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
|
package p2p
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -61,17 +62,18 @@ func (self *Cademlia) Stop() {
|
||||||
self.quitC = nil
|
self.quitC = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Cademlia) AddPeer(peer peerInfo) (needed bool) {
|
func (self *Cademlia) AddPeer(peer peerInfo) (err error) {
|
||||||
index := self.commonPrefixLength(peer.Hash())
|
index := self.commonPrefixLength(peer.Hash())
|
||||||
row := self.rows[index]
|
row := self.rows[index]
|
||||||
needed = row.insert(&entry{peer: peer})
|
needed := row.insert(&entry{peer: peer})
|
||||||
if needed {
|
if needed {
|
||||||
if index >= self.depth {
|
if index >= self.depth {
|
||||||
go self.updateDepth()
|
go self.updateDepth()
|
||||||
}
|
}
|
||||||
cadlogger.Infof("accept peer %x...", peer.Hash()[:8])
|
cadlogger.Infof("accept peer %x...", peer.Hash()[:8])
|
||||||
} else {
|
} 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
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ type peerInfo interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type peerSelector interface {
|
type peerSelector interface {
|
||||||
AddPeer(peer peerInfo) bool
|
AddPeer(peer peerInfo) error
|
||||||
GetPeers(target ...[]byte) []peerInfo
|
GetPeers(target ...[]byte) []peerInfo
|
||||||
Start() error
|
Start() error
|
||||||
Stop() error
|
Stop() error
|
||||||
|
|
@ -28,8 +28,8 @@ type BaseSelector struct {
|
||||||
peers []peerInfo
|
peers []peerInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BaseSelector) AddPeer(peer peerInfo) bool {
|
func (self *BaseSelector) AddPeer(peer peerInfo) error {
|
||||||
return true
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BaseSelector) GetPeers(target ...[]byte) []peerInfo {
|
func (self *BaseSelector) GetPeers(target ...[]byte) []peerInfo {
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ func (srv *Server) AddPeer(addr *peerAddr) (err error) {
|
||||||
lastActiveC: make(chan time.Time),
|
lastActiveC: make(chan time.Time),
|
||||||
lastActive: time.Now().Add(-24 * time.Hour),
|
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)
|
srvlog.Infof("peer %v accepted by peer selection", addr)
|
||||||
err = srv.dialPeer(peer)
|
err = srv.dialPeer(peer)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -436,7 +436,6 @@ func (srv *Server) verifyPeer(peer *Peer) error {
|
||||||
return newPeerError(errSelfConnection, "")
|
return newPeerError(errSelfConnection, "")
|
||||||
}
|
}
|
||||||
srv.lock.RLock()
|
srv.lock.RLock()
|
||||||
defer srv.lock.RUnlock()
|
|
||||||
for _, peer := range srv.peers {
|
for _, peer := range srv.peers {
|
||||||
if peer != nil {
|
if peer != nil {
|
||||||
id := peer.Identity()
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue