Commit 458a5b64 authored by tavit ohanian's avatar tavit ohanian

add support for dms3 protocol codec

parent b547151a
Pipeline #1144 passed with stages
in 43 seconds
......@@ -3,7 +3,9 @@ module gitlab.dms3.io/mf/go-multiaddr
go 1.15
require (
github.com/multiformats/go-multihash v0.0.14
github.com/multiformats/go-multihash v0.0.15
github.com/multiformats/go-varint v0.0.6
gitlab.dms3.io/dms3/go-cid v0.0.3
gitlab.dms3.io/dms3/go-cid v0.0.6
)
// replace gitlab.dms3.io/dms3/go-cid => ../go-cid
github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771 h1:MHkK1uRtFbVqvAgvWxafZe54+5uBxLluGylDiKgdhwo=
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc=
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk=
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multihash v0.0.14 h1:QoBceQYQQtNUuf6s7wHxnE2c8bhbMqhfGzNI032se/I=
github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM=
github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
gitlab.dms3.io/dms3/go-cid v0.0.3 h1:5qZ1sl1Bi26naLz7Vsc8fjWcJKX8bR6njt3WPCteXac=
gitlab.dms3.io/dms3/go-cid v0.0.3/go.mod h1:qT/Q1NZD31UnWQ+rwsQgzGrrsQhpq7dYSlXf7ulDgtk=
gitlab.dms3.io/dms3/go-cid v0.0.6 h1:YFgaSMMVYQUrMudZVczNorvNXmGEoCo1XdZvl+S2WQY=
gitlab.dms3.io/dms3/go-cid v0.0.6/go.mod h1:WLJV2nnU0k7PBj+758e8SGAZj/wklZQZfq1BUwwZbOA=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o=
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
......@@ -72,7 +72,7 @@ func infoCommand(addr maddr.Multiaddr) {
fmt.Sprintf(`"rawValue": "0x%x", `, comp.RawValue())+
fmt.Sprintf(`"valueSize": "%d", `, len(comp.RawValue()))+
fmt.Sprintf(`"protocol": "%s", `, comp.Protocol().Name)+
fmt.Sprintf(`"codec": "%d", `, comp.Protocol().Code)+
fmt.Sprintf(`"codec": "%x", `, comp.Protocol().Code)+
fmt.Sprintf(`"uvarint": "0x%x", `, comp.Protocol().VCode)+
fmt.Sprintf(`"lengthPrefix": "%s"`, lengthPrefix)+
`}`)
......
......@@ -419,6 +419,9 @@ func TestEncapsulate(t *testing.T) {
func assertValueForProto(t *testing.T, a Multiaddr, p int, exp string) {
t.Logf("checking for %s in %s", ProtocolWithCode(p).Name, a)
fv, err := a.ValueForProtocol(p)
// fmt.Printf("assertValueForProto fv = %v, err = %v, exp = %v \n", fv, err, exp)
if err != nil {
t.Fatal(err)
}
......@@ -430,6 +433,7 @@ func assertValueForProto(t *testing.T, a Multiaddr, p int, exp string) {
func TestGetValue(t *testing.T) {
a := newMultiaddr(t, "/ip4/127.0.0.1/utp/tcp/5555/udp/1234/tls/utp/ipfs/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP")
b := newMultiaddr(t, "/ip4/127.0.0.1/utp/tcp/5555/udp/1234/tls/utp/dms3/Qmeq45rCLjFt573aFKgLrcAmAMSmYy9WXTuetDsELM2r8m")
assertValueForProto(t, a, P_IP4, "127.0.0.1")
assertValueForProto(t, a, P_UTP, "")
assertValueForProto(t, a, P_TLS, "")
......@@ -437,6 +441,7 @@ func TestGetValue(t *testing.T) {
assertValueForProto(t, a, P_UDP, "1234")
assertValueForProto(t, a, P_IPFS, "QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP")
assertValueForProto(t, a, P_P2P, "QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP")
assertValueForProto(t, b, P_DMS3, "Qmeq45rCLjFt573aFKgLrcAmAMSmYy9WXTuetDsELM2r8m")
_, err := a.ValueForProtocol(P_IP6)
switch err {
......@@ -554,16 +559,20 @@ func TestIPFSvP2P(t *testing.T) {
var (
p2pAddr = "/p2p/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP"
ipfsAddr = "/ipfs/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP"
dms3Addr = "/dms3/Qmeq45rCLjFt573aFKgLrcAmAMSmYy9WXTuetDsELM2r8m"
)
for _, s := range []string{p2pAddr, ipfsAddr} {
for _, s := range []string{p2pAddr, ipfsAddr, dms3Addr} {
ma, err := NewMultiaddr(s)
if err != nil {
t.Errorf("error when parsing %q: %s", s, err)
}
if ma.String() != p2pAddr {
if s == p2pAddr && ma.String() != p2pAddr {
t.Errorf("expected %q, got %q", p2pAddr, ma.String())
}
if s == dms3Addr && ma.String() != dms3Addr {
t.Errorf("expected %q, got %q", dms3Addr, ma.String())
}
}
}
......@@ -595,6 +604,11 @@ func TestInvalidP2PAddrString(t *testing.T) {
"/p2p/?unknownmultibase", // invalid multibase encoding
"/p2p/k2jmtxwoe2phm1hbqp0e7nufqf6umvuu2e9qd7ana7h411a0haqj6i2z", // non-p2p-key codec
"/p2p/" + unknownCodecCID, // impossible codec
"/dms3/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl-", // invalid multibase encoding
"/dms3/?unknownmultibase", // invalid multibase encoding
"/dms3/k2jmtxwoe2phm1hbqp0e7nufqf6umvuu2e9qd7ana7h411a0haqj6i2z", // non-p2p-key codec
"/dms3/" + unknownCodecCID, // impossible codec
}
for _, a := range badStringAddrs {
ma, err := NewMultiaddr(a)
......
......@@ -21,7 +21,6 @@ const (
P_UNIX = 0x0190
P_P2P = 0x01A5
P_IPFS = 0x01A5 // alias for backwards compatibility
P_DMS3 = 0x01A5 // temprary alias, codec to be reserved later
P_HTTP = 0x01E0
P_HTTPS = 0x01BB // deprecated alias for /tls/http
P_ONION = 0x01BC // also for backwards compatibility
......@@ -33,6 +32,18 @@ const (
P_NOISE = 0x01c6
P_WS = 0x01DD
P_WSS = 0x01DE // deprecated alias for /tls/ws
//
// reference: https://github.com/multiformats/multicodec
// Reserved Code Ranges
// The following code ranges have special meaning and may only have
// meanings assigned to as specified in their description:
//
// Private Use Area
// Range: 0x300000 – 0x3FFFFF
//
// Codes in this range are reserved for internal use by applications and will
// never be assigned any meaning as part of the Multicodec specification.
P_DMS3 = 0x3E01A5 // public codec to be reserved later
)
var (
......@@ -187,6 +198,13 @@ var (
Size: LengthPrefixedVarSize,
Transcoder: TranscoderP2P,
}
protoDMS3 = Protocol{
Name: "dms3",
Code: P_DMS3,
VCode: CodeToVarint(P_DMS3),
Size: LengthPrefixedVarSize,
Transcoder: TranscoderDMS3,
}
protoUNIX = Protocol{
Name: "unix",
Code: P_UNIX,
......@@ -252,6 +270,7 @@ func init() {
protoNOISE,
protoWS,
protoWSS,
protoDMS3,
} {
if err := AddProtocol(p); err != nil {
panic(err)
......@@ -261,5 +280,5 @@ func init() {
// explicitly set both of these
protocolsByName["p2p"] = protoP2P
protocolsByName["ipfs"] = protoP2P
protocolsByName["dms3"] = protoP2P
protocolsByName["dms3"] = protoDMS3
}
......@@ -314,7 +314,7 @@ func p2pStB(s string) ([]byte, error) {
if ty := c.Type(); ty == cid.P2pKey {
return c.Hash(), nil
} else {
return nil, fmt.Errorf("failed to parse p2p addr: %s has the invalid codec %d", s, ty)
return nil, fmt.Errorf("failed to parse p2p addr: %s has the invalid codec %x", s, ty)
}
}
......@@ -331,6 +331,46 @@ func p2pBtS(b []byte) (string, error) {
return m.B58String(), nil
}
var TranscoderDMS3 = NewTranscoderFromFunctions(dms3StB, dms3BtS, dms3Val)
// The encoded peer ID can either be a CID of a key or a raw multihash (identity
// or sha256-256).
func dms3StB(s string) ([]byte, error) {
// check if the address is a base58 encoded sha256 or identity multihash
if strings.HasPrefix(s, "Qm") || strings.HasPrefix(s, "1") {
m, err := mh.FromB58String(s)
if err != nil {
return nil, fmt.Errorf("failed to parse dms3 addr: %s %s", s, err)
}
return m, nil
}
// check if the address is a CID
c, err := cid.Decode(s)
if err != nil {
return nil, fmt.Errorf("failed to parse dms3 addr: %s %s", s, err)
}
if ty := c.Type(); ty == cid.Dms3Key {
return c.Hash(), nil
} else {
return nil, fmt.Errorf("failed to parse dms3 addr: %s has the invalid codec %d", s, ty)
}
}
func dms3Val(b []byte) error {
_, err := mh.Cast(b)
return err
}
func dms3BtS(b []byte) (string, error) {
m, err := mh.Cast(b)
if err != nil {
return "", err
}
return m.B58String(), nil
}
var TranscoderUnix = NewTranscoderFromFunctions(unixStB, unixBtS, nil)
func unixStB(s string) ([]byte, error) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment