From b790f4aab8f0625df6e605ceda5c80c08e2f0f13 Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Wed, 18 Jul 2018 15:39:43 +0800 Subject: [PATCH] les: remove hardcode indexer params --- les/odr.go | 2 +- les/odr_requests.go | 32 +++++++++++++++++++++++--------- les/peer.go | 16 ++-------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/les/odr.go b/les/odr.go index 3c2c48df94..7a775be8c7 100644 --- a/les/odr.go +++ b/les/odr.go @@ -106,7 +106,7 @@ func (odr *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err erro p := dp.(*peer) cost := lreq.GetCost(p) p.fcServer.QueueRequest(reqID, cost) - return func() { lreq.Request(reqID, p) } + return func() { lreq.Request(reqID, p, odr.indexerConfig) } }, } diff --git a/les/odr_requests.go b/les/odr_requests.go index eb19ec2a0b..b5c9891cd2 100644 --- a/les/odr_requests.go +++ b/les/odr_requests.go @@ -50,7 +50,7 @@ var ( type LesOdrRequest interface { GetCost(*peer) uint64 CanSend(*peer, *light.IndexerConfig) bool - Request(uint64, *peer) error + Request(uint64, *peer, *light.IndexerConfig) error Validate(ethdb.Database, *Msg) error } @@ -88,7 +88,7 @@ func (r *BlockRequest) CanSend(peer *peer, config *light.IndexerConfig) bool { } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) -func (r *BlockRequest) Request(reqID uint64, peer *peer) error { +func (r *BlockRequest) Request(reqID uint64, peer *peer, config *light.IndexerConfig) error { peer.Log().Debug("Requesting block body", "hash", r.Hash) return peer.RequestBodies(reqID, r.GetCost(peer), []common.Hash{r.Hash}) } @@ -144,7 +144,7 @@ func (r *ReceiptsRequest) CanSend(peer *peer, config *light.IndexerConfig) bool } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) -func (r *ReceiptsRequest) Request(reqID uint64, peer *peer) error { +func (r *ReceiptsRequest) Request(reqID uint64, peer *peer, config *light.IndexerConfig) error { peer.Log().Debug("Requesting block receipts", "hash", r.Hash) return peer.RequestReceipts(reqID, r.GetCost(peer), []common.Hash{r.Hash}) } @@ -206,7 +206,7 @@ func (r *TrieRequest) CanSend(peer *peer, config *light.IndexerConfig) bool { } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) -func (r *TrieRequest) Request(reqID uint64, peer *peer) error { +func (r *TrieRequest) Request(reqID uint64, peer *peer, config *light.IndexerConfig) error { peer.Log().Debug("Requesting trie proof", "root", r.Id.Root, "key", r.Key) req := ProofReq{ BHash: r.Id.BlockHash, @@ -276,7 +276,7 @@ func (r *CodeRequest) CanSend(peer *peer, config *light.IndexerConfig) bool { } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) -func (r *CodeRequest) Request(reqID uint64, peer *peer) error { +func (r *CodeRequest) Request(reqID uint64, peer *peer, config *light.IndexerConfig) error { peer.Log().Debug("Requesting code data", "hash", r.Hash) req := CodeReq{ BHash: r.Id.BlockHash, @@ -369,7 +369,7 @@ func (r *ChtRequest) CanSend(peer *peer, config *light.IndexerConfig) bool { } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) -func (r *ChtRequest) Request(reqID uint64, peer *peer) error { +func (r *ChtRequest) Request(reqID uint64, peer *peer, config *light.IndexerConfig) error { peer.Log().Debug("Requesting CHT", "cht", r.ChtNum, "block", r.BlockNum) var encNum [8]byte binary.BigEndian.PutUint64(encNum[:], r.BlockNum) @@ -379,7 +379,21 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error { Key: encNum[:], AuxReq: auxHeader, } - return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) + switch peer.version { + case lpv1: + var reqsV1 ChtReq + if req.Type != htCanonical || req.AuxReq != auxHeader || len(req.Key) != 8 { + return fmt.Errorf("Request invalid in LES/1 mode") + } + blockNum := binary.BigEndian.Uint64(req.Key) + // convert HelperTrie request to old CHT request + reqsV1 = ChtReq{ChtNum: (req.TrieIdx+1)*(config.ChtSize/config.ChtClientSize) - 1, BlockNum: blockNum, FromLevel: req.FromLevel} + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []interface{}{reqsV1}) + case lpv2: + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []interface{}{req}) + default: + panic(nil) + } } // Valid processes an ODR request reply message from the LES network @@ -488,7 +502,7 @@ func (r *BloomRequest) CanSend(peer *peer, config *light.IndexerConfig) bool { } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) -func (r *BloomRequest) Request(reqID uint64, peer *peer) error { +func (r *BloomRequest) Request(reqID uint64, peer *peer, config *light.IndexerConfig) error { peer.Log().Debug("Requesting BloomBits", "bloomTrie", r.BloomTrieNum, "bitIdx", r.BitIdx, "sections", r.SectionIdxList) reqs := make([]HelperTrieReq, len(r.SectionIdxList)) @@ -503,7 +517,7 @@ func (r *BloomRequest) Request(reqID uint64, peer *peer) error { Key: common.CopyBytes(encNumber[:]), } } - return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), reqs) + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []interface{}{reqs}) } // Valid processes an ODR request reply message from the LES network diff --git a/les/peer.go b/les/peer.go index 76afa25a45..87c213cd5e 100644 --- a/les/peer.go +++ b/les/peer.go @@ -19,7 +19,6 @@ package les import ( "crypto/ecdsa" - "encoding/binary" "errors" "fmt" "math/big" @@ -32,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/les/flowcontrol" "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) @@ -285,21 +283,11 @@ func (p *peer) RequestProofs(reqID, cost uint64, reqs []ProofReq) error { } // RequestHelperTrieProofs fetches a batch of HelperTrie merkle proofs from a remote node. -func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, reqs []HelperTrieReq) error { +func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, reqs []interface{}) error { p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) switch p.version { case lpv1: - reqsV1 := make([]ChtReq, len(reqs)) - for i, req := range reqs { - if req.Type != htCanonical || req.AuxReq != auxHeader || len(req.Key) != 8 { - return fmt.Errorf("Request invalid in LES/1 mode") - } - blockNum := binary.BigEndian.Uint64(req.Key) - // convert HelperTrie request to old CHT request - reqsV1[i] = ChtReq{ChtNum: (req.TrieIdx + 1) * (params.CHTFrequencyClient / params.CHTFrequencyServer), BlockNum: blockNum, FromLevel: req.FromLevel} - - } - return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqsV1) + return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqs) case lpv2: return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) default: