aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ethereum.go91
-rw-r--r--peer.go12
2 files changed, 63 insertions, 40 deletions
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)
+ }
+ } 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
- _, 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)
+ // 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)
}
- } else {
- ethlogger.Debugln("Couldn't resolve :", target)
}
+ // Connect to Peer list
+ s.ProcessPeerList(peers)
}
- // Connect to Peer list
- s.ProcessPeerList(peers)
- }
- // XXX tmp
- s.ConnectToPeer(seedNodeAddress)
+ // 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 {