aboutsummaryrefslogtreecommitdiffstats
path: root/core/compaction-chain.go
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-09-20 16:08:08 +0800
committerGitHub <noreply@github.com>2018-09-20 16:08:08 +0800
commita4b6b9e6a28a4d8fc49ee76c191454a819265713 (patch)
tree716e5724b182b8dccb01a49faec4c163f1fafdb0 /core/compaction-chain.go
parent2f1e71d9d298d1f6ade8d17a1db7a657b0223872 (diff)
downloaddexon-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.go36
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,
}