mirror of https://github.com/libp2p/go-libp2p.git
Jeromy
7 years ago
1 changed files with 90 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||||
|
package libp2p |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"crypto/rand" |
||||
|
|
||||
|
crypto "github.com/libp2p/go-libp2p-crypto" |
||||
|
host "github.com/libp2p/go-libp2p-host" |
||||
|
pnet "github.com/libp2p/go-libp2p-interface-pnet" |
||||
|
metrics "github.com/libp2p/go-libp2p-metrics" |
||||
|
peer "github.com/libp2p/go-libp2p-peer" |
||||
|
pstore "github.com/libp2p/go-libp2p-peerstore" |
||||
|
swarm "github.com/libp2p/go-libp2p-swarm" |
||||
|
transport "github.com/libp2p/go-libp2p-transport" |
||||
|
bhost "github.com/libp2p/go-libp2p/p2p/host/basic" |
||||
|
mux "github.com/libp2p/go-stream-muxer" |
||||
|
ma "github.com/multiformats/go-multiaddr" |
||||
|
mplex "github.com/whyrusleeping/go-smux-multiplex" |
||||
|
msmux "github.com/whyrusleeping/go-smux-multistream" |
||||
|
yamux "github.com/whyrusleeping/go-smux-yamux" |
||||
|
) |
||||
|
|
||||
|
type Config struct { |
||||
|
Transports []transport.Transport |
||||
|
Muxer mux.Transport |
||||
|
ListenAddrs []ma.Multiaddr |
||||
|
PeerKey crypto.PrivKey |
||||
|
Peerstore pstore.Peerstore |
||||
|
Protector pnet.Protector |
||||
|
Reporter metrics.Reporter |
||||
|
} |
||||
|
|
||||
|
func Construct(ctx context.Context, cfg *Config) (host.Host, error) { |
||||
|
if cfg == nil { |
||||
|
cfg = DefaultConfig() |
||||
|
} |
||||
|
|
||||
|
if cfg.PeerKey == nil { |
||||
|
priv, _, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, rand.Reader) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
cfg.PeerKey = priv |
||||
|
} |
||||
|
|
||||
|
// Obtain Peer ID from public key
|
||||
|
pid, err := peer.IDFromPublicKey(cfg.PeerKey.GetPublic()) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
ps := cfg.Peerstore |
||||
|
if ps == nil { |
||||
|
ps = pstore.NewPeerstore() |
||||
|
} |
||||
|
|
||||
|
ps.AddPrivKey(pid, cfg.PeerKey) |
||||
|
ps.AddPubKey(pid, cfg.PeerKey.GetPublic()) |
||||
|
|
||||
|
swrm, err := swarm.NewSwarmWithProtector(ctx, cfg.ListenAddrs, pid, ps, cfg.Protector, cfg.Muxer, cfg.Reporter) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
netw := (*swarm.Network)(swrm) |
||||
|
|
||||
|
return bhost.New(netw), nil |
||||
|
} |
||||
|
|
||||
|
func DefaultMuxer() mux.Transport { |
||||
|
// Set up stream multiplexer
|
||||
|
tpt := msmux.NewBlankTransport() |
||||
|
tpt.AddTransport("/yamux/1.0.0", yamux.DefaultTransport) |
||||
|
tpt.AddTransport("/mplex/6.3.0", mplex.DefaultTransport) |
||||
|
return tpt |
||||
|
} |
||||
|
|
||||
|
func DefaultConfig() *Config { |
||||
|
// Create a multiaddress
|
||||
|
addr, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0") |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
|
||||
|
return &Config{ |
||||
|
ListenAddrs: []ma.Multiaddr{addr}, |
||||
|
Peerstore: pstore.NewPeerstore(), |
||||
|
Muxer: DefaultMuxer(), |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue