Skip to content

Commit 27b5139

Browse files
fearlessfeGrapeBaBa
authored andcommitted
feat: add test
1 parent d44009c commit 27b5139

File tree

2 files changed

+109
-7
lines changed

2 files changed

+109
-7
lines changed

p2p/discover/portal_protocol.go

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,15 +1518,35 @@ func (p *PortalProtocol) TraceContentLookup(contentKey []byte) (*TraceContentRes
15181518

15191519
traceContentRes := &TraceContentResult{}
15201520

1521+
selfHexId := "0x" + p.Self().ID().String()
1522+
15211523
trace := &Trace{
1522-
Origin: p.Self().ID().String(),
1524+
Origin: selfHexId,
15231525
TargetId: hexutil.Encode(p.ToContentId(contentKey)),
15241526
StartedAtMs: int(time.Now().UnixMilli()),
15251527
Responses: make(map[string][]string),
15261528
Metadata: make(map[string]*NodeMetadata),
15271529
Cancelled: make([]string, 0),
15281530
}
15291531

1532+
nodes := p.table.findnodeByID(enode.ID(p.ToContentId(contentKey)), bucketSize, false)
1533+
1534+
localResponse := make([]string, 0, len(nodes.entries))
1535+
for _, node := range nodes.entries {
1536+
id := "0x" + node.ID().String()
1537+
localResponse = append(localResponse, id)
1538+
}
1539+
trace.Responses[selfHexId] = localResponse
1540+
1541+
contentId := p.ToContentId(contentKey)
1542+
1543+
dis := p.Distance(p.Self().ID(), enode.ID(contentId))
1544+
1545+
trace.Metadata[selfHexId] = &NodeMetadata{
1546+
Enr: p.Self().String(),
1547+
Distance: hexutil.Encode(dis[:]),
1548+
}
1549+
15301550
var wg sync.WaitGroup
15311551
wg.Add(2)
15321552
go func() {
@@ -1561,23 +1581,27 @@ func (p *PortalProtocol) TraceContentLookup(contentKey []byte) (*TraceContentRes
15611581

15621582
for _, node := range requestNode {
15631583
id := node.ID().String()
1564-
trace.Metadata[id] = &NodeMetadata{
1565-
Enr: node.String(),
1566-
//Distance: node.Seq(),
1584+
hexId := "0x" + id
1585+
dis := p.Distance(node.ID(), enode.ID(contentId))
1586+
trace.Metadata[hexId] = &NodeMetadata{
1587+
Enr: node.String(),
1588+
Distance: hexutil.Encode(dis[:]),
15671589
}
15681590
if res, ok := requestRes[id]; ok {
15691591
if res.Flag == portalwire.ContentRawSelector || res.Flag == portalwire.ContentConnIdSelector {
1570-
trace.ReceivedFrom = res.Node.ID().String()
1592+
trace.ReceivedFrom = hexId
15711593
content := res.Content.([]byte)
15721594
traceContentRes.Content = hexutil.Encode(content)
15731595
traceContentRes.UtpTransfer = res.UtpTransfer
1596+
trace.Responses[hexId] = make([]string, 0)
15741597
} else {
15751598
content := res.Content.([]*enode.Node)
15761599
ids := make([]string, 0)
15771600
for _, n := range content {
1578-
ids = append(ids, n.ID().String())
1601+
hexId := "0x" + n.ID().String()
1602+
ids = append(ids, hexId)
15791603
}
1580-
trace.Responses[id] = ids
1604+
trace.Responses[hexId] = ids
15811605
}
15821606
} else {
15831607
trace.Cancelled = append(trace.Cancelled, id)
@@ -1793,6 +1817,14 @@ func (p *PortalProtocol) RandomGossip(srcNodeId *enode.ID, contentKeys [][]byte,
17931817
return len(nodes), nil
17941818
}
17951819

1820+
func (p *PortalProtocol) Distance(a, b enode.ID) enode.ID {
1821+
res := [32]byte{}
1822+
for i := range a {
1823+
res[i] = a[i] ^ b[i]
1824+
}
1825+
return enode.ID(res)
1826+
}
1827+
17961828
func inRange(nodeId enode.ID, nodeRadius *uint256.Int, contentId []byte) bool {
17971829
distance := enode.LogDist(nodeId, enode.ID(contentId))
17981830
disBig := new(big.Int).SetInt64(int64(distance))

p2p/discover/portal_protocol_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/prysmaticlabs/go-bitfield"
1515
"golang.org/x/exp/slices"
1616

17+
"github.com/ethereum/go-ethereum/common/hexutil"
1718
"github.com/ethereum/go-ethereum/internal/testlog"
1819
"github.com/ethereum/go-ethereum/log"
1920
"github.com/ethereum/go-ethereum/p2p/discover/portalwire"
@@ -410,3 +411,72 @@ func TestContentLookup(t *testing.T) {
410411
assert.Equal(t, ContentNotFound, err)
411412
assert.Nil(t, res)
412413
}
414+
415+
func TestTraceContentLookup(t *testing.T) {
416+
node1, err := setupLocalPortalNode(":17787", nil)
417+
assert.NoError(t, err)
418+
node1.log = testlog.Logger(t, log.LvlTrace)
419+
err = node1.Start()
420+
assert.NoError(t, err)
421+
422+
node2, err := setupLocalPortalNode(":17788", []*enode.Node{node1.localNode.Node()})
423+
assert.NoError(t, err)
424+
node2.log = testlog.Logger(t, log.LvlTrace)
425+
err = node2.Start()
426+
assert.NoError(t, err)
427+
428+
node3, err := setupLocalPortalNode(":17789", []*enode.Node{node2.localNode.Node()})
429+
assert.NoError(t, err)
430+
node3.log = testlog.Logger(t, log.LvlTrace)
431+
err = node3.Start()
432+
assert.NoError(t, err)
433+
434+
contentKey := []byte{0x3, 0x4}
435+
content := []byte{0x1, 0x2}
436+
contentId := node1.toContentId(contentKey)
437+
438+
err = node1.storage.Put(contentId, content)
439+
assert.NoError(t, err)
440+
441+
node1Id := hexutil.Encode(node1.Self().ID().Bytes())
442+
node2Id := hexutil.Encode(node2.Self().ID().Bytes())
443+
node3Id := hexutil.Encode(node3.Self().ID().Bytes())
444+
445+
res, err := node3.TraceContentLookup(contentKey)
446+
assert.NoError(t, err)
447+
assert.Equal(t, res.Content, hexutil.Encode(content))
448+
assert.Equal(t, res.UtpTransfer, false)
449+
assert.Equal(t, res.Trace.Origin, node3Id)
450+
assert.Equal(t, res.Trace.TargetId, hexutil.Encode(contentId))
451+
assert.Equal(t, res.Trace.ReceivedFrom, node1Id)
452+
453+
// check nodeMeta
454+
node1Meta := res.Trace.Metadata[node1Id]
455+
assert.Equal(t, node1Meta.Enr, node1.Self().String())
456+
dis := node1.Distance(node1.Self().ID(), enode.ID(contentId))
457+
assert.Equal(t, node1Meta.Distance, hexutil.Encode(dis[:]))
458+
459+
node2Meta := res.Trace.Metadata[node2Id]
460+
assert.Equal(t, node2Meta.Enr, node2.Self().String())
461+
dis = node2.Distance(node2.Self().ID(), enode.ID(contentId))
462+
assert.Equal(t, node2Meta.Distance, hexutil.Encode(dis[:]))
463+
464+
node3Meta := res.Trace.Metadata[node3Id]
465+
assert.Equal(t, node3Meta.Enr, node3.Self().String())
466+
dis = node3.Distance(node3.Self().ID(), enode.ID(contentId))
467+
assert.Equal(t, node3Meta.Distance, hexutil.Encode(dis[:]))
468+
469+
// check response
470+
node3Response := res.Trace.Responses[node3Id]
471+
assert.Equal(t, node3Response, []string{node2Id})
472+
473+
node2Response := res.Trace.Responses[node2Id]
474+
assert.Equal(t, node2Response, []string{node1Id})
475+
476+
node1Response := res.Trace.Responses[node1Id]
477+
assert.Equal(t, node1Response, []string{})
478+
479+
// res, _, err = node1.ContentLookup([]byte{0x2, 0x4})
480+
// assert.Equal(t, ContentNotFound, err)
481+
// assert.Nil(t, res)
482+
}

0 commit comments

Comments
 (0)