From 9483cfb1e8f419dd84ca8bcf139a3d3d1def18cc Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Wed, 14 Mar 2018 12:10:36 +0100 Subject: [PATCH] whisper: update to the wnode libp2p interface Fix the node address iinput, enable the passing of ipfs-enabled multiaddr address schemes. --- cmd/wnode/main.go | 27 +++++++++++++++++++++++---- whisper/whisperv6/libp2p_glue.go | 20 ++++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go index b27a1189c8..fff337024a 100644 --- a/cmd/wnode/main.go +++ b/cmd/wnode/main.go @@ -43,6 +43,8 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/multiformats/go-multiaddr" + "github.com/ethereum/go-ethereum/whisper/mailserver" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" "golang.org/x/crypto/pbkdf2" @@ -178,6 +180,7 @@ func initialize() { done = make(chan struct{}) var peers []*discover.Node + var libp2pPeers []multiaddr.Multiaddr var err error if *generateKey { @@ -202,11 +205,24 @@ func initialize() { } else if *fileReader { *bootstrapMode = true } else { - if len(*argEnode) == 0 { - argEnode = scanLineA("Please enter the peer's enode: ") + if *useLibP2P { + var libp2pbootstrap *string + for libp2pbootstrap == nil { + libp2pbootstrap = scanLineA("Please enter the bootstrap node's addres: ") + } + libp2pbootaddr, err := multiaddr.NewMultiaddr(*libp2pbootstrap) + if err != nil { + utils.Fatalf("Error parsing the bootnode addr: %v", err) + } + fmt.Println(libp2pbootaddr) + libp2pPeers = append(libp2pPeers, libp2pbootaddr) + } else { + if len(*argEnode) == 0 { + argEnode = scanLineA("Please enter the peer's enode: ") + } + peer := discover.MustParseNode(*argEnode) + peers = append(peers, peer) } - peer := discover.MustParseNode(*argEnode) - peers = append(peers, peer) } if *mailServerMode { @@ -281,6 +297,9 @@ func initialize() { if err != nil { utils.Fatalf("Error starting the libp2p client: %v", err) } + for _, p := range libp2pPeers { + server.(*whisper.LibP2PWhisperServer).AddPeer(p) + } } else { server = &whisper.DevP2PWhisperServer{ &p2p.Server{ diff --git a/whisper/whisperv6/libp2p_glue.go b/whisper/whisperv6/libp2p_glue.go index cb5a2cbccc..e8549f5841 100644 --- a/whisper/whisperv6/libp2p_glue.go +++ b/whisper/whisperv6/libp2p_glue.go @@ -29,6 +29,7 @@ import ( host "github.com/libp2p/go-libp2p-host" inet "github.com/libp2p/go-libp2p-net" peer "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" ) // LibP2PStream is a wrapper used to implement the MsgReadWriter @@ -128,6 +129,8 @@ func (p *LibP2PPeer) ID() string { // LibP2PWhisperServer implements WhisperServer for libp2p. type LibP2PWhisperServer struct { Host host.Host + + Peers []LibP2PPeer } // Start starts the server @@ -147,7 +150,20 @@ func (server *LibP2PWhisperServer) PeerCount() int { // Enode returns the enode address of the node func (server *LibP2PWhisperServer) Enode() string { - return server.Host.Addrs()[0].String() + addr := server.Host.Addrs()[0] + hostAddr, _ := ma.NewMultiaddr(fmt.Sprintf("/ipfs/%s", server.Host.ID().Pretty())) + fullAddr := addr.Encapsulate(hostAddr) + return fullAddr.String() +} + +func (server *LibP2PWhisperServer) AddPeer(addr ma.Multiaddr) *LibP2PPeer { + fmt.Println("Adding peer: ", addr) + pid, err := addr.ValueForProtocol(ma.P_IPFS) + if err != nil { + // XXX + panic(err) + } + return &LibP2PPeer{id: peer.ID(pid)} } // NewLibP2PWhisperServer creates a new WhisperServer with @@ -163,5 +179,5 @@ func NewLibP2PWhisperServer() (WhisperServer, error) { if err != nil { return nil, fmt.Errorf("Error setting up the libp2p network: %s", err) } - return &LibP2PWhisperServer{h}, nil + return &LibP2PWhisperServer{h, []LibP2PPeer{}}, nil }