diff --git a/core/commands/block.go b/core/commands/block.go index 2d9356ada13..fe9f939454e 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."), 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, formatSet := req.Options["format"].(string) + if !formatSet { + 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..054b5491089 100755 --- a/test/sharness/t0050-block.sh +++ b/test/sharness/t0050-block.sh @@ -185,11 +185,11 @@ test_expect_success "block get output looks right" ' ' test_expect_success "can set multihash type and length on block put" ' - HASH=$(echo "foooo" | ipfs block put --format=raw --mhtype=sha3 --mhlen=16) + HASH=$(echo "foooo" | ipfs block put --format=raw --mhtype=sha3 --mhlen=20) ' test_expect_success "output looks good" ' - test "z25ScPysKoxJBcPxczn9NvuHiZU5" = "$HASH" + test "z83bYcqyBkbx5fuNAcvbdv4pr5RYQiEpK" = "$HASH" ' test_expect_success "can read block with different hash" ' @@ -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=20) +' + +test_expect_success "output looks good" ' + test "z8bwYCvQPhyDY7VUTsUdGdE8Evm1ktSPV" = "$HASH" +' + +test_expect_success "put with sha3 and cidv0 fails" ' + echo "foooo" | test_must_fail ipfs block put --mhtype=sha3 --mhlen=20 --format=v0 +' + test_done