feat: add Valid, and Decode methods, and create CID struct
This commit is contained in:
parent
2dc9d4dcf6
commit
4e6c29f1fd
54
cid/cid.go
54
cid/cid.go
|
@ -1,16 +1,68 @@
|
||||||
package cid
|
package cid
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
"github.com/multiformats/go-multibase"
|
"github.com/multiformats/go-multibase"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var MAGIC_BYTES = []byte{0x26, 0x1f}
|
||||||
|
|
||||||
|
type CID struct {
|
||||||
|
Hash [32]byte
|
||||||
|
Size uint64
|
||||||
|
}
|
||||||
|
|
||||||
func Encode(hash [32]byte, size uint64) (string, error) {
|
func Encode(hash [32]byte, size uint64) (string, error) {
|
||||||
sizeBytes := make([]byte, 8)
|
sizeBytes := make([]byte, 8)
|
||||||
binary.LittleEndian.PutUint64(sizeBytes, size)
|
binary.LittleEndian.PutUint64(sizeBytes, size)
|
||||||
|
|
||||||
prefixedHash := append([]byte{0x26, 0x1f}, hash[:]...)
|
prefixedHash := append(MAGIC_BYTES, hash[:]...)
|
||||||
prefixedHash = append(prefixedHash, sizeBytes...)
|
prefixedHash = append(prefixedHash, sizeBytes...)
|
||||||
|
|
||||||
return multibase.Encode(multibase.Base58BTC, prefixedHash)
|
return multibase.Encode(multibase.Base58BTC, prefixedHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Valid(cid string) (bool, error) {
|
||||||
|
_, err := maybeDecode(cid)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func Decode(cid string) (*CID, error) {
|
||||||
|
data, err := maybeDecode(cid)
|
||||||
|
if err != nil {
|
||||||
|
return &CID{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
data = data[len(MAGIC_BYTES):]
|
||||||
|
var hash [32]byte
|
||||||
|
copy(hash[:], data[:])
|
||||||
|
size := binary.LittleEndian.Uint64(data[32:])
|
||||||
|
|
||||||
|
return &CID{Hash: hash, Size: size}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func maybeDecode(cid string) ([]byte, error) {
|
||||||
|
_, data, err := multibase.Decode(cid)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.Compare(data[0:len(MAGIC_BYTES)], MAGIC_BYTES) != 0 {
|
||||||
|
return nil, errors.New("CID magic bytes missing or invalid")
|
||||||
|
}
|
||||||
|
|
||||||
|
size := binary.LittleEndian.Uint64(data[len(MAGIC_BYTES)+32:])
|
||||||
|
|
||||||
|
if size == 0 {
|
||||||
|
return nil, errors.New("missing or empty size")
|
||||||
|
}
|
||||||
|
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue