The Blockchain Test fixture format tests are included in the fixtures subdirectory blockchain_tests
.
These are produced by the StateTest
and BlockchainTest
test specs.
The blockchain test fixture format is used to test block validation and the consensus rules of the Ethereum blockchain.
It does so by defining a pre-execution state, a series of blocks, and a post-execution state, verifying that, after all the blocks have been processed, appended if valid or rejected if invalid, the result is the expected post-execution state.
A single JSON fixture file is composed of a JSON object where each key-value pair is a different Fixture
test object, with the key string representing the test name.
The JSON file path plus the test name are used as the unique test identifier.
For each Fixture
test object in the JSON fixture file, perform the following steps:
-
Use
network
to configure the execution fork schedule according to theFork
type definition. -
Use
pre
as the starting state allocation of the execution environment for the test and calculate the genesis state root. -
Decode
genesisRLP
to obtain the genesis block header, if the block cannot be decoded, fail the test. -
Compare the genesis block header with
genesisBlockHeader
, if any field does not match, fail the test. -
Compare the state root calculated on step 2 with the state root in the genesis block header, if they do not match, fail the test.
-
Set the genesis block as the current head of the chain.
-
If
blocks
contains at least one block, perform the following steps for eachFixtureBlock
orInvalidFixtureBlock
:-
Determine whether the current block is valid or invalid:
- If the
expectException
field is not present, it is valid, and object must be decoded as aFixtureBlock
. - If the
expectException
field is present, it is invalid, and object must be decoded as aInvalidFixtureBlock
.
- If the
-
Attempt to decode field
rlp
as the current block- If the block cannot be decoded:
- If an rlp decoding exception is not expected for the current block, fail the test.
- If an rlp decoding error is expected, pass the test (Note: A block with an expected exception will be the last block in the fixture).
- If the block can be decoded, proceed to the next step.
- If the block cannot be decoded:
-
Attempt to apply the current decoded block on top of the current head of the chain
- If the block cannot be applied:
- If an exception is expected on the current block and it matches the exception obtained upon execution, pass the test. (Note: A block with an expected exception will be the last block in the fixture)
- If an exception is not expected on the current block, fail the test
- If the block can be applied:
- If an exception is expected on the current block, fail the test
- If an exception is not expected on the current block, set the decoded block as the current head of the chain and proceed to the next block until you reach the last block in the fixture.
- If the block cannot be applied:
-
-
Compare the hash of the current head of the chain against
lastblockhash
, if they do not match, fail the test. -
Compare all accounts and the fields described in
post
against the current state, if any do not match, fail the test.
- network
: Fork
Fork configuration for the test.
- pre
: Alloc
Starting account allocation for the test. State root calculated from this allocation must match the one in the genesis block.
- genesisRLP
: Bytes
RLP serialized version of the genesis block.
- genesisBlockHeader
: FixtureHeader
Genesis block header.
- blocks
: List
[
FixtureBlock
|
InvalidFixtureBlock
]
List of blocks to be processed after the genesis block.
- lastblockhash
: Hash
Hash of the last valid block, or the genesis block hash if the list of blocks is empty, or contains a single invalid block.
- post
: Alloc
Account allocation for verification after all the blocks have been processed.
Deprecated: Seal engine used to mine the blocks.
- parentHash
: Hash
Hash of the parent block.
- uncleHash
: Hash
Hash of the uncle block list.
- coinbase
: Address
Address of the account that will receive the rewards for building the block.
- stateRoot
: Hash
Root hash of the state trie.
- transactionsTrie
: Hash
Root hash of the transactions trie.
- receiptTrie
: Hash
Root hash of the receipts trie.
- bloom
: Bloom
Bloom filter composed of the logs of all the transactions in the block.
- difficulty
: ZeroPaddedHexNumber
Difficulty of the block.
- number
: ZeroPaddedHexNumber
Number of the block.
- gasLimit
: ZeroPaddedHexNumber
Total gas limit of the block.
- gasUsed
: ZeroPaddedHexNumber
Total gas used by all the transactions in the block.
- timestamp
: ZeroPaddedHexNumber
Timestamp of the block.
- extraData
: Bytes
Extra data of the block.
- mixHash
: Hash
Mix hash or PrevRandao of the block.
- nonce
: HeaderNonce
Nonce of the block.
- hash
: Hash
Hash of the block.
- baseFeePerGas
: ZeroPaddedHexNumber
(fork: London)
Base fee per gas of the block.
- withdrawalsRoot
: Hash
(fork: Shanghai)
Root hash of the withdrawals trie.
- blobGasUsed
: ZeroPaddedHexNumber
(fork: Cancun)
Total blob gas used by all the transactions in the block.
- excessBlobGas
: ZeroPaddedHexNumber
(fork: Cancun)
Excess blob gas of the block used to calculate the blob fee per gas for this block.
- parentBeaconBlockRoot
: Hash
(fork: Cancun)
Root hash of the parent beacon block.
- rlp
: Bytes
RLP serialized version of the block. Field is only optional when embedded in a InvalidFixtureBlock
as the rlp_decoded
field.
- blockHeader
: FixtureHeader
Decoded block header fields included in the block RLP.
- blocknumber
: Number
Block number.
- transactions
: List
[
FixtureTransaction
]
List of decoded transactions included in the block RLP.
- uncleHeaders
: List
[
FixtureHeader
]
List of uncle headers included in the block RLP. An empty list post merge.
- withdrawals
: Optional
[
List
[
FixtureWithdrawal
]]
(fork: Shanghai)
Optional list of withdrawals included in the block RLP.
- expectException
: TransactionException
|
BlockException
Expected exception that invalidates the block.
- rlp
: Bytes
RLP serialized version of the block.
- rlp_decoded
: Optional
[
FixtureBlock
]
Decoded block attributes included in the block RLP.
- type
: ZeroPaddedHexNumber
Transaction type.
- chainId
: ZeroPaddedHexNumber
Chain ID of the transaction.
- nonce
: ZeroPaddedHexNumber
Nonce of the account that sends the transaction
- gasPrice
: ZeroPaddedHexNumber
Gas price for the transaction (Transaction types 0 & 1)
- maxPriorityFeePerGas
: HexNumber
(fork: London)
Max priority fee per gas to pay (Transaction types 2 & 3)
- maxFeePerGas
: HexNumber
(fork: London)
Max base fee per gas to pay (Transaction types 2 & 3)
- gasLimit
: ZeroPaddedHexNumber
Gas limit of the transaction
- to
: Address
| null
Destination address of the transaction, or null
to create a contract
- value
: ZeroPaddedHexNumber
Value of the transaction
- data
: Bytes
Data bytes of the transaction
Account access lists (Transaction types 1, 2 & 3)
- maxFeePerBlobGas
: ZeroPaddedHexNumber
(fork: Cancun)
Max fee per blob gas to pay (Transaction type 3)
Max fee per blob gas to pay (Transaction type 3)
- v
: ZeroPaddedHexNumber
V value of the transaction signature
- r
: ZeroPaddedHexNumber
R value of the transaction signature
- s
: ZeroPaddedHexNumber
S value of the transaction signature
- sender
: Address
Sender address of the transaction
- secretKey
: Hash
Private key that must be used to sign the transaction
- index
: ZeroPaddedHexNumber
Index of the withdrawal
- validatorIndex
: ZeroPaddedHexNumber
Withdrawing validator index
- address
: Address
Address to withdraw to
- amount
: ZeroPaddedHexNumber
Amount of the withdrawal