mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 15:16:43 +00:00
Speed up CalcPastMedianTime by using block headers
This commit is contained in:
parent
02ddc321ff
commit
8afb245c50
1 changed files with 18 additions and 4 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue