Skip to content

Commit f7ce568

Browse files
committed
feat(libp2p): add v1.0.0 network compatibility
1 parent 482dd21 commit f7ce568

File tree

9 files changed

+924
-40
lines changed

9 files changed

+924
-40
lines changed

impl/graphsync_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1770,7 +1770,7 @@ func processResponsesTraces(t *testing.T, tracing *testutil.Collector, responseC
17701770
finalStub := tracing.FindSpanByTraceString(fmt.Sprintf("processResponses(%d)->loaderProcess(0)", responseCount-1))
17711771
require.NotNil(t, finalStub)
17721772
if len(testutil.AttributeValueInTraceSpan(t, *finalStub, "requestIDs").AsStringSlice()) == 0 {
1773-
return append(traces, fmt.Sprintf("responseMessage(%d)->loaderProcess(0)", responseCount-1))
1773+
return append(traces, fmt.Sprintf("processResponses(%d)->loaderProcess(0)", responseCount-1))
17741774
}
17751775
return append(traces, fmt.Sprintf("processResponses(%d)->loaderProcess(0)->cacheProcess(0)", responseCount-1))
17761776
}

message/message.go

Lines changed: 108 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -135,24 +135,24 @@ func newResponse(requestID graphsync.RequestID,
135135
}
136136
}
137137

138-
func newMessageFromProto(pbm *pb.Message) (GraphSyncMessage, error) {
138+
func (mh MessageHandler) newMessageFromProto(pbm pbMessage) (GraphSyncMessage, error) {
139139
requests := make(map[graphsync.RequestID]GraphSyncRequest, len(pbm.GetRequests()))
140-
for _, req := range pbm.Requests {
140+
for _, req := range pbm.GetRequests() {
141141
if req == nil {
142142
return GraphSyncMessage{}, errors.New("request is nil")
143143
}
144144
var root cid.Cid
145145
var err error
146-
if !req.Cancel && !req.Update {
147-
root, err = cid.Cast(req.Root)
146+
if !req.GetCancel() && !req.GetUpdate() {
147+
root, err = cid.Cast(req.GetRoot())
148148
if err != nil {
149149
return GraphSyncMessage{}, err
150150
}
151151
}
152152

153153
var selector ipld.Node
154-
if !req.Cancel && !req.Update {
155-
selector, err = ipldutil.DecodeNode(req.Selector)
154+
if !req.GetCancel() && !req.GetUpdate() {
155+
selector, err = ipldutil.DecodeNode(req.GetSelector())
156156
if err != nil {
157157
return GraphSyncMessage{}, err
158158
}
@@ -161,27 +161,27 @@ func newMessageFromProto(pbm *pb.Message) (GraphSyncMessage, error) {
161161
if exts == nil {
162162
exts = make(map[string][]byte)
163163
}
164-
id, err := graphsync.ParseRequestID(req.Id)
164+
id, err := req.GetId(mh)
165165
if err != nil {
166166
return GraphSyncMessage{}, err
167167
}
168-
requests[id] = newRequest(id, root, selector, graphsync.Priority(req.Priority), req.Cancel, req.Update, exts)
168+
requests[id] = newRequest(id, root, selector, graphsync.Priority(req.GetPriority()), req.GetCancel(), req.GetUpdate(), exts)
169169
}
170170

171171
responses := make(map[graphsync.RequestID]GraphSyncResponse, len(pbm.GetResponses()))
172-
for _, res := range pbm.Responses {
172+
for _, res := range pbm.GetResponses() {
173173
if res == nil {
174174
return GraphSyncMessage{}, errors.New("response is nil")
175175
}
176176
exts := res.GetExtensions()
177177
if exts == nil {
178178
exts = make(map[string][]byte)
179179
}
180-
id, err := graphsync.ParseRequestID(res.Id)
180+
id, err := res.GetId(mh)
181181
if err != nil {
182182
return GraphSyncMessage{}, err
183183
}
184-
responses[id] = newResponse(id, graphsync.ResponseStatusCode(res.Status), exts)
184+
responses[id] = newResponse(id, graphsync.ResponseStatusCode(res.GetStatus()), exts)
185185
}
186186

187187
blks := make(map[cid.Cid]blocks.Block, len(pbm.GetData()))
@@ -249,14 +249,20 @@ func (gsm GraphSyncMessage) Blocks() []blocks.Block {
249249
return bs
250250
}
251251

252+
type MessageHandler struct {
253+
fromV1Map map[int32]graphsync.RequestID
254+
toV1Map map[graphsync.RequestID]int32
255+
nextIntId int32
256+
}
257+
252258
// FromNet can read a network stream to deserialized a GraphSyncMessage
253-
func FromNet(r io.Reader) (GraphSyncMessage, error) {
259+
func (mh MessageHandler) FromNet(r io.Reader) (GraphSyncMessage, error) {
254260
reader := msgio.NewVarintReaderSize(r, network.MessageSizeMax)
255-
return FromMsgReader(reader)
261+
return mh.FromMsgReader(reader)
256262
}
257263

258264
// FromMsgReader can deserialize a protobuf message into a GraphySyncMessage.
259-
func FromMsgReader(r msgio.Reader) (GraphSyncMessage, error) {
265+
func (mh MessageHandler) FromMsgReader(r msgio.Reader) (GraphSyncMessage, error) {
260266
msg, err := r.ReadMsg()
261267
if err != nil {
262268
return GraphSyncMessage{}, err
@@ -269,7 +275,24 @@ func FromMsgReader(r msgio.Reader) (GraphSyncMessage, error) {
269275
return GraphSyncMessage{}, err
270276
}
271277

272-
return newMessageFromProto(&pb)
278+
return mh.newMessageFromProto(&pbMessageV1_1{&pb})
279+
}
280+
281+
// FromMsgReaderV1 can deserialize a v1.0.0 protobuf message into a GraphySyncMessage.
282+
func (mh MessageHandler) FromMsgReaderV1(r msgio.Reader) (GraphSyncMessage, error) {
283+
msg, err := r.ReadMsg()
284+
if err != nil {
285+
return GraphSyncMessage{}, err
286+
}
287+
288+
var pb pb.Message_V1_0_0
289+
err = proto.Unmarshal(msg, &pb)
290+
r.ReleaseMsg(msg)
291+
if err != nil {
292+
return GraphSyncMessage{}, err
293+
}
294+
295+
return mh.newMessageFromProto(&pbMessageV1_0{&pb})
273296
}
274297

275298
func (gsm GraphSyncMessage) ToProto() (*pb.Message, error) {
@@ -315,6 +338,57 @@ func (gsm GraphSyncMessage) ToProto() (*pb.Message, error) {
315338
return pbm, nil
316339
}
317340

341+
func (gsm GraphSyncMessage) ToProtoV1(mh MessageHandler) (*pb.Message_V1_0_0, error) {
342+
pbm := new(pb.Message_V1_0_0)
343+
pbm.Requests = make([]*pb.Message_V1_0_0_Request, 0, len(gsm.requests))
344+
for _, request := range gsm.requests {
345+
var selector []byte
346+
var err error
347+
if request.selector != nil {
348+
selector, err = ipldutil.EncodeNode(request.selector)
349+
if err != nil {
350+
return nil, err
351+
}
352+
}
353+
rid, err := bytesIdToInt(mh, request.id.Bytes())
354+
if err != nil {
355+
return nil, err
356+
}
357+
pbm.Requests = append(pbm.Requests, &pb.Message_V1_0_0_Request{
358+
Id: rid,
359+
Root: request.root.Bytes(),
360+
Selector: selector,
361+
Priority: int32(request.priority),
362+
Cancel: request.isCancel,
363+
Update: request.isUpdate,
364+
Extensions: request.extensions,
365+
})
366+
}
367+
368+
pbm.Responses = make([]*pb.Message_V1_0_0_Response, 0, len(gsm.responses))
369+
for _, response := range gsm.responses {
370+
rid, err := bytesIdToInt(mh, response.requestID.Bytes())
371+
if err != nil {
372+
return nil, err
373+
}
374+
pbm.Responses = append(pbm.Responses, &pb.Message_V1_0_0_Response{
375+
Id: rid,
376+
Status: int32(response.status),
377+
Extensions: response.extensions,
378+
})
379+
}
380+
381+
blocks := gsm.Blocks()
382+
pbm.Data = make([]*pb.Message_V1_0_0_Block, 0, len(blocks))
383+
for _, b := range blocks {
384+
pbm.Data = append(pbm.Data, &pb.Message_V1_0_0_Block{
385+
Data: b.RawData(),
386+
Prefix: b.Cid().Prefix().Bytes(),
387+
})
388+
}
389+
return pbm, nil
390+
}
391+
318392
func (gsm GraphSyncMessage) ToNet(w io.Writer) error {
319393
msg, err := gsm.ToProto()
320394
if err != nil {
@@ -334,6 +408,25 @@ func (gsm GraphSyncMessage) ToNet(w io.Writer) error {
334408
return err
335409
}
336410

411+
func (gsm GraphSyncMessage) ToNetV1(mh MessageHandler, w io.Writer) error {
412+
msg, err := gsm.ToProtoV1(mh)
413+
if err != nil {
414+
return err
415+
}
416+
size := proto.Size(msg)
417+
buf := pool.Get(size + binary.MaxVarintLen64)
418+
defer pool.Put(buf)
419+
420+
n := binary.PutUvarint(buf, uint64(size))
421+
422+
out, err := proto.MarshalOptions{}.MarshalAppend(buf[:n], msg)
423+
if err != nil {
424+
return err
425+
}
426+
_, err = w.Write(out)
427+
return err
428+
}
429+
337430
func (gsm GraphSyncMessage) Loggable() map[string]interface{} {
338431
requests := make([]string, 0, len(gsm.requests))
339432
for _, request := range gsm.requests {

message/message_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func TestAppendingRequests(t *testing.T) {
5959
require.Equal(t, selectorEncoded, pbRequest.Selector)
6060
require.Equal(t, map[string][]byte{"graphsync/awesome": extension.Data}, pbRequest.Extensions)
6161

62-
deserialized, err := newMessageFromProto(pbMessage)
62+
deserialized, err := MessageHandler{}.newMessageFromProto(pbMessageV1_1{pbMessage})
6363
require.NoError(t, err, "deserializing protobuf message errored")
6464
deserializedRequests := deserialized.Requests()
6565
require.Len(t, deserializedRequests, 1, "did not add request to deserialized message")
@@ -106,7 +106,7 @@ func TestAppendingResponses(t *testing.T) {
106106
require.Equal(t, int32(status), pbResponse.Status)
107107
require.Equal(t, extension.Data, pbResponse.Extensions["graphsync/awesome"])
108108

109-
deserialized, err := newMessageFromProto(pbMessage)
109+
deserialized, err := MessageHandler{}.newMessageFromProto(pbMessageV1_1{pbMessage})
110110
require.NoError(t, err, "deserializing protobuf message errored")
111111
deserializedResponses := deserialized.Responses()
112112
require.Len(t, deserializedResponses, 1, "did not add response to deserialized message")
@@ -173,7 +173,7 @@ func TestRequestCancel(t *testing.T) {
173173
buf := new(bytes.Buffer)
174174
err = gsm.ToNet(buf)
175175
require.NoError(t, err, "did not serialize protobuf message")
176-
deserialized, err := FromNet(buf)
176+
deserialized, err := MessageHandler{}.FromNet(buf)
177177
require.NoError(t, err, "did not deserialize protobuf message")
178178
deserializedRequests := deserialized.Requests()
179179
require.Len(t, deserializedRequests, 1, "did not add request to deserialized message")
@@ -209,7 +209,7 @@ func TestRequestUpdate(t *testing.T) {
209209
buf := new(bytes.Buffer)
210210
err = gsm.ToNet(buf)
211211
require.NoError(t, err, "did not serialize protobuf message")
212-
deserialized, err := FromNet(buf)
212+
deserialized, err := MessageHandler{}.FromNet(buf)
213213
require.NoError(t, err, "did not deserialize protobuf message")
214214

215215
deserializedRequests := deserialized.Requests()
@@ -253,7 +253,7 @@ func TestToNetFromNetEquivalency(t *testing.T) {
253253
buf := new(bytes.Buffer)
254254
err = gsm.ToNet(buf)
255255
require.NoError(t, err, "did not serialize protobuf message")
256-
deserialized, err := FromNet(buf)
256+
deserialized, err := MessageHandler{}.FromNet(buf)
257257
require.NoError(t, err, "did not deserialize protobuf message")
258258

259259
requests := gsm.Requests()
@@ -404,15 +404,15 @@ func TestKnownFuzzIssues(t *testing.T) {
404404
for _, input := range inputs {
405405
//inputAsBytes, err := hex.DecodeString(input)
406406
///require.NoError(t, err)
407-
msg1, err := FromNet(bytes.NewReader([]byte(input)))
407+
msg1, err := MessageHandler{}.FromNet(bytes.NewReader([]byte(input)))
408408
if err != nil {
409409
continue
410410
}
411411
buf2 := new(bytes.Buffer)
412412
err = msg1.ToNet(buf2)
413413
require.NoError(t, err)
414414

415-
msg2, err := FromNet(buf2)
415+
msg2, err := MessageHandler{}.FromNet(buf2)
416416
require.NoError(t, err)
417417

418418
require.Equal(t, msg1, msg2)

message/pb/message.pb.go

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)