zcash: support alternative ports and clarify APIs

This commit is contained in:
George Tankersley 2019-10-16 21:05:42 -04:00
parent 7716305c89
commit 7d12f5e57d
2 changed files with 29 additions and 16 deletions

View File

@ -111,6 +111,11 @@ func newSeederPeerConfig(magic network.Network, template *peer.Config) (*peer.Co
return &newPeerConfig, nil
}
// GetNetworkDefaultPort returns the default port of the network this seeder is configured for.
func (s *Seeder) GetNetworkDefaultPort() string {
return s.config.ChainParams.DefaultPort
}
func (s *Seeder) onVerAck(p *peer.Peer, msg *wire.MsgVerAck) {
// Check if we're expecting to hear from this peer
_, ok := s.pendingPeers.Load(p.Addr())
@ -136,10 +141,15 @@ func (s *Seeder) onVerAck(p *peer.Peer, msg *wire.MsgVerAck) {
}
// ConnectToPeer attempts to connect to a peer on the default port at the
// specified address. It returns either a live peer connection or an error.
func (s *Seeder) ConnectToPeer(addr string) error {
connectionString := net.JoinHostPort(addr, s.config.ChainParams.DefaultPort)
// specified address. It returns an error if it can't complete handshake with
// the peer. Otherwise it returns nil and adds the peer to the list of live
// connections and known-good addresses.
func (s *Seeder) ConnectOnDefaultPort(addr string) error {
return s.Connect(addr, s.config.ChainParams.DefaultPort)
}
func (s *Seeder) Connect(addr, port string) error {
connectionString := net.JoinHostPort(addr, port)
p, err := peer.NewOutboundPeer(s.config, connectionString)
if err != nil {
return errors.Wrap(err, "constructing outbound peer")
@ -178,9 +188,10 @@ func (s *Seeder) ConnectToPeer(addr string) error {
panic("This should be unreachable")
}
// GetPeer returns a live peer identified by "host:port" string, or an error if
// we aren't connected to that peer.
func (s *Seeder) GetPeer(addr string) (*peer.Peer, error) {
lookupKey := net.JoinHostPort(addr, s.config.ChainParams.DefaultPort)
p, ok := s.livePeers.Load(lookupKey)
p, ok := s.livePeers.Load(addr)
if ok {
return p.(*peer.Peer), nil
@ -189,9 +200,10 @@ func (s *Seeder) GetPeer(addr string) (*peer.Peer, error) {
return nil, ErrNoSuchPeer
}
// DisconnectPeer disconnects from a live peer identified by "host:port"
// string. It returns an error if we aren't connected to that peer.
func (s *Seeder) DisconnectPeer(addr string) error {
lookupKey := net.JoinHostPort(addr, s.config.ChainParams.DefaultPort)
p, ok := s.livePeers.Load(lookupKey)
p, ok := s.livePeers.Load(addr)
if !ok {
return ErrNoSuchPeer
@ -202,11 +214,12 @@ func (s *Seeder) DisconnectPeer(addr string) error {
v := p.(*peer.Peer)
v.Disconnect()
v.WaitForDisconnect()
s.livePeers.Delete(lookupKey)
s.livePeers.Delete(addr)
return nil
}
// DisconnectAllPeers terminates the connections to all live and pending peers.
func (s *Seeder) DisconnectAllPeers() {
s.pendingPeers.Range(func(key, value interface{}) bool {
p, ok := value.(*peer.Peer)

View File

@ -74,27 +74,27 @@ func TestOutboundPeerSync(t *testing.T) {
return
}
err = regSeeder.ConnectToPeer("127.0.0.1")
err = regSeeder.ConnectOnDefaultPort("127.0.0.1")
if err != nil {
t.Error(err)
return
}
// Can we address that peer if we want to?
p, err := regSeeder.GetPeer("127.0.0.1")
p, err := regSeeder.GetPeer("127.0.0.1:18344")
if err != nil {
t.Error(err)
return
}
if p.Connected() {
regSeeder.DisconnectPeer("127.0.0.1")
regSeeder.DisconnectPeer("127.0.0.1:18344")
} else {
t.Error("Peer never connected")
}
// Can we STILL address a flushed peer?
p, err = regSeeder.GetPeer("127.0.0.1")
p, err = regSeeder.GetPeer("127.0.0.1:18344")
if err != ErrNoSuchPeer {
t.Error("Peer should have been cleared on disconnect")
}
@ -110,7 +110,7 @@ func TestOutboundPeerAsync(t *testing.T) {
for i := 0; i < 4; i++ {
wg.Add(1)
go func() {
err := regSeeder.ConnectToPeer("127.0.0.1")
err := regSeeder.ConnectOnDefaultPort("127.0.0.1")
if err != nil && err != ErrRepeatConnection {
t.Error(err)
}
@ -121,7 +121,7 @@ func TestOutboundPeerAsync(t *testing.T) {
wg.Wait()
// Can we address that peer if we want to?
p, err := regSeeder.GetPeer("127.0.0.1")
p, err := regSeeder.GetPeer("127.0.0.1:18344")
if err != nil {
t.Error(err)
return
@ -129,7 +129,7 @@ func TestOutboundPeerAsync(t *testing.T) {
if p.Connected() {
// Shouldn't try to connect to a live peer again
err := regSeeder.ConnectToPeer("127.0.0.1")
err := regSeeder.ConnectOnDefaultPort("127.0.0.1")
if err != ErrRepeatConnection {
t.Error("should have caught repeat connection attempt")
}
@ -147,7 +147,7 @@ func TestRequestAddresses(t *testing.T) {
return
}
err = regSeeder.ConnectToPeer("127.0.0.1")
err = regSeeder.ConnectOnDefaultPort("127.0.0.1")
if err != nil {
t.Error(err)
return