From 9b75ce0713fe985a85fdbe991b91033ce512770d Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Thu, 14 Jun 2018 11:33:48 +0200 Subject: [PATCH] eth, les: share code to serve block receipts --- eth/handler.go | 32 +++++++++++++++++++++----------- les/handler.go | 16 ++-------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index 59a8aaed5e..b0d5964e24 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -505,17 +505,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } else if err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - // Retrieve the requested block's receipts, skipping if unknown to us - results := pm.blockchain.GetReceiptsByHash(hash) - if results == nil { - if header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { - continue - } - } - // If known, encode and queue for response packet - if encoded, err := rlp.EncodeToBytes(results); err != nil { - log.Error("Failed to encode receipt", "err", err) - } else { + + if encoded := ServeBlockReceipts(pm.blockchain, hash); encoded != nil { receipts = append(receipts, encoded) bytes += len(encoded) } @@ -694,6 +685,25 @@ func ServeBlockHeaders(blockchain *core.BlockChain, peer *p2p.Peer, originHash c return headers } +// ServeBlockReceipts fetches and encodes the block receipts of a single block, +// returning nil if unknown +func ServeBlockReceipts(blockchain *core.BlockChain, hash common.Hash) rlp.RawValue { + // Retrieve the requested block's receipts, skipping if unknown to us + results := blockchain.GetReceiptsByHash(hash) + if results == nil { + if header := blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { + return nil + } + } + // If known, encode and queue for response packet + if encoded, err := rlp.EncodeToBytes(results); err != nil { + log.Error("Failed to encode receipt", "err", err) + return nil + } else { + return encoded + } +} + // BroadcastBlock will either propagate a block to a subset of it's peers, or // will only announce it's availability (depending what's requested). func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) { diff --git a/les/handler.go b/les/handler.go index 9f2491d5cb..caf76e851e 100644 --- a/les/handler.go +++ b/les/handler.go @@ -587,20 +587,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if bytes >= softResponseLimit { break } - // Retrieve the requested block's receipts, skipping if unknown to us - var results types.Receipts - if number := rawdb.ReadHeaderNumber(pm.chainDb, hash); number != nil { - results = rawdb.ReadReceipts(pm.chainDb, hash, *number) - } - if results == nil { - if header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { - continue - } - } - // If known, encode and queue for response packet - if encoded, err := rlp.EncodeToBytes(results); err != nil { - log.Error("Failed to encode receipt", "err", err) - } else { + + if encoded := eth.ServeBlockReceipts(pm.blockchain.(*core.BlockChain), hash); encoded != nil { receipts = append(receipts, encoded) bytes += len(encoded) }