@@ -4,47 +4,54 @@ import (
44 "bytes"
55 "context"
66 "fmt"
7+ "log"
8+ "os"
9+ "path"
10+ "strconv"
11+ "time"
12+
713 dsb "github.com/ipfs/go-ds-badger"
14+ logging "github.com/ipfs/go-log"
815 p2p "github.com/libp2p/go-libp2p"
916 crypto "github.com/libp2p/go-libp2p-core/crypto"
1017 host "github.com/libp2p/go-libp2p-core/host"
18+ "github.com/libp2p/go-libp2p-core/peer"
19+ "github.com/libp2p/go-libp2p-core/peerstore"
1120 routing "github.com/libp2p/go-libp2p-core/routing"
1221 discovery "github.com/libp2p/go-libp2p-discovery"
1322 kad "github.com/libp2p/go-libp2p-kad-dht"
1423 kadopts "github.com/libp2p/go-libp2p-kad-dht/opts"
15- "github.com/libp2p/go-libp2p-peerstore"
1624 "github.com/libp2p/go-libp2p-peerstore/pstoreds"
1725 pnet "github.com/libp2p/go-libp2p-pnet"
1826 pubsub "github.com/libp2p/go-libp2p-pubsub"
19- "github.com/libp2p/go-libp2p-record"
27+ record "github.com/libp2p/go-libp2p-record"
2028 secio "github.com/libp2p/go-libp2p-secio"
2129 p2pconfig "github.com/libp2p/go-libp2p/config"
2230 mdns "github.com/libp2p/go-libp2p/p2p/discovery"
2331 tcp "github.com/libp2p/go-tcp-transport"
2432 ws "github.com/libp2p/go-ws-transport"
2533 "github.com/multiformats/go-multiaddr"
2634 "golang.org/x/crypto/blake2b"
27- "log"
28- "os"
29- "path"
30- "strconv"
31- "time"
3235)
3336
3437// Helper contains all the daemon state
3538type Helper struct {
36- Host host.Host
37- Mdns mdns.Service
38- Dht * kad.IpfsDHT
39- Ctx context.Context
40- Pubsub * pubsub.PubSub
39+ Host host.Host
40+ Mdns mdns.Service
41+ Dht * kad.IpfsDHT
42+ Ctx context.Context
43+ Pubsub * pubsub.PubSub
44+ Logger logging.EventLogger
45+ DiscoveredPeers chan peer.AddrInfo
46+ Rendezvous string
47+ Discovery * discovery.RoutingDiscovery
4148}
4249
4350type mdnsListener struct {
44- FoundPeer chan peerstore. PeerInfo
51+ FoundPeer chan peer. AddrInfo
4552}
4653
47- func (l * mdnsListener ) HandlePeerFound (info peerstore. PeerInfo ) {
54+ func (l * mdnsListener ) HandlePeerFound (info peer. AddrInfo ) {
4855 l .FoundPeer <- info
4956}
5057
@@ -64,6 +71,7 @@ func (cv customValidator) Select(key string, values [][]byte) (int, error) {
6471
6572// MakeHelper does all the initialization to run one host
6673func MakeHelper (ctx context.Context , listenOn []multiaddr.Multiaddr , statedir string , pk crypto.PrivKey , networkID string ) (* Helper , error ) {
74+ logger := logging .Logger ("codanet.Helper" )
6775 dso := dsb .DefaultOptions
6876
6977 bp := path .Join (statedir , strconv .Itoa (os .Getpid ()))
@@ -85,14 +93,17 @@ func MakeHelper(ctx context.Context, listenOn []multiaddr.Multiaddr, statedir st
8593 return nil , err
8694 }
8795
88- pnetKey := blake2b .Sum256 ([]byte ("/coda/0.0.1" ))
96+ rendezvousString := fmt .Sprintf ("/coda/0.0.1/%s" , networkID )
97+
98+ pnetKey := blake2b .Sum256 ([]byte (rendezvousString ))
8999 prot , err := pnet .NewV1ProtectorFromBytes (& pnetKey )
90100 if err != nil {
91101 return nil , err
92102 }
93103
94104 rv := customValidator {Base : record.NamespacedValidator {"pk" : record.PublicKeyValidator {}}}
95105
106+ // gross hack to exfiltrate a channel from the side effect of option evaluation
96107 kadch := make (chan * kad.IpfsDHT )
97108
98109 // Make sure this doesn't get too out of sync with the defaults,
@@ -118,13 +129,11 @@ func MakeHelper(ctx context.Context, listenOn []multiaddr.Multiaddr, statedir st
118129 return nil , err
119130 }
120131
121- rendezvousString := fmt .Sprintf ("/coda/0.0.1/%s" , networkID )
122-
123132 mdns , err := mdns .NewMdnsService (ctx , host , time .Minute , "_coda-discovery._udp.local" )
124133 if err != nil {
125134 return nil , err
126135 }
127- l := & mdnsListener {FoundPeer : make (chan peerstore. PeerInfo )}
136+ l := & mdnsListener {FoundPeer : make (chan peer. AddrInfo )}
128137 mdns .RegisterNotifee (l )
129138
130139 kad := <- kadch
@@ -135,44 +144,60 @@ func MakeHelper(ctx context.Context, listenOn []multiaddr.Multiaddr, statedir st
135144 routingDiscovery := discovery .NewRoutingDiscovery (kad )
136145
137146 log .Println ("Announcing ourselves for" , rendezvousString )
138- discovery .Advertise (ctx , routingDiscovery , rendezvousString )
139147
140- // try and find some peers for this chain
141- //dhtpeers, err := routingDiscovery.FindPeers(ctx, rendezvousString, discovery.Limit(16))
142- //if err != nil {
143- // return nil, err
144- //}
148+ discovered := make (chan peer.AddrInfo )
145149
146- foundPeer := func (info peerstore. PeerInfo , source string ) {
150+ foundPeer := func (info peer. AddrInfo , source string ) {
147151 if info .ID != "" {
148152 ctx , cancel := context .WithTimeout (ctx , 15 * time .Second )
149153 defer cancel ()
150154 if err := host .Connect (ctx , info ); err != nil {
151- log . Printf ( "Warn: couldn't connect to %s peer %v (different chain ?): %v" , source , info .Loggable (), err )
155+ logger . Warning ( " couldn't connect to %s peer %v (maybe the network ID mismatched ?): %v" , source , info .Loggable (), err )
152156 } else {
153- log .Printf ("Found a %s peer: %s" , source , info .Loggable ())
154- host .Peerstore ().AddAddrs (info .ID , info .Addrs , peerstore .PermanentAddrTTL )
157+ logger .Info ("Found a %s peer: %s" , source , info .Loggable ())
158+ host .Peerstore ().AddAddrs (info .ID , info .Addrs , peerstore .ConnectedAddrTTL )
159+ discovered <- info
155160 }
156161 }
157162 }
158163
164+ // report local discovery peers
159165 go func () {
160- for {
161- info := <- l .FoundPeer
166+ for info := range l .FoundPeer {
162167 foundPeer (info , "local" )
163168 }
164169 }()
165170
171+ // report dht peers
172+ go func () {
173+ for {
174+ // default is to yield only 100 peers at a time. for now, always be
175+ // looking... TODO: Is there a better way to use discovery? Should we only
176+ // have to explicitly search once?
177+ dhtpeers , err := routingDiscovery .FindPeers (ctx , rendezvousString )
178+ if err != nil {
179+ logger .Error ("failed to find DHT peers: " , err )
180+ }
181+ for info := range dhtpeers {
182+ foundPeer (info , "dht" )
183+ }
184+ }
185+ }()
186+
166187 pubsub , err := pubsub .NewFloodSub (ctx , host , pubsub .WithStrictSignatureVerification (true ), pubsub .WithMessageSigning (true ))
167188 if err != nil {
168189 return nil , err
169190 }
170191
171192 return & Helper {
172- Host : host ,
173- Ctx : ctx ,
174- Mdns : mdns ,
175- Dht : kad ,
176- Pubsub : pubsub ,
193+ Host : host ,
194+ Ctx : ctx ,
195+ Mdns : mdns ,
196+ Dht : kad ,
197+ Pubsub : pubsub ,
198+ Logger : logger ,
199+ DiscoveredPeers : discovered ,
200+ Rendezvous : rendezvousString ,
201+ Discovery : routingDiscovery ,
177202 }, nil
178203}
0 commit comments