github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/routing/record/record.go (about) 1 package record 2 3 import ( 4 "bytes" 5 6 proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" 7 8 key "github.com/ipfs/go-ipfs/blocks/key" 9 dag "github.com/ipfs/go-ipfs/merkledag" 10 ci "github.com/ipfs/go-ipfs/p2p/crypto" 11 pb "github.com/ipfs/go-ipfs/routing/dht/pb" 12 eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" 13 ) 14 15 var _ = dag.FetchGraph 16 var log = eventlog.Logger("routing/record") 17 18 // MakePutRecord creates and signs a dht record for the given key/value pair 19 func MakePutRecord(sk ci.PrivKey, key key.Key, value []byte, sign bool) (*pb.Record, error) { 20 record := new(pb.Record) 21 22 record.Key = proto.String(string(key)) 23 record.Value = value 24 25 pkh, err := sk.GetPublic().Hash() 26 if err != nil { 27 return nil, err 28 } 29 30 record.Author = proto.String(string(pkh)) 31 if sign { 32 blob := RecordBlobForSig(record) 33 34 sig, err := sk.Sign(blob) 35 if err != nil { 36 return nil, err 37 } 38 39 record.Signature = sig 40 } 41 return record, nil 42 } 43 44 // RecordBlobForSig returns the blob protected by the record signature 45 func RecordBlobForSig(r *pb.Record) []byte { 46 k := []byte(r.GetKey()) 47 v := []byte(r.GetValue()) 48 a := []byte(r.GetAuthor()) 49 return bytes.Join([][]byte{k, v, a}, []byte{}) 50 }