From 8afb245c506dca137a4e9875abf4da32f6fad865 Mon Sep 17 00:00:00 2001 From: Julian Yap Date: Wed, 15 Mar 2017 17:33:44 -1000 Subject: [PATCH] Speed up CalcPastMedianTime by using block headers --- core/blockchain.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 5db25be6cc..6ab1bc996b 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -529,12 +529,12 @@ func (bc *BlockChain) CalcPastMedianTime(number uint64) *big.Int { timestamps := make([]*big.Int, medianTimeBlocks) numNodes := 0 - iterNode := bc.GetBlockByNumber(number) + iterNode := bc.GetHeaderByNumber(number) - ancestors := make(map[common.Hash]*types.Block) - for i, ancestor := range bc.GetBlocksFromHash(iterNode.Hash(), medianTimeBlocks) { + ancestors := make(map[common.Hash]*types.Header) + for i, ancestor := range bc.GetBlockHeadersFromHash(iterNode.Hash(), medianTimeBlocks) { ancestors[ancestor.Hash()] = ancestor - timestamps[i] = ancestor.Time() + timestamps[i] = ancestor.Time numNodes++ } @@ -1375,6 +1375,20 @@ func (self *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []c return self.hc.GetBlockHashesFromHash(hash, max) } +func (self *BlockChain) GetBlockHeadersFromHash(hash common.Hash, n int) (blockHeaders []*types.Header) { + number := self.hc.GetBlockNumber(hash) + for i := 0; i < n; i++ { + blockHeader := self.GetHeader(hash, number) + if blockHeader == nil { + break + } + blockHeaders = append(blockHeaders, blockHeader) + hash = blockHeader.ParentHash + number-- + } + return +} + // GetHeaderByNumber retrieves a block header from the database by number, // caching it (associated with its hash) if found. func (self *BlockChain) GetHeaderByNumber(number uint64) *types.Header {