General State Tests¶
The state tests aim is to test the basic workings of the state in isolation.
Location | /GeneralStateTests |
Supported Hardforks | Byzantium | Constantinople | EIP150 | EIP158 | Frontier | Homestead |
Status | Actively supported |
A state test is based around the notion of executing a single transaction, described
by the transaction
portion of the test. The overarching environment
in which it is executed is described by the env
portion of the test and
includes attributes of the current and previous blocks. A set of pre-existing accounts
are detailed in the pre
portion and form the world state prior to execution.
Similarly, a set of accounts are detailed in the post
portion to specify the
end world state. Since the data of the blockchain is not given, the opcode BLOCKHASH
could not return the hashes of the corresponding blocks. Therefore we define the hash of
block number n
to be SHA256("n")
.
The log entries (logs
) as well as any output returned from the code (output
) is also detailed.
Test Implementation¶
It is generally expected that the test implementer will read env
, transaction
and pre
then check their results against logs
, out
, and post
.
Note
The structure of state tests was reworked lately, see the associated discussion here.
Test Structure¶
{
"testname" : {
"env" : {
"currentCoinbase" : "address",
"currentDifficulty" : "0x020000", //minimum difficulty for mining on blockchain
"currentGasLimit" : "u64", //not larger then maxGasLimit = 0x7fffffffffffffff
"currentNumber" : "0x01", //Irrelevant to hardfork parameters!
"currentTimestamp" : "1000", //for blockchain version
"previousHash" : "h256"
},
"post" : {
"EIP150" : [
{
"hash" : "3e6dacc1575c6a8c76422255eca03529bbf4c0dda75dfc110b22d6dc4152396f",
"indexes" : { "data" : 0, "gas" : 0, "value" : 0 }
},
{
"hash" : "99a450d8ce5b987a71346d8a0a1203711f770745c7ef326912e46761f14cd764",
"indexes" : { "data" : 0, "gas" : 0, "value" : 1 }
},
...
],
"EIP158" : [
{
"hash" : "3e6dacc1575c6a8c76422255eca03529bbf4c0dda75dfc110b22d6dc4152396f",
"indexes" : { "data" : 0, "gas" : 0, "value" : 0 }
},
{
"hash" : "99a450d8ce5b987a71346d8a0a1203711f770745c7ef326912e46761f14cd764",
"indexes" : { "data" : 0, "gas" : 0, "value" : 1 }
},
...
],
"Frontier" : [
...
],
"Homestead" : [
...
]
},
"pre" : {
//same as for StateTests
},
"transaction" : {
"data" : [ "" ],
"gasLimit" : [ "285000", "100000", "6000" ],
"gasPrice" : "0x01",
"nonce" : "0x00",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"value" : [ "10", "0" ]
}
}
}
The env Section¶
currentCoinbase
currentDifficulty
currentGasLimit
currentNumber
currentTimestamp
previousHash
The transaction Section¶
data
gasLimit
gasPrice
nonce
address
secretKey
to
value
The post Section¶
Indexes
section describes which values from given array to set for transaction
before it’s execution on a pre state. Transaction now has data, value, and gasLimit as arrays.
post section now has array of implemented forks. For each fork it has another array
of execution results on that fork rules with post state root hash and transaction parameters.
The pre Section¶
The pre
section have the format of a mapping between addresses and accounts.
Each account has the format:
balance
nonce
code
storage
"1200"
or "0x04B0"
For values used $DATA_ARRAY.