diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-09-20 16:08:08 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-20 16:08:08 +0800 |
commit | a4b6b9e6a28a4d8fc49ee76c191454a819265713 (patch) | |
tree | 716e5724b182b8dccb01a49faec4c163f1fafdb0 /core/compaction-chain.go | |
parent | 2f1e71d9d298d1f6ade8d17a1db7a657b0223872 (diff) | |
download | dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.tar dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.tar.gz dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.tar.bz2 dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.tar.lz dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.tar.xz dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.tar.zst dexon-consensus-a4b6b9e6a28a4d8fc49ee76c191454a819265713.zip |
core: refactor witness data processing flow (#124)
Since witness data need to include data from application after it
processed a block (e.g. stateRoot). We should make the process of
witness data asynchronous.
An interface `BlockProcessedChan()` is added to the application
interface to return a channel for notifying the consensus core when a
block is processed. The notification object includes a byte slice
(witenss data) which will be include in the final witness data object.
Diffstat (limited to 'core/compaction-chain.go')
-rw-r--r-- | core/compaction-chain.go | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/core/compaction-chain.go b/core/compaction-chain.go index c72cd7b..f5c5548 100644 --- a/core/compaction-chain.go +++ b/core/compaction-chain.go @@ -107,14 +107,34 @@ func (cc *compactionChain) processBlock(block *types.Block) error { return nil } -func (cc *compactionChain) prepareWitnessAck(prvKey crypto.PrivateKey) ( - witnessAck *types.WitnessAck, err error) { - lastBlock := cc.lastBlock() - if lastBlock == nil { - err = ErrNoWitnessToAck - return +func (cc *compactionChain) processWitnessResult( + block *types.Block, result types.WitnessResult) error { + block.Witness.Data = result.Data + + // block is a genesis block, no need to update witness parent hash. + if block.IsGenesis() { + return nil } - hash, err := hashWitness(lastBlock) + + prevBlock, err := cc.db.Get(block.ParentHash) + if err != nil { + return err + } + + hash, err := hashWitness(&prevBlock) + if err != nil { + return err + } + + block.Witness.ParentHash = hash + return nil +} + +func (cc *compactionChain) prepareWitnessAck( + block *types.Block, prvKey crypto.PrivateKey) ( + witnessAck *types.WitnessAck, err error) { + + hash, err := hashWitness(block) if err != nil { return } @@ -124,7 +144,7 @@ func (cc *compactionChain) prepareWitnessAck(prvKey crypto.PrivateKey) ( } witnessAck = &types.WitnessAck{ ProposerID: types.NewNodeID(prvKey.PublicKey()), - WitnessBlockHash: lastBlock.Hash, + WitnessBlockHash: block.Hash, Signature: sig, Hash: hash, } |