From 8c50cb09e7f204f4ef9fe1a60807b1d2a23ea266 Mon Sep 17 00:00:00 2001 From: Sai V Date: Wed, 12 Feb 2020 04:21:13 +0800 Subject: [PATCH] IBFT private state commit issue in a single validator node network (#938) --- core/blockchain.go | 38 +++++++++++++++++--------------------- miner/worker.go | 13 ++----------- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 4cffd7d7c..19bcb6500 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -936,6 +936,23 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. bc.mu.Lock() defer bc.mu.Unlock() + // Quorum + // Write private state changes to database + privateRoot, err := privateState.Commit(bc.chainConfig.IsEIP158(block.Number())) + if err != nil { + return NonStatTy, err + } + if err := WritePrivateStateRoot(bc.db, block.Root(), privateRoot); err != nil { + log.Error("Failed writing private state root", "err", err) + return NonStatTy, err + } + // Explicit commit for privateStateTriedb + privateTriedb := bc.privateStateCache.TrieDB() + if err := privateTriedb.Commit(privateRoot, false); err != nil { + return NonStatTy, err + } + // /Quorum + currentBlock := bc.CurrentBlock() localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) @@ -953,17 +970,6 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. } triedb := bc.stateCache.TrieDB() - // Explicit commit for privateStateTriedb to handle Raft db issues - if privateState != nil { - privateRoot, err := privateState.Commit(bc.chainConfig.IsEIP158(block.Number())) - if err != nil { - return NonStatTy, err - } - privateTriedb := bc.privateStateCache.TrieDB() - if err := privateTriedb.Commit(privateRoot, false); err != nil { - return NonStatTy, err - } - } // If we're running an archive node, always flush if bc.cacheConfig.Disabled { @@ -1269,17 +1275,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty return i, events, coalescedLogs, err } - // Quorum - // Write private state changes to database - if privateStateRoot, err = privateState.Commit(bc.Config().IsEIP158(block.Number())); err != nil { - return i, events, coalescedLogs, err - } - if err := WritePrivateStateRoot(bc.db, block.Root(), privateStateRoot); err != nil { - return i, events, coalescedLogs, err - } allReceipts := mergeReceipts(receipts, privateReceipts) - // /Quorum - proctime := time.Since(bstart) // Write the block to the chain and get the status. diff --git a/miner/worker.go b/miner/worker.go index 42cea0ae2..bdaea7598 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -592,20 +592,11 @@ func (w *worker) resultLoop() { logs = append(logs, receipt.Logs...) } - // write private transactions - privateStateRoot, err := task.privateState.Commit(w.config.IsEIP158(block.Number())) - if err != nil { - log.Error("Failed committing private state root", "err", err) - continue - } - if err := core.WritePrivateStateRoot(w.eth.ChainDb(), block.Root(), privateStateRoot); err != nil { - log.Error("Failed writing private state root", "err", err) - continue - } allReceipts := mergeReceipts(task.receipts, task.privateReceipts) // Commit block and state to database. - stat, err := w.chain.WriteBlockWithState(block, allReceipts, task.state, nil) + stat, err := w.chain.WriteBlockWithState(block, allReceipts, task.state, task.privateState) + if err != nil { log.Error("Failed writing block to chain", "err", err) continue