diff --git a/consensus/aura/aura.go b/consensus/aura/aura.go index 0189116e6798..f9978f6bd885 100644 --- a/consensus/aura/aura.go +++ b/consensus/aura/aura.go @@ -200,15 +200,15 @@ type Aura struct { // The fields below are for testing only fakeDiff bool // Skip difficulty verifications - validators validatorset.ValidatorSet - transition *Transition - validatorSet []common.Address - simulatedBackend bind.ContractBackend + validators validatorset.ValidatorSet + transition *Transition + validatorSet []common.Address + simulatedBackend bind.ContractBackend } type Transition struct { - blockNumber int64 - finalizeBlock int64 + blockNumber int64 + finalizeBlock int64 pendingValidatorSet []common.Address } @@ -232,8 +232,8 @@ func New(config *params.AuraConfig, db ethdb.Database) *Aura { proposals: make(map[common.Address]bool), validators: validatorset.NewValidatorSet(make(map[int]validatorset.ValidatorSet), &config.Authorities), transition: &Transition{ - blockNumber: 0, - finalizeBlock: 0, + blockNumber: 0, + finalizeBlock: 0, pendingValidatorSet: nil, }, simulatedBackend: nil, @@ -516,7 +516,9 @@ func (a *Aura) Prepare(chain consensus.ChainHeaderReader, header *types.Header) // rewards given. func (a *Aura) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { // No block rewards in PoA, so the state remains as is and uncles are dropped - header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + if nil != txs { + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + } header.UncleHash = types.CalcUncleHash(nil) if err := a.FinalizeChange(header, chain, state); err != nil { @@ -528,7 +530,9 @@ func (a *Aura) Finalize(chain consensus.ChainHeaderReader, header *types.Header, // nor block rewards given, and returns the final block. func (a *Aura) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // No block rewards in PoA, so the state remains as is and uncles are dropped - header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + if nil != txs { + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + } header.UncleHash = types.CalcUncleHash(nil) if err := a.FinalizeChange(header, chain, state); err != nil { @@ -836,9 +840,9 @@ func (a *Aura) SignalToChange(receipts types.Receipts, blockNumber *big.Int) { panic("Cannot operate with an empty validator set.") } - a.transition.blockNumber = blockNumber.Int64() // signal block - a.transition.pendingValidatorSet = newSet // pending validator set for setting next validator set - a.transition.finalizeBlock = blockNumber.Int64() + 1 // in which block the finalizeChange method will call + a.transition.blockNumber = blockNumber.Int64() // signal block + a.transition.pendingValidatorSet = newSet // pending validator set for setting next validator set + a.transition.finalizeBlock = blockNumber.Int64() + 1 // in which block the finalizeChange method will call // finalizeChange method calls after 2 block later when removes any validator from // validator set contract. diff --git a/consensus/aura/aura_test.go b/consensus/aura/aura_test.go index a3117fc44b74..62c217c0dd73 100644 --- a/consensus/aura/aura_test.go +++ b/consensus/aura/aura_test.go @@ -9,7 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -35,8 +37,8 @@ func init() { auraChainConfig = ¶ms.AuraConfig{ Period: 5, Epoch: 500, - Authorities: params.ValidatorSet { - List: []common.Address { + Authorities: params.ValidatorSet{ + List: []common.Address{ testBankAddress, crypto.PubkeyToAddress(authority1.PublicKey), crypto.PubkeyToAddress(authority2.PublicKey), @@ -56,6 +58,69 @@ func init() { auraEngine.Authorize(testBankAddress, signerFunc) } +func TestAura_Finalize(t *testing.T) { + //gethHeaderWithTransition := "f9026ea0a52747663faa49ea84f1c177f981492b45fcb62d71353a288cb9374ae86381c5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794dfa5b73a85f758b0a53992c968ac1a0e0f51ce83a037f2e8ec3a5827d2a65ace4eccfb78d264dae5c9a413bc1e483a675be956c64aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090fffffffffffffffffffffffffffffffd1f83232e6580845fca55a39cdb830300018c4f70656e457468657265756d86312e34332e31826c69a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f84c888777281300000000b841ef723ea77bd06dc7153e243636668e35cec750a1b5a63ddbc3dab2d594249f3d4de14c70428031fab1649edd526b61109a60fdf930a198acd291b2267d4eb18f00" + gethHeaderWithTransition := "f9026ea01b8f7e78fd786ce49f5ab95a69c49a8dc9cfb45c05f3c04f69210114956a04c7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794dfa5b73a85f758b0a53992c968ac1a0e0f51ce83a0cacf4ddf8416347cfd1b2c6e4b0cbaf45e400a89e6282d579e83a1ae561c9bf0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090fffffffffffffffffffffffffffffffe1f83232e6580845fca601b9cdb830300018c4f70656e457468657265756d86312e34332e31826c69a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f84c889f79281300000000b841353f1e6c9a981a1247d31e9647314621ae401d0dd8dbc7f53b880dfb86c75072366176e11eaff127345228773297dbd29cf7b60d4ce433b4462affb15a2334a201" + //withoutStateMutation := "f9026ea01b8f7e78fd786ce49f5ab95a69c49a8dc9cfb45c05f3c04f69210114956a04c7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794dfa5b73a85f758b0a53992c968ac1a0e0f51ce83a0cacf4ddf8416347cfd1b2c6e4b0cbaf45e400a89e6282d579e83a1ae561c9bf0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090fffffffffffffffffffffffffffffffe1f83232e6580845fca601b9cdb830300018c4f70656e457468657265756d86312e34332e31826c69a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f84c889f79281300000000b841353f1e6c9a981a1247d31e9647314621ae401d0dd8dbc7f53b880dfb86c75072366176e11eaff127345228773297dbd29cf7b60d4ce433b4462affb15a2334a201" + input, err := hex.DecodeString(gethHeaderWithTransition) + assert.Nil(t, err) + var header *types.Header + err = rlp.Decode(bytes.NewReader(input), &header) + assert.Nil(t, err) + + db := rawdb.NewMemoryDatabase() + genspec := &core.Genesis{} + genspec.MustCommit(db) + + specificEngine := New(auraChainConfig, db) + + // With EIP + consensusChain, err := core.NewBlockChain( + specificEngine.db, + nil, + ¶ms.ChainConfig{ + ChainID: big.NewInt(5684), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + DAOForkSupport: false, + EIP150Block: big.NewInt(0), + EIP150Hash: common.Hash{}, + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + YoloV1Block: nil, + EWASMBlock: nil, + Ethash: nil, + Clique: nil, + Aura: auraChainConfig, + }, + specificEngine, + vm.Config{}, + func(block *types.Block) bool { + return false + }, + nil, + ) + assert.Nil(t, err) + + stateDbDatabase := state.NewDatabase(db) + stateDb, err := state.New(common.Hash{}, stateDbDatabase, nil) + assert.Nil(t, err) + headerRootString := header.Root.String() + remoteMerkleRoot := "0xcacf4ddf8416347cfd1b2c6e4b0cbaf45e400a89e6282d579e83a1ae561c9bf0" + assert.Equal(t, remoteMerkleRoot, headerRootString) + + specificEngine.Finalize(consensusChain, header, stateDb, nil, nil) + assert.NotNil(t, header) + + headerRootString = header.Root.String() + assert.Equal(t, remoteMerkleRoot, headerRootString) +} + func TestAura_CheckStep(t *testing.T) { currentTime := int64(1602588556) @@ -111,10 +176,10 @@ func TestAura_CountClosestTurn(t *testing.T) { auraChainConfig = ¶ms.AuraConfig{ Period: 5, Epoch: 500, - Authorities: params.ValidatorSet { - List: []common.Address { - crypto.PubkeyToAddress(randomValidatorKey.PublicKey), - }, + Authorities: params.ValidatorSet{ + List: []common.Address{ + crypto.PubkeyToAddress(randomValidatorKey.PublicKey), + }, }, Difficulty: big.NewInt(int64(131072)), Signatures: nil, @@ -333,10 +398,10 @@ func TestAura_VerifySeal(t *testing.T) { var aura Aura auraConfig := ¶ms.AuraConfig{ Period: uint64(5), - Authorities: params.ValidatorSet { - List: []common.Address { - common.HexToAddress("0x70ad1a5fba52e27173d23ad87ad97c9bbe249abf"), - common.HexToAddress("0xafe443af9d1504de4c2d486356c421c160fdd7b1"), + Authorities: params.ValidatorSet{ + List: []common.Address{ + common.HexToAddress("0x70ad1a5fba52e27173d23ad87ad97c9bbe249abf"), + common.HexToAddress("0xafe443af9d1504de4c2d486356c421c160fdd7b1"), }, }, }