mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-12 07:55:07 +08:00
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package record
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
|
|
|
|
key "github.com/ipfs/go-ipfs/blocks/key"
|
|
pb "github.com/ipfs/go-ipfs/routing/dht/pb"
|
|
ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto"
|
|
logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log"
|
|
)
|
|
|
|
var log = logging.Logger("routing/record")
|
|
|
|
// MakePutRecord creates and signs a dht record for the given key/value pair
|
|
func MakePutRecord(sk ci.PrivKey, key key.Key, value []byte, sign bool) (*pb.Record, error) {
|
|
record := new(pb.Record)
|
|
|
|
record.Key = proto.String(string(key))
|
|
record.Value = value
|
|
|
|
pkh, err := sk.GetPublic().Hash()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
record.Author = proto.String(string(pkh))
|
|
if sign {
|
|
blob := RecordBlobForSig(record)
|
|
|
|
sig, err := sk.Sign(blob)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
record.Signature = sig
|
|
}
|
|
return record, nil
|
|
}
|
|
|
|
// RecordBlobForSig returns the blob protected by the record signature
|
|
func RecordBlobForSig(r *pb.Record) []byte {
|
|
k := []byte(r.GetKey())
|
|
v := []byte(r.GetValue())
|
|
a := []byte(r.GetAuthor())
|
|
return bytes.Join([][]byte{k, v, a}, []byte{})
|
|
}
|