|
|
@@ -55,6 +55,7 @@ var (
|
|
|
const (
|
|
|
bodyCacheLimit = 256
|
|
|
blockCacheLimit = 256
|
|
|
+ receiptsCacheLimit = 32
|
|
|
maxFutureBlocks = 256
|
|
|
maxTimeFutureBlocks = 30
|
|
|
badBlockLimit = 10
|
|
|
@@ -111,11 +112,12 @@ type BlockChain struct {
|
|
|
currentBlock atomic.Value // Current head of the block chain
|
|
|
currentFastBlock atomic.Value // Current head of the fast-sync chain (may be above the block chain!)
|
|
|
|
|
|
- stateCache state.Database // State database to reuse between imports (contains state cache)
|
|
|
- bodyCache *lru.Cache // Cache for the most recent block bodies
|
|
|
- bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format
|
|
|
- blockCache *lru.Cache // Cache for the most recent entire blocks
|
|
|
- futureBlocks *lru.Cache // future blocks are blocks added for later processing
|
|
|
+ stateCache state.Database // State database to reuse between imports (contains state cache)
|
|
|
+ bodyCache *lru.Cache // Cache for the most recent block bodies
|
|
|
+ bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format
|
|
|
+ receiptsCache *lru.Cache // Cache for the most recent receipts per block
|
|
|
+ blockCache *lru.Cache // Cache for the most recent entire blocks
|
|
|
+ futureBlocks *lru.Cache // future blocks are blocks added for later processing
|
|
|
|
|
|
quit chan struct{} // blockchain quit channel
|
|
|
running int32 // running must be called atomically
|
|
|
@@ -144,6 +146,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par
|
|
|
}
|
|
|
bodyCache, _ := lru.New(bodyCacheLimit)
|
|
|
bodyRLPCache, _ := lru.New(bodyCacheLimit)
|
|
|
+ receiptsCache, _ := lru.New(receiptsCacheLimit)
|
|
|
blockCache, _ := lru.New(blockCacheLimit)
|
|
|
futureBlocks, _ := lru.New(maxFutureBlocks)
|
|
|
badBlocks, _ := lru.New(badBlockLimit)
|
|
|
@@ -158,6 +161,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par
|
|
|
shouldPreserve: shouldPreserve,
|
|
|
bodyCache: bodyCache,
|
|
|
bodyRLPCache: bodyRLPCache,
|
|
|
+ receiptsCache: receiptsCache,
|
|
|
blockCache: blockCache,
|
|
|
futureBlocks: futureBlocks,
|
|
|
engine: engine,
|
|
|
@@ -280,6 +284,7 @@ func (bc *BlockChain) SetHead(head uint64) error {
|
|
|
// Clear out any stale content from the caches
|
|
|
bc.bodyCache.Purge()
|
|
|
bc.bodyRLPCache.Purge()
|
|
|
+ bc.receiptsCache.Purge()
|
|
|
bc.blockCache.Purge()
|
|
|
bc.futureBlocks.Purge()
|
|
|
|
|
|
@@ -603,11 +608,18 @@ func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block {
|
|
|
|
|
|
// GetReceiptsByHash retrieves the receipts for all transactions in a given block.
|
|
|
func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts {
|
|
|
+ if receipts, ok := bc.receiptsCache.Get(hash); ok {
|
|
|
+ return receipts.(types.Receipts)
|
|
|
+ }
|
|
|
+
|
|
|
number := rawdb.ReadHeaderNumber(bc.db, hash)
|
|
|
if number == nil {
|
|
|
return nil
|
|
|
}
|
|
|
- return rawdb.ReadReceipts(bc.db, hash, *number)
|
|
|
+
|
|
|
+ receipts := rawdb.ReadReceipts(bc.db, hash, *number)
|
|
|
+ bc.receiptsCache.Add(hash, receipts)
|
|
|
+ return receipts
|
|
|
}
|
|
|
|
|
|
// GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors.
|