forked from cerc-io/plugeth
all: move light.NodeSet to trienode.ProofSet (#28287)
This is a minor refactor in preparation of changes to range verifier. This PR contains no intentional functional changes but moves (and renames) the light.NodeSet
This commit is contained in:
parent
db9afae2ea
commit
6b1e4f4211
@ -27,8 +27,8 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/eth/protocols/snap"
|
"github.com/ethereum/go-ethereum/eth/protocols/snap"
|
||||||
"github.com/ethereum/go-ethereum/internal/utesting"
|
"github.com/ethereum/go-ethereum/internal/utesting"
|
||||||
"github.com/ethereum/go-ethereum/light"
|
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -530,11 +530,11 @@ func (s *Suite) snapGetAccountRange(t *utesting.T, tc *accRangeTest) error {
|
|||||||
for i, key := range hashes {
|
for i, key := range hashes {
|
||||||
keys[i] = common.CopyBytes(key[:])
|
keys[i] = common.CopyBytes(key[:])
|
||||||
}
|
}
|
||||||
nodes := make(light.NodeList, len(proof))
|
nodes := make(trienode.ProofList, len(proof))
|
||||||
for i, node := range proof {
|
for i, node := range proof {
|
||||||
nodes[i] = node
|
nodes[i] = node
|
||||||
}
|
}
|
||||||
proofdb := nodes.NodeSet()
|
proofdb := nodes.Set()
|
||||||
|
|
||||||
var end []byte
|
var end []byte
|
||||||
if len(keys) > 0 {
|
if len(keys) > 0 {
|
||||||
|
@ -24,13 +24,13 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/light"
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/metrics"
|
"github.com/ethereum/go-ethereum/metrics"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -321,7 +321,7 @@ func ServiceGetAccountRangeQuery(chain *core.BlockChain, req *GetAccountRangePac
|
|||||||
it.Release()
|
it.Release()
|
||||||
|
|
||||||
// Generate the Merkle proofs for the first and last account
|
// Generate the Merkle proofs for the first and last account
|
||||||
proof := light.NewNodeSet()
|
proof := trienode.NewProofSet()
|
||||||
if err := tr.Prove(req.Origin[:], proof); err != nil {
|
if err := tr.Prove(req.Origin[:], proof); err != nil {
|
||||||
log.Warn("Failed to prove account range", "origin", req.Origin, "err", err)
|
log.Warn("Failed to prove account range", "origin", req.Origin, "err", err)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -333,7 +333,7 @@ func ServiceGetAccountRangeQuery(chain *core.BlockChain, req *GetAccountRangePac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var proofs [][]byte
|
var proofs [][]byte
|
||||||
for _, blob := range proof.NodeList() {
|
for _, blob := range proof.List() {
|
||||||
proofs = append(proofs, blob)
|
proofs = append(proofs, blob)
|
||||||
}
|
}
|
||||||
return accounts, proofs
|
return accounts, proofs
|
||||||
@ -427,7 +427,7 @@ func ServiceGetStorageRangesQuery(chain *core.BlockChain, req *GetStorageRangesP
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
proof := light.NewNodeSet()
|
proof := trienode.NewProofSet()
|
||||||
if err := stTrie.Prove(origin[:], proof); err != nil {
|
if err := stTrie.Prove(origin[:], proof); err != nil {
|
||||||
log.Warn("Failed to prove storage range", "origin", req.Origin, "err", err)
|
log.Warn("Failed to prove storage range", "origin", req.Origin, "err", err)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -438,7 +438,7 @@ func ServiceGetStorageRangesQuery(chain *core.BlockChain, req *GetStorageRangesP
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, blob := range proof.NodeList() {
|
for _, blob := range proof.List() {
|
||||||
proofs = append(proofs, blob)
|
proofs = append(proofs, blob)
|
||||||
}
|
}
|
||||||
// Proof terminates the reply as proofs are only added if a node
|
// Proof terminates the reply as proofs are only added if a node
|
||||||
|
@ -37,11 +37,11 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
"github.com/ethereum/go-ethereum/light"
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/p2p/msgrate"
|
"github.com/ethereum/go-ethereum/p2p/msgrate"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -2394,11 +2394,11 @@ func (s *Syncer) OnAccounts(peer SyncPeer, id uint64, hashes []common.Hash, acco
|
|||||||
for i, key := range hashes {
|
for i, key := range hashes {
|
||||||
keys[i] = common.CopyBytes(key[:])
|
keys[i] = common.CopyBytes(key[:])
|
||||||
}
|
}
|
||||||
nodes := make(light.NodeList, len(proof))
|
nodes := make(trienode.ProofList, len(proof))
|
||||||
for i, node := range proof {
|
for i, node := range proof {
|
||||||
nodes[i] = node
|
nodes[i] = node
|
||||||
}
|
}
|
||||||
proofdb := nodes.NodeSet()
|
proofdb := nodes.Set()
|
||||||
|
|
||||||
var end []byte
|
var end []byte
|
||||||
if len(keys) > 0 {
|
if len(keys) > 0 {
|
||||||
@ -2639,7 +2639,7 @@ func (s *Syncer) OnStorage(peer SyncPeer, id uint64, hashes [][]common.Hash, slo
|
|||||||
for j, key := range hashes[i] {
|
for j, key := range hashes[i] {
|
||||||
keys[j] = common.CopyBytes(key[:])
|
keys[j] = common.CopyBytes(key[:])
|
||||||
}
|
}
|
||||||
nodes := make(light.NodeList, 0, len(proof))
|
nodes := make(trienode.ProofList, 0, len(proof))
|
||||||
if i == len(hashes)-1 {
|
if i == len(hashes)-1 {
|
||||||
for _, node := range proof {
|
for _, node := range proof {
|
||||||
nodes = append(nodes, node)
|
nodes = append(nodes, node)
|
||||||
@ -2658,7 +2658,7 @@ func (s *Syncer) OnStorage(peer SyncPeer, id uint64, hashes [][]common.Hash, slo
|
|||||||
} else {
|
} else {
|
||||||
// A proof was attached, the response is only partial, check that the
|
// A proof was attached, the response is only partial, check that the
|
||||||
// returned data is indeed part of the storage trie
|
// returned data is indeed part of the storage trie
|
||||||
proofdb := nodes.NodeSet()
|
proofdb := nodes.Set()
|
||||||
|
|
||||||
var end []byte
|
var end []byte
|
||||||
if len(keys) > 0 {
|
if len(keys) > 0 {
|
||||||
|
@ -31,7 +31,6 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
"github.com/ethereum/go-ethereum/light"
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
@ -273,7 +272,7 @@ func createAccountRequestResponse(t *testPeer, root common.Hash, origin common.H
|
|||||||
// Unless we send the entire trie, we need to supply proofs
|
// Unless we send the entire trie, we need to supply proofs
|
||||||
// Actually, we need to supply proofs either way! This seems to be an implementation
|
// Actually, we need to supply proofs either way! This seems to be an implementation
|
||||||
// quirk in go-ethereum
|
// quirk in go-ethereum
|
||||||
proof := light.NewNodeSet()
|
proof := trienode.NewProofSet()
|
||||||
if err := t.accountTrie.Prove(origin[:], proof); err != nil {
|
if err := t.accountTrie.Prove(origin[:], proof); err != nil {
|
||||||
t.logger.Error("Could not prove inexistence of origin", "origin", origin, "error", err)
|
t.logger.Error("Could not prove inexistence of origin", "origin", origin, "error", err)
|
||||||
}
|
}
|
||||||
@ -283,7 +282,7 @@ func createAccountRequestResponse(t *testPeer, root common.Hash, origin common.H
|
|||||||
t.logger.Error("Could not prove last item", "error", err)
|
t.logger.Error("Could not prove last item", "error", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, blob := range proof.NodeList() {
|
for _, blob := range proof.List() {
|
||||||
proofs = append(proofs, blob)
|
proofs = append(proofs, blob)
|
||||||
}
|
}
|
||||||
return keys, vals, proofs
|
return keys, vals, proofs
|
||||||
@ -353,7 +352,7 @@ func createStorageRequestResponse(t *testPeer, root common.Hash, accounts []comm
|
|||||||
if originHash != (common.Hash{}) || (abort && len(keys) > 0) {
|
if originHash != (common.Hash{}) || (abort && len(keys) > 0) {
|
||||||
// If we're aborting, we need to prove the first and last item
|
// If we're aborting, we need to prove the first and last item
|
||||||
// This terminates the response (and thus the loop)
|
// This terminates the response (and thus the loop)
|
||||||
proof := light.NewNodeSet()
|
proof := trienode.NewProofSet()
|
||||||
stTrie := t.storageTries[account]
|
stTrie := t.storageTries[account]
|
||||||
|
|
||||||
// Here's a potential gotcha: when constructing the proof, we cannot
|
// Here's a potential gotcha: when constructing the proof, we cannot
|
||||||
@ -368,7 +367,7 @@ func createStorageRequestResponse(t *testPeer, root common.Hash, accounts []comm
|
|||||||
t.logger.Error("Could not prove last item", "error", err)
|
t.logger.Error("Could not prove last item", "error", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, blob := range proof.NodeList() {
|
for _, blob := range proof.List() {
|
||||||
proofs = append(proofs, blob)
|
proofs = append(proofs, blob)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@ -411,7 +410,7 @@ func createStorageRequestResponseAlwaysProve(t *testPeer, root common.Hash, acco
|
|||||||
if exit {
|
if exit {
|
||||||
// If we're aborting, we need to prove the first and last item
|
// If we're aborting, we need to prove the first and last item
|
||||||
// This terminates the response (and thus the loop)
|
// This terminates the response (and thus the loop)
|
||||||
proof := light.NewNodeSet()
|
proof := trienode.NewProofSet()
|
||||||
stTrie := t.storageTries[account]
|
stTrie := t.storageTries[account]
|
||||||
|
|
||||||
// Here's a potential gotcha: when constructing the proof, we cannot
|
// Here's a potential gotcha: when constructing the proof, we cannot
|
||||||
@ -427,7 +426,7 @@ func createStorageRequestResponseAlwaysProve(t *testPeer, root common.Hash, acco
|
|||||||
t.logger.Error("Could not prove last item", "error", err)
|
t.logger.Error("Could not prove last item", "error", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, blob := range proof.NodeList() {
|
for _, blob := range proof.List() {
|
||||||
proofs = append(proofs, blob)
|
proofs = append(proofs, blob)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@ -599,9 +598,10 @@ func testSyncBloatedProof(t *testing.T, scheme string) {
|
|||||||
vals = append(vals, entry.v)
|
vals = append(vals, entry.v)
|
||||||
}
|
}
|
||||||
// The proofs
|
// The proofs
|
||||||
proof := light.NewNodeSet()
|
proof := trienode.NewProofSet()
|
||||||
if err := t.accountTrie.Prove(origin[:], proof); err != nil {
|
if err := t.accountTrie.Prove(origin[:], proof); err != nil {
|
||||||
t.logger.Error("Could not prove origin", "origin", origin, "error", err)
|
t.logger.Error("Could not prove origin", "origin", origin, "error", err)
|
||||||
|
t.logger.Error("Could not prove origin", "origin", origin, "error", err)
|
||||||
}
|
}
|
||||||
// The bloat: add proof of every single element
|
// The bloat: add proof of every single element
|
||||||
for _, entry := range t.accountValues {
|
for _, entry := range t.accountValues {
|
||||||
@ -614,7 +614,7 @@ func testSyncBloatedProof(t *testing.T, scheme string) {
|
|||||||
keys = append(keys[:1], keys[2:]...)
|
keys = append(keys[:1], keys[2:]...)
|
||||||
vals = append(vals[:1], vals[2:]...)
|
vals = append(vals[:1], vals[2:]...)
|
||||||
}
|
}
|
||||||
for _, blob := range proof.NodeList() {
|
for _, blob := range proof.List() {
|
||||||
proofs = append(proofs, blob)
|
proofs = append(proofs, blob)
|
||||||
}
|
}
|
||||||
if err := t.remote.OnAccounts(t, requestId, keys, vals, proofs); err != nil {
|
if err := t.remote.OnAccounts(t, requestId, keys, vals, proofs); err != nil {
|
||||||
|
@ -26,6 +26,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/light"
|
"github.com/ethereum/go-ethereum/light"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// clientHandler is responsible for receiving and processing all incoming server
|
// clientHandler is responsible for receiving and processing all incoming server
|
||||||
@ -236,7 +237,7 @@ func (h *clientHandler) handleMsg(p *serverPeer) error {
|
|||||||
p.Log().Trace("Received les/2 proofs response")
|
p.Log().Trace("Received les/2 proofs response")
|
||||||
var resp struct {
|
var resp struct {
|
||||||
ReqID, BV uint64
|
ReqID, BV uint64
|
||||||
Data light.NodeList
|
Data trienode.ProofList
|
||||||
}
|
}
|
||||||
if err := msg.Decode(&resp); err != nil {
|
if err := msg.Decode(&resp); err != nil {
|
||||||
return errResp(ErrDecode, "msg %v: %v", msg, err)
|
return errResp(ErrDecode, "msg %v: %v", msg, err)
|
||||||
|
@ -37,6 +37,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{}) error {
|
func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{}) error {
|
||||||
@ -401,7 +402,7 @@ func testGetProofs(t *testing.T, protocol int) {
|
|||||||
bc := server.handler.blockchain
|
bc := server.handler.blockchain
|
||||||
|
|
||||||
var proofreqs []ProofReq
|
var proofreqs []ProofReq
|
||||||
proofsV2 := light.NewNodeSet()
|
proofsV2 := trienode.NewProofSet()
|
||||||
|
|
||||||
accounts := []common.Address{bankAddr, userAddr1, userAddr2, signerAddr, {}}
|
accounts := []common.Address{bankAddr, userAddr1, userAddr2, signerAddr, {}}
|
||||||
for i := uint64(0); i <= bc.CurrentBlock().Number.Uint64(); i++ {
|
for i := uint64(0); i <= bc.CurrentBlock().Number.Uint64(); i++ {
|
||||||
@ -419,7 +420,7 @@ func testGetProofs(t *testing.T, protocol int) {
|
|||||||
}
|
}
|
||||||
// Send the proof request and verify the response
|
// Send the proof request and verify the response
|
||||||
sendRequest(rawPeer.app, GetProofsV2Msg, 42, proofreqs)
|
sendRequest(rawPeer.app, GetProofsV2Msg, 42, proofreqs)
|
||||||
if err := expectResponse(rawPeer.app, ProofsV2Msg, 42, testBufLimit, proofsV2.NodeList()); err != nil {
|
if err := expectResponse(rawPeer.app, ProofsV2Msg, 42, testBufLimit, proofsV2.List()); err != nil {
|
||||||
t.Errorf("proofs mismatch: %v", err)
|
t.Errorf("proofs mismatch: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -456,10 +457,10 @@ func testGetStaleProof(t *testing.T, protocol int) {
|
|||||||
|
|
||||||
var expected []rlp.RawValue
|
var expected []rlp.RawValue
|
||||||
if wantOK {
|
if wantOK {
|
||||||
proofsV2 := light.NewNodeSet()
|
proofsV2 := trienode.NewProofSet()
|
||||||
t, _ := trie.New(trie.StateTrieID(header.Root), server.backend.Blockchain().TrieDB())
|
t, _ := trie.New(trie.StateTrieID(header.Root), server.backend.Blockchain().TrieDB())
|
||||||
t.Prove(account, proofsV2)
|
t.Prove(account, proofsV2)
|
||||||
expected = proofsV2.NodeList()
|
expected = proofsV2.List()
|
||||||
}
|
}
|
||||||
if err := expectResponse(rawPeer.app, ProofsV2Msg, 42, testBufLimit, expected); err != nil {
|
if err := expectResponse(rawPeer.app, ProofsV2Msg, 42, testBufLimit, expected); err != nil {
|
||||||
t.Errorf("codes mismatch: %v", err)
|
t.Errorf("codes mismatch: %v", err)
|
||||||
|
@ -30,6 +30,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -222,9 +223,9 @@ func (r *TrieRequest) Validate(db ethdb.Database, msg *Msg) error {
|
|||||||
if msg.MsgType != MsgProofsV2 {
|
if msg.MsgType != MsgProofsV2 {
|
||||||
return errInvalidMessageType
|
return errInvalidMessageType
|
||||||
}
|
}
|
||||||
proofs := msg.Obj.(light.NodeList)
|
proofs := msg.Obj.(trienode.ProofList)
|
||||||
// Verify the proof and store if checks out
|
// Verify the proof and store if checks out
|
||||||
nodeSet := proofs.NodeSet()
|
nodeSet := proofs.Set()
|
||||||
reads := &readTraceDB{db: nodeSet}
|
reads := &readTraceDB{db: nodeSet}
|
||||||
if _, err := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil {
|
if _, err := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil {
|
||||||
return fmt.Errorf("merkle proof verification failed: %v", err)
|
return fmt.Errorf("merkle proof verification failed: %v", err)
|
||||||
@ -308,7 +309,7 @@ type HelperTrieReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type HelperTrieResps struct { // describes all responses, not just a single one
|
type HelperTrieResps struct { // describes all responses, not just a single one
|
||||||
Proofs light.NodeList
|
Proofs trienode.ProofList
|
||||||
AuxData [][]byte
|
AuxData [][]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +357,7 @@ func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error {
|
|||||||
if len(resp.AuxData) != 1 {
|
if len(resp.AuxData) != 1 {
|
||||||
return errInvalidEntryCount
|
return errInvalidEntryCount
|
||||||
}
|
}
|
||||||
nodeSet := resp.Proofs.NodeSet()
|
nodeSet := resp.Proofs.Set()
|
||||||
headerEnc := resp.AuxData[0]
|
headerEnc := resp.AuxData[0]
|
||||||
if len(headerEnc) == 0 {
|
if len(headerEnc) == 0 {
|
||||||
return errHeaderUnavailable
|
return errHeaderUnavailable
|
||||||
@ -451,7 +452,7 @@ func (r *BloomRequest) Validate(db ethdb.Database, msg *Msg) error {
|
|||||||
}
|
}
|
||||||
resps := msg.Obj.(HelperTrieResps)
|
resps := msg.Obj.(HelperTrieResps)
|
||||||
proofs := resps.Proofs
|
proofs := resps.Proofs
|
||||||
nodeSet := proofs.NodeSet()
|
nodeSet := proofs.Set()
|
||||||
reads := &readTraceDB{db: nodeSet}
|
reads := &readTraceDB{db: nodeSet}
|
||||||
|
|
||||||
r.BloomBits = make([][]byte, len(r.SectionIndexList))
|
r.BloomBits = make([][]byte, len(r.SectionIndexList))
|
||||||
|
@ -40,6 +40,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -899,7 +900,7 @@ func (p *clientPeer) replyReceiptsRLP(reqID uint64, receipts []rlp.RawValue) *re
|
|||||||
}
|
}
|
||||||
|
|
||||||
// replyProofsV2 creates a reply with a batch of merkle proofs, corresponding to the ones requested.
|
// replyProofsV2 creates a reply with a batch of merkle proofs, corresponding to the ones requested.
|
||||||
func (p *clientPeer) replyProofsV2(reqID uint64, proofs light.NodeList) *reply {
|
func (p *clientPeer) replyProofsV2(reqID uint64, proofs trienode.ProofList) *reply {
|
||||||
data, _ := rlp.EncodeToBytes(proofs)
|
data, _ := rlp.EncodeToBytes(proofs)
|
||||||
return &reply{p.rw, ProofsV2Msg, reqID, data}
|
return &reply{p.rw, ProofsV2Msg, reqID, data}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/metrics"
|
"github.com/ethereum/go-ethereum/metrics"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// serverBackend defines the backend functions needed for serving LES requests
|
// serverBackend defines the backend functions needed for serving LES requests
|
||||||
@ -378,7 +379,7 @@ func handleGetProofs(msg Decoder) (serveRequestFn, uint64, uint64, error) {
|
|||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
bc := backend.BlockChain()
|
bc := backend.BlockChain()
|
||||||
nodes := light.NewNodeSet()
|
nodes := trienode.NewProofSet()
|
||||||
|
|
||||||
for i, request := range r.Reqs {
|
for i, request := range r.Reqs {
|
||||||
if i != 0 && !waitOrStop() {
|
if i != 0 && !waitOrStop() {
|
||||||
@ -444,7 +445,7 @@ func handleGetProofs(msg Decoder) (serveRequestFn, uint64, uint64, error) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return p.replyProofsV2(r.ReqID, nodes.NodeList())
|
return p.replyProofsV2(r.ReqID, nodes.List())
|
||||||
}, r.ReqID, uint64(len(r.Reqs)), nil
|
}, r.ReqID, uint64(len(r.Reqs)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -463,7 +464,7 @@ func handleGetHelperTrieProofs(msg Decoder) (serveRequestFn, uint64, uint64, err
|
|||||||
auxData [][]byte
|
auxData [][]byte
|
||||||
)
|
)
|
||||||
bc := backend.BlockChain()
|
bc := backend.BlockChain()
|
||||||
nodes := light.NewNodeSet()
|
nodes := trienode.NewProofSet()
|
||||||
for i, request := range r.Reqs {
|
for i, request := range r.Reqs {
|
||||||
if i != 0 && !waitOrStop() {
|
if i != 0 && !waitOrStop() {
|
||||||
return nil
|
return nil
|
||||||
@ -498,7 +499,7 @@ func handleGetHelperTrieProofs(msg Decoder) (serveRequestFn, uint64, uint64, err
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return p.replyHelperTrieProofs(r.ReqID, HelperTrieResps{Proofs: nodes.NodeList(), AuxData: auxData})
|
return p.replyHelperTrieProofs(r.ReqID, HelperTrieResps{Proofs: nodes.List(), AuxData: auxData})
|
||||||
}, r.ReqID, uint64(len(r.Reqs)), nil
|
}, r.ReqID, uint64(len(r.Reqs)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/txpool"
|
"github.com/ethereum/go-ethereum/core/txpool"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NoOdr is the default context passed to an ODR capable function when the ODR
|
// NoOdr is the default context passed to an ODR capable function when the ODR
|
||||||
@ -90,7 +91,7 @@ func StorageTrieID(state *TrieID, address common.Address, root common.Hash) *Tri
|
|||||||
type TrieRequest struct {
|
type TrieRequest struct {
|
||||||
Id *TrieID
|
Id *TrieID
|
||||||
Key []byte
|
Key []byte
|
||||||
Proof *NodeSet
|
Proof *trienode.ProofSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// StoreResult stores the retrieved data in local database
|
// StoreResult stores the retrieved data in local database
|
||||||
@ -143,7 +144,7 @@ type ChtRequest struct {
|
|||||||
ChtRoot common.Hash
|
ChtRoot common.Hash
|
||||||
Header *types.Header
|
Header *types.Header
|
||||||
Td *big.Int
|
Td *big.Int
|
||||||
Proof *NodeSet
|
Proof *trienode.ProofSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// StoreResult stores the retrieved data in local database
|
// StoreResult stores the retrieved data in local database
|
||||||
@ -163,7 +164,7 @@ type BloomRequest struct {
|
|||||||
SectionIndexList []uint64
|
SectionIndexList []uint64
|
||||||
BloomTrieRoot common.Hash
|
BloomTrieRoot common.Hash
|
||||||
BloomBits [][]byte
|
BloomBits [][]byte
|
||||||
Proofs *NodeSet
|
Proofs *trienode.ProofSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// StoreResult stores the retrieved data in local database
|
// StoreResult stores the retrieved data in local database
|
||||||
|
@ -37,6 +37,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
|
"github.com/ethereum/go-ethereum/trie/trienode"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -95,7 +96,7 @@ func (odr *testOdr) Retrieve(ctx context.Context, req OdrRequest) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
nodes := NewNodeSet()
|
nodes := trienode.NewProofSet()
|
||||||
t.Prove(req.Key, nodes)
|
t.Prove(req.Key, nodes)
|
||||||
req.Proof = nodes
|
req.Proof = nodes
|
||||||
case *CodeRequest:
|
case *CodeRequest:
|
||||||
|
@ -363,7 +363,7 @@ func NewBloomTrieIndexer(db ethdb.Database, odr OdrBackend, parentSize, size uin
|
|||||||
func (b *BloomTrieIndexerBackend) fetchMissingNodes(ctx context.Context, section uint64, root common.Hash) error {
|
func (b *BloomTrieIndexerBackend) fetchMissingNodes(ctx context.Context, section uint64, root common.Hash) error {
|
||||||
indexCh := make(chan uint, types.BloomBitLength)
|
indexCh := make(chan uint, types.BloomBitLength)
|
||||||
type res struct {
|
type res struct {
|
||||||
nodes *NodeSet
|
nodes *trienode.ProofSet
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
resCh := make(chan res, types.BloomBitLength)
|
resCh := make(chan res, types.BloomBitLength)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
// You should have received a copy of the GNU Lesser General Public License
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package light
|
package trienode
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
@ -26,9 +26,9 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NodeSet stores a set of trie nodes. It implements trie.Database and can also
|
// ProofSet stores a set of trie nodes. It implements trie.Database and can also
|
||||||
// act as a cache for another trie.Database.
|
// act as a cache for another trie.Database.
|
||||||
type NodeSet struct {
|
type ProofSet struct {
|
||||||
nodes map[string][]byte
|
nodes map[string][]byte
|
||||||
order []string
|
order []string
|
||||||
|
|
||||||
@ -36,15 +36,15 @@ type NodeSet struct {
|
|||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNodeSet creates an empty node set
|
// NewProofSet creates an empty node set
|
||||||
func NewNodeSet() *NodeSet {
|
func NewProofSet() *ProofSet {
|
||||||
return &NodeSet{
|
return &ProofSet{
|
||||||
nodes: make(map[string][]byte),
|
nodes: make(map[string][]byte),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put stores a new node in the set
|
// Put stores a new node in the set
|
||||||
func (db *NodeSet) Put(key []byte, value []byte) error {
|
func (db *ProofSet) Put(key []byte, value []byte) error {
|
||||||
db.lock.Lock()
|
db.lock.Lock()
|
||||||
defer db.lock.Unlock()
|
defer db.lock.Unlock()
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ func (db *NodeSet) Put(key []byte, value []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete removes a node from the set
|
// Delete removes a node from the set
|
||||||
func (db *NodeSet) Delete(key []byte) error {
|
func (db *ProofSet) Delete(key []byte) error {
|
||||||
db.lock.Lock()
|
db.lock.Lock()
|
||||||
defer db.lock.Unlock()
|
defer db.lock.Unlock()
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ func (db *NodeSet) Delete(key []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get returns a stored node
|
// Get returns a stored node
|
||||||
func (db *NodeSet) Get(key []byte) ([]byte, error) {
|
func (db *ProofSet) Get(key []byte) ([]byte, error) {
|
||||||
db.lock.RLock()
|
db.lock.RLock()
|
||||||
defer db.lock.RUnlock()
|
defer db.lock.RUnlock()
|
||||||
|
|
||||||
@ -81,13 +81,13 @@ func (db *NodeSet) Get(key []byte) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Has returns true if the node set contains the given key
|
// Has returns true if the node set contains the given key
|
||||||
func (db *NodeSet) Has(key []byte) (bool, error) {
|
func (db *ProofSet) Has(key []byte) (bool, error) {
|
||||||
_, err := db.Get(key)
|
_, err := db.Get(key)
|
||||||
return err == nil, nil
|
return err == nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeyCount returns the number of nodes in the set
|
// KeyCount returns the number of nodes in the set
|
||||||
func (db *NodeSet) KeyCount() int {
|
func (db *ProofSet) KeyCount() int {
|
||||||
db.lock.RLock()
|
db.lock.RLock()
|
||||||
defer db.lock.RUnlock()
|
defer db.lock.RUnlock()
|
||||||
|
|
||||||
@ -95,19 +95,19 @@ func (db *NodeSet) KeyCount() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DataSize returns the aggregated data size of nodes in the set
|
// DataSize returns the aggregated data size of nodes in the set
|
||||||
func (db *NodeSet) DataSize() int {
|
func (db *ProofSet) DataSize() int {
|
||||||
db.lock.RLock()
|
db.lock.RLock()
|
||||||
defer db.lock.RUnlock()
|
defer db.lock.RUnlock()
|
||||||
|
|
||||||
return db.dataSize
|
return db.dataSize
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeList converts the node set to a NodeList
|
// List converts the node set to a ProofList
|
||||||
func (db *NodeSet) NodeList() NodeList {
|
func (db *ProofSet) List() ProofList {
|
||||||
db.lock.RLock()
|
db.lock.RLock()
|
||||||
defer db.lock.RUnlock()
|
defer db.lock.RUnlock()
|
||||||
|
|
||||||
var values NodeList
|
var values ProofList
|
||||||
for _, key := range db.order {
|
for _, key := range db.order {
|
||||||
values = append(values, db.nodes[key])
|
values = append(values, db.nodes[key])
|
||||||
}
|
}
|
||||||
@ -115,7 +115,7 @@ func (db *NodeSet) NodeList() NodeList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store writes the contents of the set to the given database
|
// Store writes the contents of the set to the given database
|
||||||
func (db *NodeSet) Store(target ethdb.KeyValueWriter) {
|
func (db *ProofSet) Store(target ethdb.KeyValueWriter) {
|
||||||
db.lock.RLock()
|
db.lock.RLock()
|
||||||
defer db.lock.RUnlock()
|
defer db.lock.RUnlock()
|
||||||
|
|
||||||
@ -124,36 +124,36 @@ func (db *NodeSet) Store(target ethdb.KeyValueWriter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeList stores an ordered list of trie nodes. It implements ethdb.KeyValueWriter.
|
// ProofList stores an ordered list of trie nodes. It implements ethdb.KeyValueWriter.
|
||||||
type NodeList []rlp.RawValue
|
type ProofList []rlp.RawValue
|
||||||
|
|
||||||
// Store writes the contents of the list to the given database
|
// Store writes the contents of the list to the given database
|
||||||
func (n NodeList) Store(db ethdb.KeyValueWriter) {
|
func (n ProofList) Store(db ethdb.KeyValueWriter) {
|
||||||
for _, node := range n {
|
for _, node := range n {
|
||||||
db.Put(crypto.Keccak256(node), node)
|
db.Put(crypto.Keccak256(node), node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeSet converts the node list to a NodeSet
|
// Set converts the node list to a ProofSet
|
||||||
func (n NodeList) NodeSet() *NodeSet {
|
func (n ProofList) Set() *ProofSet {
|
||||||
db := NewNodeSet()
|
db := NewProofSet()
|
||||||
n.Store(db)
|
n.Store(db)
|
||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put stores a new node at the end of the list
|
// Put stores a new node at the end of the list
|
||||||
func (n *NodeList) Put(key []byte, value []byte) error {
|
func (n *ProofList) Put(key []byte, value []byte) error {
|
||||||
*n = append(*n, value)
|
*n = append(*n, value)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete panics as there's no reason to remove a node from the list.
|
// Delete panics as there's no reason to remove a node from the list.
|
||||||
func (n *NodeList) Delete(key []byte) error {
|
func (n *ProofList) Delete(key []byte) error {
|
||||||
panic("not supported")
|
panic("not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
// DataSize returns the aggregated data size of nodes in the list
|
// DataSize returns the aggregated data size of nodes in the list
|
||||||
func (n NodeList) DataSize() int {
|
func (n ProofList) DataSize() int {
|
||||||
var size int
|
var size int
|
||||||
for _, node := range n {
|
for _, node := range n {
|
||||||
size += len(node)
|
size += len(node)
|
Loading…
Reference in New Issue
Block a user