From d669816a1b904ddcfcdf8160600b2cd0763801c3 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 11 Dec 2017 11:36:04 -0600 Subject: [PATCH] send absent validators in BeginBlock Refs #668 --- consensus/replay.go | 2 +- state/execution.go | 32 ++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/consensus/replay.go b/consensus/replay.go index 168404af0..ac9b9910a 100644 --- a/consensus/replay.go +++ b/consensus/replay.go @@ -324,7 +324,7 @@ func (h *Handshaker) replayBlocks(proxyApp proxy.AppConns, appBlockHeight, store for i := appBlockHeight + 1; i <= finalBlock; i++ { h.logger.Info("Applying block", "height", i) block := h.store.LoadBlock(i) - appHash, err = sm.ExecCommitBlock(proxyApp.Consensus(), block, h.logger) + appHash, err = sm.ExecCommitBlock(proxyApp.Consensus(), block, h.logger, h.state.LastValidators) if err != nil { return nil, err } diff --git a/state/execution.go b/state/execution.go index a5eabed27..57315432b 100644 --- a/state/execution.go +++ b/state/execution.go @@ -26,7 +26,7 @@ func (s *State) ValExecBlock(txEventPublisher types.TxEventPublisher, proxyAppCo } // Execute the block txs - abciResponses, err := execBlockOnProxyApp(txEventPublisher, proxyAppConn, block, s.logger) + abciResponses, err := execBlockOnProxyApp(txEventPublisher, proxyAppConn, block, s.logger, s.LastValidators) if err != nil { // There was some error in proxyApp // TODO Report error and wait for proxyApp to be available. @@ -39,7 +39,7 @@ func (s *State) ValExecBlock(txEventPublisher types.TxEventPublisher, proxyAppCo // Executes block's transactions on proxyAppConn. // Returns a list of transaction results and updates to the validator set // TODO: Generate a bitmap or otherwise store tx validity in state. -func execBlockOnProxyApp(txEventPublisher types.TxEventPublisher, proxyAppConn proxy.AppConnConsensus, block *types.Block, logger log.Logger) (*ABCIResponses, error) { +func execBlockOnProxyApp(txEventPublisher types.TxEventPublisher, proxyAppConn proxy.AppConnConsensus, block *types.Block, logger log.Logger, lastValidators *types.ValidatorSet) (*ABCIResponses, error) { var validTxs, invalidTxs = 0, 0 txIndex := 0 @@ -76,12 +76,28 @@ func execBlockOnProxyApp(txEventPublisher types.TxEventPublisher, proxyAppConn p } proxyAppConn.SetResponseCallback(proxyCb) + // determine validators who did not sign last block + absentVals := make([]int32, 0) + for valA, _ := range lastValidators.Validators { + found := false + for _, voteB := range block.LastCommit.Precommits { + valB := voteB.ValidatorIndex + if valA == valB { + found = true + break + } + } + if !found { + absentVals = append(absentVals, int32(valA)) + } + } + // Begin block _, err := proxyAppConn.BeginBlockSync(abci.RequestBeginBlock{ - block.Hash(), - types.TM2PB.Header(block.Header), - nil, - nil, + Hash: block.Hash(), + Header: types.TM2PB.Header(block.Header), + AbsentValidators: absentVals, + ByzantineValidators: nil, }) if err != nil { logger.Error("Error in proxyAppConn.BeginBlock", "err", err) @@ -275,8 +291,8 @@ func (s *State) CommitStateUpdateMempool(proxyAppConn proxy.AppConnConsensus, bl // ExecCommitBlock executes and commits a block on the proxyApp without validating or mutating the state. // It returns the application root hash (result of abci.Commit). -func ExecCommitBlock(appConnConsensus proxy.AppConnConsensus, block *types.Block, logger log.Logger) ([]byte, error) { - _, err := execBlockOnProxyApp(types.NopEventBus{}, appConnConsensus, block, logger) +func ExecCommitBlock(appConnConsensus proxy.AppConnConsensus, block *types.Block, logger log.Logger, lastValidators *types.ValidatorSet) ([]byte, error) { + _, err := execBlockOnProxyApp(types.NopEventBus{}, appConnConsensus, block, logger, lastValidators) if err != nil { logger.Error("Error executing block on proxy app", "height", block.Height, "err", err) return nil, err