Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 71 additions & 48 deletions cmd/config/addtrustedpeer.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ var addTrustedPeerCmd = &cobra.Command{
Example: `chia-tools config add-trusted-peer 1.2.3.4

# The following version will also override the port to use when connecting to this peer
chia-tools config add-trusted-peer 1.2.3.4 18444`,
chia-tools config add-trusted-peer 1.2.3.4 18444

# You may also specify a DNS name. The tool will attempt to resolve the name to an IP address.
# If the name resolves to multiple IP addresses, chia-tools will attempt to connect to each one to add it to the config.
chia-tools config add-trusted-peer node.chia.net 8444`,
Run: func(cmd *cobra.Command, args []string) {
chiaRoot, err := config.GetChiaRootPath()
if err != nil {
Expand Down Expand Up @@ -60,64 +64,83 @@ chia-tools config add-trusted-peer 1.2.3.4 18444`,
port = uint16(port64)
}

var ips []net.IP

ip := net.ParseIP(peer)
if ip == nil {
slogs.Logr.Fatal("Invalid IP address", "id", peer)
}
slogs.Logr.Info("Attempting to get peer id", "peer", peer, "port", port)

keypair, err := cfg.FullNode.SSL.LoadPublicKeyPair(chiaRoot)
if err != nil {
slogs.Logr.Fatal("Error loading certs from CHIA_ROOT", "CHIA_ROOT", chiaRoot, "error", err)
}
if keypair == nil {
slogs.Logr.Fatal("Error loading certs from CHIA_ROOT", "CHIA_ROOT", chiaRoot, "error", "keypair was nil")
}
conn, err := peerprotocol.NewConnection(
&ip,
peerprotocol.WithPeerPort(port),
peerprotocol.WithNetworkID(*cfg.SelectedNetwork),
peerprotocol.WithPeerKeyPair(*keypair),
)
if err != nil {
slogs.Logr.Fatal("Error creating connection", "error", err)
}
peerID, err := conn.PeerID()
if err != nil {
slogs.Logr.Fatal("Error getting peer id", "error", err)
}
peerIDStr := hex.EncodeToString(peerID[:])
slogs.Logr.Info("peer id received", "peer", peerIDStr)
if !utils.ConfirmAction("Would you like trust this peer? (y/N)", skipConfirm) {
slogs.Logr.Error("Cancelled")
}
cfg.Wallet.TrustedPeers[peerIDStr] = "Does_not_matter"

peerToAdd := config.Peer{
Host: ip.String(),
Port: port,
}

foundPeer := false
for idx, peer := range cfg.Wallet.FullNodePeers {
if peer.Host == ip.String() {
foundPeer = true
cfg.Wallet.FullNodePeers[idx] = peerToAdd
// Try to resolve a DNS name
ips, err = net.LookupIP(peer)
if err != nil {
slogs.Logr.Fatal("Couldn't parse peer as IP address or resolve to a host", "id", peer)
}
}
if !foundPeer {
cfg.Wallet.FullNodePeers = append(cfg.Wallet.FullNodePeers, peerToAdd)
if len(ips) == 0 {
slogs.Logr.Fatal("dns lookup returned 0 IPs ", "id", peer)
}
} else {
ips = append(ips, ip)
}

err = cfg.Save()
if err != nil {
slogs.Logr.Fatal("error saving config", "error", err)
for _, ip := range ips {
addTrustedPeer(cfg, chiaRoot, ip, port)
}

slogs.Logr.Info("Added trusted peer. Restart your chia services for the configuration to take effect")
},
}

func addTrustedPeer(cfg *config.ChiaConfig, chiaRoot string, ip net.IP, port uint16) {
slogs.Logr.Info("Attempting to get peer id", "peer", ip.String(), "port", port)

keypair, err := cfg.FullNode.SSL.LoadPublicKeyPair(chiaRoot)
if err != nil {
slogs.Logr.Fatal("Error loading certs from CHIA_ROOT", "CHIA_ROOT", chiaRoot, "error", err)
}
if keypair == nil {
slogs.Logr.Fatal("Error loading certs from CHIA_ROOT", "CHIA_ROOT", chiaRoot, "error", "keypair was nil")
}
conn, err := peerprotocol.NewConnection(
&ip,
peerprotocol.WithPeerPort(port),
peerprotocol.WithNetworkID(*cfg.SelectedNetwork),
peerprotocol.WithPeerKeyPair(*keypair),
)
if err != nil {
slogs.Logr.Fatal("Error creating connection", "error", err)
}
peerID, err := conn.PeerID()
if err != nil {
slogs.Logr.Fatal("Error getting peer id", "error", err)
}
peerIDStr := hex.EncodeToString(peerID[:])
slogs.Logr.Info("peer id received", "peer", peerIDStr)
if !utils.ConfirmAction("Would you like trust this peer? (y/N)", skipConfirm) {
slogs.Logr.Error("Cancelled")
return
}
cfg.Wallet.TrustedPeers[peerIDStr] = "Does_not_matter"

peerToAdd := config.Peer{
Host: ip.String(),
Port: port,
}

foundPeer := false
for idx, peer := range cfg.Wallet.FullNodePeers {
if peer.Host == ip.String() {
foundPeer = true
cfg.Wallet.FullNodePeers[idx] = peerToAdd
}
}
if !foundPeer {
cfg.Wallet.FullNodePeers = append(cfg.Wallet.FullNodePeers, peerToAdd)
}

err = cfg.Save()
if err != nil {
slogs.Logr.Fatal("error saving config", "error", err)
}
}

func init() {
addTrustedPeerCmd.Flags().BoolVarP(&skipConfirm, "yes", "y", false, "Skip confirmation")
configCmd.AddCommand(addTrustedPeerCmd)
Expand Down