From 8c176d26ebdad5d0a225f83a467c7efcd2285295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 8 Jan 2018 14:22:53 +0100 Subject: [PATCH] commands/block: use CIDv1 with custom mhtype MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Ɓukasz Magiera --- core/commands/block.go | 41 +++++++++++++++++++++++++----------- test/sharness/t0050-block.sh | 12 +++++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/core/commands/block.go b/core/commands/block.go index 2d9356ada13..04312f13e6e 100644 --- a/core/commands/block.go +++ b/core/commands/block.go @@ -3,6 +3,7 @@ package commands import ( "bytes" "context" + "errors" "fmt" "io" "io/ioutil" @@ -121,6 +122,9 @@ var blockPutCmd = &cmds.Command{ ShortDescription: ` 'ipfs block put' is a plumbing command for storing raw IPFS blocks. It reads from stdin, and is a base58 encoded multihash. + +By default CIDv0 is going to be generated. Setting 'mhtype' to anything other +than 'sha2-256' or format to anything other than 'v0' will result in CIDv1. `, }, @@ -128,7 +132,7 @@ It reads from stdin, and is a base58 encoded multihash. cmdkit.FileArg("data", true, false, "The data to be stored as an IPFS block.").EnableStdin(), }, Options: []cmdkit.Option{ - cmdkit.StringOption("format", "f", "cid format for blocks to be created with.").WithDefault("v0"), + cmdkit.StringOption("format", "f", "cid format for blocks to be created with.").WithDefault(""), cmdkit.StringOption("mhtype", "multihash hash function").WithDefault("sha2-256"), cmdkit.IntOption("mhlen", "multihash hash length").WithDefault(-1), }, @@ -157,27 +161,40 @@ It reads from stdin, and is a base58 encoded multihash. return } + mhtype, _ := req.Options["mhtype"].(string) + mhtval, ok := mh.Names[mhtype] + if !ok { + err := fmt.Errorf("unrecognized multihash function: %s", mhtype) + res.SetError(err, cmdkit.ErrNormal) + return + } + var pref cid.Prefix pref.Version = 1 - format, _ := req.Options["format"].(string) - formatval, ok := cid.Codecs[format] - if !ok { - res.SetError(fmt.Errorf("unrecognized format: %s", format), cmdkit.ErrNormal) - return + format := req.Options["format"].(string) + if format == "" { + if mhtval == mh.SHA2_256 { + format = "v0" + } else { + format = "protobuf" + } } + if format == "v0" { pref.Version = 0 } - pref.Codec = formatval - - mhtype, _ := req.Options["mhtype"].(string) - mhtval, ok := mh.Names[mhtype] + formatval, ok := cid.Codecs[format] if !ok { - err := fmt.Errorf("unrecognized multihash function: %s", mhtype) - res.SetError(err, cmdkit.ErrNormal) + res.SetError(fmt.Errorf("unrecognized format: %s", format), cmdkit.ErrNormal) + return + } + if mhtval != mh.SHA2_256 && pref.Version == 0 { + res.SetError(errors.New("cannot generate CIDv0 with non-sha256 hash function"), cmdkit.ErrNormal) return } + + pref.Codec = formatval pref.MhType = mhtval mhlen, ok := req.Options["mhlen"].(int) diff --git a/test/sharness/t0050-block.sh b/test/sharness/t0050-block.sh index 285d8ad94b5..0cdd2498ba4 100755 --- a/test/sharness/t0050-block.sh +++ b/test/sharness/t0050-block.sh @@ -209,4 +209,16 @@ test_expect_success "no panic in output" ' test_expect_code 1 grep "panic" stat_out ' +test_expect_success "can set multihash type and length on block put without format" ' + HASH=$(echo "foooo" | ipfs block put --mhtype=sha3 --mhlen=16) +' + +test_expect_success "output looks good" ' + test "z2APJNN6rqZTWPpv7gYFHzh7ZEDX" = "$HASH" +' + +test_expect_success "put with sha3 and cidv0 fails" ' + echo "foooo" | test_must_fail ipfs block put --mhtype=sha3 --mhlen=16 --format=v0 +' + test_done