IBFT private state commit issue in a single validator node network (#938)

This commit is contained in:
Sai V 2020-02-12 04:21:13 +08:00 committed by GitHub
parent 29d53fb649
commit 8c50cb09e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 32 deletions

View File

@ -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.

View File

@ -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