Merge pull request #1480 from wpaulino/add-peer-on-verack

server: refactor OnVersion to instead add peers within OnVerAck
This commit is contained in:
Olaoluwa Osuntokun 2019-10-14 17:11:47 +02:00 committed by GitHub
commit 860ca32a22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -438,11 +438,6 @@ func (sp *serverPeer) OnVersion(_ *peer.Peer, msg *wire.MsgVersion) *wire.MsgRej
return wire.NewMsgReject(msg.Command(), wire.RejectNonstandard, reason) return wire.NewMsgReject(msg.Command(), wire.RejectNonstandard, reason)
} }
// Update the address manager and request known addresses from the
// remote peer for outbound connections. This is skipped when running
// on the simulation test network since it is only intended to connect
// to specified peers and actively avoids advertising and connecting to
// discovered peers.
if !cfg.SimNet && !isInbound { if !cfg.SimNet && !isInbound {
// After soft-fork activation, only make outbound // After soft-fork activation, only make outbound
// connection to peers if they flag that they're segwit // connection to peers if they flag that they're segwit
@ -461,47 +456,25 @@ func (sp *serverPeer) OnVersion(_ *peer.Peer, msg *wire.MsgVersion) *wire.MsgRej
sp.Disconnect() sp.Disconnect()
return nil return nil
} }
// Advertise the local address when the server accepts incoming
// connections and it believes itself to be close to the best known tip.
if !cfg.DisableListen && sp.server.syncManager.IsCurrent() {
// Get address that best matches.
lna := addrManager.GetBestLocalAddress(remoteAddr)
if addrmgr.IsRoutable(lna) {
// Filter addresses the peer already knows about.
addresses := []*wire.NetAddress{lna}
sp.pushAddrMsg(addresses)
}
}
// Request known addresses if the server address manager needs
// more and the peer has a protocol version new enough to
// include a timestamp with addresses.
hasTimestamp := sp.ProtocolVersion() >= wire.NetAddressTimeVersion
if addrManager.NeedMoreAddresses() && hasTimestamp {
sp.QueueMessage(wire.NewMsgGetAddr(), nil)
}
// Mark the address as a known good address.
addrManager.Good(remoteAddr)
} }
// Add the remote peer time as a sample for creating an offset against // Add the remote peer time as a sample for creating an offset against
// the local clock to keep the network time in sync. // the local clock to keep the network time in sync.
sp.server.timeSource.AddTimeSample(sp.Addr(), msg.Timestamp) sp.server.timeSource.AddTimeSample(sp.Addr(), msg.Timestamp)
// Signal the sync manager this peer is a new sync candidate.
sp.server.syncManager.NewPeer(sp.Peer)
// Choose whether or not to relay transactions before a filter command // Choose whether or not to relay transactions before a filter command
// is received. // is received.
sp.setDisableRelayTx(msg.DisableRelayTx) sp.setDisableRelayTx(msg.DisableRelayTx)
// Add valid peer to the server.
sp.server.AddPeer(sp)
return nil return nil
} }
// OnVerAck is invoked when a peer receives a verack bitcoin message and is used
// to kick start communication with them.
func (sp *serverPeer) OnVerAck(_ *peer.Peer, _ *wire.MsgVerAck) {
sp.server.AddPeer(sp)
}
// OnMemPool is invoked when a peer receives a mempool bitcoin message. // OnMemPool is invoked when a peer receives a mempool bitcoin message.
// It creates and sends an inventory message with the contents of the memory // It creates and sends an inventory message with the contents of the memory
// pool up to the maximum inventory allowed per message. When the peer has a // pool up to the maximum inventory allowed per message. When the peer has a
@ -1590,7 +1563,7 @@ func (s *server) handleUpdatePeerHeights(state *peerState, umsg updatePeerHeight
// handleAddPeerMsg deals with adding new peers. It is invoked from the // handleAddPeerMsg deals with adding new peers. It is invoked from the
// peerHandler goroutine. // peerHandler goroutine.
func (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool { func (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool {
if sp == nil { if sp == nil || !sp.Connected() {
return false return false
} }
@ -1657,6 +1630,40 @@ func (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool {
s.addrManager.Connected(sp.NA()) s.addrManager.Connected(sp.NA())
} }
// Signal the sync manager this peer is a new sync candidate.
s.syncManager.NewPeer(sp.Peer)
// Update the address manager and request known addresses from the
// remote peer for outbound connections. This is skipped when running on
// the simulation test network since it is only intended to connect to
// specified peers and actively avoids advertising and connecting to
// discovered peers.
if !cfg.SimNet && !sp.Inbound() {
// Advertise the local address when the server accepts incoming
// connections and it believes itself to be close to the best
// known tip.
if !cfg.DisableListen && s.syncManager.IsCurrent() {
// Get address that best matches.
lna := s.addrManager.GetBestLocalAddress(sp.NA())
if addrmgr.IsRoutable(lna) {
// Filter addresses the peer already knows about.
addresses := []*wire.NetAddress{lna}
sp.pushAddrMsg(addresses)
}
}
// Request known addresses if the server address manager needs
// more and the peer has a protocol version new enough to
// include a timestamp with addresses.
hasTimestamp := sp.ProtocolVersion() >= wire.NetAddressTimeVersion
if s.addrManager.NeedMoreAddresses() && hasTimestamp {
sp.QueueMessage(wire.NewMsgGetAddr(), nil)
}
// Mark the address as a known good address.
s.addrManager.Good(sp.NA())
}
return true return true
} }
@ -1966,6 +1973,7 @@ func newPeerConfig(sp *serverPeer) *peer.Config {
return &peer.Config{ return &peer.Config{
Listeners: peer.MessageListeners{ Listeners: peer.MessageListeners{
OnVersion: sp.OnVersion, OnVersion: sp.OnVersion,
OnVerAck: sp.OnVerAck,
OnMemPool: sp.OnMemPool, OnMemPool: sp.OnMemPool,
OnTx: sp.OnTx, OnTx: sp.OnTx,
OnBlock: sp.OnBlock, OnBlock: sp.OnBlock,