Data structures in world state

In this article, we describe the different kinds of key-value pairs which are stored in smartBCH's world state.

In the following descriptions, we use "+" to denote concatenation.

Basic Information of an Account

Key: byte(23) + 20-byte-address

Value:

  1. 32-byte Balance (Big Endian)

  2. 8-byte Nonce (Big Endian)

  3. 8-byte Sequence (Big Endian). For EOA, the sequence is always uint64(-1). For contract account, the sequence is assigned a unique value when created.

Creation Counter

Key: byte(21) + first-byte-of-address

Values: 8-byte Counter (Big Endian)

All the smart contracts who have the same value in the first byte of address share one counter. Each time a new contract is created, this counter get increased by one. And the address of the new contract is calculated by: new-value-of-counter * 256 + first-byte-of-address.

Storage in Smart Contract Accounts

Key: byte(27) + 8-byte-account-sequence + 32-byte-key

Value: Non-zero-length byte string (not required to be 32 bytes)

Please note after a smart contract's self-destruction, there will never be another contract which can have the same account sequence as it. So the self-destructed contract's storage slots can never be accessed.

Bytecode

Key: byte(25) + 20-byte-address

Value: arbitrary-length byte string

EOA has no bytecode. We only store byte codes for smart contracts.

Standby Queue's Start&End Positions

Key: byte(102)

Value:

  1. 8-byte start position (Big Endian)

  2. 8-byte end position (Big Endian)

You can find a standby transaction at a position in the range [start, end)

Standby Queue's Content

Key: byte(100) + 8-byte-position

Value: serialized bytes for a transaction

Current Block's basic information

Key: byte(29)

Value: serialized bytes of current Block's basic information