diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go index 660b2901e2..1c8201b05f 100644 --- a/cmd/wnode/main.go +++ b/cmd/wnode/main.go @@ -100,6 +100,7 @@ var ( argServerPoW = flag.Float64("mspow", whisper.DefaultMinimumPoW, "PoW requirement for Mail Server request") argIP = flag.String("ip", "", "IP address and port of this node (e.g. 127.0.0.1:30303)") + argPort = flag.Uint("port", 0, "Port to be used byt the libp2p server") argPub = flag.String("pub", "", "public key for asymmetric encryption") argDBPath = flag.String("dbpath", "", "path to the server's DB directory") argIDFile = flag.String("idfile", "", "file name with node id (private key)") @@ -199,11 +200,22 @@ func initialize() { } if *bootstrapMode { + if !*useLibP2P { if len(*argIP) == 0 { argIP = scanLineA("Please enter your IP and port (e.g. 127.0.0.1:30348): ") } } else if *fileReader { *bootstrapMode = true + } else { + if *argPort == 0 { + for { + fmt.Print("Please enter the port to use: ") + if _, err := fmt.Scanf("%d", argPort); err != nil || *argPort >= 1024 { + break + } + } + } + } } else { if *useLibP2P { var libp2pbootstrap *string @@ -293,10 +305,8 @@ func initialize() { } if *useLibP2P { - var port uint - var a string - fmt.Scanf(*argIP, "%s:%d", &a, &port) - server, err = whisper.NewLibP2PWhisperServer(port, shh) + fmt.Println("Using port", *argPort) + server, err = whisper.NewLibP2PWhisperServer(*argPort, shh) if err != nil { utils.Fatalf("Error starting the libp2p client: %v", err) } @@ -330,7 +340,7 @@ func startServer() error { } fmt.Printf("my public key: %s \n", common.ToHex(crypto.FromECDSAPub(&asymKey.PublicKey))) - fmt.Println(server.Enode()) + fmt.Println("my address:", server.Enode()) if *bootstrapMode { configureNode() diff --git a/whisper/whisperv6/libp2p_glue.go b/whisper/whisperv6/libp2p_glue.go index eeb44219ad..fd613b0d9b 100644 --- a/whisper/whisperv6/libp2p_glue.go +++ b/whisper/whisperv6/libp2p_glue.go @@ -24,7 +24,6 @@ import ( "math" "github.com/ethereum/go-ethereum/p2p" - libp2p "github.com/libp2p/go-libp2p" crypto "github.com/libp2p/go-libp2p-crypto" host "github.com/libp2p/go-libp2p-host" inet "github.com/libp2p/go-libp2p-net" @@ -32,6 +31,8 @@ import ( ma "github.com/multiformats/go-multiaddr" set "gopkg.in/fatih/set.v0" pstore "github.com/libp2p/go-libp2p-peerstore" + swarm "github.com/libp2p/go-libp2p-swarm" + "github.com/libp2p/go-libp2p/p2p/host/basic" ) // LibP2PStream is a wrapper used to implement the MsgReadWriter @@ -269,7 +270,7 @@ func (server *LibP2PWhisperServer) AddPeer(addr ma.Multiaddr) *LibP2PPeer { ipfsaddrpart, _ := ma.NewMultiaddr(fmt.Sprintf("/ipfs/%s", pid)) ipaddr := addr.Decapsulate(ipfsaddrpart) server.Host.Peerstore().AddAddr(peerid, ipaddr, pstore.PermanentAddrTTL) - newPeer := &LibP2PPeer{id: peer.ID(pid)} + newPeer := &LibP2PPeer{id: peerid} server.Peers = append(server.Peers, newPeer) return newPeer @@ -278,16 +279,28 @@ func (server *LibP2PWhisperServer) AddPeer(addr ma.Multiaddr) *LibP2PPeer { // NewLibP2PWhisperServer creates a new WhisperServer with // a libp2p backend. func NewLibP2PWhisperServer(port uint, whisper *Whisper) (WhisperServer, error) { - priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, 384) - opts := []libp2p.Option{ - libp2p.ListenAddrStrings(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port)), - libp2p.Identity(priv), + priv, pub, err := crypto.GenerateKeyPair(crypto.Ed25519, 384) + if err != nil { + return nil, fmt.Errorf("Error creating libp2p server: %v", err) + } + nodeID, err := peer.IDFromPublicKey(pub) + if err != nil { + return nil, fmt.Errorf("Error creating libp2p server identity: %v pubkey=%v", err, pub) + } + serverAddr, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port)) + if err != nil { + return nil, fmt.Errorf("Error creating libp2p server address: %v port=%d", err, port) } - h, err := libp2p.New(context.Background(), opts...) + ps := pstore.NewPeerstore() + ps.AddPrivKey(nodeID, priv) + ps.AddPubKey(nodeID, pub) + + network, err := swarm.NewNetwork(context.Background(), []ma.Multiaddr{serverAddr}, nodeID, ps, nil) if err != nil { - return nil, fmt.Errorf("Error setting up the libp2p network: %s", err) + return nil, fmt.Errorf("Error creating libp2p network: %v port=%d", err, port) } + h := basichost.New(network) server := &LibP2PWhisperServer{h, []*LibP2PPeer{}, whisper} return server, nil