Commit 1549a29c authored by obscuren's avatar obscuren

Connect to previous peer

parent 66e309c5
...@@ -2,9 +2,11 @@ package eth ...@@ -2,9 +2,11 @@ package eth
import ( import (
"container/list" "container/list"
"encoding/json"
"fmt" "fmt"
"math/rand" "math/rand"
"net" "net"
"path"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
...@@ -31,9 +33,7 @@ var ethlogger = ethlog.NewLogger("SERV") ...@@ -31,9 +33,7 @@ var ethlogger = ethlog.NewLogger("SERV")
func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) { func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) {
// Loop thru the peers and close them (if we had them) // Loop thru the peers and close them (if we had them)
for e := peers.Front(); e != nil; e = e.Next() { for e := peers.Front(); e != nil; e = e.Next() {
if peer, ok := e.Value.(*Peer); ok { callback(e.Value.(*Peer), e)
callback(peer, e)
}
} }
} }
...@@ -399,47 +399,57 @@ func (s *Ethereum) Start(seed bool) { ...@@ -399,47 +399,57 @@ func (s *Ethereum) Start(seed bool) {
} }
func (s *Ethereum) Seed() { func (s *Ethereum) Seed() {
ethlogger.Debugln("Retrieving seed nodes") var ips []string
data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"))
// Eth-Go Bootstrapping json.Unmarshal([]byte(data), &ips)
ips, er := net.LookupIP("seed.bysh.me") if len(ips) > 0 {
if er == nil {
peers := []string{}
for _, ip := range ips { for _, ip := range ips {
node := fmt.Sprintf("%s:%d", ip.String(), 30303) ethlogger.Infoln("Connecting to previous peer ", ip)
ethlogger.Debugln("Found DNS Go Peer:", node) s.ConnectToPeer(ip)
peers = append(peers, node) }
} else {
ethlogger.Debugln("Retrieving seed nodes")
// Eth-Go Bootstrapping
ips, er := net.LookupIP("seed.bysh.me")
if er == nil {
peers := []string{}
for _, ip := range ips {
node := fmt.Sprintf("%s:%d", ip.String(), 30303)
ethlogger.Debugln("Found DNS Go Peer:", node)
peers = append(peers, node)
}
s.ProcessPeerList(peers)
} }
s.ProcessPeerList(peers)
}
// Official DNS Bootstrapping // Official DNS Bootstrapping
_, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org") _, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org")
if err == nil { if err == nil {
peers := []string{} peers := []string{}
// Iterate SRV nodes // Iterate SRV nodes
for _, n := range nodes { for _, n := range nodes {
target := n.Target target := n.Target
port := strconv.Itoa(int(n.Port)) port := strconv.Itoa(int(n.Port))
// Resolve target to ip (Go returns list, so may resolve to multiple ips?) // Resolve target to ip (Go returns list, so may resolve to multiple ips?)
addr, err := net.LookupHost(target) addr, err := net.LookupHost(target)
if err == nil { if err == nil {
for _, a := range addr { for _, a := range addr {
// Build string out of SRV port and Resolved IP // Build string out of SRV port and Resolved IP
peer := net.JoinHostPort(a, port) peer := net.JoinHostPort(a, port)
ethlogger.Debugln("Found DNS Bootstrap Peer:", peer) ethlogger.Debugln("Found DNS Bootstrap Peer:", peer)
peers = append(peers, peer) peers = append(peers, peer)
}
} else {
ethlogger.Debugln("Couldn't resolve :", target)
} }
} else {
ethlogger.Debugln("Couldn't resolve :", target)
} }
// Connect to Peer list
s.ProcessPeerList(peers)
} }
// Connect to Peer list
s.ProcessPeerList(peers)
}
// XXX tmp // XXX tmp
s.ConnectToPeer(seedNodeAddress) s.ConnectToPeer(seedNodeAddress)
}
} }
func (s *Ethereum) peerHandler(listener net.Listener) { func (s *Ethereum) peerHandler(listener net.Listener) {
...@@ -459,6 +469,13 @@ func (s *Ethereum) Stop() { ...@@ -459,6 +469,13 @@ func (s *Ethereum) Stop() {
// Close the database // Close the database
defer s.db.Close() defer s.db.Close()
var ips []string
eachPeer(s.peers, func(p *Peer, e *list.Element) {
ips = append(ips, p.conn.RemoteAddr().String())
})
d, _ := json.MarshalIndent(ips, "", " ")
ethutil.WriteFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"), d)
eachPeer(s.peers, func(p *Peer, e *list.Element) { eachPeer(s.peers, func(p *Peer, e *list.Element) {
p.Stop() p.Stop()
}) })
......
...@@ -680,7 +680,7 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { ...@@ -680,7 +680,7 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
var ( var (
p2pVersion = c.Get(0).Uint() p2pVersion = c.Get(0).Uint()
clientId = c.Get(1).Str() clientId = c.Get(1).Str()
caps = c.Get(2).Raw() caps = c.Get(2)
port = c.Get(3).Uint() port = c.Get(3).Uint()
pub = c.Get(4).Bytes() pub = c.Get(4).Bytes()
) )
...@@ -734,11 +734,17 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { ...@@ -734,11 +734,17 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
p.ethereum.PushPeer(p) p.ethereum.PushPeer(p)
p.ethereum.reactor.Post("peerList", p.ethereum.Peers()) p.ethereum.reactor.Post("peerList", p.ethereum.Peers())
ethlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, caps) ethlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, caps.Raw())
peerlogger.Debugln(p) peerlogger.Debugln(p)
p.pushStatus() capsIt := caps.NewIterator()
for capsIt.Next() {
switch capsIt.Value().Str() {
case "eth":
p.pushStatus()
}
}
} }
func (p *Peer) String() string { func (p *Peer) String() string {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment