mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-16 12:28:54 +08:00
implement ipns publisher code
This commit is contained in:
@ -238,5 +238,3 @@ func (n *IpfsNode) PinDagNode(nd *merkledag.Node) error {
|
|||||||
u.DOut("Pinning node. Currently No-Op\n")
|
u.DOut("Pinning node. Currently No-Op\n")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *IpfsNode) SetIpnsEntry() {}
|
|
||||||
|
@ -9,7 +9,7 @@ It is generated from these files:
|
|||||||
entry.proto
|
entry.proto
|
||||||
|
|
||||||
It has these top-level messages:
|
It has these top-level messages:
|
||||||
InpsEntry
|
IpnsEntry
|
||||||
*/
|
*/
|
||||||
package namesys
|
package namesys
|
||||||
|
|
||||||
@ -20,24 +20,24 @@ import math "math"
|
|||||||
var _ = proto.Marshal
|
var _ = proto.Marshal
|
||||||
var _ = math.Inf
|
var _ = math.Inf
|
||||||
|
|
||||||
type InpsEntry struct {
|
type IpnsEntry struct {
|
||||||
Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
|
Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
|
||||||
Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"`
|
Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_unrecognized []byte `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *InpsEntry) Reset() { *m = InpsEntry{} }
|
func (m *IpnsEntry) Reset() { *m = IpnsEntry{} }
|
||||||
func (m *InpsEntry) String() string { return proto.CompactTextString(m) }
|
func (m *IpnsEntry) String() string { return proto.CompactTextString(m) }
|
||||||
func (*InpsEntry) ProtoMessage() {}
|
func (*IpnsEntry) ProtoMessage() {}
|
||||||
|
|
||||||
func (m *InpsEntry) GetValue() []byte {
|
func (m *IpnsEntry) GetValue() []byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Value
|
return m.Value
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *InpsEntry) GetSignature() []byte {
|
func (m *IpnsEntry) GetSignature() []byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Signature
|
return m.Signature
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package namesys;
|
package namesys;
|
||||||
|
|
||||||
message InpsEntry {
|
message IpnsEntry {
|
||||||
required bytes value = 1;
|
required bytes value = 1;
|
||||||
required bytes signature = 2;
|
required bytes signature = 2;
|
||||||
}
|
}
|
||||||
|
64
namesys/publisher.go
Normal file
64
namesys/publisher.go
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package namesys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.google.com/p/goprotobuf/proto"
|
||||||
|
|
||||||
|
ci "github.com/jbenet/go-ipfs/crypto"
|
||||||
|
mdag "github.com/jbenet/go-ipfs/merkledag"
|
||||||
|
routing "github.com/jbenet/go-ipfs/routing"
|
||||||
|
u "github.com/jbenet/go-ipfs/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IpnsPublisher struct {
|
||||||
|
dag *mdag.DAGService
|
||||||
|
routing routing.IpfsRouting
|
||||||
|
}
|
||||||
|
|
||||||
|
// Publish accepts a keypair and a value,
|
||||||
|
func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
|
||||||
|
data, err := CreateEntryData(k, value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pubkey := k.GetPublic()
|
||||||
|
pkbytes, err := pubkey.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
nameb, err := u.Hash(pkbytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
namekey := u.Key(nameb).Pretty()
|
||||||
|
|
||||||
|
ipnskey, err := u.Hash([]byte("ipns:" + namekey))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store associated public key
|
||||||
|
err = p.routing.PutValue(u.Key(nameb), pkbytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store ipns entry at h("ipns:"+b58(h(pubkey)))
|
||||||
|
err = p.routing.PutValue(u.Key(ipnskey), data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) {
|
||||||
|
entry := new(IpnsEntry)
|
||||||
|
sig, err := pk.Sign([]byte(val))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
entry.Signature = sig
|
||||||
|
entry.Value = []byte(val)
|
||||||
|
return proto.Marshal(entry)
|
||||||
|
}
|
@ -1,6 +1,11 @@
|
|||||||
package namesys
|
package namesys
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
mdag "github.com/jbenet/go-ipfs/merkledag"
|
||||||
|
"github.com/jbenet/go-ipfs/routing"
|
||||||
|
)
|
||||||
|
|
||||||
type MasterResolver struct {
|
type MasterResolver struct {
|
||||||
dns *DNSResolver
|
dns *DNSResolver
|
||||||
@ -8,6 +13,14 @@ type MasterResolver struct {
|
|||||||
pro *ProquintResolver
|
pro *ProquintResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver {
|
||||||
|
mr := new(MasterResolver)
|
||||||
|
mr.dns = new(DNSResolver)
|
||||||
|
mr.pro = new(ProquintResolver)
|
||||||
|
mr.routing = NewRoutingResolver(r, dag)
|
||||||
|
return mr
|
||||||
|
}
|
||||||
|
|
||||||
func (mr *MasterResolver) Resolve(name string) (string, error) {
|
func (mr *MasterResolver) Resolve(name string) (string, error) {
|
||||||
if strings.Contains(name, ".") {
|
if strings.Contains(name, ".") {
|
||||||
return mr.dns.Resolve(name)
|
return mr.dns.Resolve(name)
|
||||||
|
@ -13,18 +13,17 @@ import (
|
|||||||
mh "github.com/jbenet/go-multihash"
|
mh "github.com/jbenet/go-multihash"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RoutingName is the de-serialized name structure that is stored (serialized)
|
|
||||||
// in the routing system. Basically, a hash + a digital signature. (serialization can be
|
|
||||||
// protobuf, or a simple binary format)
|
|
||||||
type RoutingName struct {
|
|
||||||
Hash u.Key
|
|
||||||
Signature []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// RoutingResolver implements NSResolver for the main IPFS SFS-like naming
|
// RoutingResolver implements NSResolver for the main IPFS SFS-like naming
|
||||||
type RoutingResolver struct {
|
type RoutingResolver struct {
|
||||||
routing routing.IpfsRouting
|
routing routing.IpfsRouting
|
||||||
dag mdag.DAGService
|
dag *mdag.DAGService
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) *RoutingResolver {
|
||||||
|
return &RoutingResolver{
|
||||||
|
routing: route,
|
||||||
|
dag: dagservice,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RoutingResolver) Resolve(name string) (string, error) {
|
func (r *RoutingResolver) Resolve(name string) (string, error) {
|
||||||
@ -47,7 +46,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
entry := new(InpsEntry)
|
entry := new(IpnsEntry)
|
||||||
err = proto.Unmarshal(val, entry)
|
err = proto.Unmarshal(val, entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
Reference in New Issue
Block a user