949e6f2364
TrustedPeers are specified in the configuration. Additional peers can be added at runtime with Trust/Distrust functions. Unfortunately we cannot use consensus.PeerAdd as a way to trust a peer as cluster.PeerAdd+Join can be called by any peer and this calls consensus.PeerAdd. The result is consensus.PeerAdd doing a lot in Raft while consensus.Trust does nothing, while in CRDTs consensus.Trust does something but consensus.PeerAdd does nothing. But this is more or less consistent.
70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package api
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
peer "github.com/libp2p/go-libp2p-peer"
|
|
ma "github.com/multiformats/go-multiaddr"
|
|
)
|
|
|
|
// PeersToStrings IDB58Encodes a list of peers.
|
|
func PeersToStrings(peers []peer.ID) []string {
|
|
strs := make([]string, len(peers))
|
|
for i, p := range peers {
|
|
if p != "" {
|
|
strs[i] = peer.IDB58Encode(p)
|
|
}
|
|
}
|
|
return strs
|
|
}
|
|
|
|
// StringsToPeers decodes peer.IDs from strings.
|
|
func StringsToPeers(strs []string) []peer.ID {
|
|
peers := []peer.ID{}
|
|
for _, p := range strs {
|
|
pid, err := peer.IDB58Decode(p)
|
|
if err != nil {
|
|
logger.Debugf("'%s': %s", p, err)
|
|
continue
|
|
}
|
|
peers = append(peers, pid)
|
|
}
|
|
return peers
|
|
}
|
|
|
|
// Libp2pMultiaddrSplit takes a LibP2P multiaddress (/<multiaddr>/ipfs/<peerID>)
|
|
// and decapsulates it, parsing the peer ID. Returns an error if there is
|
|
// any problem (for example, the provided address not being a Libp2p one).
|
|
func Libp2pMultiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
|
|
pid, err := addr.ValueForProtocol(ma.P_IPFS)
|
|
if err != nil {
|
|
err = fmt.Errorf("invalid peer multiaddress: %s: %s", addr, err)
|
|
logger.Error(err)
|
|
return "", nil, err
|
|
}
|
|
|
|
ipfs, _ := ma.NewMultiaddr("/ipfs/" + pid)
|
|
decapAddr := addr.Decapsulate(ipfs)
|
|
|
|
peerID, err := peer.IDB58Decode(pid)
|
|
if err != nil {
|
|
err = fmt.Errorf("invalid peer ID in multiaddress: %s: %s", pid, err)
|
|
logger.Error(err)
|
|
return "", nil, err
|
|
}
|
|
return peerID, decapAddr, nil
|
|
}
|
|
|
|
// MustLibp2pMultiaddrJoin takes a LibP2P multiaddress and a peer ID and
|
|
// encapsulates a new /ipfs/<peerID> address. It will panic if the given
|
|
// peer ID is bad.
|
|
func MustLibp2pMultiaddrJoin(addr Multiaddr, p peer.ID) Multiaddr {
|
|
v := addr.Value()
|
|
pidAddr, err := ma.NewMultiaddr("/ipfs/" + peer.IDB58Encode(p))
|
|
// let this break badly
|
|
if err != nil {
|
|
panic("called MustLibp2pMultiaddrJoin with bad peer!")
|
|
}
|
|
return Multiaddr{Multiaddr: v.Encapsulate(pidAddr)}
|
|
}
|