diff options
author | Maran <maran.hidskes@gmail.com> | 2014-06-18 19:06:48 +0800 |
---|---|---|
committer | Maran <maran.hidskes@gmail.com> | 2014-06-18 19:06:48 +0800 |
commit | 1f7917589822d4327147949c610fad3979819ab3 (patch) | |
tree | 0ec1644e26bb4e503623738ea1b6730d42b094ef /peer.go | |
parent | 22e16f15a69f53934a61978eb18fdf0244a74a99 (diff) | |
download | go-tangerine-1f7917589822d4327147949c610fad3979819ab3.tar.gz go-tangerine-1f7917589822d4327147949c610fad3979819ab3.tar.zst go-tangerine-1f7917589822d4327147949c610fad3979819ab3.zip |
Reworked peers to check for public key duplication and adding peers to peerlist only after the handshake has come in
Diffstat (limited to 'peer.go')
-rw-r--r-- | peer.go | 31 |
1 files changed, 30 insertions, 1 deletions
@@ -2,6 +2,7 @@ package eth import ( "bytes" + "container/list" "fmt" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethutil" @@ -615,6 +616,30 @@ func (p *Peer) pushPeers() { func (p *Peer) handleHandshake(msg *ethwire.Msg) { c := msg.Data + // Set pubkey + p.pubkey = c.Get(5).Bytes() + + if p.pubkey == nil { + //ethutil.Config.Log.Debugln("Pubkey required, not supplied in handshake.") + p.Stop() + return + } + + usedPub := 0 + // This peer is already added to the peerlist so we expect to find a double pubkey at least once + + eachPeer(p.ethereum.Peers(), func(peer *Peer, e *list.Element) { + if bytes.Compare(p.pubkey, peer.pubkey) == 0 { + usedPub++ + } + }) + + if usedPub > 0 { + //ethutil.Config.Log.Debugf("Pubkey %x found more then once. Already connected to client.", p.pubkey) + p.Stop() + return + } + if c.Get(0).Uint() != ProtocolVersion { ethutil.Config.Log.Debugf("Invalid peer version. Require protocol: %d. Received: %d\n", ProtocolVersion, c.Get(0).Uint()) p.Stop() @@ -626,7 +651,6 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { // If this is an inbound connection send an ack back if p.inbound { - p.pubkey = c.Get(5).Bytes() p.port = uint16(c.Get(4).Uint()) // Self connect detection @@ -648,6 +672,11 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { p.SetVersion(c.Get(2).Str()) } + p.ethereum.PushPeer(p) + p.ethereum.reactor.Post("peerList", p.ethereum.Peers()) + + ethutil.Config.Log.Infof("[SERV] Added peer (%s) %d / %d\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers) + // Catch up with the connected peer if !p.ethereum.IsUpToDate() { ethutil.Config.Log.Debugln("Already syncing up with a peer; sleeping") |