aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--ethereum.go78
-rw-r--r--ethpub/pub.go10
-rw-r--r--ethrpc/server.go10
-rw-r--r--ethutil/config.go2
-rw-r--r--peer.go47
6 files changed, 113 insertions, 36 deletions
diff --git a/README.md b/README.md
index 617a1ac8a..72e187db7 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Ethereum
Ethereum Go Development package (C) Jeffrey Wilcke
Ethereum is currently in its testing phase. The current state is "Proof
-of Concept 5.0 RC3". For build instructions see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)).
+of Concept 5.0 RC4". For build instructions see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)).
Ethereum Go is split up in several sub packages Please refer to each
individual package for more information.
diff --git a/ethereum.go b/ethereum.go
index e3140b5ce..92c4e4ba1 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -2,6 +2,7 @@ package eth
import (
"container/list"
+ "fmt"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethdb"
"github.com/ethereum/eth-go/ethrpc"
@@ -9,9 +10,11 @@ import (
"github.com/ethereum/eth-go/ethwire"
"io/ioutil"
"log"
+ "math/rand"
"net"
"net/http"
"strconv"
+ "strings"
"sync"
"sync/atomic"
"time"
@@ -122,12 +125,20 @@ func (s *Ethereum) TxPool() *ethchain.TxPool {
return s.txPool
}
+func (s *Ethereum) ServerCaps() Caps {
+ return s.serverCaps
+}
+
func (s *Ethereum) AddPeer(conn net.Conn) {
peer := NewPeer(conn, s, true)
- if peer != nil && s.peers.Len() < s.MaxPeers {
- s.peers.PushBack(peer)
- peer.Start()
+ if peer != nil {
+ if s.peers.Len() < s.MaxPeers {
+ s.peers.PushBack(peer)
+ peer.Start()
+ } else {
+ ethutil.Config.Log.Debugf("[SERV] Max connected peers reached. Not adding incoming peer.")
+ }
}
}
@@ -142,15 +153,51 @@ func (s *Ethereum) ConnectToPeer(addr string) error {
if s.peers.Len() < s.MaxPeers {
var alreadyConnected bool
+ ahost, _, _ := net.SplitHostPort(addr)
+ var chost string
+
+ ips, err := net.LookupIP(ahost)
+
+ if err != nil {
+ return err
+ } else {
+ // If more then one ip is available try stripping away the ipv6 ones
+ if len(ips) > 1 {
+ var ipsv4 []net.IP
+ // For now remove the ipv6 addresses
+ for _, ip := range ips {
+ if strings.Contains(ip.String(), "::") {
+ continue
+ } else {
+ ipsv4 = append(ipsv4, ip)
+ }
+ }
+ if len(ipsv4) == 0 {
+ return fmt.Errorf("[SERV] No IPV4 addresses available for hostname")
+ }
+
+ // Pick a random ipv4 address, simulating round-robin DNS.
+ rand.Seed(time.Now().UTC().UnixNano())
+ i := rand.Intn(len(ipsv4))
+ chost = ipsv4[i].String()
+ } else {
+ if len(ips) == 0 {
+ return fmt.Errorf("[SERV] No IPs resolved for the given hostname")
+ return nil
+ }
+ chost = ips[0].String()
+ }
+ }
+
eachPeer(s.peers, func(p *Peer, v *list.Element) {
if p.conn == nil {
return
}
phost, _, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
- ahost, _, _ := net.SplitHostPort(addr)
- if phost == ahost {
+ if phost == chost {
alreadyConnected = true
+ ethutil.Config.Log.Debugf("[SERV] Peer %s already added.\n", chost)
return
}
})
@@ -278,8 +325,21 @@ func (s *Ethereum) Start(seed bool) {
}
func (s *Ethereum) Seed() {
- ethutil.Config.Log.Debugln("Seeding")
- // DNS Bootstrapping
+ ethutil.Config.Log.Debugln("[SERV] 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)
+ ethutil.Config.Log.Debugln("[SERV] Found DNS Go Peer:", node)
+ peers = append(peers, node)
+ }
+ s.ProcessPeerList(peers)
+ }
+
+ // Official DNS Bootstrapping
_, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org")
if err == nil {
peers := []string{}
@@ -293,11 +353,11 @@ func (s *Ethereum) Seed() {
for _, a := range addr {
// Build string out of SRV port and Resolved IP
peer := net.JoinHostPort(a, port)
- log.Println("Found DNS Bootstrap Peer:", peer)
+ ethutil.Config.Log.Debugln("[SERV] Found DNS Bootstrap Peer:", peer)
peers = append(peers, peer)
}
} else {
- log.Println("Couldn't resolve :", target)
+ ethutil.Config.Log.Debugln("[SERV} Couldn't resolve :", target)
}
}
// Connect to Peer list
diff --git a/ethpub/pub.go b/ethpub/pub.go
index f7e641b35..4ced632f5 100644
--- a/ethpub/pub.go
+++ b/ethpub/pub.go
@@ -6,16 +6,18 @@ import (
)
type PEthereum struct {
+ manager ethchain.EthManager
stateManager *ethchain.StateManager
blockChain *ethchain.BlockChain
txPool *ethchain.TxPool
}
-func NewPEthereum(sm *ethchain.StateManager, bc *ethchain.BlockChain, txp *ethchain.TxPool) *PEthereum {
+func NewPEthereum(manager ethchain.EthManager) *PEthereum {
return &PEthereum{
- sm,
- bc,
- txp,
+ manager,
+ manager.StateManager(),
+ manager.BlockChain(),
+ manager.TxPool(),
}
}
diff --git a/ethrpc/server.go b/ethrpc/server.go
index 40787fade..3960e641c 100644
--- a/ethrpc/server.go
+++ b/ethrpc/server.go
@@ -1,6 +1,7 @@
package ethrpc
import (
+ "fmt"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil"
"net"
@@ -48,15 +49,16 @@ func (s *JsonRpcServer) Start() {
}
}
-func NewJsonRpcServer(ethp *ethpub.PEthereum) *JsonRpcServer {
- l, err := net.Listen("tcp", ":30304")
+func NewJsonRpcServer(ethp *ethpub.PEthereum, port int) (*JsonRpcServer, error) {
+ sport := fmt.Sprintf(":%d", port)
+ l, err := net.Listen("tcp", sport)
if err != nil {
- ethutil.Config.Log.Infoln("Error starting JSON-RPC")
+ return nil, err
}
return &JsonRpcServer{
listener: l,
quit: make(chan bool),
ethp: ethp,
- }
+ }, nil
}
diff --git a/ethutil/config.go b/ethutil/config.go
index feab23e02..07dc85f08 100644
--- a/ethutil/config.go
+++ b/ethutil/config.go
@@ -50,7 +50,7 @@ func ReadConfig(base string) *config {
}
}
- Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC3"}
+ Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC4"}
Config.Log = NewLogger(LogFile|LogStd, LogLevelDebug)
Config.SetClientString("/Ethereum(G)")
}
diff --git a/peer.go b/peer.go
index 80ddc5142..932dbdc18 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"
@@ -146,6 +147,7 @@ func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer {
port: 30303,
pubkey: pubkey,
blocksRequested: 10,
+ caps: ethereum.ServerCaps(),
}
}
@@ -400,22 +402,22 @@ func (p *Peer) HandleInbound() {
case ethwire.MsgPeersTy:
// Received a list of peers (probably because MsgGetPeersTy was send)
// Only act on message if we actually requested for a peers list
- //if p.requestedPeerList {
- data := msg.Data
- // Create new list of possible peers for the ethereum to process
- peers := make([]string, data.Len())
- // Parse each possible peer
- for i := 0; i < data.Len(); i++ {
- value := data.Get(i)
- peers[i] = unpackAddr(value.Get(0), value.Get(1).Uint())
- }
+ if p.requestedPeerList {
+ data := msg.Data
+ // Create new list of possible peers for the ethereum to process
+ peers := make([]string, data.Len())
+ // Parse each possible peer
+ for i := 0; i < data.Len(); i++ {
+ value := data.Get(i)
+ peers[i] = unpackAddr(value.Get(0), value.Get(1).Uint())
+ }
- // Connect to the list of peers
- p.ethereum.ProcessPeerList(peers)
- // Mark unrequested again
- p.requestedPeerList = false
+ // Connect to the list of peers
+ p.ethereum.ProcessPeerList(peers)
+ // Mark unrequested again
+ p.requestedPeerList = false
- //}
+ }
case ethwire.MsgGetChainTy:
var parent *ethchain.Block
// Length minus one since the very last element in the array is a count
@@ -514,6 +516,15 @@ func (p *Peer) Stop() {
p.writeMessage(ethwire.NewMessage(ethwire.MsgDiscTy, ""))
p.conn.Close()
}
+
+ // Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here
+ p.ethereum.peerMut.Lock()
+ defer p.ethereum.peerMut.Unlock()
+ eachPeer(p.ethereum.peers, func(peer *Peer, e *list.Element) {
+ if peer == p {
+ p.ethereum.peers.Remove(e)
+ }
+ })
}
func (p *Peer) pushHandshake() error {
@@ -533,7 +544,10 @@ func (p *Peer) peersMessage() *ethwire.Msg {
outPeers := make([]interface{}, len(p.ethereum.InOutPeers()))
// Serialise each peer
for i, peer := range p.ethereum.InOutPeers() {
- outPeers[i] = peer.RlpData()
+ // Don't return localhost as valid peer
+ if !net.ParseIP(peer.conn.RemoteAddr().String()).IsLoopback() {
+ outPeers[i] = peer.RlpData()
+ }
}
// Return the message to the peer with the known list of connected clients
@@ -549,7 +563,7 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
c := msg.Data
if c.Get(0).Uint() != ProtocolVersion {
- ethutil.Config.Log.Debugln("Invalid peer version. Require protocol v5")
+ ethutil.Config.Log.Debugln("Invalid peer version. Require protocol:", ProtocolVersion)
p.Stop()
return
}
@@ -573,7 +587,6 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
}
// Catch up with the connected peer
- // p.CatchupWithPeer(p.ethereum.BlockChain().CurrentBlock.Hash())
p.SyncWithBlocks()
// Set the peer's caps