adjust chain maker for tests to add an empty account in block1 and switch to EIP-158 afterwards (now we just need to generate enough accounts until one causes the empty account to be touched and removed post-EIP-158 so we can simulate and test that process...); also added 2 new blocks where more contract storage is set and old slots are set to zero so they are removed so we can test that
This commit is contained in:
parent
859e18aea4
commit
3c514837f3
@ -33,14 +33,14 @@ import (
|
||||
|
||||
// TODO: add test that filters on address
|
||||
var (
|
||||
contractLeafKey []byte
|
||||
emptyDiffs = make([]statediff.StateNode, 0)
|
||||
emptyStorage = make([]statediff.StorageNode, 0)
|
||||
block0, block1, block2, block3 *types.Block
|
||||
builder statediff.Builder
|
||||
miningReward = int64(2000000000000000000)
|
||||
minerAddress = common.HexToAddress("0x0")
|
||||
minerLeafKey = testhelpers.AddressToLeafKey(minerAddress)
|
||||
contractLeafKey, emptyContractLeafKey []byte
|
||||
emptyDiffs = make([]statediff.StateNode, 0)
|
||||
emptyStorage = make([]statediff.StorageNode, 0)
|
||||
block0, block1, block2, block3 *types.Block
|
||||
builder statediff.Builder
|
||||
miningReward = int64(2000000000000000000)
|
||||
minerAddress = common.HexToAddress("0x0")
|
||||
minerLeafKey = testhelpers.AddressToLeafKey(minerAddress)
|
||||
|
||||
balanceChange10000 = int64(10000)
|
||||
balanceChange1000 = int64(1000)
|
||||
@ -77,6 +77,16 @@ var (
|
||||
common.Hex2Bytes("2000bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a"),
|
||||
bankAccountAtBlock0,
|
||||
})
|
||||
emptyContractAtBlock1, _ = rlp.EncodeToBytes(state.Account{
|
||||
Nonce: testhelpers.Nonce0,
|
||||
Balance: big.NewInt(0),
|
||||
CodeHash: testhelpers.NullCodeHash.Bytes(),
|
||||
Root: testhelpers.EmptyContractRoot,
|
||||
})
|
||||
emptyContractAtBlock1LeafNode, _ = rlp.EncodeToBytes([]interface{}{
|
||||
common.Hex2Bytes("38f0847834712d0d4a56cc9fd09ca7a91cd58d022e0f3790ef365ae82a471419"),
|
||||
emptyContractAtBlock1,
|
||||
})
|
||||
account1AtBlock1, _ = rlp.EncodeToBytes(state.Account{
|
||||
Nonce: testhelpers.Nonce0,
|
||||
Balance: big.NewInt(balanceChange10000),
|
||||
@ -98,7 +108,7 @@ var (
|
||||
minerAccountAtBlock1,
|
||||
})
|
||||
bankAccountAtBlock1, _ = rlp.EncodeToBytes(state.Account{
|
||||
Nonce: testhelpers.Nonce1,
|
||||
Nonce: testhelpers.Nonce2,
|
||||
Balance: big.NewInt(testhelpers.TestBankFunds.Int64() - balanceChange10000),
|
||||
CodeHash: testhelpers.NullCodeHash.Bytes(),
|
||||
Root: testhelpers.EmptyContractRoot,
|
||||
@ -128,7 +138,7 @@ var (
|
||||
contractAccountAtBlock2,
|
||||
})
|
||||
bankAccountAtBlock2, _ = rlp.EncodeToBytes(state.Account{
|
||||
Nonce: testhelpers.Nonce2,
|
||||
Nonce: testhelpers.Nonce3,
|
||||
Balance: big.NewInt(block1BankBalance - balanceChange1000),
|
||||
CodeHash: testhelpers.NullCodeHash.Bytes(),
|
||||
Root: testhelpers.EmptyContractRoot,
|
||||
@ -178,7 +188,7 @@ var (
|
||||
contractAccountAtBlock3,
|
||||
})
|
||||
bankAccountAtBlock3, _ = rlp.EncodeToBytes(state.Account{
|
||||
Nonce: testhelpers.Nonce3,
|
||||
Nonce: testhelpers.Nonce4,
|
||||
Balance: big.NewInt(99989000),
|
||||
CodeHash: testhelpers.NullCodeHash.Bytes(),
|
||||
Root: testhelpers.EmptyContractRoot,
|
||||
@ -191,7 +201,7 @@ var (
|
||||
block1BranchNode, _ = rlp.EncodeToBytes([]interface{}{
|
||||
crypto.Keccak256(bankAccountAtBlock1LeafNode),
|
||||
[]byte{},
|
||||
[]byte{},
|
||||
crypto.Keccak256(emptyContractAtBlock1LeafNode),
|
||||
[]byte{},
|
||||
[]byte{},
|
||||
crypto.Keccak256(minerAccountAtBlock1LeafNode),
|
||||
@ -210,7 +220,7 @@ var (
|
||||
block2BranchNode, _ = rlp.EncodeToBytes([]interface{}{
|
||||
crypto.Keccak256(bankAccountAtBlock2LeafNode),
|
||||
[]byte{},
|
||||
[]byte{},
|
||||
crypto.Keccak256(emptyContractAtBlock1LeafNode),
|
||||
[]byte{},
|
||||
[]byte{},
|
||||
crypto.Keccak256(minerAccountAtBlock2LeafNode),
|
||||
@ -229,7 +239,7 @@ var (
|
||||
block3BranchNode, _ = rlp.EncodeToBytes([]interface{}{
|
||||
crypto.Keccak256(bankAccountAtBlock3LeafNode),
|
||||
[]byte{},
|
||||
[]byte{},
|
||||
crypto.Keccak256(emptyContractAtBlock1LeafNode),
|
||||
[]byte{},
|
||||
[]byte{},
|
||||
crypto.Keccak256(minerAccountAtBlock2LeafNode),
|
||||
@ -269,6 +279,7 @@ var (
|
||||
func TestBuilder(t *testing.T) {
|
||||
blocks, chain := testhelpers.MakeChain(3, testhelpers.Genesis)
|
||||
contractLeafKey = testhelpers.AddressToLeafKey(testhelpers.ContractAddr)
|
||||
emptyContractLeafKey = testhelpers.AddressToLeafKey(testhelpers.EmptyContractAddr)
|
||||
defer chain.Stop()
|
||||
block0 = testhelpers.Genesis
|
||||
block1 = blocks[0]
|
||||
@ -339,6 +350,13 @@ func TestBuilder(t *testing.T) {
|
||||
NodeValue: bankAccountAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x02'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: emptyContractLeafKey,
|
||||
NodeValue: emptyContractAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
@ -494,6 +512,7 @@ func TestBuilder(t *testing.T) {
|
||||
func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
blocks, chain := testhelpers.MakeChain(3, testhelpers.Genesis)
|
||||
contractLeafKey = testhelpers.AddressToLeafKey(testhelpers.ContractAddr)
|
||||
emptyContractLeafKey = testhelpers.AddressToLeafKey(testhelpers.EmptyContractAddr)
|
||||
defer chain.Stop()
|
||||
block0 = testhelpers.Genesis
|
||||
block1 = blocks[0]
|
||||
@ -573,6 +592,13 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
NodeValue: bankAccountAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x02'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: emptyContractLeafKey,
|
||||
NodeValue: emptyContractAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
|
@ -31,7 +31,10 @@ import (
|
||||
// MakeChain creates a chain of n blocks starting at and including parent.
|
||||
// the returned hash chain is ordered head->parent.
|
||||
func MakeChain(n int, parent *types.Block) ([]*types.Block, *core.BlockChain) {
|
||||
blocks, _ := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), Testdb, n, testChainGen)
|
||||
config := params.TestChainConfig
|
||||
config.EIP158Block = big.NewInt(2)
|
||||
config.ByzantiumBlock = big.NewInt(2)
|
||||
blocks, _ := core.GenerateChain(config, parent, ethash.NewFaker(), Testdb, n, testChainGen)
|
||||
chain, _ := core.NewBlockChain(Testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil)
|
||||
return blocks, chain
|
||||
}
|
||||
@ -41,8 +44,14 @@ func testChainGen(i int, block *core.BlockGen) {
|
||||
switch i {
|
||||
case 0:
|
||||
// In block 1, the test bank sends account #1 some ether.
|
||||
tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(TestBankAddress), Account1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, TestBankKey)
|
||||
block.AddTx(tx)
|
||||
// And the bank makes an empty contract account (to be removed by EIP-158)
|
||||
nonce := block.TxNonce(TestBankAddress)
|
||||
tx1, _ := types.SignTx(types.NewTransaction(nonce, Account1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, TestBankKey)
|
||||
nonce++
|
||||
tx2, _ := types.SignTx(types.NewContractCreation(nonce, big.NewInt(0), 1000000, big.NewInt(0), EmptyContractCode), signer, TestBankKey)
|
||||
EmptyContractAddr = crypto.CreateAddress(TestBankAddress, nonce)
|
||||
block.AddTx(tx1)
|
||||
block.AddTx(tx2)
|
||||
case 1:
|
||||
// In block 2, the test bank sends some more ether to account #1.
|
||||
// account1Addr passes it on to account #2.
|
||||
@ -57,12 +66,33 @@ func testChainGen(i int, block *core.BlockGen) {
|
||||
block.AddTx(tx2)
|
||||
block.AddTx(tx3)
|
||||
case 2:
|
||||
// Block 3 has a single tx from the bankAccount to the contract, that transfers no value, that is mined by account2
|
||||
// Block 3 has a single tx from the bankAccount to the contract, that transfers no value
|
||||
// Block is mined by account2
|
||||
block.SetCoinbase(Account2Addr)
|
||||
//get function: 60cd2685
|
||||
//put function: c16431b9
|
||||
data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003")
|
||||
tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(TestBankAddress), ContractAddr, big.NewInt(0), 100000, nil, data), signer, TestBankKey)
|
||||
block.AddTx(tx)
|
||||
case 3:
|
||||
// Block 4 has two more txs from the bankAccount to the contract, that transfer no value
|
||||
// Block is mined by account1
|
||||
block.SetCoinbase(Account1Addr)
|
||||
data1 := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005")
|
||||
data2 := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002")
|
||||
tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(TestBankAddress), ContractAddr, big.NewInt(0), 100000, nil, data1), signer, TestBankKey)
|
||||
tx2, _ := types.SignTx(types.NewTransaction(block.TxNonce(TestBankAddress), ContractAddr, big.NewInt(0), 100000, nil, data2), signer, TestBankKey)
|
||||
block.AddTx(tx1)
|
||||
block.AddTx(tx2)
|
||||
case 4:
|
||||
// Block 5 has two more txs from the bankAccount to the contract, that transfer no value and set slot positions to 0
|
||||
// Block is mined by new Account3Addr
|
||||
block.SetCoinbase(Account3Addr)
|
||||
data1 := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000")
|
||||
data2 := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000")
|
||||
tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(TestBankAddress), ContractAddr, big.NewInt(0), 100000, nil, data1), signer, TestBankKey)
|
||||
tx2, _ := types.SignTx(types.NewTransaction(block.TxNonce(TestBankAddress), ContractAddr, big.NewInt(0), 100000, nil, data2), signer, TestBankKey)
|
||||
block.AddTx(tx1)
|
||||
block.AddTx(tx2)
|
||||
}
|
||||
}
|
||||
|
@ -57,14 +57,18 @@ var (
|
||||
TestBankFunds = big.NewInt(100000000)
|
||||
Genesis = core.GenesisBlockForTesting(Testdb, TestBankAddress, TestBankFunds)
|
||||
|
||||
Account1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
|
||||
Account2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
|
||||
Account1Addr = crypto.PubkeyToAddress(Account1Key.PublicKey) //0x703c4b2bD70c169f5717101CaeE543299Fc946C7
|
||||
Account2Addr = crypto.PubkeyToAddress(Account2Key.PublicKey) //0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e
|
||||
Account1LeafKey = AddressToLeafKey(Account1Addr)
|
||||
Account2LeafKey = AddressToLeafKey(Account2Addr)
|
||||
ContractCode = common.Hex2Bytes("608060405234801561001057600080fd5b50602060405190810160405280600160ff16815250600090600161003592919061003b565b506100a5565b826064810192821561006f579160200282015b8281111561006e578251829060ff1690559160200191906001019061004e565b5b50905061007c9190610080565b5090565b6100a291905b8082111561009e576000816000905550600101610086565b5090565b90565b610124806100b46000396000f3fe6080604052348015600f57600080fd5b5060043610604f576000357c01000000000000000000000000000000000000000000000000000000009004806360cd2685146054578063c16431b9146093575b600080fd5b607d60048036036020811015606857600080fd5b810190808035906020019092919050505060c8565b6040518082815260200191505060405180910390f35b60c66004803603604081101560a757600080fd5b81019080803590602001909291908035906020019092919050505060e0565b005b6000808260648110151560d757fe5b01549050919050565b8060008360648110151560ef57fe5b0181905550505056fea165627a7a7230582064e918c3140a117bf3aa65865a9b9e83fae21ad1720506e7933b2a9f54bb40260029")
|
||||
ContractAddr common.Address
|
||||
Account1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
|
||||
Account2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
|
||||
Account3Key, _ = crypto.HexToECDSA("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")
|
||||
Account1Addr = crypto.PubkeyToAddress(Account1Key.PublicKey) //0x703c4b2bD70c169f5717101CaeE543299Fc946C7
|
||||
Account2Addr = crypto.PubkeyToAddress(Account2Key.PublicKey) //0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e
|
||||
Account3Addr = crypto.PubkeyToAddress(Account3Key.PublicKey) //0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e
|
||||
Account1LeafKey = AddressToLeafKey(Account1Addr)
|
||||
Account2LeafKey = AddressToLeafKey(Account2Addr)
|
||||
Account3LeafKey = AddressToLeafKey(Account3Addr)
|
||||
ContractCode = common.Hex2Bytes("608060405234801561001057600080fd5b50602060405190810160405280600160ff16815250600090600161003592919061003b565b506100a5565b826064810192821561006f579160200282015b8281111561006e578251829060ff1690559160200191906001019061004e565b5b50905061007c9190610080565b5090565b6100a291905b8082111561009e576000816000905550600101610086565b5090565b90565b610124806100b46000396000f3fe6080604052348015600f57600080fd5b5060043610604f576000357c01000000000000000000000000000000000000000000000000000000009004806360cd2685146054578063c16431b9146093575b600080fd5b607d60048036036020811015606857600080fd5b810190808035906020019092919050505060c8565b6040518082815260200191505060405180910390f35b60c66004803603604081101560a757600080fd5b81019080803590602001909291908035906020019092919050505060e0565b005b6000808260648110151560d757fe5b01549050919050565b8060008360648110151560ef57fe5b0181905550505056fea165627a7a7230582064e918c3140a117bf3aa65865a9b9e83fae21ad1720506e7933b2a9f54bb40260029")
|
||||
EmptyContractCode []byte
|
||||
ContractAddr, EmptyContractAddr common.Address
|
||||
|
||||
EmptyRootNode, _ = rlp.EncodeToBytes([]byte{})
|
||||
EmptyContractRoot = crypto.Keccak256Hash(EmptyRootNode)
|
||||
@ -72,4 +76,5 @@ var (
|
||||
Nonce1 = uint64(1)
|
||||
Nonce2 = uint64(2)
|
||||
Nonce3 = uint64(3)
|
||||
Nonce4 = uint64(4)
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user