aboutsummaryrefslogtreecommitdiffstats
path: root/peer.go
diff options
context:
space:
mode:
authorMaran <maran.hidskes@gmail.com>2014-06-18 19:06:48 +0800
committerMaran <maran.hidskes@gmail.com>2014-06-18 19:06:48 +0800
commit1f7917589822d4327147949c610fad3979819ab3 (patch)
tree0ec1644e26bb4e503623738ea1b6730d42b094ef /peer.go
parent22e16f15a69f53934a61978eb18fdf0244a74a99 (diff)
downloadgo-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.go31
1 files changed, 30 insertions, 1 deletions
diff --git a/peer.go b/peer.go
index 5362b0f77..2ece9b359 100644
--- a/peer.go
+++ b/peer.go
@@ -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")