A system account is one that was created by the Solana system program. It is typical that these are often considered a wallet conceptually.
A Token account is an account that is "owned" by the Token program. This enables the Token program to update the information in that account, whereas if other programs try to modify the data execution will fail.
What data, if any, is in one of these program owned accounts it defined by the program that owns it.
Other notes:
- Programs themselves are accounts that are owned by the BPFLoader program
You can discover what is what from the command line with:
solana account ...
(see solana account --help for more options)
For example, on a Program account in devnet:
Public Key: SampGgdt3wioaoMZhC6LTSbg4pnuvQnSfJpDYeuXQBv
Balance: 0.00114144 SOL
Owner: BPFLoaderUpgradeab1e11111111111111111111111
Executable: true
Rent Epoch: 213
Length: 36 (0x24) bytes
0000: 02 00 00 00 a4 6d da 51 48 e4 d4 48 b1 19 5e 80 .....m.QH..H..^.
0010: a7 ff 85 8a c9 06 49 f3 63 d8 5f 7f 8b 32 6a 4d ......I.c._..2jM
0020: 9a a6 00 d6 ....
The owner is the BPF program loader
Whereas for my default wallet for devnet:
solana account .config/solana/id.json
Public Key: 5VhBw95K4NYEgQDgEA7335znvVgwUifMPVy6cqFVq5rZ
Balance: 29.355201517 SOL
Owner: 11111111111111111111111111111111
Executable: false
Rent Epoch: 270
The owner is the system program