From ed9b28fe7b3e9a4aa47ce74632ca168931881a0a Mon Sep 17 00:00:00 2001 From: fudongbai <296179868@qq.com> Date: Mon, 1 Jun 2020 21:39:21 +0800 Subject: [PATCH] fix validator failed to sync a block produced by itself --- consensus/parlia/parlia.go | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go index fe6f0b066f..dbc5673a7c 100644 --- a/consensus/parlia/parlia.go +++ b/consensus/parlia/parlia.go @@ -653,7 +653,7 @@ func (p *Parlia) Finalize(chain consensus.ChainReader, header *types.Header, sta // No block rewards in PoA, so the state remains as is and uncles are dropped cx := chainContext{Chain: chain, parlia: p} if header.Number.Cmp(common.Big1) == 0 { - err := p.initContract(state, header, cx, txs, receipts, systemTxs, usedGas) + err := p.initContract(state, header, cx, txs, receipts, systemTxs, usedGas, false) if err != nil { log.Error("init contract failed") } @@ -674,14 +674,14 @@ func (p *Parlia) Finalize(chain consensus.ChainReader, header *types.Header, sta } if !signedRecently { log.Info("slash validator", "block hash", header.Hash(), "address", spoiledVal) - err = p.slash(spoiledVal, state, header, cx, txs, receipts, systemTxs, usedGas) + err = p.slash(spoiledVal, state, header, cx, txs, receipts, systemTxs, usedGas, false) if err != nil { panic(err) } } } val := header.Coinbase - err := p.distributeIncoming(val, state, header, cx, txs, receipts, systemTxs, usedGas) + err := p.distributeIncoming(val, state, header, cx, txs, receipts, systemTxs, usedGas, false) if err != nil { panic(err) } @@ -706,7 +706,7 @@ func (p *Parlia) FinalizeAndAssemble(chain consensus.ChainReader, header *types. receipts = make([]*types.Receipt, 0) } if header.Number.Cmp(common.Big1) == 0 { - err := p.initContract(state, header, cx, &txs, &receipts, nil, &header.GasUsed) + err := p.initContract(state, header, cx, &txs, &receipts, nil, &header.GasUsed, true) if err != nil { log.Error("init contract failed") } @@ -726,13 +726,13 @@ func (p *Parlia) FinalizeAndAssemble(chain consensus.ChainReader, header *types. } } if !signedRecently { - err = p.slash(spoiledVal, state, header, cx, &txs, &receipts, nil, &header.GasUsed) + err = p.slash(spoiledVal, state, header, cx, &txs, &receipts, nil, &header.GasUsed, true) if err != nil { panic(err) } } } - err := p.distributeIncoming(p.val, state, header, cx, &txs, &receipts, nil, &header.GasUsed) + err := p.distributeIncoming(p.val, state, header, cx, &txs, &receipts, nil, &header.GasUsed, true) if err != nil { panic(err) } @@ -923,7 +923,7 @@ func (p *Parlia) getCurrentValidators(blockHash common.Hash) ([]common.Address, // slash spoiled validators func (p *Parlia) distributeIncoming(val common.Address, state *state.StateDB, header *types.Header, chain core.ChainContext, - txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64) error { + txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64, mining bool) error { coinbase := header.Coinbase balance := state.GetBalance(consensus.SystemAddress) if balance.Cmp(common.Big0) <= 0 { @@ -937,7 +937,7 @@ func (p *Parlia) distributeIncoming(val common.Address, state *state.StateDB, he var rewards = new(big.Int) rewards = rewards.Rsh(balance, systemRewardPercent) if rewards.Cmp(common.Big0) > 0 { - err := p.distributeToSystem(rewards, state, header, chain, txs, receipts, receivedTxs, usedGas) + err := p.distributeToSystem(rewards, state, header, chain, txs, receipts, receivedTxs, usedGas, mining) if err != nil { return err } @@ -946,12 +946,12 @@ func (p *Parlia) distributeIncoming(val common.Address, state *state.StateDB, he } } log.Info("distribute to validator contract", "block hash", header.Hash(), "amount", balance) - return p.distributeToValidator(balance, val, state, header, chain, txs, receipts, receivedTxs, usedGas) + return p.distributeToValidator(balance, val, state, header, chain, txs, receipts, receivedTxs, usedGas, mining) } // slash spoiled validators func (p *Parlia) slash(spoiledVal common.Address, state *state.StateDB, header *types.Header, chain core.ChainContext, - txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64) error { + txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64, mining bool) error { // method method := "slash" @@ -966,12 +966,12 @@ func (p *Parlia) slash(spoiledVal common.Address, state *state.StateDB, header * // get system message msg := p.getSystemMessage(header.Coinbase, common.HexToAddress(SlashContract), data, common.Big0) // apply message - return p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas) + return p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas, mining) } // init contract func (p *Parlia) initContract(state *state.StateDB, header *types.Header, chain core.ChainContext, - txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64) error { + txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64, mining bool) error { // method method := "init" // contracts @@ -986,7 +986,7 @@ func (p *Parlia) initContract(state *state.StateDB, header *types.Header, chain msg := p.getSystemMessage(header.Coinbase, common.HexToAddress(c), data, common.Big0) // apply message log.Info("init contract", "block hash", header.Hash(), "contract", c) - err = p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas) + err = p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas, mining) if err != nil { return err } @@ -995,17 +995,17 @@ func (p *Parlia) initContract(state *state.StateDB, header *types.Header, chain } func (p *Parlia) distributeToSystem(amount *big.Int, state *state.StateDB, header *types.Header, chain core.ChainContext, - txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64) error { + txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64, mining bool) error { // get system message msg := p.getSystemMessage(header.Coinbase, common.HexToAddress(SystemRewardContract), nil, amount) // apply message - return p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas) + return p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas, mining) } // slash spoiled validators func (p *Parlia) distributeToValidator(amount *big.Int, validator common.Address, state *state.StateDB, header *types.Header, chain core.ChainContext, - txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64) error { + txs *[]*types.Transaction, receipts *[]*types.Receipt, receivedTxs *[]*types.Transaction, usedGas *uint64, mining bool) error { // method method := "deposit" @@ -1020,7 +1020,7 @@ func (p *Parlia) distributeToValidator(amount *big.Int, validator common.Address // get system message msg := p.getSystemMessage(header.Coinbase, common.HexToAddress(ValidatorContract), data, amount) // apply message - return p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas) + return p.applyTransaction(msg, state, header, chain, txs, receipts, receivedTxs, usedGas, mining) } // get system message @@ -1043,13 +1043,13 @@ func (p *Parlia) applyTransaction( header *types.Header, chainContext core.ChainContext, txs *[]*types.Transaction, receipts *[]*types.Receipt, - receivedTxs *[]*types.Transaction, usedGas *uint64, + receivedTxs *[]*types.Transaction, usedGas *uint64, mining bool, ) (err error) { nonce := state.GetNonce(msg.From()) expectedTx := types.NewTransaction(nonce, *msg.To(), msg.Value(), msg.Gas(), msg.GasPrice(), msg.Data()) expectedHash := p.signer.Hash(expectedTx) - if msg.From() == p.val { + if msg.From() == p.val && mining { expectedTx, err = p.signTxFn(accounts.Account{Address: msg.From()}, expectedTx, p.chainConfig.ChainID) if err != nil { return err