From e23dbd291be024b369c43709357d85b51c14ddd4 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sat, 13 May 2017 00:35:22 -0400 Subject: [PATCH] Add support for using an alternative hash function with raw nodes. License: MIT Signed-off-by: Kevin Atkinson --- importer/helpers/dagbuilder.go | 19 +++++++++++++++---- merkledag/merkledag.go | 2 +- merkledag/raw.go | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/importer/helpers/dagbuilder.go b/importer/helpers/dagbuilder.go index a06b38c59..de33563ef 100644 --- a/importer/helpers/dagbuilder.go +++ b/importer/helpers/dagbuilder.go @@ -165,10 +165,21 @@ func (db *DagBuilderHelper) GetNextDataNode() (*UnixfsNode, error) { } if db.rawLeaves { - return &UnixfsNode{ - rawnode: dag.NewRawNode(data), - raw: true, - }, nil + if db.prefix == nil { + return &UnixfsNode{ + rawnode: dag.NewRawNode(data), + raw: true, + }, nil + } else { + rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) + if err != nil { + return nil, err + } + return &UnixfsNode{ + rawnode: rawnode, + raw: true, + }, nil + } } else { blk := db.NewUnixfsBlock() blk.SetData(data) diff --git a/merkledag/merkledag.go b/merkledag/merkledag.go index e0dc5c74a..5509bcaeb 100644 --- a/merkledag/merkledag.go +++ b/merkledag/merkledag.go @@ -116,7 +116,7 @@ func decodeBlock(b blocks.Block) (node.Node, error) { decnd.Prefix = b.Cid().Prefix() return decnd, nil case cid.Raw: - return NewRawNode(b.RawData()), nil + return NewRawNodeWPrefix(b.RawData(), b.Cid().Prefix()) case cid.DagCBOR: return ipldcbor.Decode(b.RawData()) default: diff --git a/merkledag/raw.go b/merkledag/raw.go index 30fe639af..7c5ba56af 100644 --- a/merkledag/raw.go +++ b/merkledag/raw.go @@ -12,6 +12,8 @@ type RawNode struct { blocks.Block } +// NewRawNode creates a RawNode using the default sha2-256 hash +// funcition. func NewRawNode(data []byte) *RawNode { h := u.Hash(data) c := cid.NewCidV1(cid.Raw, h) @@ -20,6 +22,24 @@ func NewRawNode(data []byte) *RawNode { return &RawNode{blk} } +// NewRawNodeWPrefix creates a RawNode with the hash function +// specified in prefix. +func NewRawNodeWPrefix(data []byte, prefix cid.Prefix) (*RawNode, error) { + prefix.Codec = cid.Raw + if prefix.Version == 0 { + prefix.Version = 1 + } + c, err := prefix.Sum(data) + if err != nil { + return nil, err + } + blk, err := blocks.NewBlockWithCid(data, c) + if err != nil { + return nil, err + } + return &RawNode{blk}, nil +} + func (rn *RawNode) Links() []*node.Link { return nil }