Compare commits
55 Commits
gx/v0.7.16
...
gx/v0.8.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afcde25c66 | ||
|
|
fb85ebd768 | ||
|
|
870aa9e7de | ||
|
|
73e5246a65 | ||
|
|
83a7594d41 | ||
|
|
3655c1cdd4 | ||
|
|
1543f4a136 | ||
|
|
d6e0b4e5a7 | ||
|
|
5eff744da0 | ||
|
|
a8ae38caae | ||
|
|
23f03cb301 | ||
|
|
1c907dba61 | ||
|
|
86805e711c | ||
|
|
f868375825 | ||
|
|
8f7ba15bfb | ||
|
|
ae25e25d1a | ||
|
|
0f09109d9f | ||
|
|
67951e2c09 | ||
|
|
ad88cb11c5 | ||
|
|
10944c9d86 | ||
|
|
b340dd202e | ||
|
|
c4bfcd0671 | ||
|
|
36bab4873c | ||
|
|
056eac16ae | ||
|
|
038b7f7cc9 | ||
|
|
019d945bf5 | ||
|
|
799731b9e5 | ||
|
|
06f861b665 | ||
|
|
88cd5dcebf | ||
|
|
9949dd29e5 | ||
|
|
75d3ffe549 | ||
|
|
8028fee095 | ||
|
|
bd441bb43e | ||
|
|
10a4d040b4 | ||
|
|
d204c18f7a | ||
|
|
b41162260a | ||
|
|
9cb0b7bcae | ||
|
|
6f951560f5 | ||
|
|
5d8ad3eb9c | ||
|
|
5b04f30433 | ||
|
|
078355866b | ||
|
|
1805dd530f | ||
|
|
2055d2e652 | ||
|
|
63d4b33fcf | ||
|
|
19c1c0e32e | ||
|
|
088f141a17 | ||
|
|
758714796c | ||
|
|
ed3563b69e | ||
|
|
db11d7248a | ||
|
|
68abb41a9b | ||
|
|
7333c60a00 | ||
|
|
f62e35b87a | ||
|
|
5652e6f751 | ||
|
|
fa428a337b | ||
|
|
e0f0e24c2d |
@@ -1 +1 @@
|
||||
0.7.16: Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB
|
||||
0.8.0: QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb
|
||||
|
||||
74
builder.go
Normal file
74
builder.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package cid
|
||||
|
||||
import (
|
||||
mh "github.com/multiformats/go-multihash"
|
||||
)
|
||||
|
||||
type Builder interface {
|
||||
Sum(data []byte) (*Cid, error)
|
||||
GetCodec() uint64
|
||||
WithCodec(uint64) Builder
|
||||
}
|
||||
|
||||
type V0Builder struct{}
|
||||
|
||||
type V1Builder struct {
|
||||
Codec uint64
|
||||
MhType uint64
|
||||
MhLength int // MhLength <= 0 means the default length
|
||||
}
|
||||
|
||||
func (p Prefix) GetCodec() uint64 {
|
||||
return p.Codec
|
||||
}
|
||||
|
||||
func (p Prefix) WithCodec(c uint64) Builder {
|
||||
if c == p.Codec {
|
||||
return p
|
||||
}
|
||||
p.Codec = c
|
||||
if c != DagProtobuf {
|
||||
p.Version = 1
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
func (p V0Builder) Sum(data []byte) (*Cid, error) {
|
||||
hash, err := mh.Sum(data, mh.SHA2_256, -1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewCidV0(hash), nil
|
||||
}
|
||||
|
||||
func (p V0Builder) GetCodec() uint64 {
|
||||
return DagProtobuf
|
||||
}
|
||||
|
||||
func (p V0Builder) WithCodec(c uint64) Builder {
|
||||
if c == DagProtobuf {
|
||||
return p
|
||||
}
|
||||
return V1Builder{Codec: c, MhType: mh.SHA2_256}
|
||||
}
|
||||
|
||||
func (p V1Builder) Sum(data []byte) (*Cid, error) {
|
||||
mhLen := p.MhLength
|
||||
if mhLen <= 0 {
|
||||
mhLen = -1
|
||||
}
|
||||
hash, err := mh.Sum(data, p.MhType, mhLen)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewCidV1(p.Codec, hash), nil
|
||||
}
|
||||
|
||||
func (p V1Builder) GetCodec() uint64 {
|
||||
return p.Codec
|
||||
}
|
||||
|
||||
func (p V1Builder) WithCodec(c uint64) Builder {
|
||||
p.Codec = c
|
||||
return p
|
||||
}
|
||||
92
builder_test.go
Normal file
92
builder_test.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package cid
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
mh "github.com/multiformats/go-multihash"
|
||||
)
|
||||
|
||||
func TestV0Builder(t *testing.T) {
|
||||
data := []byte("this is some test content")
|
||||
|
||||
// Construct c1
|
||||
format := V0Builder{}
|
||||
c1, err := format.Sum(data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Construct c2
|
||||
hash, err := mh.Sum(data, mh.SHA2_256, -1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
c2 := NewCidV0(hash)
|
||||
|
||||
if !c1.Equals(c2) {
|
||||
t.Fatal("cids mismatch")
|
||||
}
|
||||
if c1.Prefix() != c2.Prefix() {
|
||||
t.Fatal("prefixes mismatch")
|
||||
}
|
||||
}
|
||||
|
||||
func TestV1Builder(t *testing.T) {
|
||||
data := []byte("this is some test content")
|
||||
|
||||
// Construct c1
|
||||
format := V1Builder{Codec: DagCBOR, MhType: mh.SHA2_256}
|
||||
c1, err := format.Sum(data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Construct c2
|
||||
hash, err := mh.Sum(data, mh.SHA2_256, -1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
c2 := NewCidV1(DagCBOR, hash)
|
||||
|
||||
if !c1.Equals(c2) {
|
||||
t.Fatal("cids mismatch")
|
||||
}
|
||||
if c1.Prefix() != c2.Prefix() {
|
||||
t.Fatal("prefixes mismatch")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCodecChange(t *testing.T) {
|
||||
t.Run("Prefix-CidV0", func(t *testing.T) {
|
||||
p := Prefix{Version: 0, Codec: DagProtobuf, MhType: mh.SHA2_256, MhLength: mh.DefaultLengths[mh.SHA2_256]}
|
||||
testCodecChange(t, p)
|
||||
})
|
||||
t.Run("Prefix-CidV1", func(t *testing.T) {
|
||||
p := Prefix{Version: 1, Codec: DagProtobuf, MhType: mh.SHA2_256, MhLength: mh.DefaultLengths[mh.SHA2_256]}
|
||||
testCodecChange(t, p)
|
||||
})
|
||||
t.Run("V0Builder", func(t *testing.T) {
|
||||
testCodecChange(t, V0Builder{})
|
||||
})
|
||||
t.Run("V1Builder", func(t *testing.T) {
|
||||
testCodecChange(t, V1Builder{Codec: DagProtobuf, MhType: mh.SHA2_256})
|
||||
})
|
||||
}
|
||||
|
||||
func testCodecChange(t *testing.T, b Builder) {
|
||||
data := []byte("this is some test content")
|
||||
|
||||
if b.GetCodec() != DagProtobuf {
|
||||
t.Fatal("original builder not using Protobuf codec")
|
||||
}
|
||||
|
||||
b = b.WithCodec(Raw)
|
||||
c, err := b.Sum(data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if c.Type() != Raw {
|
||||
t.Fatal("new cid codec did not change to Raw")
|
||||
}
|
||||
}
|
||||
53
cid.go
53
cid.go
@@ -77,6 +77,8 @@ const (
|
||||
BitcoinTx = 0xb1
|
||||
ZcashBlock = 0xc0
|
||||
ZcashTx = 0xc1
|
||||
DecredBlock = 0xe0
|
||||
DecredTx = 0xe1
|
||||
)
|
||||
|
||||
// Codecs maps the name of a codec to its type
|
||||
@@ -99,6 +101,31 @@ var Codecs = map[string]uint64{
|
||||
"bitcoin-tx": BitcoinTx,
|
||||
"zcash-block": ZcashBlock,
|
||||
"zcash-tx": ZcashTx,
|
||||
"decred-block": DecredBlock,
|
||||
"decred-tx": DecredTx,
|
||||
}
|
||||
|
||||
// CodecToStr maps the numeric codec to its name
|
||||
var CodecToStr = map[uint64]string{
|
||||
Raw: "raw",
|
||||
DagProtobuf: "protobuf",
|
||||
DagCBOR: "cbor",
|
||||
GitRaw: "git-raw",
|
||||
EthBlock: "eth-block",
|
||||
EthBlockList: "eth-block-list",
|
||||
EthTxTrie: "eth-tx-trie",
|
||||
EthTx: "eth-tx",
|
||||
EthTxReceiptTrie: "eth-tx-receipt-trie",
|
||||
EthTxReceipt: "eth-tx-receipt",
|
||||
EthStateTrie: "eth-state-trie",
|
||||
EthAccountSnapshot: "eth-account-snapshot",
|
||||
EthStorageTrie: "eth-storage-trie",
|
||||
BitcoinBlock: "bitcoin-block",
|
||||
BitcoinTx: "bitcoin-tx",
|
||||
ZcashBlock: "zcash-block",
|
||||
ZcashTx: "zcash-tx",
|
||||
DecredBlock: "decred-block",
|
||||
DecredTx: "decred-tx",
|
||||
}
|
||||
|
||||
// NewCidV0 returns a Cid-wrapped multihash.
|
||||
@@ -186,6 +213,28 @@ func Decode(v string) (*Cid, error) {
|
||||
return Cast(data)
|
||||
}
|
||||
|
||||
// Extract the encoding from a Cid. If Decode on the same string did
|
||||
// not return an error neither will this function.
|
||||
func ExtractEncoding(v string) (mbase.Encoding, error) {
|
||||
if len(v) < 2 {
|
||||
return -1, ErrCidTooShort
|
||||
}
|
||||
|
||||
if len(v) == 46 && v[:2] == "Qm" {
|
||||
return mbase.Base58BTC, nil
|
||||
}
|
||||
|
||||
encoding := mbase.Encoding(v[0])
|
||||
|
||||
// check encoding is valid
|
||||
_, err := mbase.NewEncoder(encoding)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
|
||||
return encoding, nil
|
||||
}
|
||||
|
||||
func uvError(read int) error {
|
||||
switch {
|
||||
case read == 0:
|
||||
@@ -368,7 +417,7 @@ func (c *Cid) UnmarshalJSON(b []byte) error {
|
||||
//
|
||||
// Note that this formatting comes from the IPLD specification
|
||||
// (https://github.com/ipld/specs/tree/master/ipld)
|
||||
func (c *Cid) MarshalJSON() ([]byte, error) {
|
||||
func (c Cid) MarshalJSON() ([]byte, error) {
|
||||
return []byte(fmt.Sprintf("{\"/\":\"%s\"}", c.String())), nil
|
||||
}
|
||||
|
||||
@@ -400,6 +449,8 @@ func (c *Cid) Prefix() Prefix {
|
||||
// that is, the Version, the Codec, the Multihash type
|
||||
// and the Multihash length. It does not contains
|
||||
// any actual content information.
|
||||
// NOTE: The use -1 in MhLength to mean default length is deprecated,
|
||||
// use the V0Builder or V1Builder structures instead
|
||||
type Prefix struct {
|
||||
Version uint64
|
||||
Codec uint64
|
||||
|
||||
103
cid_test.go
103
cid_test.go
@@ -33,6 +33,8 @@ var tCodecs = map[uint64]string{
|
||||
BitcoinTx: "bitcoin-tx",
|
||||
ZcashBlock: "zcash-block",
|
||||
ZcashTx: "zcash-tx",
|
||||
DecredBlock: "decred-block",
|
||||
DecredTx: "decred-tx",
|
||||
}
|
||||
|
||||
func assertEqual(t *testing.T, a, b *Cid) {
|
||||
@@ -189,6 +191,64 @@ func TestV0ErrorCases(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewPrefixV1(t *testing.T) {
|
||||
data := []byte("this is some test content")
|
||||
|
||||
// Construct c1
|
||||
prefix := NewPrefixV1(DagCBOR, mh.SHA2_256)
|
||||
c1, err := prefix.Sum(data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if c1.Prefix() != prefix {
|
||||
t.Fatal("prefix not preserved")
|
||||
}
|
||||
|
||||
// Construct c2
|
||||
hash, err := mh.Sum(data, mh.SHA2_256, -1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
c2 := NewCidV1(DagCBOR, hash)
|
||||
|
||||
if !c1.Equals(c2) {
|
||||
t.Fatal("cids mismatch")
|
||||
}
|
||||
if c1.Prefix() != c2.Prefix() {
|
||||
t.Fatal("prefixes mismatch")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewPrefixV0(t *testing.T) {
|
||||
data := []byte("this is some test content")
|
||||
|
||||
// Construct c1
|
||||
prefix := NewPrefixV0(mh.SHA2_256)
|
||||
c1, err := prefix.Sum(data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if c1.Prefix() != prefix {
|
||||
t.Fatal("prefix not preserved")
|
||||
}
|
||||
|
||||
// Construct c2
|
||||
hash, err := mh.Sum(data, mh.SHA2_256, -1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
c2 := NewCidV0(hash)
|
||||
|
||||
if !c1.Equals(c2) {
|
||||
t.Fatal("cids mismatch")
|
||||
}
|
||||
if c1.Prefix() != c2.Prefix() {
|
||||
t.Fatal("prefixes mismatch")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrefixRoundtrip(t *testing.T) {
|
||||
data := []byte("this is some test content")
|
||||
hash, _ := mh.Sum(data, mh.SHA2_256, -1)
|
||||
@@ -325,3 +385,46 @@ func TestFromJson(t *testing.T) {
|
||||
t.Fatal("json parsing failed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestJsonRoundTrip(t *testing.T) {
|
||||
exp, err := Decode("zb2rhhFAEMepUBbGyP1k8tGfz7BSciKXP6GHuUeUsJBaK6cqG")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Verify it works for a *Cid.
|
||||
enc, err := json.Marshal(exp)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var actual Cid
|
||||
err = json.Unmarshal(enc, &actual)
|
||||
if !exp.Equals(&actual) {
|
||||
t.Fatal("cids not equal for *Cid")
|
||||
}
|
||||
|
||||
// Verify it works for a Cid.
|
||||
enc, err = json.Marshal(*exp)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var actual2 Cid
|
||||
err = json.Unmarshal(enc, &actual2)
|
||||
if !exp.Equals(&actual2) {
|
||||
t.Fatal("cids not equal for Cid")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkStringV1(b *testing.B) {
|
||||
data := []byte("this is some test content")
|
||||
hash, _ := mh.Sum(data, mh.SHA2_256, -1)
|
||||
cid := NewCidV1(Raw, hash)
|
||||
b.ResetTimer()
|
||||
count := 0
|
||||
for i := 0; i < b.N; i++ {
|
||||
count += len(cid.String())
|
||||
}
|
||||
if count != 49*b.N {
|
||||
b.FailNow()
|
||||
}
|
||||
}
|
||||
|
||||
28
deprecated.go
Normal file
28
deprecated.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package cid
|
||||
|
||||
import (
|
||||
mh "github.com/multiformats/go-multihash"
|
||||
)
|
||||
|
||||
// NewPrefixV0 returns a CIDv0 prefix with the specified multihash type.
|
||||
// DEPRECATED: Use V0Builder
|
||||
func NewPrefixV0(mhType uint64) Prefix {
|
||||
return Prefix{
|
||||
MhType: mhType,
|
||||
MhLength: mh.DefaultLengths[mhType],
|
||||
Version: 0,
|
||||
Codec: DagProtobuf,
|
||||
}
|
||||
}
|
||||
|
||||
// NewPrefixV1 returns a CIDv1 prefix with the specified codec and multihash
|
||||
// type.
|
||||
// DEPRECATED: Use V1Builder
|
||||
func NewPrefixV1(codecType uint64, mhType uint64) Prefix {
|
||||
return Prefix{
|
||||
MhType: mhType,
|
||||
MhLength: mh.DefaultLengths[mhType],
|
||||
Version: 1,
|
||||
Codec: codecType,
|
||||
}
|
||||
}
|
||||
10
package.json
10
package.json
@@ -9,15 +9,15 @@
|
||||
"gxDependencies": [
|
||||
{
|
||||
"author": "whyrusleeping",
|
||||
"hash": "QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw",
|
||||
"hash": "QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8",
|
||||
"name": "go-multihash",
|
||||
"version": "1.0.4"
|
||||
"version": "1.0.8"
|
||||
},
|
||||
{
|
||||
"author": "whyrusleeping",
|
||||
"hash": "Qme4T6BE4sQxg7ZouamF5M7Tx1ZFTqzcns7BkyQPXpoT99",
|
||||
"hash": "QmSbvata2WqNkqGtZNg8MR3SKwnB8iQ7vTPJgWqB8bC5kR",
|
||||
"name": "go-multibase",
|
||||
"version": "0.2.4"
|
||||
"version": "0.2.7"
|
||||
}
|
||||
],
|
||||
"gxVersion": "0.8.0",
|
||||
@@ -25,6 +25,6 @@
|
||||
"license": "MIT",
|
||||
"name": "go-cid",
|
||||
"releaseCmd": "git commit -a -m \"gx publish $VERSION\"",
|
||||
"version": "0.7.16"
|
||||
"version": "0.8.0"
|
||||
}
|
||||
|
||||
|
||||
1
set.go
1
set.go
@@ -65,3 +65,4 @@ func (s *Set) ForEach(f func(c *Cid) error) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
92
set_test.go
Normal file
92
set_test.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package cid
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
mh "github.com/multiformats/go-multihash"
|
||||
)
|
||||
|
||||
func makeRandomCid(t *testing.T) *Cid {
|
||||
p := make([]byte, 256)
|
||||
_, err := rand.Read(p)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
h, err := mh.Sum(p, mh.SHA3, 4)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
cid := &Cid{
|
||||
codec: 7,
|
||||
version: 1,
|
||||
hash: h,
|
||||
}
|
||||
|
||||
return cid
|
||||
}
|
||||
|
||||
func TestSet(t *testing.T) {
|
||||
cid := makeRandomCid(t)
|
||||
cid2 := makeRandomCid(t)
|
||||
s := NewSet()
|
||||
|
||||
s.Add(cid)
|
||||
|
||||
if !s.Has(cid) {
|
||||
t.Error("should have the CID")
|
||||
}
|
||||
|
||||
if s.Len() != 1 {
|
||||
t.Error("should report 1 element")
|
||||
}
|
||||
|
||||
keys := s.Keys()
|
||||
|
||||
if len(keys) != 1 || !keys[0].Equals(cid) {
|
||||
t.Error("key should correspond to Cid")
|
||||
}
|
||||
|
||||
if s.Visit(cid) {
|
||||
t.Error("visit should return false")
|
||||
}
|
||||
|
||||
foreach := []*Cid{}
|
||||
foreachF := func(c *Cid) error {
|
||||
foreach = append(foreach, c)
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := s.ForEach(foreachF); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if len(foreach) != 1 {
|
||||
t.Error("ForEach should have visited 1 element")
|
||||
}
|
||||
|
||||
foreachErr := func(c *Cid) error {
|
||||
return errors.New("test")
|
||||
}
|
||||
|
||||
if err := s.ForEach(foreachErr); err == nil {
|
||||
t.Error("Should have returned an error")
|
||||
}
|
||||
|
||||
if !s.Visit(cid2) {
|
||||
t.Error("should have visited a new Cid")
|
||||
}
|
||||
|
||||
if s.Len() != 2 {
|
||||
t.Error("len should be 2 now")
|
||||
}
|
||||
|
||||
s.Remove(cid2)
|
||||
|
||||
if s.Len() != 1 {
|
||||
t.Error("len should be 1 now")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user