|
|
@ -8,7 +8,6 @@ import ( |
|
|
|
"github.com/ethereum/ethwire-go" |
|
|
|
"github.com/ethereum/ethwire-go" |
|
|
|
"log" |
|
|
|
"log" |
|
|
|
"net" |
|
|
|
"net" |
|
|
|
"strconv" |
|
|
|
|
|
|
|
"sync" |
|
|
|
"sync" |
|
|
|
"sync/atomic" |
|
|
|
"sync/atomic" |
|
|
|
"time" |
|
|
|
"time" |
|
|
@ -45,8 +44,6 @@ type Ethereum struct { |
|
|
|
|
|
|
|
|
|
|
|
Addr net.Addr |
|
|
|
Addr net.Addr |
|
|
|
|
|
|
|
|
|
|
|
nat NAT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
peerMut sync.Mutex |
|
|
|
peerMut sync.Mutex |
|
|
|
|
|
|
|
|
|
|
|
// Capabilities for outgoing peers
|
|
|
|
// Capabilities for outgoing peers
|
|
|
@ -62,12 +59,6 @@ func New(caps Caps) (*Ethereum, error) { |
|
|
|
|
|
|
|
|
|
|
|
ethutil.Config.Db = db |
|
|
|
ethutil.Config.Db = db |
|
|
|
|
|
|
|
|
|
|
|
nat, err := Discover() |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
log.Printf("Can't discover upnp: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
log.Println(nat) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nonce, _ := ethutil.RandomUint64() |
|
|
|
nonce, _ := ethutil.RandomUint64() |
|
|
|
ethereum := &Ethereum{ |
|
|
|
ethereum := &Ethereum{ |
|
|
|
shutdownChan: make(chan bool), |
|
|
|
shutdownChan: make(chan bool), |
|
|
@ -75,7 +66,6 @@ func New(caps Caps) (*Ethereum, error) { |
|
|
|
peers: list.New(), |
|
|
|
peers: list.New(), |
|
|
|
Nonce: nonce, |
|
|
|
Nonce: nonce, |
|
|
|
serverCaps: caps, |
|
|
|
serverCaps: caps, |
|
|
|
nat: nat, |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
ethereum.TxPool = ethchain.NewTxPool() |
|
|
|
ethereum.TxPool = ethchain.NewTxPool() |
|
|
|
ethereum.TxPool.Speaker = ethereum |
|
|
|
ethereum.TxPool.Speaker = ethereum |
|
|
@ -213,46 +203,6 @@ func (s *Ethereum) ReapDeadPeerHandler() { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// FIXME
|
|
|
|
|
|
|
|
func (s *Ethereum) upnpUpdateThread() { |
|
|
|
|
|
|
|
// Go off immediately to prevent code duplication, thereafter we renew
|
|
|
|
|
|
|
|
// lease every 15 minutes.
|
|
|
|
|
|
|
|
timer := time.NewTimer(0 * time.Second) |
|
|
|
|
|
|
|
lport, _ := strconv.ParseInt("30303", 10, 16) |
|
|
|
|
|
|
|
first := true |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
for { |
|
|
|
|
|
|
|
select { |
|
|
|
|
|
|
|
case <-timer.C: |
|
|
|
|
|
|
|
listenPort, err := s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
log.Printf("can't add UPnP port mapping: %v\n", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if first && err == nil { |
|
|
|
|
|
|
|
externalip, err := s.nat.GetExternalAddress() |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
log.Printf("UPnP can't get external address: %v\n", err) |
|
|
|
|
|
|
|
continue out |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// externalip, listenport
|
|
|
|
|
|
|
|
log.Println("Successfully bound via UPnP to", externalip, listenPort) |
|
|
|
|
|
|
|
first = false |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
timer.Reset(time.Minute * 15) |
|
|
|
|
|
|
|
case <-s.shutdownChan: |
|
|
|
|
|
|
|
break out |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
timer.Stop() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err := s.nat.DeletePortMapping("tcp", int(lport), int(lport)); err != nil { |
|
|
|
|
|
|
|
log.Printf("unable to remove UPnP port mapping: %v\n", err) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
log.Printf("succesfully disestablished UPnP port mapping\n") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Start the ethereum
|
|
|
|
// Start the ethereum
|
|
|
|
func (s *Ethereum) Start() { |
|
|
|
func (s *Ethereum) Start() { |
|
|
|
// Bind to addr and port
|
|
|
|
// Bind to addr and port
|
|
|
@ -267,8 +217,6 @@ func (s *Ethereum) Start() { |
|
|
|
go s.peerHandler(ln) |
|
|
|
go s.peerHandler(ln) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
go s.upnpUpdateThread() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Start the reaping processes
|
|
|
|
// Start the reaping processes
|
|
|
|
go s.ReapDeadPeerHandler() |
|
|
|
go s.ReapDeadPeerHandler() |
|
|
|
|
|
|
|
|
|
|
|