Skip to content

Commit

Permalink
commands/block: use CIDv1 with custom mhtype
Browse files Browse the repository at this point in the history
License: MIT
Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
  • Loading branch information
magik6k committed Feb 2, 2018
1 parent 3f2c774 commit 8c176d2
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 12 deletions.
41 changes: 29 additions & 12 deletions core/commands/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package commands
import (
"bytes"
"context"
"errors"
"fmt"
"io"
"io/ioutil"
Expand Down Expand Up @@ -121,14 +122,17 @@ var blockPutCmd = &cmds.Command{
ShortDescription: `
'ipfs block put' is a plumbing command for storing raw IPFS blocks.
It reads from stdin, and <key> 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.
`,
},

Arguments: []cmdkit.Argument{
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),
},
Expand Down Expand Up @@ -157,27 +161,40 @@ It reads from stdin, and <key> 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)
Expand Down
12 changes: 12 additions & 0 deletions test/sharness/t0050-block.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 8c176d2

Please sign in to comment.