whisper: fix libp2p connection

Caller gets an EOF very often, though
This commit is contained in:
Guillaume Ballet 2018-03-25 19:46:47 +02:00
parent 03d4401f47
commit 5628f88028
2 changed files with 36 additions and 13 deletions

View file

@ -100,6 +100,7 @@ var (
argServerPoW = flag.Float64("mspow", whisper.DefaultMinimumPoW, "PoW requirement for Mail Server request") 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)") 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") argPub = flag.String("pub", "", "public key for asymmetric encryption")
argDBPath = flag.String("dbpath", "", "path to the server's DB directory") argDBPath = flag.String("dbpath", "", "path to the server's DB directory")
argIDFile = flag.String("idfile", "", "file name with node id (private key)") argIDFile = flag.String("idfile", "", "file name with node id (private key)")
@ -199,11 +200,22 @@ func initialize() {
} }
if *bootstrapMode { if *bootstrapMode {
if !*useLibP2P {
if len(*argIP) == 0 { if len(*argIP) == 0 {
argIP = scanLineA("Please enter your IP and port (e.g. 127.0.0.1:30348): ") argIP = scanLineA("Please enter your IP and port (e.g. 127.0.0.1:30348): ")
} }
} else if *fileReader { } else if *fileReader {
*bootstrapMode = true *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 { } else {
if *useLibP2P { if *useLibP2P {
var libp2pbootstrap *string var libp2pbootstrap *string
@ -293,10 +305,8 @@ func initialize() {
} }
if *useLibP2P { if *useLibP2P {
var port uint fmt.Println("Using port", *argPort)
var a string server, err = whisper.NewLibP2PWhisperServer(*argPort, shh)
fmt.Scanf(*argIP, "%s:%d", &a, &port)
server, err = whisper.NewLibP2PWhisperServer(port, shh)
if err != nil { if err != nil {
utils.Fatalf("Error starting the libp2p client: %v", err) 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.Printf("my public key: %s \n", common.ToHex(crypto.FromECDSAPub(&asymKey.PublicKey)))
fmt.Println(server.Enode()) fmt.Println("my address:", server.Enode())
if *bootstrapMode { if *bootstrapMode {
configureNode() configureNode()

View file

@ -24,7 +24,6 @@ import (
"math" "math"
"github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p"
libp2p "github.com/libp2p/go-libp2p"
crypto "github.com/libp2p/go-libp2p-crypto" crypto "github.com/libp2p/go-libp2p-crypto"
host "github.com/libp2p/go-libp2p-host" host "github.com/libp2p/go-libp2p-host"
inet "github.com/libp2p/go-libp2p-net" inet "github.com/libp2p/go-libp2p-net"
@ -32,6 +31,8 @@ import (
ma "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr"
set "gopkg.in/fatih/set.v0" set "gopkg.in/fatih/set.v0"
pstore "github.com/libp2p/go-libp2p-peerstore" 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 // 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)) ipfsaddrpart, _ := ma.NewMultiaddr(fmt.Sprintf("/ipfs/%s", pid))
ipaddr := addr.Decapsulate(ipfsaddrpart) ipaddr := addr.Decapsulate(ipfsaddrpart)
server.Host.Peerstore().AddAddr(peerid, ipaddr, pstore.PermanentAddrTTL) server.Host.Peerstore().AddAddr(peerid, ipaddr, pstore.PermanentAddrTTL)
newPeer := &LibP2PPeer{id: peer.ID(pid)} newPeer := &LibP2PPeer{id: peerid}
server.Peers = append(server.Peers, newPeer) server.Peers = append(server.Peers, newPeer)
return newPeer return newPeer
@ -278,16 +279,28 @@ func (server *LibP2PWhisperServer) AddPeer(addr ma.Multiaddr) *LibP2PPeer {
// NewLibP2PWhisperServer creates a new WhisperServer with // NewLibP2PWhisperServer creates a new WhisperServer with
// a libp2p backend. // a libp2p backend.
func NewLibP2PWhisperServer(port uint, whisper *Whisper) (WhisperServer, error) { func NewLibP2PWhisperServer(port uint, whisper *Whisper) (WhisperServer, error) {
priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, 384) priv, pub, err := crypto.GenerateKeyPair(crypto.Ed25519, 384)
opts := []libp2p.Option{ if err != nil {
libp2p.ListenAddrStrings(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port)), return nil, fmt.Errorf("Error creating libp2p server: %v", err)
libp2p.Identity(priv), }
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 { 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} server := &LibP2PWhisperServer{h, []*LibP2PPeer{}, whisper}
return server, nil return server, nil