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")
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()

View file

@ -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