aboutsummaryrefslogtreecommitdiffstats
path: root/les/odr_requests.go
diff options
context:
space:
mode:
authorZsolt Felfoldi <zsfelfoldi@gmail.com>2019-04-05 23:01:51 +0800
committerZsolt Felfoldi <zsfelfoldi@gmail.com>2019-04-08 19:17:24 +0800
commit5515f364ae1673c1bf5569c089b5853c90ea1655 (patch)
treec220d8e953d8f075cc39d4ceb0d01d658052bd4f /les/odr_requests.go
parent3996bc1ad91665ad30036713fba11840a36dfff0 (diff)
downloadgo-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.tar
go-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.tar.gz
go-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.tar.bz2
go-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.tar.lz
go-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.tar.xz
go-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.tar.zst
go-tangerine-5515f364ae1673c1bf5569c089b5853c90ea1655.zip
les: removed les/1 protocol messages
Diffstat (limited to 'les/odr_requests.go')
-rw-r--r--les/odr_requests.go198
1 files changed, 57 insertions, 141 deletions
diff --git a/les/odr_requests.go b/les/odr_requests.go
index 6bd4a2931..66d6175b8 100644
--- a/les/odr_requests.go
+++ b/les/odr_requests.go
@@ -188,14 +188,7 @@ type TrieRequest light.TrieRequest
// GetCost returns the cost of the given ODR request according to the serving
// peer's cost table (implementation of LesOdrRequest)
func (r *TrieRequest) GetCost(peer *peer) uint64 {
- switch peer.version {
- case lpv1:
- return peer.GetRequestCost(GetProofsV1Msg, 1)
- case lpv2:
- return peer.GetRequestCost(GetProofsV2Msg, 1)
- default:
- panic(nil)
- }
+ return peer.GetRequestCost(GetProofsV2Msg, 1)
}
// CanSend tells if a certain peer is suitable for serving the given request
@@ -220,38 +213,22 @@ func (r *TrieRequest) Request(reqID uint64, peer *peer) error {
func (r *TrieRequest) Validate(db ethdb.Database, msg *Msg) error {
log.Debug("Validating trie proof", "root", r.Id.Root, "key", r.Key)
- switch msg.MsgType {
- case MsgProofsV1:
- proofs := msg.Obj.([]light.NodeList)
- if len(proofs) != 1 {
- return errInvalidEntryCount
- }
- nodeSet := proofs[0].NodeSet()
- // Verify the proof and store if checks out
- if _, _, err := trie.VerifyProof(r.Id.Root, r.Key, nodeSet); err != nil {
- return fmt.Errorf("merkle proof verification failed: %v", err)
- }
- r.Proof = nodeSet
- return nil
-
- case MsgProofsV2:
- proofs := msg.Obj.(light.NodeList)
- // Verify the proof and store if checks out
- nodeSet := proofs.NodeSet()
- reads := &readTraceDB{db: nodeSet}
- if _, _, err := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil {
- return fmt.Errorf("merkle proof verification failed: %v", err)
- }
- // check if all nodes have been read by VerifyProof
- if len(reads.reads) != nodeSet.KeyCount() {
- return errUselessNodes
- }
- r.Proof = nodeSet
- return nil
-
- default:
+ if msg.MsgType != MsgProofsV2 {
return errInvalidMessageType
}
+ proofs := msg.Obj.(light.NodeList)
+ // Verify the proof and store if checks out
+ nodeSet := proofs.NodeSet()
+ reads := &readTraceDB{db: nodeSet}
+ if _, _, err := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil {
+ return fmt.Errorf("merkle proof verification failed: %v", err)
+ }
+ // check if all nodes have been read by VerifyProof
+ if len(reads.reads) != nodeSet.KeyCount() {
+ return errUselessNodes
+ }
+ r.Proof = nodeSet
+ return nil
}
type CodeReq struct {
@@ -330,32 +307,13 @@ type HelperTrieResps struct { // describes all responses, not just a single one
AuxData [][]byte
}
-// legacy LES/1
-type ChtReq struct {
- ChtNum, BlockNum uint64
- FromLevel uint
-}
-
-// legacy LES/1
-type ChtResp struct {
- Header *types.Header
- Proof []rlp.RawValue
-}
-
// ODR request type for requesting headers by Canonical Hash Trie, see LesOdrRequest interface
type ChtRequest light.ChtRequest
// GetCost returns the cost of the given ODR request according to the serving
// peer's cost table (implementation of LesOdrRequest)
func (r *ChtRequest) GetCost(peer *peer) uint64 {
- switch peer.version {
- case lpv1:
- return peer.GetRequestCost(GetHeaderProofsMsg, 1)
- case lpv2:
- return peer.GetRequestCost(GetHelperTrieProofsMsg, 1)
- default:
- panic(nil)
- }
+ return peer.GetRequestCost(GetHelperTrieProofsMsg, 1)
}
// CanSend tells if a certain peer is suitable for serving the given request
@@ -377,21 +335,7 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error {
Key: encNum[:],
AuxReq: auxHeader,
}
- 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) * (r.Config.ChtSize / r.Config.PairChtSize), BlockNum: blockNum, FromLevel: req.FromLevel}
- return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []ChtReq{reqsV1})
- case lpv2:
- return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req})
- default:
- panic(nil)
- }
+ return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req})
}
// Valid processes an ODR request reply message from the LES network
@@ -400,78 +344,50 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error {
func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error {
log.Debug("Validating CHT", "cht", r.ChtNum, "block", r.BlockNum)
- switch msg.MsgType {
- case MsgHeaderProofs: // LES/1 backwards compatibility
- proofs := msg.Obj.([]ChtResp)
- if len(proofs) != 1 {
- return errInvalidEntryCount
- }
- proof := proofs[0]
-
- // Verify the CHT
- var encNumber [8]byte
- binary.BigEndian.PutUint64(encNumber[:], r.BlockNum)
-
- value, _, err := trie.VerifyProof(r.ChtRoot, encNumber[:], light.NodeList(proof.Proof).NodeSet())
- if err != nil {
- return err
- }
- var node light.ChtNode
- if err := rlp.DecodeBytes(value, &node); err != nil {
- return err
- }
- if node.Hash != proof.Header.Hash() {
- return errCHTHashMismatch
- }
- // Verifications passed, store and return
- r.Header = proof.Header
- r.Proof = light.NodeList(proof.Proof).NodeSet()
- r.Td = node.Td
- case MsgHelperTrieProofs:
- resp := msg.Obj.(HelperTrieResps)
- if len(resp.AuxData) != 1 {
- return errInvalidEntryCount
- }
- nodeSet := resp.Proofs.NodeSet()
- headerEnc := resp.AuxData[0]
- if len(headerEnc) == 0 {
- return errHeaderUnavailable
- }
- header := new(types.Header)
- if err := rlp.DecodeBytes(headerEnc, header); err != nil {
- return errHeaderUnavailable
- }
+ if msg.MsgType != MsgHelperTrieProofs {
+ return errInvalidMessageType
+ }
+ resp := msg.Obj.(HelperTrieResps)
+ if len(resp.AuxData) != 1 {
+ return errInvalidEntryCount
+ }
+ nodeSet := resp.Proofs.NodeSet()
+ headerEnc := resp.AuxData[0]
+ if len(headerEnc) == 0 {
+ return errHeaderUnavailable
+ }
+ header := new(types.Header)
+ if err := rlp.DecodeBytes(headerEnc, header); err != nil {
+ return errHeaderUnavailable
+ }
- // Verify the CHT
- var encNumber [8]byte
- binary.BigEndian.PutUint64(encNumber[:], r.BlockNum)
+ // Verify the CHT
+ var encNumber [8]byte
+ binary.BigEndian.PutUint64(encNumber[:], r.BlockNum)
- reads := &readTraceDB{db: nodeSet}
- value, _, err := trie.VerifyProof(r.ChtRoot, encNumber[:], reads)
- if err != nil {
- return fmt.Errorf("merkle proof verification failed: %v", err)
- }
- if len(reads.reads) != nodeSet.KeyCount() {
- return errUselessNodes
- }
+ reads := &readTraceDB{db: nodeSet}
+ value, _, err := trie.VerifyProof(r.ChtRoot, encNumber[:], reads)
+ if err != nil {
+ return fmt.Errorf("merkle proof verification failed: %v", err)
+ }
+ if len(reads.reads) != nodeSet.KeyCount() {
+ return errUselessNodes
+ }
- var node light.ChtNode
- if err := rlp.DecodeBytes(value, &node); err != nil {
- return err
- }
- if node.Hash != header.Hash() {
- return errCHTHashMismatch
- }
- if r.BlockNum != header.Number.Uint64() {
- return errCHTNumberMismatch
- }
- // Verifications passed, store and return
- r.Header = header
- r.Proof = nodeSet
- r.Td = node.Td
- default:
- return errInvalidMessageType
+ var node light.ChtNode
+ if err := rlp.DecodeBytes(value, &node); err != nil {
+ return err
+ }
+ if node.Hash != header.Hash() {
+ return errCHTHashMismatch
+ }
+ if r.BlockNum != header.Number.Uint64() {
+ return errCHTNumberMismatch
}
+ // Verifications passed, store and return
+ r.Header = header
+ r.Proof = nodeSet
+ r.Td = node.Td
return nil
}