merkledag: respond with correct cid to Cid() method
License: MIT Signed-off-by: Jeromy <why@ipfs.io>
Jeromy committed
Nov 29, 2016 at 14:03 UTC
13f6528e3090649b4119947205d81a3ae469d286
5 files changed
+68
-14
merkledag/coding.go
+3
-7
@@ -7,7 +7,6 @@ import (
7
pb "github.com/ipfs/go-ipfs/merkledag/pb"
8
9
node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node"
10
- mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash"
10
cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid"
11
)
12
@@ -84,13 +83,10 @@ func (n *ProtoNode) EncodeProtobuf(force bool) ([]byte, error) {
83
}
84
85
if n.cached == nil {
87
- if n.prefix.MhType == 0 { // unset
88
- n.prefix.Codec = cid.DagProtobuf
89
- n.prefix.MhLength = -1
90
- n.prefix.MhType = mh.SHA2_256
91
- n.prefix.Version = 0
86
+ if n.Prefix.Codec == 0 { // unset
87
+ n.Prefix = defaultCidPrefix
88
}
93
- c, err := n.prefix.Sum(n.encoded)
89
+ c, err := n.Prefix.Sum(n.encoded)
90
if err != nil {
91
return nil, err
92
}
merkledag/merkledag.go
+1
-1
@@ -103,7 +103,7 @@ func decodeBlock(b blocks.Block) (node.Node, error) {
103
}
104
105
decnd.cached = b.Cid()
106
- decnd.prefix = b.Cid().Prefix()
106
+ decnd.Prefix = b.Cid().Prefix()
107
return decnd, nil
108
case cid.Raw:
109
return NewRawNode(b.RawData()), nil
merkledag/merkledag_test.go
+35
@@ -11,6 +11,7 @@ import (
11
"sync"
12
"testing"
13
14
+ blocks "github.com/ipfs/go-ipfs/blocks"
15
bserv "github.com/ipfs/go-ipfs/blockservice"
16
bstest "github.com/ipfs/go-ipfs/blockservice/test"
17
offline "github.com/ipfs/go-ipfs/exchange/offline"
@@ -450,3 +451,37 @@ func TestProtoNodeResolve(t *testing.T) {
451
t.Fatal("expected tree to return []{\"foo\"}")
452
}
453
}
454
+
455
+func TestCidRetention(t *testing.T) {
456
+ nd := new(ProtoNode)
457
+ nd.SetData([]byte("fooooo"))
458
+
459
+ pref := nd.Cid().Prefix()
460
+ pref.Version = 1
461
+
462
+ c2, err := pref.Sum(nd.RawData())
463
+ if err != nil {
464
+ t.Fatal(err)
465
+ }
466
+
467
+ blk, err := blocks.NewBlockWithCid(nd.RawData(), c2)
468
+ if err != nil {
469
+ t.Fatal(err)
470
+ }
471
+
472
+ bs := dstest.Bserv()
473
+ _, err = bs.AddBlock(blk)
474
+ if err != nil {
475
+ t.Fatal(err)
476
+ }
477
+
478
+ ds := NewDAGService(bs)
479
+ out, err := ds.Get(context.Background(), c2)
480
+ if err != nil {
481
+ t.Fatal(err)
482
+ }
483
+
484
+ if !out.Cid().Equals(c2) {
485
+ t.Fatal("output cid didnt match")
486
+ }
487
+}
merkledag/node.go
+24
-4
@@ -23,8 +23,15 @@ type ProtoNode struct {
23
24
cached *cid.Cid
25
26
- // prefix specifies cid version and hashing function
27
- prefix cid.Prefix
26
+ // Prefix specifies cid version and hashing function
27
+ Prefix cid.Prefix
28
+}
29
+
30
+var defaultCidPrefix = cid.Prefix{
31
+ Codec: cid.DagProtobuf,
32
+ MhLength: -1,
33
+ MhType: mh.SHA2_256,
34
+ Version: 0,
35
}
36
37
type LinkSlice []*node.Link
@@ -222,9 +229,22 @@ func (n *ProtoNode) Loggable() map[string]interface{} {
229
}
230
231
func (n *ProtoNode) Cid() *cid.Cid {
225
- h := n.Multihash()
232
+ if n.encoded != nil && n.cached != nil {
233
+ return n.cached
234
+ }
235
+
236
+ if n.Prefix.Codec == 0 {
237
+ n.Prefix = defaultCidPrefix
238
+ }
239
+
240
+ c, err := n.Prefix.Sum(n.RawData())
241
+ if err != nil {
242
+ // programmer error
243
+ panic(err)
244
+ }
245
227
- return cid.NewCidV0(h)
246
+ n.cached = c
247
+ return c
248
}
249
250
func (n *ProtoNode) String() string {
merkledag/test/utils.go
+5
-2
@@ -10,7 +10,10 @@ import (
10
)
11
12
func Mock() dag.DAGService {
13
+ return dag.NewDAGService(Bserv())
14
+}
15
+
16
+func Bserv() bsrv.BlockService {
17
bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore()))
14
- bserv := bsrv.New(bstore, offline.Exchange(bstore))
15
- return dag.NewDAGService(bserv)
18
+ return bsrv.New(bstore, offline.Exchange(bstore))
19
}