Skip to content

Commit cb45833

Browse files
committed
chore(net,extensions): wire up IPLD extensions, expose as Node instead of []byte
* Extensions now working with new dag-cbor network protocol * dag-cbor network protocol still not default, most tests are still exercising the existing v1 protocol * Metadata now using bindnode instead of cbor-gen * []byte for deferred extensions decoding is now replaced with datamodel.Node everywhere. Internal extensions now using some form of go-ipld-prime decode to convert them to local types (metadata using bindnode, others using direct inspection). * V1 protocol also using dag-cbor decode of extensions data and exporting the bytes - this may be a breaking change for exising extensions - need to check whether this should be done differently. Maybe a try-decode and if it fails export a wrapped Bytes Node?
1 parent c3649f3 commit cb45833

29 files changed

Lines changed: 297 additions & 220 deletions

cidset/cidset.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,30 @@ import (
44
"errors"
55

66
"github.com/ipfs/go-cid"
7+
"github.com/ipld/go-ipld-prime/datamodel"
78
"github.com/ipld/go-ipld-prime/fluent"
89
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
910
"github.com/ipld/go-ipld-prime/node/basicnode"
10-
11-
"github.com/ipfs/go-graphsync/ipldutil"
1211
)
1312

1413
// EncodeCidSet encodes a cid set into bytes for the do-no-send-cids extension
15-
func EncodeCidSet(cids *cid.Set) ([]byte, error) {
14+
func EncodeCidSet(cids *cid.Set) datamodel.Node {
1615
list := fluent.MustBuildList(basicnode.Prototype.List, int64(cids.Len()), func(la fluent.ListAssembler) {
1716
_ = cids.ForEach(func(c cid.Cid) error {
1817
la.AssembleValue().AssignLink(cidlink.Link{Cid: c})
1918
return nil
2019
})
2120
})
22-
return ipldutil.EncodeNode(list)
21+
return list
2322
}
2423

2524
// DecodeCidSet decode a cid set from data for the do-no-send-cids extension
26-
func DecodeCidSet(data []byte) (*cid.Set, error) {
27-
list, err := ipldutil.DecodeNode(data)
28-
if err != nil {
29-
return nil, err
25+
func DecodeCidSet(data datamodel.Node) (*cid.Set, error) {
26+
if data.Kind() != datamodel.Kind_List {
27+
return nil, errors.New("did not receive a list of CIDs")
3028
}
3129
set := cid.NewSet()
32-
iter := list.ListIterator()
30+
iter := data.ListIterator()
3331
for !iter.Done() {
3432
_, next, err := iter.Next()
3533
if err != nil {

cidset/cidset_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ func TestDecodeEncodeCidSet(t *testing.T) {
1515
for _, c := range cids {
1616
set.Add(c)
1717
}
18-
encoded, err := EncodeCidSet(set)
19-
require.NoError(t, err, "encode errored")
18+
encoded := EncodeCidSet(set)
2019
decodedCidSet, err := DecodeCidSet(encoded)
2120
require.NoError(t, err, "decode errored")
2221
require.Equal(t, decodedCidSet.Len(), set.Len())

dedupkey/dedupkey.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
package dedupkey
22

33
import (
4+
"github.com/ipld/go-ipld-prime/datamodel"
45
"github.com/ipld/go-ipld-prime/node/basicnode"
5-
6-
"github.com/ipfs/go-graphsync/ipldutil"
76
)
87

98
// EncodeDedupKey returns encoded cbor data for string key
10-
func EncodeDedupKey(key string) ([]byte, error) {
9+
func EncodeDedupKey(key string) (datamodel.Node, error) {
1110
nb := basicnode.Prototype.String.NewBuilder()
1211
err := nb.AssignString(key)
1312
if err != nil {
1413
return nil, err
1514
}
16-
nd := nb.Build()
17-
return ipldutil.EncodeNode(nd)
15+
return nb.Build(), nil
1816
}
1917

2018
// DecodeDedupKey returns a string key decoded from cbor data
21-
func DecodeDedupKey(data []byte) (string, error) {
22-
nd, err := ipldutil.DecodeNode(data)
23-
if err != nil {
24-
return "", err
25-
}
26-
return nd.AsString()
19+
func DecodeDedupKey(data datamodel.Node) (string, error) {
20+
return data.AsString()
2721
}
Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
package donotsendfirstblocks
22

33
import (
4+
"github.com/ipld/go-ipld-prime/datamodel"
45
"github.com/ipld/go-ipld-prime/node/basicnode"
5-
6-
"github.com/ipfs/go-graphsync/ipldutil"
76
)
87

98
// EncodeDoNotSendFirstBlocks returns encoded cbor data for the given number
109
// of blocks to skip
11-
func EncodeDoNotSendFirstBlocks(skipBlockCount int64) ([]byte, error) {
12-
nd := basicnode.NewInt(skipBlockCount)
13-
return ipldutil.EncodeNode(nd)
10+
func EncodeDoNotSendFirstBlocks(skipBlockCount int64) datamodel.Node {
11+
return basicnode.NewInt(skipBlockCount)
1412
}
1513

1614
// DecodeDoNotSendFirstBlocks returns the number of blocks to skip
17-
func DecodeDoNotSendFirstBlocks(data []byte) (int64, error) {
18-
nd, err := ipldutil.DecodeNode(data)
19-
if err != nil {
20-
return 0, err
21-
}
22-
return nd.AsInt()
15+
func DecodeDoNotSendFirstBlocks(data datamodel.Node) (int64, error) {
16+
return data.AsInt()
2317
}

go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ require (
2929
github.com/ipfs/go-unixfs v0.3.1
3030
github.com/ipfs/go-unixfsnode v1.2.0
3131
github.com/ipld/go-codec-dagpb v1.3.0
32-
github.com/ipld/go-ipld-prime v0.14.4
32+
github.com/ipld/go-ipld-prime v0.14.5-0.20220121142026-257b06219831
3333
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c
3434
github.com/libp2p/go-buffer-pool v0.0.2
3535
github.com/libp2p/go-libp2p v0.16.0
@@ -49,5 +49,3 @@ require (
4949
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
5050
google.golang.org/protobuf v1.27.1
5151
)
52-
53-
replace github.com/ipld/go-ipld-prime => ../../ipld/go-ipld-prime

go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,9 @@ github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9
454454
github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
455455
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
456456
github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM=
457-
github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc=
458457
github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
458+
github.com/ipld/go-ipld-prime v0.14.5-0.20220121142026-257b06219831 h1:hHLYeedwqakiOMaGI6HWF84geJu2VL6OZ1DrrhyY70s=
459+
github.com/ipld/go-ipld-prime v0.14.5-0.20220121142026-257b06219831/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
459460
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY=
460461
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
461462
github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=

graphsync.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/google/uuid"
99
"github.com/ipfs/go-cid"
1010
"github.com/ipld/go-ipld-prime"
11+
"github.com/ipld/go-ipld-prime/datamodel"
1112
"github.com/ipld/go-ipld-prime/traversal"
1213
"github.com/libp2p/go-libp2p-core/peer"
1314
)
@@ -54,7 +55,7 @@ type ExtensionName string
5455
// ExtensionData is a name/data pair for a graphsync extension
5556
type ExtensionData struct {
5657
Name ExtensionName
57-
Data []byte
58+
Data datamodel.Node
5859
}
5960

6061
const (
@@ -172,7 +173,7 @@ type RequestData interface {
172173

173174
// Extension returns the content for an extension on a response, or errors
174175
// if extension is not present
175-
Extension(name ExtensionName) ([]byte, bool)
176+
Extension(name ExtensionName) (datamodel.Node, bool)
176177

177178
// IsCancel returns true if this particular request is being cancelled
178179
IsCancel() bool
@@ -188,7 +189,7 @@ type ResponseData interface {
188189

189190
// Extension returns the content for an extension on a response, or errors
190191
// if extension is not present
191-
Extension(name ExtensionName) ([]byte, bool)
192+
Extension(name ExtensionName) (datamodel.Node, bool)
192193
}
193194

194195
// BlockData gives information about a block included in a graphsync response

impl/graphsync_test.go

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/ipfs/go-unixfsnode"
3131
unixfsbuilder "github.com/ipfs/go-unixfsnode/data/builder"
3232
ipld "github.com/ipld/go-ipld-prime"
33+
"github.com/ipld/go-ipld-prime/datamodel"
3334
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
3435
"github.com/ipld/go-ipld-prime/node/basicnode"
3536
"github.com/ipld/go-ipld-prime/traversal/selector"
@@ -137,7 +138,7 @@ func TestSendResponseToIncomingRequest(t *testing.T) {
137138
}
138139
td.gsnet1.SetDelegate(r)
139140

140-
var receivedRequestData []byte
141+
var receivedRequestData datamodel.Node
141142
// initialize graphsync on second node to response to requests
142143
gsnet := td.GraphSyncHost2()
143144
gsnet.RegisterIncomingRequestHook(
@@ -164,7 +165,7 @@ func TestSendResponseToIncomingRequest(t *testing.T) {
164165
// read the values sent back to requestor
165166
var received gsmsg.GraphSyncMessage
166167
var receivedBlocks []blocks.Block
167-
var receivedExtensions [][]byte
168+
var receivedExtensions []datamodel.Node
168169
for {
169170
var message receivedMessage
170171
testutil.AssertReceive(ctx, t, r.messageReceived, &message, "did not receive complete response")
@@ -355,8 +356,8 @@ func TestGraphsyncRoundTrip(t *testing.T) {
355356
responder := td.GraphSyncHost2()
356357
assertComplete := assertCompletionFunction(responder, 1)
357358

358-
var receivedResponseData []byte
359-
var receivedRequestData []byte
359+
var receivedResponseData datamodel.Node
360+
var receivedRequestData datamodel.Node
360361

361362
requestor.RegisterIncomingResponseHook(
362363
func(p peer.ID, responseData graphsync.ResponseData, hookActions graphsync.IncomingResponseHookActions) {
@@ -537,8 +538,7 @@ func TestGraphsyncRoundTripIgnoreCids(t *testing.T) {
537538
td.blockStore1[cidlink.Link{Cid: blk.Cid()}] = blk.RawData()
538539
set.Add(blk.Cid())
539540
}
540-
encodedCidSet, err := cidset.EncodeCidSet(set)
541-
require.NoError(t, err)
541+
encodedCidSet := cidset.EncodeCidSet(set)
542542
extension := graphsync.ExtensionData{
543543
Name: graphsync.ExtensionDoNotSendCIDs,
544544
Data: encodedCidSet,
@@ -609,8 +609,7 @@ func TestGraphsyncRoundTripIgnoreNBlocks(t *testing.T) {
609609
td.blockStore1[cidlink.Link{Cid: blk.Cid()}] = blk.RawData()
610610
}
611611

612-
doNotSendFirstBlocksData, err := donotsendfirstblocks.EncodeDoNotSendFirstBlocks(50)
613-
require.NoError(t, err)
612+
doNotSendFirstBlocksData := donotsendfirstblocks.EncodeDoNotSendFirstBlocks(50)
614613
extension := graphsync.ExtensionData{
615614
Name: graphsync.ExtensionsDoNotSendFirstBlocks,
616615
Data: doNotSendFirstBlocksData,
@@ -844,8 +843,8 @@ func TestPauseResumeViaUpdate(t *testing.T) {
844843
defer cancel()
845844
td := newGsTestData(ctx, t)
846845

847-
var receivedReponseData []byte
848-
var receivedUpdateData []byte
846+
var receivedReponseData datamodel.Node
847+
var receivedUpdateData datamodel.Node
849848
// initialize graphsync on first node to make requests
850849
requestor := td.GraphSyncHost1()
851850
assertAllResponsesReceived := assertAllResponsesReceivedFunction(requestor)
@@ -945,8 +944,8 @@ func TestPauseResumeViaUpdateOnBlockHook(t *testing.T) {
945944
defer cancel()
946945
td := newGsTestData(ctx, t)
947946

948-
var receivedReponseData []byte
949-
var receivedUpdateData []byte
947+
var receivedReponseData datamodel.Node
948+
var receivedUpdateData datamodel.Node
950949
// initialize graphsync on first node to make requests
951950
requestor := td.GraphSyncHost1()
952951

@@ -1639,8 +1638,8 @@ func TestGraphsyncBlockListeners(t *testing.T) {
16391638
blocksOutgoing++
16401639
})
16411640

1642-
var receivedResponseData []byte
1643-
var receivedRequestData []byte
1641+
var receivedResponseData datamodel.Node
1642+
var receivedRequestData datamodel.Node
16441643

16451644
requestor.RegisterIncomingResponseHook(
16461645
func(p peer.ID, responseData graphsync.ResponseData, hookActions graphsync.IncomingResponseHookActions) {
@@ -1718,12 +1717,12 @@ type gsTestData struct {
17181717
gsnet2 gsnet.GraphSyncNetwork
17191718
blockStore1, blockStore2 map[ipld.Link][]byte
17201719
persistence1, persistence2 ipld.LinkSystem
1721-
extensionData []byte
1720+
extensionData datamodel.Node
17221721
extensionName graphsync.ExtensionName
17231722
extension graphsync.ExtensionData
1724-
extensionResponseData []byte
1723+
extensionResponseData datamodel.Node
17251724
extensionResponse graphsync.ExtensionData
1726-
extensionUpdateData []byte
1725+
extensionUpdateData datamodel.Node
17271726
extensionUpdate graphsync.ExtensionData
17281727
}
17291728

@@ -1814,18 +1813,18 @@ func newOptionalGsTestData(ctx context.Context, t *testing.T, network1Protocols
18141813
td.blockStore2 = make(map[ipld.Link][]byte)
18151814
td.persistence2 = testutil.NewTestStore(td.blockStore2)
18161815
// setup extension handlers
1817-
td.extensionData = testutil.RandomBytes(100)
1816+
td.extensionData = basicnode.NewBytes(testutil.RandomBytes(100))
18181817
td.extensionName = graphsync.ExtensionName("AppleSauce/McGee")
18191818
td.extension = graphsync.ExtensionData{
18201819
Name: td.extensionName,
18211820
Data: td.extensionData,
18221821
}
1823-
td.extensionResponseData = testutil.RandomBytes(100)
1822+
td.extensionResponseData = basicnode.NewBytes(testutil.RandomBytes(100))
18241823
td.extensionResponse = graphsync.ExtensionData{
18251824
Name: td.extensionName,
18261825
Data: td.extensionResponseData,
18271826
}
1828-
td.extensionUpdateData = testutil.RandomBytes(100)
1827+
td.extensionUpdateData = basicnode.NewBytes(testutil.RandomBytes(100))
18291828
td.extensionUpdate = graphsync.ExtensionData{
18301829
Name: td.extensionName,
18311830
Data: td.extensionUpdateData,

message/bench_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ func BenchmarkMessageEncodingRoundtrip(b *testing.B) {
2222
root := testutil.GenerateCids(1)[0]
2323
ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any)
2424
selector := ssb.Matcher().Node()
25+
bb := basicnode.Prototype.Bytes.NewBuilder()
26+
bb.AssignBytes(testutil.RandomBytes(100))
2527
extensionName := graphsync.ExtensionName("graphsync/awesome")
2628
extension := graphsync.ExtensionData{
2729
Name: extensionName,
28-
Data: testutil.RandomBytes(100),
30+
Data: bb.Build(),
2931
}
3032
id := graphsync.NewRequestID()
3133
priority := graphsync.Priority(rand.Int31())

message/builder.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,7 @@ func (b *Builder) ScrubResponses(requestIDs []graphsync.RequestID) uint64 {
111111
func (b *Builder) Build() (GraphSyncMessage, error) {
112112
responses := make(map[graphsync.RequestID]GraphSyncResponse, len(b.outgoingResponses))
113113
for requestID, linkMap := range b.outgoingResponses {
114-
mdRaw, err := metadata.EncodeMetadata(linkMap)
115-
if err != nil {
116-
return GraphSyncMessage{}, err
117-
}
114+
mdRaw := metadata.EncodeMetadata(linkMap)
118115
b.extensions[requestID] = append(b.extensions[requestID], graphsync.ExtensionData{
119116
Name: graphsync.ExtensionMetadata,
120117
Data: mdRaw,

0 commit comments

Comments
 (0)