From a4b6b9e6a28a4d8fc49ee76c191454a819265713 Mon Sep 17 00:00:00 2001 From: Wei-Ning Huang Date: Thu, 20 Sep 2018 16:08:08 +0800 Subject: 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. --- core/compaction-chain.go | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'core/compaction-chain.go') 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, } -- cgit v1.2.3