mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
peer selector now verifies inbound peers
- after handshake when nodeID is known - part of verifyPeerHook - peerSelector.AddPeer now returns error
This commit is contained in:
parent
c8aa9f1e75
commit
44e9ebbf91
3 changed files with 15 additions and 8 deletions
|
|
@ -1,6 +1,7 @@
|
|||
package p2p
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
|
|
@ -61,17 +62,18 @@ func (self *Cademlia) Stop() {
|
|||
self.quitC = nil
|
||||
}
|
||||
|
||||
func (self *Cademlia) AddPeer(peer peerInfo) (needed bool) {
|
||||
func (self *Cademlia) AddPeer(peer peerInfo) (err error) {
|
||||
index := self.commonPrefixLength(peer.Hash())
|
||||
row := self.rows[index]
|
||||
needed = row.insert(&entry{peer: peer})
|
||||
needed := row.insert(&entry{peer: peer})
|
||||
if needed {
|
||||
if index >= self.depth {
|
||||
go self.updateDepth()
|
||||
}
|
||||
cadlogger.Infof("accept peer %x...", peer.Hash()[:8])
|
||||
} else {
|
||||
cadlogger.Infof("reject peer %x... no worse peer found", peer.Hash()[:8])
|
||||
err = fmt.Errorf("no worse peer found")
|
||||
cadlogger.Infof("reject peer %x..: %v", peer.Hash()[:8], err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ type peerInfo interface {
|
|||
}
|
||||
|
||||
type peerSelector interface {
|
||||
AddPeer(peer peerInfo) bool
|
||||
AddPeer(peer peerInfo) error
|
||||
GetPeers(target ...[]byte) []peerInfo
|
||||
Start() error
|
||||
Stop() error
|
||||
|
|
@ -28,8 +28,8 @@ type BaseSelector struct {
|
|||
peers []peerInfo
|
||||
}
|
||||
|
||||
func (self *BaseSelector) AddPeer(peer peerInfo) bool {
|
||||
return true
|
||||
func (self *BaseSelector) AddPeer(peer peerInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *BaseSelector) GetPeers(target ...[]byte) []peerInfo {
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ func (srv *Server) AddPeer(addr *peerAddr) (err error) {
|
|||
lastActiveC: make(chan time.Time),
|
||||
lastActive: time.Now().Add(-24 * time.Hour),
|
||||
}
|
||||
if srv.PeerSelector.AddPeer(peer) {
|
||||
if err = srv.PeerSelector.AddPeer(peer); err == nil {
|
||||
srvlog.Infof("peer %v accepted by peer selection", addr)
|
||||
err = srv.dialPeer(peer)
|
||||
} else {
|
||||
|
|
@ -436,7 +436,6 @@ func (srv *Server) verifyPeer(peer *Peer) error {
|
|||
return newPeerError(errSelfConnection, "")
|
||||
}
|
||||
srv.lock.RLock()
|
||||
defer srv.lock.RUnlock()
|
||||
for _, peer := range srv.peers {
|
||||
if peer != nil {
|
||||
id := peer.Identity()
|
||||
|
|
@ -445,6 +444,12 @@ func (srv *Server) verifyPeer(peer *Peer) error {
|
|||
}
|
||||
}
|
||||
}
|
||||
srv.lock.RUnlock()
|
||||
if peer.dialAddr == nil {
|
||||
if err := srv.PeerSelector.AddPeer(peer); err != nil {
|
||||
return newPeerError(errRejectedPeer, "%v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue