@cryptotaxi247 / kubo / commits / 13f6528e3

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 }