@cryptotaxi247 / kubo / commits / 4c0f18cbb

implement ipns publisher code

Jeromy committed Sep 12, 2014 at 02:41 UTC 4c0f18cbbde4982ee5f47b8c885e510650bd689c
6 files changed +95 -21
core/core.go
-2
@@ -238,5 +238,3 @@ func (n *IpfsNode) PinDagNode(nd *merkledag.Node) error {
238 u.DOut("Pinning node. Currently No-Op\n")
239 return nil
240 }
241 -
242 -func (n *IpfsNode) SetIpnsEntry() {}
namesys/entry.pb.go
+7 -7
@@ -9,7 +9,7 @@ It is generated from these files:
9 entry.proto
10
11 It has these top-level messages:
12 - InpsEntry
12 + IpnsEntry
13 */
14 package namesys
15
@@ -20,24 +20,24 @@ import math "math"
20 var _ = proto.Marshal
21 var _ = math.Inf
22
23 -type InpsEntry struct {
23 +type IpnsEntry struct {
24 Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
25 Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"`
26 XXX_unrecognized []byte `json:"-"`
27 }
28
29 -func (m *InpsEntry) Reset() { *m = InpsEntry{} }
30 -func (m *InpsEntry) String() string { return proto.CompactTextString(m) }
31 -func (*InpsEntry) ProtoMessage() {}
29 +func (m *IpnsEntry) Reset() { *m = IpnsEntry{} }
30 +func (m *IpnsEntry) String() string { return proto.CompactTextString(m) }
31 +func (*IpnsEntry) ProtoMessage() {}
32
33 -func (m *InpsEntry) GetValue() []byte {
33 +func (m *IpnsEntry) GetValue() []byte {
34 if m != nil {
35 return m.Value
36 }
37 return nil
38 }
39
40 -func (m *InpsEntry) GetSignature() []byte {
40 +func (m *IpnsEntry) GetSignature() []byte {
41 if m != nil {
42 return m.Signature
43 }
namesys/entry.proto
+1 -1
@@ -1,6 +1,6 @@
1 package namesys;
2
3 -message InpsEntry {
3 +message IpnsEntry {
4 required bytes value = 1;
5 required bytes signature = 2;
6 }
namesys/publisher.go new
+64
@@ -0,0 +1,64 @@
1 +package namesys
2 +
3 +import (
4 + "code.google.com/p/goprotobuf/proto"
5 +
6 + ci "github.com/jbenet/go-ipfs/crypto"
7 + mdag "github.com/jbenet/go-ipfs/merkledag"
8 + routing "github.com/jbenet/go-ipfs/routing"
9 + u "github.com/jbenet/go-ipfs/util"
10 +)
11 +
12 +type IpnsPublisher struct {
13 + dag *mdag.DAGService
14 + routing routing.IpfsRouting
15 +}
16 +
17 +// Publish accepts a keypair and a value,
18 +func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
19 + data, err := CreateEntryData(k, value)
20 + if err != nil {
21 + return err
22 + }
23 + pubkey := k.GetPublic()
24 + pkbytes, err := pubkey.Bytes()
25 + if err != nil {
26 + return nil
27 + }
28 +
29 + nameb, err := u.Hash(pkbytes)
30 + if err != nil {
31 + return nil
32 + }
33 + namekey := u.Key(nameb).Pretty()
34 +
35 + ipnskey, err := u.Hash([]byte("ipns:" + namekey))
36 + if err != nil {
37 + return err
38 + }
39 +
40 + // Store associated public key
41 + err = p.routing.PutValue(u.Key(nameb), pkbytes)
42 + if err != nil {
43 + return err
44 + }
45 +
46 + // Store ipns entry at h("ipns:"+b58(h(pubkey)))
47 + err = p.routing.PutValue(u.Key(ipnskey), data)
48 + if err != nil {
49 + return err
50 + }
51 +
52 + return nil
53 +}
54 +
55 +func CreateEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) {
56 + entry := new(IpnsEntry)
57 + sig, err := pk.Sign([]byte(val))
58 + if err != nil {
59 + return nil, err
60 + }
61 + entry.Signature = sig
62 + entry.Value = []byte(val)
63 + return proto.Marshal(entry)
64 +}
namesys/resolver.go
+14 -1
@@ -1,6 +1,11 @@
1 package namesys
2
3 -import "strings"
3 +import (
4 + "strings"
5 +
6 + mdag "github.com/jbenet/go-ipfs/merkledag"
7 + "github.com/jbenet/go-ipfs/routing"
8 +)
9
10 type MasterResolver struct {
11 dns *DNSResolver
@@ -8,6 +13,14 @@ type MasterResolver struct {
13 pro *ProquintResolver
14 }
15
16 +func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver {
17 + mr := new(MasterResolver)
18 + mr.dns = new(DNSResolver)
19 + mr.pro = new(ProquintResolver)
20 + mr.routing = NewRoutingResolver(r, dag)
21 + return mr
22 +}
23 +
24 func (mr *MasterResolver) Resolve(name string) (string, error) {
25 if strings.Contains(name, ".") {
26 return mr.dns.Resolve(name)
namesys/routing.go
+9 -10
@@ -13,18 +13,17 @@ import (
13 mh "github.com/jbenet/go-multihash"
14 )
15
16 -// RoutingName is the de-serialized name structure that is stored (serialized)
17 -// in the routing system. Basically, a hash + a digital signature. (serialization can be
18 -// protobuf, or a simple binary format)
19 -type RoutingName struct {
20 - Hash u.Key
21 - Signature []byte
22 -}
23 -
16 // RoutingResolver implements NSResolver for the main IPFS SFS-like naming
17 type RoutingResolver struct {
18 routing routing.IpfsRouting
27 - dag mdag.DAGService
19 + dag *mdag.DAGService
20 +}
21 +
22 +func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) *RoutingResolver {
23 + return &RoutingResolver{
24 + routing: route,
25 + dag: dagservice,
26 + }
27 }
28
29 func (r *RoutingResolver) Resolve(name string) (string, error) {
@@ -47,7 +46,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
46 return "", err
47 }
48
50 - entry := new(InpsEntry)
49 + entry := new(IpnsEntry)
50 err = proto.Unmarshal(val, entry)
51 if err != nil {
52 return "", err