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. --- simulation/app.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'simulation/app.go') diff --git a/simulation/app.go b/simulation/app.go index 9c5619a..d00cf19 100644 --- a/simulation/app.go +++ b/simulation/app.go @@ -40,6 +40,7 @@ type simApp struct { unconfirmedBlocks map[types.NodeID]common.Hashes blockByHash map[common.Hash]*types.Block blockByHashMutex sync.RWMutex + witnessResultChan chan types.WitnessResult } // newSimApp returns point to a new instance of simApp. @@ -51,6 +52,7 @@ func newSimApp(id types.NodeID, netModule *network) *simApp { blockSeen: make(map[common.Hash]time.Time), unconfirmedBlocks: make(map[types.NodeID]common.Hashes), blockByHash: make(map[common.Hash]*types.Block), + witnessResultChan: make(chan types.WitnessResult), } } @@ -193,6 +195,19 @@ func (a *simApp) DeliverBlock(blockHash common.Hash, timestamp time.Time) { Payload: jsonPayload, } a.netModule.report(msg) + + go func() { + a.witnessResultChan <- types.WitnessResult{ + BlockHash: blockHash, + Data: []byte(fmt.Sprintf("Block %s", blockHash)), + } + }() +} + +// BlockProcessedChan returns a channel to receive the block hashes that have +// finished processing by the application. +func (a *simApp) BlockProcessedChan() <-chan types.WitnessResult { + return a.witnessResultChan } // WitnessAckDeliver is called when a witness ack is created. -- cgit v1.2.3