// NewBlock creates a Block object from opaque data. It will hash the data. func NewBlock(data []byte) (*Block, error) { h, err := u.Hash(data) if err != nil { return nil, err } return &Block{Data: data, Multihash: h}, nil }
// Multihash hashes the encoded data of this node. func (n *Node) Multihash() (mh.Multihash, error) { b, err := n.Encoded(false) if err != nil { return nil, err } return u.Hash(b) }
// IDFromPubKey returns Nodes ID given its public key func IDFromPubKey(pk ci.PubKey) (peer.ID, error) { b, err := pk.Bytes() if err != nil { return nil, err } hash, err := u.Hash(b) if err != nil { return nil, err } return peer.ID(hash), nil }
func TestBlocks(t *testing.T) { d := ds.NewMapDatastore() bs, err := NewBlockService(d, nil) if err != nil { t.Error("failed to construct block service", err) return } b, err := blocks.NewBlock([]byte("beep boop")) if err != nil { t.Error("failed to construct block", err) return } h, err := u.Hash([]byte("beep boop")) if err != nil { t.Error("failed to hash data", err) return } if !bytes.Equal(b.Multihash, h) { t.Error("Block Multihash and data multihash not equal") } if b.Key() != u.Key(h) { t.Error("Block key and data multihash key not equal") } k, err := bs.AddBlock(b) if err != nil { t.Error("failed to add block to BlockService", err) return } if k != b.Key() { t.Error("returned key is not equal to block key", err) } b2, err := bs.GetBlock(b.Key()) if err != nil { t.Error("failed to retrieve block from BlockService", err) return } if b.Key() != b2.Key() { t.Error("Block keys not equal.") } if !bytes.Equal(b.Data, b2.Data) { t.Error("Block data is not equal.") } }
// Determines which algorithm to use. Note: f(a, b) = f(b, a) func selectBest(myPrefs, theirPrefs string) (string, error) { // Person with greatest hash gets first choice. myHash, err := u.Hash([]byte(myPrefs)) if err != nil { return "", err } theirHash, err := u.Hash([]byte(theirPrefs)) if err != nil { return "", err } cmp := bytes.Compare(myHash, theirHash) var firstChoiceArr, secChoiceArr []string if cmp == -1 { firstChoiceArr = strings.Split(theirPrefs, ",") secChoiceArr = strings.Split(myPrefs, ",") } else if cmp == 1 { firstChoiceArr = strings.Split(myPrefs, ",") secChoiceArr = strings.Split(theirPrefs, ",") } else { // Exact same preferences. myPrefsArr := strings.Split(myPrefs, ",") return myPrefsArr[0], nil } for _, secChoice := range secChoiceArr { for _, firstChoice := range firstChoiceArr { if firstChoice == secChoice { return firstChoice, nil } } } return "", errors.New("No algorithms in common!") }
// GenIdentity creates a random keypair and returns the associated // peerID and private key encoded to match config values func GenIdentity() (string, string, error) { k, pub, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 512, u.NewTimeSeededRand()) if err != nil { return "", "", err } b, err := k.Bytes() if err != nil { return "", "", err } privkey := b64.StdEncoding.EncodeToString(b) pubkeyb, err := pub.Bytes() if err != nil { return "", "", err } id := b58.Encode(u.Hash(pubkeyb)) return id, privkey, nil }