diff --git a/ethereum.go b/ethereum.go index fdfb59b09..729f81926 100644 --- a/ethereum.go +++ b/ethereum.go @@ -2,9 +2,11 @@ package eth import ( "container/list" + "encoding/json" "fmt" "math/rand" "net" + "path" "strconv" "strings" "sync" @@ -31,9 +33,7 @@ var ethlogger = ethlog.NewLogger("SERV") func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) { // Loop thru the peers and close them (if we had them) for e := peers.Front(); e != nil; e = e.Next() { - if peer, ok := e.Value.(*Peer); ok { - callback(peer, e) - } + callback(e.Value.(*Peer), e) } } @@ -399,47 +399,57 @@ func (s *Ethereum) Start(seed bool) { } func (s *Ethereum) Seed() { - ethlogger.Debugln("Retrieving seed nodes") - - // Eth-Go Bootstrapping - ips, er := net.LookupIP("seed.bysh.me") - if er == nil { - peers := []string{} + var ips []string + data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json")) + json.Unmarshal([]byte(data), &ips) + if len(ips) > 0 { for _, ip := range ips { - node := fmt.Sprintf("%s:%d", ip.String(), 30303) - ethlogger.Debugln("Found DNS Go Peer:", node) - peers = append(peers, node) + ethlogger.Infoln("Connecting to previous peer ", ip) + s.ConnectToPeer(ip) } - s.ProcessPeerList(peers) - } + } else { + ethlogger.Debugln("Retrieving seed nodes") - // Official DNS Bootstrapping - _, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org") - if err == nil { - peers := []string{} - // Iterate SRV nodes - for _, n := range nodes { - target := n.Target - port := strconv.Itoa(int(n.Port)) - // Resolve target to ip (Go returns list, so may resolve to multiple ips?) - addr, err := net.LookupHost(target) - if err == nil { - for _, a := range addr { - // Build string out of SRV port and Resolved IP - peer := net.JoinHostPort(a, port) - ethlogger.Debugln("Found DNS Bootstrap Peer:", peer) - peers = append(peers, peer) - } - } else { - ethlogger.Debugln("Couldn't resolve :", target) + // 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) } - // Connect to Peer list - s.ProcessPeerList(peers) - } - // XXX tmp - s.ConnectToPeer(seedNodeAddress) + // Official DNS Bootstrapping + _, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org") + if err == nil { + peers := []string{} + // Iterate SRV nodes + for _, n := range nodes { + target := n.Target + port := strconv.Itoa(int(n.Port)) + // Resolve target to ip (Go returns list, so may resolve to multiple ips?) + addr, err := net.LookupHost(target) + if err == nil { + for _, a := range addr { + // Build string out of SRV port and Resolved IP + peer := net.JoinHostPort(a, port) + ethlogger.Debugln("Found DNS Bootstrap Peer:", peer) + peers = append(peers, peer) + } + } else { + ethlogger.Debugln("Couldn't resolve :", target) + } + } + // Connect to Peer list + s.ProcessPeerList(peers) + } + + // XXX tmp + s.ConnectToPeer(seedNodeAddress) + } } func (s *Ethereum) peerHandler(listener net.Listener) { @@ -459,6 +469,13 @@ func (s *Ethereum) Stop() { // Close the database 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) { p.Stop() }) diff --git a/peer.go b/peer.go index 69aa4b668..628953535 100644 --- a/peer.go +++ b/peer.go @@ -680,7 +680,7 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { var ( p2pVersion = c.Get(0).Uint() clientId = c.Get(1).Str() - caps = c.Get(2).Raw() + caps = c.Get(2) port = c.Get(3).Uint() pub = c.Get(4).Bytes() ) @@ -734,11 +734,17 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { p.ethereum.PushPeer(p) 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) - p.pushStatus() + capsIt := caps.NewIterator() + for capsIt.Next() { + switch capsIt.Value().Str() { + case "eth": + p.pushStatus() + } + } } func (p *Peer) String() string {