|
|
|
@ -1136,13 +1136,14 @@ func TestCanonicalBlockRetrieval(t *testing.T) { |
|
|
|
|
func TestEIP155Transition(t *testing.T) { |
|
|
|
|
// Configure and generate a sample block chain
|
|
|
|
|
var ( |
|
|
|
|
db, _ = ethdb.NewMemDatabase() |
|
|
|
|
key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") |
|
|
|
|
address = crypto.PubkeyToAddress(key.PublicKey) |
|
|
|
|
funds = big.NewInt(1000000000) |
|
|
|
|
genesis = WriteGenesisBlockForTesting(db, GenesisAccount{address, funds}) |
|
|
|
|
config = ¶ms.ChainConfig{ChainId: big.NewInt(1), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)} |
|
|
|
|
mux event.TypeMux |
|
|
|
|
db, _ = ethdb.NewMemDatabase() |
|
|
|
|
key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") |
|
|
|
|
address = crypto.PubkeyToAddress(key.PublicKey) |
|
|
|
|
funds = big.NewInt(1000000000) |
|
|
|
|
deleteAddr = common.Address{1} |
|
|
|
|
genesis = WriteGenesisBlockForTesting(db, GenesisAccount{address, funds}, GenesisAccount{deleteAddr, new(big.Int)}) |
|
|
|
|
config = ¶ms.ChainConfig{ChainId: big.NewInt(1), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)} |
|
|
|
|
mux event.TypeMux |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
blockchain, _ := NewBlockChain(db, config, FakePow{}, &mux) |
|
|
|
@ -1231,3 +1232,66 @@ func TestEIP155Transition(t *testing.T) { |
|
|
|
|
t.Error("expected error:", types.ErrInvalidChainId) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestEIP161AccountRemoval(t *testing.T) { |
|
|
|
|
// Configure and generate a sample block chain
|
|
|
|
|
var ( |
|
|
|
|
db, _ = ethdb.NewMemDatabase() |
|
|
|
|
key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") |
|
|
|
|
address = crypto.PubkeyToAddress(key.PublicKey) |
|
|
|
|
funds = big.NewInt(1000000000) |
|
|
|
|
theAddr = common.Address{1} |
|
|
|
|
genesis = WriteGenesisBlockForTesting(db, GenesisAccount{address, funds}) |
|
|
|
|
config = ¶ms.ChainConfig{ |
|
|
|
|
ChainId: big.NewInt(1), |
|
|
|
|
HomesteadBlock: new(big.Int), |
|
|
|
|
EIP155Block: new(big.Int), |
|
|
|
|
EIP158Block: big.NewInt(2), |
|
|
|
|
} |
|
|
|
|
mux event.TypeMux |
|
|
|
|
|
|
|
|
|
blockchain, _ = NewBlockChain(db, config, FakePow{}, &mux) |
|
|
|
|
) |
|
|
|
|
blocks, _ := GenerateChain(config, genesis, db, 3, func(i int, block *BlockGen) { |
|
|
|
|
var ( |
|
|
|
|
tx *types.Transaction |
|
|
|
|
err error |
|
|
|
|
signer = types.NewEIP155Signer(config.ChainId) |
|
|
|
|
) |
|
|
|
|
switch i { |
|
|
|
|
case 0: |
|
|
|
|
tx, err = types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), big.NewInt(21000), new(big.Int), nil).SignECDSA(signer, key) |
|
|
|
|
case 1: |
|
|
|
|
tx, err = types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), big.NewInt(21000), new(big.Int), nil).SignECDSA(signer, key) |
|
|
|
|
case 2: |
|
|
|
|
tx, err = types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), big.NewInt(21000), new(big.Int), nil).SignECDSA(signer, key) |
|
|
|
|
} |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
block.AddTx(tx) |
|
|
|
|
}) |
|
|
|
|
// account must exist pre eip 161
|
|
|
|
|
if _, err := blockchain.InsertChain(types.Blocks{blocks[0]}); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !blockchain.stateCache.Exist(theAddr) { |
|
|
|
|
t.Error("expected account to exist") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// account needs to be deleted post eip 161
|
|
|
|
|
if _, err := blockchain.InsertChain(types.Blocks{blocks[1]}); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if blockchain.stateCache.Exist(theAddr) { |
|
|
|
|
t.Error("account should not expect") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// account musn't be created post eip 161
|
|
|
|
|
if _, err := blockchain.InsertChain(types.Blocks{blocks[2]}); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if blockchain.stateCache.Exist(theAddr) { |
|
|
|
|
t.Error("account should not expect") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|