-
Notifications
You must be signed in to change notification settings - Fork 319
Blockchain Tests
Found in /BlockTests
, the blockchain tests aim is to test the basic verification of a blockchain.
It is based around the notion of executing a list of single blocks, described by the blocks
portion of the test. The first block is the modified genesis block as described by the genesisBlockHeader
portion of the test. A set of pre-existing accounts are detailed in the pre
portion and form the world state of the genesis block.
It is generally expected that the test implementer will read genesisBlockHeader
and pre
and build the corresponding blockchain in the client. Then the new blocks, described by its RLP found in the rlp
object of the blocks
(RLP of a complete block, not the block header only), is read. If the client concludes that the block is valid, it should execute the block and verify the parameters given in blockHeader
(block header of the new block), transactions
(transaction list) and uncleHeaders
(list of uncle headers). If the client concludes that the block is invalid, it should verify that no blockHeader
, transactions
or uncleHeaders
object is present in the test. The client is expected to iterate through the list of blocks and ignore invalid blocks.
{
"ValidBlocks": {
"genesisBlockHeader": { ... },
"pre": { ... },
"blocks" : [
{
"blocknumber" : "1",
"rlp": { ... },
"blockHeader": { ... },
"transactions": { ... },
"uncleHeaders": { ... }
},
{
"blocknumber" : "2",
"rlp": { ... },
"blockHeader": { ... },
"transactions": { ... },
"uncleHeaders": { ... }
}
]
},
"SomeInvalidBlocks": {
"genesisBlockHeader": { ... },
"pre": { ... },
"blocks" : [
{
"blocknumber" : "3",
"rlp": { ... },
},
{
"blocknumber" : "1",
"rlp": { ... },
"blockHeader": { ... },
"transactions": { ... },
"uncleHeaders": { ... }
},
{
"blocknumber" : "1",
"rlp": { ... },
},
{
"blocknumber" : "2",
"rlp": { ... },
"blockHeader": { ... },
"transactions": { ... },
"uncleHeaders": { ... }
}
]
},
...
}
The genesisBlockHeader
section:
-
coinbase
: The 160-bit address to which all fees collected from the successful mining of this block be transferred, as returned by theCOINBASE
instruction. -
difficulty
: A scalar value corresponding to the difficulty level of this block. This can be alculated from the previous block’s difficulty level and the timestamp, as returned by theDIFFICULTY
instruction. -
gasLimit
: A scalar value equal to the current limit of gas expenditure per block, as returned by theGASLIMIT
instruction. -
number
: A scalar value equal to the number of ancestor blocks. The genesis block has a number of zero. -
timestamp
: A scalar value equal to the reasonable output of Unix’s time() at this block’s inception, as returned by theTIMESTAMP
instruction. -
parentHash
: The Keccak 256-bit hash of the parent block’s header, in its entirety -
bloom
: The Bloom filter composed from indexable information (logger address and log topics) contained in each log entry from the receipt of each transaction in the transactions list. -
extraData
: An arbitrary byte array containing data relevant to this block. This must be 1024 bytes or fewer. -
gasUsed
: A scalar value equal to the total gas used in transactions in this block. -
nonce
: A 256-bit hash which proves that a sufficient amount of computation has been carried out on this block. -
receiptTrie
: The Keccak 256-bit hash of the root node of the trie structure populated with the receipts of each transaction in the transactions list portion of the block. -
stateRoot
: The Keccak 256-bit hash of the root node of the state trie, after all transactions are executed and finalisations applied. -
transactionsTrie
: The Keccak 256-bit hash of the root node of the trie structure populated with each transaction in the transactions list portion of the block. -
uncleHash
: The Keccak 256-bit hash of the uncles list portion of this block
The pre
section:
as described in State Tests.
The blocks
section is a list of block objects, which have the following format:
The rlp
section contains the complete rlp of the new block as described in the yellow paper in section 4.3.3.
The blockHeader
section describes the block header of the new block in the same format as described in genesisBlockHeader
.
The transactions
section is a list of transactions which have the same format as in Transaction Tests.
The uncleHeaders
section is a list of block headers which have the same format as descibed in genesisBlockHeader
.
The blocknumber
section is optional section which defines what is the order of this block.
It is used to define situation when you have 3 blocks already imported but then it comes new version of the block 2 and 3 and thus you might have new best blockchain with blocks 1 2' 3' instead previous. If blocknumber
is undefined then it is assumed that blocks are imported one by one.