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