Speed up CalcPastMedianTime by using block headers

This commit is contained in:
Julian Yap 2017-03-15 17:33:44 -10:00
parent 02ddc321ff
commit 8afb245c50

View file

@ -529,12 +529,12 @@ func (bc *BlockChain) CalcPastMedianTime(number uint64) *big.Int {
timestamps := make([]*big.Int, medianTimeBlocks) timestamps := make([]*big.Int, medianTimeBlocks)
numNodes := 0 numNodes := 0
iterNode := bc.GetBlockByNumber(number) iterNode := bc.GetHeaderByNumber(number)
ancestors := make(map[common.Hash]*types.Block) ancestors := make(map[common.Hash]*types.Header)
for i, ancestor := range bc.GetBlocksFromHash(iterNode.Hash(), medianTimeBlocks) { for i, ancestor := range bc.GetBlockHeadersFromHash(iterNode.Hash(), medianTimeBlocks) {
ancestors[ancestor.Hash()] = ancestor ancestors[ancestor.Hash()] = ancestor
timestamps[i] = ancestor.Time() timestamps[i] = ancestor.Time
numNodes++ numNodes++
} }
@ -1375,6 +1375,20 @@ func (self *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []c
return self.hc.GetBlockHashesFromHash(hash, max) 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, // GetHeaderByNumber retrieves a block header from the database by number,
// caching it (associated with its hash) if found. // caching it (associated with its hash) if found.
func (self *BlockChain) GetHeaderByNumber(number uint64) *types.Header { func (self *BlockChain) GetHeaderByNumber(number uint64) *types.Header {