From 2b32f47d2c17aaee655d56fd91c95798652b1116 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 23 Jan 2014 20:14:01 +0100 Subject: Initial commit bootstrapping package --- ethereum.go | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 ethereum.go (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go new file mode 100644 index 000000000..b1b675c88 --- /dev/null +++ b/ethereum.go @@ -0,0 +1,213 @@ +package eth + +import ( + "container/list" + "github.com/ethereum/ethchain-go" + "github.com/ethereum/ethdb-go" + "github.com/ethereum/ethutil-go" + "github.com/ethereum/ethwire-go" + "log" + "net" + "sync/atomic" + "time" +) + +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) + } + } +} + +const ( + processReapingTimeout = 60 // TODO increase +) + +type Ethereum struct { + // Channel for shutting down the ethereum + shutdownChan chan bool + // DB interface + //db *ethdb.LDBDatabase + db *ethdb.MemDatabase + // Block manager for processing new blocks and managing the block chain + BlockManager *ethchain.BlockManager + // The transaction pool. Transaction can be pushed on this pool + // for later including in the blocks + TxPool *ethchain.TxPool + // Peers (NYI) + peers *list.List + // Nonce + Nonce uint64 +} + +func New() (*Ethereum, error) { + //db, err := ethdb.NewLDBDatabase() + db, err := ethdb.NewMemDatabase() + if err != nil { + return nil, err + } + + ethutil.Config.Db = db + + nonce, _ := ethutil.RandomUint64() + ethereum := &Ethereum{ + shutdownChan: make(chan bool), + db: db, + peers: list.New(), + Nonce: nonce, + } + ethereum.TxPool = ethchain.NewTxPool() + ethereum.TxPool.Speaker = ethereum + ethereum.BlockManager = ethchain.NewBlockManager() + + ethereum.TxPool.BlockManager = ethereum.BlockManager + ethereum.BlockManager.TransactionPool = ethereum.TxPool + + return ethereum, nil +} + +func (s *Ethereum) AddPeer(conn net.Conn) { + peer := NewPeer(conn, s, true) + + if peer != nil { + s.peers.PushBack(peer) + peer.Start() + + log.Println("Peer connected ::", conn.RemoteAddr()) + } +} + +func (s *Ethereum) ProcessPeerList(addrs []string) { + for _, addr := range addrs { + // TODO Probably requires some sanity checks + s.ConnectToPeer(addr) + } +} + +func (s *Ethereum) ConnectToPeer(addr string) error { + peer := NewOutboundPeer(addr, s) + + s.peers.PushBack(peer) + + return nil +} + +func (s *Ethereum) OutboundPeers() []*Peer { + // Create a new peer slice with at least the length of the total peers + outboundPeers := make([]*Peer, s.peers.Len()) + length := 0 + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if !p.inbound { + outboundPeers[length] = p + length++ + } + }) + + return outboundPeers[:length] +} + +func (s *Ethereum) InboundPeers() []*Peer { + // Create a new peer slice with at least the length of the total peers + inboundPeers := make([]*Peer, s.peers.Len()) + length := 0 + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if p.inbound { + inboundPeers[length] = p + length++ + } + }) + + return inboundPeers[:length] +} + +func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data []byte) { + eachPeer(s.peers, func(p *Peer, e *list.Element) { + p.QueueMessage(ethwire.NewMessage(msgType, data)) + }) +} + +func (s *Ethereum) ReapDeadPeers() { + for { + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { + log.Println("Dead peer found .. reaping") + + s.peers.Remove(e) + } + }) + + time.Sleep(processReapingTimeout * time.Second) + } +} + +// Start the ethereum +func (s *Ethereum) Start() { + // For now this function just blocks the main thread + ln, err := net.Listen("tcp", ":12345") + if err != nil { + // This is mainly for testing to create a "network" + if ethutil.Config.Debug { + log.Println("Connection listening disabled. Acting as client") + + err = s.ConnectToPeer("localhost:12345") + if err != nil { + log.Println("Error starting ethereum", err) + + s.Stop() + } + } else { + log.Fatal(err) + } + } else { + // Starting accepting connections + go func() { + for { + conn, err := ln.Accept() + if err != nil { + log.Println(err) + + continue + } + + go s.AddPeer(conn) + } + }() + } + + // Start the reaping processes + go s.ReapDeadPeers() + + // Start the tx pool + s.TxPool.Start() + + // TMP + /* + go func() { + for { + s.Broadcast("block", s.blockManager.bc.GenesisBlock().RlpEncode()) + + time.Sleep(1000 * time.Millisecond) + } + }() + */ +} + +func (s *Ethereum) Stop() { + // Close the database + defer s.db.Close() + + eachPeer(s.peers, func(p *Peer, e *list.Element) { + p.Stop() + }) + + s.shutdownChan <- true + + s.TxPool.Stop() +} + +// This function will wait for a shutdown and resumes main thread execution +func (s *Ethereum) WaitForShutdown() { + <-s.shutdownChan +} -- cgit v1.2.3 From 233f5200ef77ee77b4d33b5ff277d0e524b1fb4d Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 23 Jan 2014 22:32:50 +0100 Subject: Data send over the wire shouldn't be RLPed more then once --- ethereum.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b1b675c88..db66c3ce7 100644 --- a/ethereum.go +++ b/ethereum.go @@ -122,9 +122,10 @@ func (s *Ethereum) InboundPeers() []*Peer { return inboundPeers[:length] } -func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data []byte) { +func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data interface{}) { + msg := ethwire.NewMessage(msgType, data) eachPeer(s.peers, func(p *Peer, e *list.Element) { - p.QueueMessage(ethwire.NewMessage(msgType, data)) + p.QueueMessage(msg) }) } -- cgit v1.2.3 From 1b7cba18781ddd6ff262801057930367ea397c9e Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 24 Jan 2014 17:48:21 +0100 Subject: Updated peers --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index db66c3ce7..74e47d7bf 100644 --- a/ethereum.go +++ b/ethereum.go @@ -60,7 +60,7 @@ func New() (*Ethereum, error) { } ethereum.TxPool = ethchain.NewTxPool() ethereum.TxPool.Speaker = ethereum - ethereum.BlockManager = ethchain.NewBlockManager() + ethereum.BlockManager = ethchain.NewBlockManager(ethereum) ethereum.TxPool.BlockManager = ethereum.BlockManager ethereum.BlockManager.TransactionPool = ethereum.TxPool -- cgit v1.2.3 From 884f7928717394d631fbc8b721d8ee297f060e5b Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 27 Jan 2014 15:34:50 +0100 Subject: Removed default connection --- ethereum.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 74e47d7bf..ac11903c0 100644 --- a/ethereum.go +++ b/ethereum.go @@ -152,12 +152,14 @@ func (s *Ethereum) Start() { if ethutil.Config.Debug { log.Println("Connection listening disabled. Acting as client") - err = s.ConnectToPeer("localhost:12345") - if err != nil { - log.Println("Error starting ethereum", err) + /* + err = s.ConnectToPeer("localhost:12345") + if err != nil { + log.Println("Error starting ethereum", err) - s.Stop() - } + s.Stop() + } + */ } else { log.Fatal(err) } -- cgit v1.2.3 From 4a82230de58077b2f947dced27cce0e2abb6272e Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 27 Jan 2014 22:13:46 +0100 Subject: Switched port and removed logging --- ethereum.go | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index ac11903c0..5eaf31d12 100644 --- a/ethereum.go +++ b/ethereum.go @@ -133,8 +133,6 @@ func (s *Ethereum) ReapDeadPeers() { for { eachPeer(s.peers, func(p *Peer, e *list.Element) { if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { - log.Println("Dead peer found .. reaping") - s.peers.Remove(e) } }) @@ -145,8 +143,8 @@ func (s *Ethereum) ReapDeadPeers() { // Start the ethereum func (s *Ethereum) Start() { - // For now this function just blocks the main thread - ln, err := net.Listen("tcp", ":12345") + // Bind to addr and port + ln, err := net.Listen("tcp", ":30303") if err != nil { // This is mainly for testing to create a "network" if ethutil.Config.Debug { @@ -167,6 +165,7 @@ func (s *Ethereum) Start() { // Starting accepting connections go func() { for { + log.Println("Ready and accepting connections") conn, err := ln.Accept() if err != nil { log.Println(err) @@ -184,17 +183,6 @@ func (s *Ethereum) Start() { // Start the tx pool s.TxPool.Start() - - // TMP - /* - go func() { - for { - s.Broadcast("block", s.blockManager.bc.GenesisBlock().RlpEncode()) - - time.Sleep(1000 * time.Millisecond) - } - }() - */ } func (s *Ethereum) Stop() { -- cgit v1.2.3 From 7ccf51fd3035aaba8ed3eda0ca8e3b01edaaa2cf Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 30 Jan 2014 23:48:52 +0100 Subject: Updated seed peers --- ethereum.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 5eaf31d12..72d023f5c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -72,10 +72,13 @@ func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) if peer != nil { - s.peers.PushBack(peer) - peer.Start() - - log.Println("Peer connected ::", conn.RemoteAddr()) + if s.peers.Len() > -1 { + log.Println("SEED") + peer.Start(true) + } else { + s.peers.PushBack(peer) + peer.Start(false) + } } } @@ -164,8 +167,9 @@ func (s *Ethereum) Start() { } else { // Starting accepting connections go func() { + log.Println("Ready and accepting connections") + for { - log.Println("Ready and accepting connections") conn, err := ln.Accept() if err != nil { log.Println(err) -- cgit v1.2.3 From 7f100e96101a057cba7b2d5c58c12d2f7accf381 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Jan 2014 00:56:32 +0100 Subject: Self connect detect --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 72d023f5c..98316cf04 100644 --- a/ethereum.go +++ b/ethereum.go @@ -72,7 +72,7 @@ func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) if peer != nil { - if s.peers.Len() > -1 { + if s.peers.Len() > 25 { log.Println("SEED") peer.Start(true) } else { -- cgit v1.2.3 From 36f221dbe7e66568fc3f1680208b73e4ea20c4ef Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Jan 2014 01:12:48 +0100 Subject: Don't connect to peers that are already connected --- ethereum.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 98316cf04..dd6256f4b 100644 --- a/ethereum.go +++ b/ethereum.go @@ -90,6 +90,22 @@ func (s *Ethereum) ProcessPeerList(addrs []string) { } func (s *Ethereum) ConnectToPeer(addr string) error { + var alreadyConnected bool + + eachPeer(s.peers, func(p *Peer, v *list.Element) { + phost, _, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) + ahost, _, _ := net.SplitHostPort(addr) + + if phost == ahost { + alreadyConnected = true + return + } + }) + + if alreadyConnected { + return nil + } + peer := NewOutboundPeer(addr, s) s.peers.PushBack(peer) -- cgit v1.2.3 From dfa38b3f91d124f97350429c4664b62a5cb7dd08 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Jan 2014 11:18:10 +0100 Subject: Peer connection checking --- ethereum.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index dd6256f4b..e1fb5945c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -93,6 +93,9 @@ func (s *Ethereum) ConnectToPeer(addr string) error { var alreadyConnected bool 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) @@ -118,7 +121,7 @@ func (s *Ethereum) OutboundPeers() []*Peer { outboundPeers := make([]*Peer, s.peers.Len()) length := 0 eachPeer(s.peers, func(p *Peer, e *list.Element) { - if !p.inbound { + if !p.inbound && p.conn != nil { outboundPeers[length] = p length++ } -- cgit v1.2.3 From da66eddfccf86eb5dc036e023ddc2e0278105706 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Jan 2014 11:57:56 +0100 Subject: Get peers returns now both in and outbound peers --- ethereum.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index e1fb5945c..b9fc94d50 100644 --- a/ethereum.go +++ b/ethereum.go @@ -144,6 +144,18 @@ func (s *Ethereum) InboundPeers() []*Peer { return inboundPeers[:length] } +func (s *Ethereum) InOutPeers() []*Peer { + // Create a new peer slice with at least the length of the total peers + inboundPeers := make([]*Peer, s.peers.Len()) + length := 0 + eachPeer(s.peers, func(p *Peer, e *list.Element) { + inboundPeers[length] = p + length++ + }) + + return inboundPeers[:length] +} + func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data interface{}) { msg := ethwire.NewMessage(msgType, data) eachPeer(s.peers, func(p *Peer, e *list.Element) { @@ -151,6 +163,10 @@ func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data interface{}) { }) } +func (s *Ethereum) Peers() *list.List { + return s.peers +} + func (s *Ethereum) ReapDeadPeers() { for { eachPeer(s.peers, func(p *Peer, e *list.Element) { -- cgit v1.2.3 From 8c09602a8b6dead7e03d0d4b9fe61cbd02d8a844 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Jan 2014 13:03:13 +0100 Subject: Self connect --- ethereum.go | 9 --------- 1 file changed, 9 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b9fc94d50..0137f68de 100644 --- a/ethereum.go +++ b/ethereum.go @@ -187,15 +187,6 @@ func (s *Ethereum) Start() { // This is mainly for testing to create a "network" if ethutil.Config.Debug { log.Println("Connection listening disabled. Acting as client") - - /* - err = s.ConnectToPeer("localhost:12345") - if err != nil { - log.Println("Error starting ethereum", err) - - s.Stop() - } - */ } else { log.Fatal(err) } -- cgit v1.2.3 From dfa778fed684e97f868aab9b246646156a39e24a Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 1 Feb 2014 21:30:54 +0100 Subject: UPNP wip --- ethereum.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 5 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 0137f68de..b192b544d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/ethwire-go" "log" "net" + "strconv" "sync/atomic" "time" ) @@ -40,6 +41,10 @@ type Ethereum struct { peers *list.List // Nonce Nonce uint64 + + Addr net.Addr + + nat NAT } func New() (*Ethereum, error) { @@ -51,12 +56,20 @@ func New() (*Ethereum, error) { ethutil.Config.Db = db + /* + nat, err := Discover() + if err != nil { + log.Printf("Can'them discover upnp: %v", err) + } + */ + nonce, _ := ethutil.RandomUint64() ethereum := &Ethereum{ shutdownChan: make(chan bool), db: db, peers: list.New(), Nonce: nonce, + //nat: nat, } ethereum.TxPool = ethchain.NewTxPool() ethereum.TxPool.Speaker = ethereum @@ -179,18 +192,59 @@ func (s *Ethereum) ReapDeadPeers() { } } +// 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 func (s *Ethereum) Start() { // Bind to addr and port ln, err := net.Listen("tcp", ":30303") if err != nil { // This is mainly for testing to create a "network" - if ethutil.Config.Debug { - log.Println("Connection listening disabled. Acting as client") - } else { - log.Fatal(err) - } + //if ethutil.Config.Debug { + //log.Println("Connection listening disabled. Acting as client") + //} else { + log.Fatal(err) + //} } else { + s.Addr = ln.Addr() // Starting accepting connections go func() { log.Println("Ready and accepting connections") -- cgit v1.2.3 From b70fe3a9bea652c795fc75cf79ed21fc04ea0937 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 2 Feb 2014 01:39:06 +0100 Subject: Reverted back to messages --- ethereum.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b192b544d..a7a2f6b8c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -169,7 +169,7 @@ func (s *Ethereum) InOutPeers() []*Peer { return inboundPeers[:length] } -func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data interface{}) { +func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data []interface{}) { msg := ethwire.NewMessage(msgType, data) eachPeer(s.peers, func(p *Peer, e *list.Element) { p.QueueMessage(msg) @@ -237,12 +237,7 @@ func (s *Ethereum) Start() { // Bind to addr and port ln, err := net.Listen("tcp", ":30303") if err != nil { - // This is mainly for testing to create a "network" - //if ethutil.Config.Debug { - //log.Println("Connection listening disabled. Acting as client") - //} else { - log.Fatal(err) - //} + log.Println("Connection listening disabled. Acting as client") } else { s.Addr = ln.Addr() // Starting accepting connections -- cgit v1.2.3 From cb8a7d979d1a4b2a32317ee0a77815ec2ea38b9f Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 2 Feb 2014 16:15:39 +0100 Subject: upnp test --- ethereum.go | 107 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 41 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a7a2f6b8c..eab40e93d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -9,6 +9,7 @@ import ( "log" "net" "strconv" + "sync" "sync/atomic" "time" ) @@ -45,9 +46,14 @@ type Ethereum struct { Addr net.Addr nat NAT + + peerMut sync.Mutex + + // Capabilities for outgoing peers + serverCaps Caps } -func New() (*Ethereum, error) { +func New(caps Caps) (*Ethereum, error) { //db, err := ethdb.NewLDBDatabase() db, err := ethdb.NewMemDatabase() if err != nil { @@ -56,12 +62,11 @@ func New() (*Ethereum, error) { ethutil.Config.Db = db - /* - nat, err := Discover() - if err != nil { - log.Printf("Can'them discover upnp: %v", err) - } - */ + nat, err := Discover() + if err != nil { + log.Printf("Can't discover upnp: %v", err) + } + log.Println(nat) nonce, _ := ethutil.RandomUint64() ethereum := &Ethereum{ @@ -69,7 +74,8 @@ func New() (*Ethereum, error) { db: db, peers: list.New(), Nonce: nonce, - //nat: nat, + serverCaps: caps, + nat: nat, } ethereum.TxPool = ethchain.NewTxPool() ethereum.TxPool.Speaker = ethereum @@ -85,13 +91,8 @@ func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) if peer != nil { - if s.peers.Len() > 25 { - log.Println("SEED") - peer.Start(true) - } else { - s.peers.PushBack(peer) - peer.Start(false) - } + s.peers.PushBack(peer) + peer.Start(false) } } @@ -122,7 +123,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { return nil } - peer := NewOutboundPeer(addr, s) + peer := NewOutboundPeer(addr, s, s.serverCaps) s.peers.PushBack(peer) @@ -158,12 +159,18 @@ func (s *Ethereum) InboundPeers() []*Peer { } func (s *Ethereum) InOutPeers() []*Peer { + // Reap the dead peers first + s.reapPeers() + // Create a new peer slice with at least the length of the total peers inboundPeers := make([]*Peer, s.peers.Len()) length := 0 eachPeer(s.peers, func(p *Peer, e *list.Element) { - inboundPeers[length] = p - length++ + // Only return peers with an actual ip + if len(p.host) > 0 { + inboundPeers[length] = p + length++ + } }) return inboundPeers[:length] @@ -171,6 +178,10 @@ func (s *Ethereum) InOutPeers() []*Peer { func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data []interface{}) { msg := ethwire.NewMessage(msgType, data) + s.BroadcastMsg(msg) +} + +func (s *Ethereum) BroadcastMsg(msg *ethwire.Msg) { eachPeer(s.peers, func(p *Peer, e *list.Element) { p.QueueMessage(msg) }) @@ -180,15 +191,25 @@ func (s *Ethereum) Peers() *list.List { return s.peers } -func (s *Ethereum) ReapDeadPeers() { - for { - eachPeer(s.peers, func(p *Peer, e *list.Element) { - if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { - s.peers.Remove(e) - } - }) +func (s *Ethereum) reapPeers() { + s.peerMut.Lock() + defer s.peerMut.Unlock() + + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { + s.peers.Remove(e) + } + }) +} - time.Sleep(processReapingTimeout * time.Second) +func (s *Ethereum) ReapDeadPeerHandler() { + reapTimer := time.NewTicker(processReapingTimeout * time.Second) + + for { + select { + case <-reapTimer.C: + s.reapPeers() + } } } @@ -241,29 +262,33 @@ func (s *Ethereum) Start() { } else { s.Addr = ln.Addr() // Starting accepting connections - go func() { - log.Println("Ready and accepting connections") - - for { - conn, err := ln.Accept() - if err != nil { - log.Println(err) - - continue - } - - go s.AddPeer(conn) - } - }() + log.Println("Ready and accepting connections") + // Start the peer handler + go s.peerHandler(ln) } + go s.upnpUpdateThread() + // Start the reaping processes - go s.ReapDeadPeers() + go s.ReapDeadPeerHandler() // Start the tx pool s.TxPool.Start() } +func (s *Ethereum) peerHandler(listener net.Listener) { + for { + conn, err := listener.Accept() + if err != nil { + log.Println(err) + + continue + } + + go s.AddPeer(conn) + } +} + func (s *Ethereum) Stop() { // Close the database defer s.db.Close() -- cgit v1.2.3 From ae0d4eb7aa644b4c295d7a7cd28c38e92777a52f Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 2 Feb 2014 16:29:13 +0100 Subject: removed upnp --- ethereum.go | 52 ---------------------------------------------------- 1 file changed, 52 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index eab40e93d..ae0f2eed0 100644 --- a/ethereum.go +++ b/ethereum.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/ethwire-go" "log" "net" - "strconv" "sync" "sync/atomic" "time" @@ -45,8 +44,6 @@ type Ethereum struct { Addr net.Addr - nat NAT - peerMut sync.Mutex // Capabilities for outgoing peers @@ -62,12 +59,6 @@ func New(caps Caps) (*Ethereum, error) { ethutil.Config.Db = db - nat, err := Discover() - if err != nil { - log.Printf("Can't discover upnp: %v", err) - } - log.Println(nat) - nonce, _ := ethutil.RandomUint64() ethereum := &Ethereum{ shutdownChan: make(chan bool), @@ -75,7 +66,6 @@ func New(caps Caps) (*Ethereum, error) { peers: list.New(), Nonce: nonce, serverCaps: caps, - nat: nat, } ethereum.TxPool = ethchain.NewTxPool() 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 func (s *Ethereum) Start() { // Bind to addr and port @@ -267,8 +217,6 @@ func (s *Ethereum) Start() { go s.peerHandler(ln) } - go s.upnpUpdateThread() - // Start the reaping processes go s.ReapDeadPeerHandler() -- cgit v1.2.3 From 3f503ffc7f85287fc3716afb704f90a1a4e7b21b Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 2 Feb 2014 19:22:39 +0100 Subject: Implemented support for UPnP --- ethereum.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index ae0f2eed0..83243e23c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/ethwire-go" "log" "net" + "strconv" "sync" "sync/atomic" "time" @@ -29,6 +30,7 @@ const ( type Ethereum struct { // Channel for shutting down the ethereum shutdownChan chan bool + quit chan bool // DB interface //db *ethdb.LDBDatabase db *ethdb.MemDatabase @@ -48,6 +50,8 @@ type Ethereum struct { // Capabilities for outgoing peers serverCaps Caps + + nat NAT } func New(caps Caps) (*Ethereum, error) { @@ -57,15 +61,30 @@ func New(caps Caps) (*Ethereum, error) { return nil, err } + /* + gateway := net.ParseIP("192.168.192.1") + nat := NewNatPMP(gateway) + port, err := nat.AddPortMapping("tcp", 30303, 30303, "", 60) + log.Println(port, err) + */ + + nat, err := Discover() + if err != nil { + log.Println("UPnP failed", err) + return nil, err + } + ethutil.Config.Db = db nonce, _ := ethutil.RandomUint64() ethereum := &Ethereum{ shutdownChan: make(chan bool), + quit: make(chan bool), db: db, peers: list.New(), Nonce: nonce, serverCaps: caps, + nat: nat, } ethereum.TxPool = ethchain.NewTxPool() ethereum.TxPool.Speaker = ethereum @@ -217,6 +236,8 @@ func (s *Ethereum) Start() { go s.peerHandler(ln) } + go s.upnpUpdateThread() + // Start the reaping processes go s.ReapDeadPeerHandler() @@ -245,6 +266,8 @@ func (s *Ethereum) Stop() { p.Stop() }) + close(s.quit) + s.shutdownChan <- true s.TxPool.Stop() @@ -254,3 +277,42 @@ func (s *Ethereum) Stop() { func (s *Ethereum) WaitForShutdown() { <-s.shutdownChan } + +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.Println("can't add UPnP port mapping:", err) + break out + } + if first && err == nil { + externalip, err := s.nat.GetExternalAddress() + if err != nil { + log.Println("UPnP can't get external address:", err) + continue out + } + log.Println("Successfully bound via UPnP to", externalip, listenPort) + first = false + } + timer.Reset(time.Minute * 15) + case <-s.quit: + break out + } + } + + timer.Stop() + + if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil { + log.Println("unable to remove UPnP port mapping:", err) + } else { + log.Println("succesfully disestablished UPnP port mapping") + } +} -- cgit v1.2.3 From 48b41862ef89e3d694b71d452e7f67bfb34ca17f Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 2 Feb 2014 19:44:47 +0100 Subject: UPnP Support --- ethereum.go | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 83243e23c..b178644cf 100644 --- a/ethereum.go +++ b/ethereum.go @@ -54,24 +54,19 @@ type Ethereum struct { nat NAT } -func New(caps Caps) (*Ethereum, error) { - //db, err := ethdb.NewLDBDatabase() +func New(caps Caps, usePnp bool) (*Ethereum, error) { db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } - /* - gateway := net.ParseIP("192.168.192.1") - nat := NewNatPMP(gateway) - port, err := nat.AddPortMapping("tcp", 30303, 30303, "", 60) - log.Println(port, err) - */ - - nat, err := Discover() - if err != nil { - log.Println("UPnP failed", err) - return nil, err + var nat NAT + if usePnp { + nat, err = Discover() + if err != nil { + log.Println("UPnP failed", err) + return nil, err + } } ethutil.Config.Db = db @@ -229,14 +224,15 @@ func (s *Ethereum) Start() { if err != nil { log.Println("Connection listening disabled. Acting as client") } else { - s.Addr = ln.Addr() // Starting accepting connections log.Println("Ready and accepting connections") // Start the peer handler go s.peerHandler(ln) } - go s.upnpUpdateThread() + if s.nat != nil { + go s.upnpUpdateThread() + } // Start the reaping processes go s.ReapDeadPeerHandler() @@ -288,18 +284,18 @@ out: for { select { case <-timer.C: - listenPort, err := s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) + var err error + _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) if err != nil { log.Println("can't add UPnP port mapping:", err) break out } if first && err == nil { - externalip, err := s.nat.GetExternalAddress() + _, err = s.nat.GetExternalAddress() if err != nil { log.Println("UPnP can't get external address:", err) continue out } - log.Println("Successfully bound via UPnP to", externalip, listenPort) first = false } timer.Reset(time.Minute * 15) -- cgit v1.2.3 From f4a96ca588a4c7e1382e9c2265ca306a5b0d0adf Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 2 Feb 2014 19:46:37 +0100 Subject: Removed the seed peer option from start --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b178644cf..fa7ce9ec7 100644 --- a/ethereum.go +++ b/ethereum.go @@ -96,7 +96,7 @@ func (s *Ethereum) AddPeer(conn net.Conn) { if peer != nil { s.peers.PushBack(peer) - peer.Start(false) + peer.Start() } } -- cgit v1.2.3 From 9e9b7a520e33b0ddef66f9e5cd113ca75cc8dd4d Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 3 Feb 2014 17:26:37 +0100 Subject: Do not quit if upnp fails --- ethereum.go | 1 - 1 file changed, 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index fa7ce9ec7..2500892f0 100644 --- a/ethereum.go +++ b/ethereum.go @@ -65,7 +65,6 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { nat, err = Discover() if err != nil { log.Println("UPnP failed", err) - return nil, err } } -- cgit v1.2.3 From 1f7b13ff4ec7e8cb0e81648fd37db5d867715915 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 8 Feb 2014 21:02:09 +0100 Subject: Switched over to leveldb instead of memdb --- ethereum.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 2500892f0..cc3f1695b 100644 --- a/ethereum.go +++ b/ethereum.go @@ -33,7 +33,7 @@ type Ethereum struct { quit chan bool // DB interface //db *ethdb.LDBDatabase - db *ethdb.MemDatabase + db ethutil.Database // Block manager for processing new blocks and managing the block chain BlockManager *ethchain.BlockManager // The transaction pool. Transaction can be pushed on this pool @@ -52,10 +52,14 @@ type Ethereum struct { serverCaps Caps nat NAT + + // Specifies the desired amount of maximum peers + MaxPeers int } func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewMemDatabase() + db, err := ethdb.NewLDBDatabase() + //db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } @@ -79,6 +83,7 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { Nonce: nonce, serverCaps: caps, nat: nat, + MaxPeers: 5, } ethereum.TxPool = ethchain.NewTxPool() ethereum.TxPool.Speaker = ethereum @@ -93,7 +98,7 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) - if peer != nil { + if peer != nil && s.peers.Len() < s.MaxPeers { s.peers.PushBack(peer) peer.Start() } @@ -263,9 +268,10 @@ func (s *Ethereum) Stop() { close(s.quit) - s.shutdownChan <- true - s.TxPool.Stop() + s.BlockManager.Stop() + + s.shutdownChan <- true } // This function will wait for a shutdown and resumes main thread execution -- cgit v1.2.3 From 0de31a389803d05fb7eef776cbba922f019b6d9d Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 9 Feb 2014 23:34:33 +0100 Subject: Fixed self connect through public key discovery. Bumped protocol version number --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index cc3f1695b..565800361 100644 --- a/ethereum.go +++ b/ethereum.go @@ -58,8 +58,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewLDBDatabase() - //db, err := ethdb.NewMemDatabase() + //db, err := ethdb.NewLDBDatabase() + db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From 156495732ba2864feaf6725e770c07bd1c23a660 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 10 Feb 2014 01:10:02 +0100 Subject: level db back in --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 565800361..cc3f1695b 100644 --- a/ethereum.go +++ b/ethereum.go @@ -58,8 +58,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - //db, err := ethdb.NewLDBDatabase() - db, err := ethdb.NewMemDatabase() + db, err := ethdb.NewLDBDatabase() + //db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From 8ab6c53231deb92db1fe46bab263b1e2b12a8fb5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 10 Feb 2014 13:59:05 +0100 Subject: Reversed back --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index cc3f1695b..565800361 100644 --- a/ethereum.go +++ b/ethereum.go @@ -58,8 +58,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewLDBDatabase() - //db, err := ethdb.NewMemDatabase() + //db, err := ethdb.NewLDBDatabase() + db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From 0ae6a3882523c7134a68f64e90fd8cc70f3c0807 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 10 Feb 2014 16:04:57 +0100 Subject: Database --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 565800361..cc3f1695b 100644 --- a/ethereum.go +++ b/ethereum.go @@ -58,8 +58,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - //db, err := ethdb.NewLDBDatabase() - db, err := ethdb.NewMemDatabase() + db, err := ethdb.NewLDBDatabase() + //db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From 5a83114efd96bb8debeb3a3fccc3e054069e5400 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 10 Feb 2014 20:59:31 +0100 Subject: Seed bootstrapping added --- ethereum.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index cc3f1695b..cac442dfc 100644 --- a/ethereum.go +++ b/ethereum.go @@ -6,8 +6,10 @@ import ( "github.com/ethereum/ethdb-go" "github.com/ethereum/ethutil-go" "github.com/ethereum/ethwire-go" + "io/ioutil" "log" "net" + "net/http" "strconv" "sync" "sync/atomic" @@ -243,6 +245,20 @@ func (s *Ethereum) Start() { // Start the tx pool s.TxPool.Start() + + resp, err := http.Get("http://www.ethereum.org/servers.poc2.txt") + if err != nil { + log.Println("Fetching seed failed:", err) + return + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println("Reading seed failed:", err) + return + } + + s.ConnectToPeer(string(body)) } func (s *Ethereum) peerHandler(listener net.Listener) { -- cgit v1.2.3 From 02acef23d595dc2bc95295bab63658addf664aaf Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 11 Feb 2014 18:46:28 +0100 Subject: Interop! --- ethereum.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index cac442dfc..6ace58308 100644 --- a/ethereum.go +++ b/ethereum.go @@ -60,8 +60,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewLDBDatabase() - //db, err := ethdb.NewMemDatabase() + //db, err := ethdb.NewLDBDatabase() + db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } @@ -246,19 +246,22 @@ func (s *Ethereum) Start() { // Start the tx pool s.TxPool.Start() - resp, err := http.Get("http://www.ethereum.org/servers.poc2.txt") - if err != nil { - log.Println("Fetching seed failed:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Println("Reading seed failed:", err) - return - } + if ethutil.Config.Seed { + // Testnet seed bootstrapping + resp, err := http.Get("http://www.ethereum.org/servers.poc2.txt") + if err != nil { + log.Println("Fetching seed failed:", err) + return + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println("Reading seed failed:", err) + return + } - s.ConnectToPeer(string(body)) + s.ConnectToPeer(string(body)) + } } func (s *Ethereum) peerHandler(listener net.Listener) { -- cgit v1.2.3 From 67de76c217f4ff4f2111e5f578b35fb162d64916 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 11 Feb 2014 20:09:58 +0100 Subject: Put leveldb --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 6ace58308..c9da24bcf 100644 --- a/ethereum.go +++ b/ethereum.go @@ -60,8 +60,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - //db, err := ethdb.NewLDBDatabase() - db, err := ethdb.NewMemDatabase() + db, err := ethdb.NewLDBDatabase() + //db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From c2fb9f06ad018d01ce335c82b3542de16045a32d Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 13 Feb 2014 15:12:16 +0100 Subject: Refactoring RlpValue => Value --- ethereum.go | 1 + 1 file changed, 1 insertion(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index c9da24bcf..e1bc38542 100644 --- a/ethereum.go +++ b/ethereum.go @@ -247,6 +247,7 @@ func (s *Ethereum) Start() { s.TxPool.Start() if ethutil.Config.Seed { + log.Println("Seeding") // Testnet seed bootstrapping resp, err := http.Get("http://www.ethereum.org/servers.poc2.txt") if err != nil { -- cgit v1.2.3 From f6d1bfe45bf3709d7bad40bf563b5c09228622e3 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 14 Feb 2014 23:56:09 +0100 Subject: The great merge --- ethereum.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index e1bc38542..9feb5a15c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -2,10 +2,10 @@ package eth import ( "container/list" - "github.com/ethereum/ethchain-go" - "github.com/ethereum/ethdb-go" - "github.com/ethereum/ethutil-go" - "github.com/ethereum/ethwire-go" + "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/ethdb" + "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/eth-go/ethwire" "io/ioutil" "log" "net" @@ -60,8 +60,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewLDBDatabase() - //db, err := ethdb.NewMemDatabase() + //db, err := ethdb.NewLDBDatabase() + db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From 73fd358d940418b15dec850f50407bd2e504d88c Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 15 Feb 2014 01:34:18 +0100 Subject: Removed RlpValue in favour of Value --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 9feb5a15c..bd6caac08 100644 --- a/ethereum.go +++ b/ethereum.go @@ -60,8 +60,8 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - //db, err := ethdb.NewLDBDatabase() - db, err := ethdb.NewMemDatabase() + db, err := ethdb.NewLDBDatabase() + //db, err := ethdb.NewMemDatabase() if err != nil { return nil, err } -- cgit v1.2.3 From d7eca7bcc12e940f0aa80d45e6e802ba68143b5c Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Feb 2014 01:34:06 +0100 Subject: Rlp update --- ethereum.go | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index bd6caac08..c54303795 100644 --- a/ethereum.go +++ b/ethereum.go @@ -85,7 +85,6 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { Nonce: nonce, serverCaps: caps, nat: nat, - MaxPeers: 5, } ethereum.TxPool = ethchain.NewTxPool() ethereum.TxPool.Speaker = ethereum @@ -114,28 +113,32 @@ func (s *Ethereum) ProcessPeerList(addrs []string) { } func (s *Ethereum) ConnectToPeer(addr string) error { - var alreadyConnected bool + if s.peers.Len() < s.MaxPeers { + var alreadyConnected bool - 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) + 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 { - alreadyConnected = true - return + if phost == ahost { + alreadyConnected = true + return + } + }) + + if alreadyConnected { + return nil } - }) - if alreadyConnected { - return nil - } + peer := NewOutboundPeer(addr, s, s.serverCaps) - peer := NewOutboundPeer(addr, s, s.serverCaps) + s.peers.PushBack(peer) - s.peers.PushBack(peer) + log.Printf("[SERV] Adding peer %d / %d\n", s.peers.Len(), s.MaxPeers) + } return nil } -- cgit v1.2.3 From 24f2b2afc3a848190822c382e6aa31c8ab120f07 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Feb 2014 11:35:17 +0100 Subject: Running contracts fixed --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index c54303795..e3038cbf9 100644 --- a/ethereum.go +++ b/ethereum.go @@ -252,7 +252,7 @@ func (s *Ethereum) Start() { if ethutil.Config.Seed { log.Println("Seeding") // Testnet seed bootstrapping - resp, err := http.Get("http://www.ethereum.org/servers.poc2.txt") + resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") if err != nil { log.Println("Fetching seed failed:", err) return -- cgit v1.2.3 From 73b9ae95797ce8c38d82cfcb7c793efea268f476 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 22 Feb 2014 01:53:25 +0100 Subject: Updated some of the log statements to use the ethutil logger --- ethereum.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index e3038cbf9..f86cb121e 100644 --- a/ethereum.go +++ b/ethereum.go @@ -70,7 +70,7 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { if usePnp { nat, err = Discover() if err != nil { - log.Println("UPnP failed", err) + ethutil.Config.Log.Debugln("UPnP failed", err) } } @@ -234,7 +234,7 @@ func (s *Ethereum) Start() { log.Println("Connection listening disabled. Acting as client") } else { // Starting accepting connections - log.Println("Ready and accepting connections") + ethutil.Config.Log.Infoln("Ready and accepting connections") // Start the peer handler go s.peerHandler(ln) } @@ -250,7 +250,7 @@ func (s *Ethereum) Start() { s.TxPool.Start() if ethutil.Config.Seed { - log.Println("Seeding") + ethutil.Config.Log.Debugln("Seeding") // Testnet seed bootstrapping resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") if err != nil { @@ -272,7 +272,7 @@ func (s *Ethereum) peerHandler(listener net.Listener) { for { conn, err := listener.Accept() if err != nil { - log.Println(err) + ethutil.Config.Log.Debugln(err) continue } @@ -315,13 +315,13 @@ out: var err error _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) if err != nil { - log.Println("can't add UPnP port mapping:", err) + ethutil.Config.Log.Debugln("can't add UPnP port mapping:", err) break out } if first && err == nil { _, err = s.nat.GetExternalAddress() if err != nil { - log.Println("UPnP can't get external address:", err) + ethutil.Config.Log.Debugln("UPnP can't get external address:", err) continue out } first = false @@ -335,8 +335,8 @@ out: timer.Stop() if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil { - log.Println("unable to remove UPnP port mapping:", err) + ethutil.Config.Log.Debugln("unable to remove UPnP port mapping:", err) } else { - log.Println("succesfully disestablished UPnP port mapping") + ethutil.Config.Log.Debugln("succesfully disestablished UPnP port mapping") } } -- cgit v1.2.3 From 3a45cdeaf9682dea0407f827571353220eaf257b Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 23 Feb 2014 01:57:45 +0100 Subject: Moved txpool start to initialisation method of ethereumm --- ethereum.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index f86cb121e..725fe5a3d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -47,6 +47,7 @@ type Ethereum struct { Nonce uint64 Addr net.Addr + Port string peerMut sync.Mutex @@ -93,6 +94,9 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { ethereum.TxPool.BlockManager = ethereum.BlockManager ethereum.BlockManager.TransactionPool = ethereum.TxPool + // Start the tx pool + ethereum.TxPool.Start() + return ethereum, nil } @@ -229,7 +233,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start() { // Bind to addr and port - ln, err := net.Listen("tcp", ":30303") + ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { log.Println("Connection listening disabled. Acting as client") } else { @@ -246,9 +250,6 @@ func (s *Ethereum) Start() { // Start the reaping processes go s.ReapDeadPeerHandler() - // Start the tx pool - s.TxPool.Start() - if ethutil.Config.Seed { ethutil.Config.Log.Debugln("Seeding") // Testnet seed bootstrapping @@ -306,7 +307,7 @@ 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) + lport, _ := strconv.ParseInt(s.Port, 10, 16) first := true out: for { -- cgit v1.2.3 From 4f4175a3e295272025d312c800f65fc1a143a9ca Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 25 Feb 2014 11:21:03 +0100 Subject: Addad db name for new ldb --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 725fe5a3d..90682b396 100644 --- a/ethereum.go +++ b/ethereum.go @@ -61,7 +61,7 @@ type Ethereum struct { } func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewLDBDatabase() + db, err := ethdb.NewLDBDatabase("database") //db, err := ethdb.NewMemDatabase() if err != nil { return nil, err -- cgit v1.2.3 From 601340bd464e3ebae0e4fa3407be5fff3bb3fcbf Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 28 Feb 2014 16:45:29 +0100 Subject: Fixed shutting down --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 90682b396..b4a8cdb4a 100644 --- a/ethereum.go +++ b/ethereum.go @@ -295,7 +295,7 @@ func (s *Ethereum) Stop() { s.TxPool.Stop() s.BlockManager.Stop() - s.shutdownChan <- true + close(s.shutdownChan) } // This function will wait for a shutdown and resumes main thread execution -- cgit v1.2.3 From 92f2abdf769f52ea8e5e6d02bf326744e926f5b4 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 5 Mar 2014 10:42:51 +0100 Subject: Partially refactored server/txpool/block manager/block chain The Ethereum structure now complies to a EthManager interface which is being used by the tx pool, block manager and block chain in order to gain access to each other. It's become simpeler. TODO: BlockManager => StateManager --- ethereum.go | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b4a8cdb4a..2c8b2cceb 100644 --- a/ethereum.go +++ b/ethereum.go @@ -37,10 +37,12 @@ type Ethereum struct { //db *ethdb.LDBDatabase db ethutil.Database // Block manager for processing new blocks and managing the block chain - BlockManager *ethchain.BlockManager + blockManager *ethchain.BlockManager // The transaction pool. Transaction can be pushed on this pool // for later including in the blocks - TxPool *ethchain.TxPool + txPool *ethchain.TxPool + // The canonical chain + blockChain *ethchain.BlockChain // Peers (NYI) peers *list.List // Nonce @@ -87,19 +89,28 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { serverCaps: caps, nat: nat, } - ethereum.TxPool = ethchain.NewTxPool() - ethereum.TxPool.Speaker = ethereum - ethereum.BlockManager = ethchain.NewBlockManager(ethereum) - - ethereum.TxPool.BlockManager = ethereum.BlockManager - ethereum.BlockManager.TransactionPool = ethereum.TxPool + ethereum.txPool = ethchain.NewTxPool(ethereum) + ethereum.blockChain = ethchain.NewBlockChain(ethereum) + ethereum.blockManager = ethchain.NewBlockManager(ethereum) // Start the tx pool - ethereum.TxPool.Start() + ethereum.txPool.Start() return ethereum, nil } +func (s *Ethereum) BlockChain() *ethchain.BlockChain { + return s.blockChain +} + +func (s *Ethereum) StateManager() *ethchain.BlockManager { + return s.blockManager +} + +func (s *Ethereum) TxPool() *ethchain.TxPool { + return s.txPool +} + func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) @@ -253,7 +264,7 @@ func (s *Ethereum) Start() { if ethutil.Config.Seed { ethutil.Config.Log.Debugln("Seeding") // Testnet seed bootstrapping - resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") + resp, err := http.Get("https://www.ethereum.org/servers.poc3.txt") if err != nil { log.Println("Fetching seed failed:", err) return @@ -292,8 +303,8 @@ func (s *Ethereum) Stop() { close(s.quit) - s.TxPool.Stop() - s.BlockManager.Stop() + s.txPool.Stop() + s.blockManager.Stop() close(s.shutdownChan) } -- cgit v1.2.3 From 6c6e8b0fd7415a43c67699f145e76daff959d745 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 5 Mar 2014 10:57:32 +0100 Subject: Renamed block manager to state manager --- ethereum.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 2c8b2cceb..342f4f573 100644 --- a/ethereum.go +++ b/ethereum.go @@ -36,8 +36,8 @@ type Ethereum struct { // DB interface //db *ethdb.LDBDatabase db ethutil.Database - // Block manager for processing new blocks and managing the block chain - blockManager *ethchain.BlockManager + // State manager for processing new blocks and managing the over all states + stateManager *ethchain.StateManager // The transaction pool. Transaction can be pushed on this pool // for later including in the blocks txPool *ethchain.TxPool @@ -91,7 +91,7 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { } ethereum.txPool = ethchain.NewTxPool(ethereum) ethereum.blockChain = ethchain.NewBlockChain(ethereum) - ethereum.blockManager = ethchain.NewBlockManager(ethereum) + ethereum.stateManager = ethchain.NewStateManager(ethereum) // Start the tx pool ethereum.txPool.Start() @@ -103,8 +103,8 @@ func (s *Ethereum) BlockChain() *ethchain.BlockChain { return s.blockChain } -func (s *Ethereum) StateManager() *ethchain.BlockManager { - return s.blockManager +func (s *Ethereum) StateManager() *ethchain.StateManager { + return s.stateManager } func (s *Ethereum) TxPool() *ethchain.TxPool { @@ -304,7 +304,7 @@ func (s *Ethereum) Stop() { close(s.quit) s.txPool.Stop() - s.blockManager.Stop() + s.stateManager.Stop() close(s.shutdownChan) } -- cgit v1.2.3 From d5efeab8f92509dec3cafcafb36e1856bb084f12 Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 10 Mar 2014 11:53:02 +0100 Subject: Initial smart-miner stuff --- ethereum.go | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 342f4f573..302f3c04f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -60,6 +60,8 @@ type Ethereum struct { // Specifies the desired amount of maximum peers MaxPeers int + + reactor *ethutil.ReactorEngine } func New(caps Caps, usePnp bool) (*Ethereum, error) { @@ -89,6 +91,8 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { serverCaps: caps, nat: nat, } + ethereum.reactor = ethutil.NewReactorEngine() + ethereum.txPool = ethchain.NewTxPool(ethereum) ethereum.blockChain = ethchain.NewBlockChain(ethereum) ethereum.stateManager = ethchain.NewStateManager(ethereum) @@ -99,6 +103,10 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { return ethereum, nil } +func (s *Ethereum) Reactor() *ethutil.ReactorEngine { + return s.reactor +} + func (s *Ethereum) BlockChain() *ethchain.BlockChain { return s.blockChain } -- cgit v1.2.3 From 8ea7e21f64842380833cce7aafa52b909cb8426b Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 17 Mar 2014 10:37:37 +0100 Subject: Merge --- ethereum.go | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 302f3c04f..c906a6954 100644 --- a/ethereum.go +++ b/ethereum.go @@ -271,20 +271,45 @@ func (s *Ethereum) Start() { if ethutil.Config.Seed { ethutil.Config.Log.Debugln("Seeding") - // Testnet seed bootstrapping - resp, err := http.Get("https://www.ethereum.org/servers.poc3.txt") - if err != nil { - log.Println("Fetching seed failed:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Println("Reading seed failed:", err) - return - } + // 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) + log.Println("Found DNS Bootstrap Peer:", peer) + peers = append(peers, peer) + } + } else { + log.Println("Couldn't resolve :", target) + } + } + // Connect to Peer list + s.ProcessPeerList(peers) + } else { + // Fallback to servers.poc3.txt + resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") + if err != nil { + log.Println("Fetching seed failed:", err) + return + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println("Reading seed failed:", err) + return + } - s.ConnectToPeer(string(body)) + s.ConnectToPeer(string(body)) + } } } -- cgit v1.2.3 From 91aa189ef31adff7f4a084cae770aaa7c01f11e5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 1 May 2014 22:14:20 +0200 Subject: Fixed Upnp bug --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index c906a6954..b9174eaf8 100644 --- a/ethereum.go +++ b/ethereum.go @@ -350,7 +350,7 @@ func (s *Ethereum) WaitForShutdown() { func (s *Ethereum) upnpUpdateThread() { // Go off immediately to prevent code duplication, thereafter we renew // lease every 15 minutes. - timer := time.NewTimer(0 * time.Second) + timer := time.NewTimer(5 * time.Minute) lport, _ := strconv.ParseInt(s.Port, 10, 16) first := true out: -- cgit v1.2.3 From ebdf339a614b9d03a0b0a0292d1ea24f854d6b3e Mon Sep 17 00:00:00 2001 From: Maran Date: Fri, 2 May 2014 13:35:25 +0200 Subject: Implemented RPC framework --- ethereum.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index c906a6954..df8e9ef7d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -4,6 +4,7 @@ import ( "container/list" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethdb" + "github.com/ethereum/eth-go/etherpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" "io/ioutil" @@ -62,6 +63,8 @@ type Ethereum struct { MaxPeers int reactor *ethutil.ReactorEngine + + RpcServer *etherpc.JsonRpcServer } func New(caps Caps, usePnp bool) (*Ethereum, error) { @@ -338,6 +341,7 @@ func (s *Ethereum) Stop() { s.txPool.Stop() s.stateManager.Stop() + s.RpcServer.Stop() close(s.shutdownChan) } -- cgit v1.2.3 From 4f20e8f649a19168718a7f0fe7619e3bdb626aa8 Mon Sep 17 00:00:00 2001 From: Maran Date: Fri, 2 May 2014 20:00:58 +0200 Subject: Implemented first few methods via public api --- ethereum.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 4181f9cd8..6cb1a916f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -4,7 +4,6 @@ import ( "container/list" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethdb" - "github.com/ethereum/eth-go/etherpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" "io/ioutil" @@ -64,7 +63,7 @@ type Ethereum struct { reactor *ethutil.ReactorEngine - RpcServer *etherpc.JsonRpcServer + // TODO: This no worky: RpcServer *etherpc.JsonRpcServer } func New(caps Caps, usePnp bool) (*Ethereum, error) { @@ -341,7 +340,7 @@ func (s *Ethereum) Stop() { s.txPool.Stop() s.stateManager.Stop() - s.RpcServer.Stop() + // TODO: THIS NO WORKY: s.RpcServer.Stop() close(s.shutdownChan) } -- cgit v1.2.3 From fde3e01f80420c367139a9fe647c618b0223842d Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 5 May 2014 14:15:31 +0200 Subject: Fixed import cycle --- ethereum.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 6cb1a916f..d6154e213 100644 --- a/ethereum.go +++ b/ethereum.go @@ -4,6 +4,7 @@ import ( "container/list" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethdb" + "github.com/ethereum/eth-go/etherpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" "io/ioutil" @@ -63,7 +64,7 @@ type Ethereum struct { reactor *ethutil.ReactorEngine - // TODO: This no worky: RpcServer *etherpc.JsonRpcServer + RpcServer *etherpc.JsonRpcServer } func New(caps Caps, usePnp bool) (*Ethereum, error) { @@ -338,9 +339,9 @@ func (s *Ethereum) Stop() { close(s.quit) + s.RpcServer.Stop() s.txPool.Stop() s.stateManager.Stop() - // TODO: THIS NO WORKY: s.RpcServer.Stop() close(s.shutdownChan) } -- cgit v1.2.3 From a4ca9927abc774fe524635a38d2f3bf2c4831278 Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 5 May 2014 15:15:14 +0200 Subject: Renamed etherpc to ethrpc --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index d6154e213..707938639 100644 --- a/ethereum.go +++ b/ethereum.go @@ -4,7 +4,7 @@ import ( "container/list" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethdb" - "github.com/ethereum/eth-go/etherpc" + "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" "io/ioutil" @@ -64,7 +64,7 @@ type Ethereum struct { reactor *ethutil.ReactorEngine - RpcServer *etherpc.JsonRpcServer + RpcServer *ethrpc.JsonRpcServer } func New(caps Caps, usePnp bool) (*Ethereum, error) { -- cgit v1.2.3 From e18b96b486abefb587fd93cfe33fe6edcd8cbb87 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 6 May 2014 14:15:02 +0200 Subject: Fix an issue where we don't have the rpc so we dont have to close it --- ethereum.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 707938639..2f4db7336 100644 --- a/ethereum.go +++ b/ethereum.go @@ -339,7 +339,9 @@ func (s *Ethereum) Stop() { close(s.quit) - s.RpcServer.Stop() + if s.RpcServer != nil { + s.RpcServer.Stop() + } s.txPool.Stop() s.stateManager.Stop() -- cgit v1.2.3 From afe83af219c2146e022f6665cf30097b582d3e79 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 9 May 2014 16:09:28 +0200 Subject: Moved seeding and moved manifest --- ethereum.go | 82 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 39 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 2f4db7336..e3140b5ce 100644 --- a/ethereum.go +++ b/ethereum.go @@ -253,7 +253,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { } // Start the ethereum -func (s *Ethereum) Start() { +func (s *Ethereum) Start(seed bool) { // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { @@ -272,47 +272,51 @@ func (s *Ethereum) Start() { // Start the reaping processes go s.ReapDeadPeerHandler() - if ethutil.Config.Seed { - ethutil.Config.Log.Debugln("Seeding") - // 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) - log.Println("Found DNS Bootstrap Peer:", peer) - peers = append(peers, peer) - } - } else { - log.Println("Couldn't resolve :", target) + if seed { + s.Seed() + } +} + +func (s *Ethereum) Seed() { + ethutil.Config.Log.Debugln("Seeding") + // 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) + log.Println("Found DNS Bootstrap Peer:", peer) + peers = append(peers, peer) } + } else { + log.Println("Couldn't resolve :", target) } - // Connect to Peer list - s.ProcessPeerList(peers) - } else { - // Fallback to servers.poc3.txt - resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") - if err != nil { - log.Println("Fetching seed failed:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Println("Reading seed failed:", err) - return - } - - s.ConnectToPeer(string(body)) } + // Connect to Peer list + s.ProcessPeerList(peers) + } else { + // Fallback to servers.poc3.txt + resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") + if err != nil { + log.Println("Fetching seed failed:", err) + return + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Println("Reading seed failed:", err) + return + } + + s.ConnectToPeer(string(body)) } } -- cgit v1.2.3 From 8b4ed8c505111cb570c7c694675b833ebf0bba21 Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 12 May 2014 13:39:37 +0200 Subject: Properly exchange peer capabilities between peers --- ethereum.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index e3140b5ce..97ea35d45 100644 --- a/ethereum.go +++ b/ethereum.go @@ -122,6 +122,10 @@ 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) -- cgit v1.2.3 From 7f9fd0879207b7aba6c8e27d3e0b4672cba98bfb Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 12 May 2014 15:08:21 +0200 Subject: Implemented proper peer checking when adding new peers We now resolve a hostname to IP before we try to compare it to the existing peer pool --- ethereum.go | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 97ea35d45..0f5bd11a2 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" @@ -146,15 +149,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 } }) -- cgit v1.2.3 From cc341b8734cf2c424b9b4adf7861400992755d7a Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 12 May 2014 16:36:14 +0200 Subject: Added debug message if you try to add a peer when max peers has been reached. --- ethereum.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 0f5bd11a2..bd391ba37 100644 --- a/ethereum.go +++ b/ethereum.go @@ -132,9 +132,13 @@ func (s *Ethereum) ServerCaps() Caps { 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.") + } } } -- cgit v1.2.3 From 3647cc5b073b9c82d50394074c978628a32719e4 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 11:35:21 +0200 Subject: Implemented our own makeshift go seed. Fixes #16 --- ethereum.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index bd391ba37..92c4e4ba1 100644 --- a/ethereum.go +++ b/ethereum.go @@ -325,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{} @@ -340,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 -- cgit v1.2.3 From 28357d657b8c46e841fc96a61758652d2617b068 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 14:43:29 +0200 Subject: Implemented new JS/EthPub methods - getTxCountAt - getPeerCount - getIsMining - getIsListening - getCoinbase --- ethereum.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 92c4e4ba1..94e338c56 100644 --- a/ethereum.go +++ b/ethereum.go @@ -65,6 +65,10 @@ type Ethereum struct { // Specifies the desired amount of maximum peers MaxPeers int + Mining bool + + listening bool + reactor *ethutil.ReactorEngine RpcServer *ethrpc.JsonRpcServer @@ -128,6 +132,15 @@ func (s *Ethereum) TxPool() *ethchain.TxPool { func (s *Ethereum) ServerCaps() Caps { return s.serverCaps } +func (s *Ethereum) IsMining() bool { + return s.Mining +} +func (s *Ethereum) PeerCount() int { + return s.peers.Len() +} +func (s *Ethereum) IsListening() bool { + return s.listening +} func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) @@ -305,7 +318,9 @@ func (s *Ethereum) Start(seed bool) { ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { log.Println("Connection listening disabled. Acting as client") + s.listening = false } else { + s.listening = true // Starting accepting connections ethutil.Config.Log.Infoln("Ready and accepting connections") // Start the peer handler -- cgit v1.2.3 From 3ac74b1e7840720e8ae426c751328ed7595188a8 Mon Sep 17 00:00:00 2001 From: Maran Date: Wed, 14 May 2014 13:57:04 +0200 Subject: Implemented IsUpToDate to mark the node as ready to start mining --- ethereum.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 94e338c56..83a74f302 100644 --- a/ethereum.go +++ b/ethereum.go @@ -138,6 +138,18 @@ func (s *Ethereum) IsMining() bool { func (s *Ethereum) PeerCount() int { return s.peers.Len() } +func (s *Ethereum) IsUpToDate() bool { + upToDate := true + eachPeer(s.peers, func(peer *Peer, e *list.Element) { + if atomic.LoadInt32(&peer.connected) == 1 { + if peer.catchingUp == true { + upToDate = false + } + } + }) + return upToDate +} + func (s *Ethereum) IsListening() bool { return s.listening } -- cgit v1.2.3 From 8730dfdcc2e2b40410a57385e4864d15f2f0336b Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 17 May 2014 14:07:52 +0200 Subject: Changed how changes are being applied to states --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 83a74f302..14418023e 100644 --- a/ethereum.go +++ b/ethereum.go @@ -235,7 +235,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { s.peers.PushBack(peer) - log.Printf("[SERV] Adding peer %d / %d\n", s.peers.Len(), s.MaxPeers) + ethutil.Config.Log.Infof("[SERV] Adding peer %d / %d\n", s.peers.Len(), s.MaxPeers) } return nil -- cgit v1.2.3 From 12f30e6220354c4a8b08ecf41bb53444143f3660 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 20 May 2014 11:50:34 +0200 Subject: Refactored a lot of the chain catchup/reorg. --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 14418023e..3a7202d53 100644 --- a/ethereum.go +++ b/ethereum.go @@ -222,7 +222,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { if phost == chost { alreadyConnected = true - ethutil.Config.Log.Debugf("[SERV] Peer %s already added.\n", chost) + //ethutil.Config.Log.Debugf("[SERV] Peer %s already added.\n", chost) return } }) @@ -235,7 +235,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { s.peers.PushBack(peer) - ethutil.Config.Log.Infof("[SERV] Adding peer %d / %d\n", s.peers.Len(), s.MaxPeers) + ethutil.Config.Log.Infof("[SERV] Adding peer (%s) %d / %d\n", addr, s.peers.Len(), s.MaxPeers) } return nil -- cgit v1.2.3 From f382221b28ab9e886263e37b1eab9c7924a6a0dc Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 30 May 2014 13:04:08 +0200 Subject: Broadcast "peerList" event upon removing or adding peers --- ethereum.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 3a7202d53..6be989a10 100644 --- a/ethereum.go +++ b/ethereum.go @@ -165,6 +165,8 @@ func (s *Ethereum) AddPeer(conn net.Conn) { ethutil.Config.Log.Debugf("[SERV] Max connected peers reached. Not adding incoming peer.") } } + + s.reactor.Post("peerList", s.peers) } func (s *Ethereum) ProcessPeerList(addrs []string) { @@ -303,12 +305,26 @@ func (s *Ethereum) Peers() *list.List { } func (s *Ethereum) reapPeers() { + eachPeer(s.peers, func(p *Peer, e *list.Element) { + if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { + s.removePeerElement(e) + } + }) +} + +func (s *Ethereum) removePeerElement(e *list.Element) { s.peerMut.Lock() defer s.peerMut.Unlock() - eachPeer(s.peers, func(p *Peer, e *list.Element) { - if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { - s.peers.Remove(e) + s.peers.Remove(e) + + s.reactor.Post("peerList", s.peers) +} + +func (s *Ethereum) RemovePeer(p *Peer) { + eachPeer(s.peers, func(peer *Peer, e *list.Element) { + if peer == p { + s.removePeerElement(e) } }) } -- cgit v1.2.3 From 17c825f53a2676ffe17fd7731f8f550aebcb56b0 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 30 May 2014 16:57:58 +0200 Subject: Peer changes broadcasting and minor miner fix --- ethereum.go | 1 + 1 file changed, 1 insertion(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 6be989a10..d9281cd57 100644 --- a/ethereum.go +++ b/ethereum.go @@ -238,6 +238,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { s.peers.PushBack(peer) ethutil.Config.Log.Infof("[SERV] Adding peer (%s) %d / %d\n", addr, s.peers.Len(), s.MaxPeers) + s.reactor.Post("peerList", s.peers) } return nil -- cgit v1.2.3 From 1f7917589822d4327147949c610fad3979819ab3 Mon Sep 17 00:00:00 2001 From: Maran Date: Wed, 18 Jun 2014 13:06:48 +0200 Subject: Reworked peers to check for public key duplication and adding peers to peerlist only after the handshake has come in --- ethereum.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index d9281cd57..a6cb78b1f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -149,7 +149,9 @@ func (s *Ethereum) IsUpToDate() bool { }) return upToDate } - +func (s *Ethereum) PushPeer(peer *Peer) { + s.peers.PushBack(peer) +} func (s *Ethereum) IsListening() bool { return s.listening } @@ -159,14 +161,11 @@ func (s *Ethereum) AddPeer(conn net.Conn) { 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.") } } - - s.reactor.Post("peerList", s.peers) } func (s *Ethereum) ProcessPeerList(addrs []string) { @@ -233,12 +232,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { return nil } - peer := NewOutboundPeer(addr, s, s.serverCaps) - - s.peers.PushBack(peer) - - ethutil.Config.Log.Infof("[SERV] Adding peer (%s) %d / %d\n", addr, s.peers.Len(), s.MaxPeers) - s.reactor.Post("peerList", s.peers) + NewOutboundPeer(addr, s, s.serverCaps) } return nil -- cgit v1.2.3 From a4e26bf7c2c0cfc65be14ef98af695a0d663609f Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 23 Jun 2014 11:25:14 +0200 Subject: Added Block do which replays the given block or error --- ethereum.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a6cb78b1f..77a7c92c7 100644 --- a/ethereum.go +++ b/ethereum.go @@ -113,6 +113,24 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { return ethereum, nil } +// Replay block +func (self *Ethereum) BlockDo(hash []byte) error { + block := self.blockChain.GetBlock(hash) + if block == nil { + return fmt.Errorf("unknown block %x", hash) + } + + parent := self.blockChain.GetBlock(block.PrevHash) + + _, err := self.stateManager.ApplyDiff(parent.State(), parent, block) + if err != nil { + return err + } + + return nil + +} + func (s *Ethereum) Reactor() *ethutil.ReactorEngine { return s.reactor } -- cgit v1.2.3 From b9e8a3e02493d5bbf23cfcab259e66f6ae166612 Mon Sep 17 00:00:00 2001 From: zelig Date: Mon, 23 Jun 2014 12:54:10 +0100 Subject: modified logging API - package vars for tagged loggers - weed out spurious fmt.PrintX and log.PrintX logging - tried to second guess loglevel for some :) --- ethereum.go | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a6cb78b1f..1de671712 100644 --- a/ethereum.go +++ b/ethereum.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" + "github.com/ethereum/eth-go/ethlog" "io/ioutil" - "log" "math/rand" "net" "net/http" @@ -20,6 +20,8 @@ import ( "time" ) +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() { @@ -85,7 +87,7 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { if usePnp { nat, err = Discover() if err != nil { - ethutil.Config.Log.Debugln("UPnP failed", err) + ethlogger.Debugln("UPnP failed", err) } } @@ -163,7 +165,7 @@ func (s *Ethereum) AddPeer(conn net.Conn) { if s.peers.Len() < s.MaxPeers { peer.Start() } else { - ethutil.Config.Log.Debugf("[SERV] Max connected peers reached. Not adding incoming peer.") + ethlogger.Debugf("Max connected peers reached. Not adding incoming peer.") } } } @@ -223,7 +225,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { if phost == chost { alreadyConnected = true - //ethutil.Config.Log.Debugf("[SERV] Peer %s already added.\n", chost) + //ethlogger.Debugf("Peer %s already added.\n", chost) return } }) @@ -340,12 +342,12 @@ func (s *Ethereum) Start(seed bool) { // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { - log.Println("Connection listening disabled. Acting as client") + ethlogger.Warnln("Connection listening disabled. Acting as client") s.listening = false } else { s.listening = true // Starting accepting connections - ethutil.Config.Log.Infoln("Ready and accepting connections") + ethlogger.Infoln("Ready and accepting connections") // Start the peer handler go s.peerHandler(ln) } @@ -363,7 +365,7 @@ func (s *Ethereum) Start(seed bool) { } func (s *Ethereum) Seed() { - ethutil.Config.Log.Debugln("[SERV] Retrieving seed nodes") + ethlogger.Debugln("Retrieving seed nodes") // Eth-Go Bootstrapping ips, er := net.LookupIP("seed.bysh.me") @@ -371,7 +373,7 @@ func (s *Ethereum) Seed() { peers := []string{} for _, ip := range ips { node := fmt.Sprintf("%s:%d", ip.String(), 30303) - ethutil.Config.Log.Debugln("[SERV] Found DNS Go Peer:", node) + ethlogger.Debugln("Found DNS Go Peer:", node) peers = append(peers, node) } s.ProcessPeerList(peers) @@ -391,11 +393,11 @@ func (s *Ethereum) Seed() { for _, a := range addr { // Build string out of SRV port and Resolved IP peer := net.JoinHostPort(a, port) - ethutil.Config.Log.Debugln("[SERV] Found DNS Bootstrap Peer:", peer) + ethlogger.Debugln("Found DNS Bootstrap Peer:", peer) peers = append(peers, peer) } } else { - ethutil.Config.Log.Debugln("[SERV} Couldn't resolve :", target) + ethlogger.Debugln("Couldn't resolve :", target) } } // Connect to Peer list @@ -404,13 +406,13 @@ func (s *Ethereum) Seed() { // Fallback to servers.poc3.txt resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") if err != nil { - log.Println("Fetching seed failed:", err) + ethlogger.Warnln("Fetching seed failed:", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { - log.Println("Reading seed failed:", err) + ethlogger.Warnln("Reading seed failed:", err) return } @@ -422,7 +424,7 @@ func (s *Ethereum) peerHandler(listener net.Listener) { for { conn, err := listener.Accept() if err != nil { - ethutil.Config.Log.Debugln(err) + ethlogger.Debugln(err) continue } @@ -468,13 +470,13 @@ out: var err error _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) if err != nil { - ethutil.Config.Log.Debugln("can't add UPnP port mapping:", err) + ethlogger.Debugln("can't add UPnP port mapping:", err) break out } if first && err == nil { _, err = s.nat.GetExternalAddress() if err != nil { - ethutil.Config.Log.Debugln("UPnP can't get external address:", err) + ethlogger.Debugln("UPnP can't get external address:", err) continue out } first = false @@ -488,8 +490,8 @@ out: timer.Stop() if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil { - ethutil.Config.Log.Debugln("unable to remove UPnP port mapping:", err) + ethlogger.Debugln("unable to remove UPnP port mapping:", err) } else { - ethutil.Config.Log.Debugln("succesfully disestablished UPnP port mapping") + ethlogger.Debugln("succesfully disestablished UPnP port mapping") } } -- cgit v1.2.3 From 9dae1a17324df671bf2223ae80257a310cecfea5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 25 Jun 2014 09:47:19 +0200 Subject: Removed BlockDo Method --- ethereum.go | 18 ------------------ 1 file changed, 18 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 77a7c92c7..a6cb78b1f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -113,24 +113,6 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { return ethereum, nil } -// Replay block -func (self *Ethereum) BlockDo(hash []byte) error { - block := self.blockChain.GetBlock(hash) - if block == nil { - return fmt.Errorf("unknown block %x", hash) - } - - parent := self.blockChain.GetBlock(block.PrevHash) - - _, err := self.stateManager.ApplyDiff(parent.State(), parent, block) - if err != nil { - return err - } - - return nil - -} - func (s *Ethereum) Reactor() *ethutil.ReactorEngine { return s.reactor } -- cgit v1.2.3 From 0ed19d9f2024744ba93d0e34db6939766b3cfed5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 26 Jun 2014 11:26:42 +0200 Subject: Logging, variable rearrangement --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a6cb78b1f..6345f8864 100644 --- a/ethereum.go +++ b/ethereum.go @@ -340,7 +340,7 @@ func (s *Ethereum) Start(seed bool) { // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { - log.Println("Connection listening disabled. Acting as client") + ethutil.Config.Log.Infof("port=%s in use. Connection listening disabled.") s.listening = false } else { s.listening = true @@ -395,7 +395,7 @@ func (s *Ethereum) Seed() { peers = append(peers, peer) } } else { - ethutil.Config.Log.Debugln("[SERV} Couldn't resolve :", target) + ethutil.Config.Log.Debugln("[SERV] Couldn't resolve :", target) } } // Connect to Peer list -- cgit v1.2.3 From 098136b68198083a47408ec5c04cd0c8f9fdcc87 Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 26 Jun 2014 10:43:02 +0100 Subject: ethereum logs server started/stopped message --- ethereum.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 1de671712..28d1c0437 100644 --- a/ethereum.go +++ b/ethereum.go @@ -362,6 +362,7 @@ func (s *Ethereum) Start(seed bool) { if seed { s.Seed() } + ethlogger.Infoln("Server started") } func (s *Ethereum) Seed() { @@ -449,6 +450,7 @@ func (s *Ethereum) Stop() { s.txPool.Stop() s.stateManager.Stop() + ethlogger.Infoln("Server stopped") close(s.shutdownChan) } -- cgit v1.2.3 From 853053a3b204ddf4ae935e70e0aa5b5d8994493e Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 26 Jun 2014 18:45:57 +0100 Subject: go fmt --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 8caa75cbd..a3df23e92 100644 --- a/ethereum.go +++ b/ethereum.go @@ -5,10 +5,10 @@ import ( "fmt" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethdb" + "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" - "github.com/ethereum/eth-go/ethlog" "io/ioutil" "math/rand" "net" -- cgit v1.2.3 From dabaa4cce01586fd8b1b9314073a1d26f35355c8 Mon Sep 17 00:00:00 2001 From: zelig Date: Sun, 29 Jun 2014 18:30:05 +0100 Subject: change all modified calls to ethtrie, ethutil and ethcrypto functions --- ethereum.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a3df23e92..b78b0658f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -4,7 +4,7 @@ import ( "container/list" "fmt" "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethdb" + "github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" @@ -74,16 +74,15 @@ type Ethereum struct { reactor *ethutil.ReactorEngine RpcServer *ethrpc.JsonRpcServer + + keyManager *ethcrypto.KeyManager } -func New(caps Caps, usePnp bool) (*Ethereum, error) { - db, err := ethdb.NewLDBDatabase("database") - //db, err := ethdb.NewMemDatabase() - if err != nil { - return nil, err - } +func New(db ethutil.Database, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { + var err error var nat NAT + if usePnp { nat, err = Discover() if err != nil { @@ -102,6 +101,7 @@ func New(caps Caps, usePnp bool) (*Ethereum, error) { Nonce: nonce, serverCaps: caps, nat: nat, + keyManager: keyManager, } ethereum.reactor = ethutil.NewReactorEngine() @@ -119,6 +119,10 @@ func (s *Ethereum) Reactor() *ethutil.ReactorEngine { return s.reactor } +func (s *Ethereum) KeyManager() *ethcrypto.KeyManager { + return s.keyManager +} + func (s *Ethereum) BlockChain() *ethchain.BlockChain { return s.blockChain } -- cgit v1.2.3 From c833c3fec8cd327e22d7a481e6e4b795f27eb1de Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 3 Jul 2014 17:30:04 +0100 Subject: add ClientIdentity() ethwire.ClientIdentity to Ethereum --- ethereum.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b78b0658f..35d98e831 100644 --- a/ethereum.go +++ b/ethereum.go @@ -76,9 +76,11 @@ type Ethereum struct { RpcServer *ethrpc.JsonRpcServer keyManager *ethcrypto.KeyManager + + clientIdentity ethwire.ClientIdentity } -func New(db ethutil.Database, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { +func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { var err error var nat NAT @@ -94,14 +96,15 @@ func New(db ethutil.Database, keyManager *ethcrypto.KeyManager, caps Caps, usePn nonce, _ := ethutil.RandomUint64() ethereum := &Ethereum{ - shutdownChan: make(chan bool), - quit: make(chan bool), - db: db, - peers: list.New(), - Nonce: nonce, - serverCaps: caps, - nat: nat, - keyManager: keyManager, + shutdownChan: make(chan bool), + quit: make(chan bool), + db: db, + peers: list.New(), + Nonce: nonce, + serverCaps: caps, + nat: nat, + keyManager: keyManager, + clientIdentity: clientIdentity, } ethereum.reactor = ethutil.NewReactorEngine() @@ -123,6 +126,10 @@ func (s *Ethereum) KeyManager() *ethcrypto.KeyManager { return s.keyManager } +func (s *Ethereum) ClientIdentity() ethwire.ClientIdentity { + return s.clientIdentity +} + func (s *Ethereum) BlockChain() *ethchain.BlockChain { return s.blockChain } -- cgit v1.2.3 From 584d1c61ec93df3417f2ce8ece041b81a5ec63a6 Mon Sep 17 00:00:00 2001 From: zelig Date: Fri, 4 Jul 2014 19:38:44 +0100 Subject: use ethreact.Event and ethreact.ReactorEngine --- ethereum.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 35d98e831..de4e915a1 100644 --- a/ethereum.go +++ b/ethereum.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" @@ -71,7 +72,7 @@ type Ethereum struct { listening bool - reactor *ethutil.ReactorEngine + reactor *ethreact.ReactorEngine RpcServer *ethrpc.JsonRpcServer @@ -106,7 +107,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager keyManager: keyManager, clientIdentity: clientIdentity, } - ethereum.reactor = ethutil.NewReactorEngine() + ethereum.reactor = ethreact.New() ethereum.txPool = ethchain.NewTxPool(ethereum) ethereum.blockChain = ethchain.NewBlockChain(ethereum) @@ -118,7 +119,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager return ethereum, nil } -func (s *Ethereum) Reactor() *ethutil.ReactorEngine { +func (s *Ethereum) Reactor() *ethreact.ReactorEngine { return s.reactor } @@ -350,6 +351,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { + s.reactor.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { @@ -461,6 +463,9 @@ func (s *Ethereum) Stop() { s.txPool.Stop() s.stateManager.Stop() + s.reactor.Flush() + s.reactor.Stop() + ethlogger.Infoln("Server stopped") close(s.shutdownChan) } -- cgit v1.2.3 From 1199941475452e8d62fb2d5b634672e3f7c48bfd Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 7 Jul 2014 10:52:58 +0200 Subject: Connect to peer node by default --- ethereum.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 35d98e831..f4c497ca4 100644 --- a/ethereum.go +++ b/ethereum.go @@ -430,6 +430,8 @@ func (s *Ethereum) Seed() { s.ConnectToPeer(string(body)) } + + s.ConnectToPeer("54.204.10.41:30303") } func (s *Ethereum) peerHandler(listener net.Listener) { -- cgit v1.2.3 From 6fe9b4ab5e839be96eb1c4a619bc14fab622d8d1 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Mon, 7 Jul 2014 10:59:16 +0200 Subject: Revert "ethreact - Feature/ethutil refactor" --- ethereum.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 69fcc338e..f4c497ca4 100644 --- a/ethereum.go +++ b/ethereum.go @@ -6,7 +6,6 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" @@ -72,7 +71,7 @@ type Ethereum struct { listening bool - reactor *ethreact.ReactorEngine + reactor *ethutil.ReactorEngine RpcServer *ethrpc.JsonRpcServer @@ -107,7 +106,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager keyManager: keyManager, clientIdentity: clientIdentity, } - ethereum.reactor = ethreact.New() + ethereum.reactor = ethutil.NewReactorEngine() ethereum.txPool = ethchain.NewTxPool(ethereum) ethereum.blockChain = ethchain.NewBlockChain(ethereum) @@ -119,7 +118,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager return ethereum, nil } -func (s *Ethereum) Reactor() *ethreact.ReactorEngine { +func (s *Ethereum) Reactor() *ethutil.ReactorEngine { return s.reactor } @@ -351,7 +350,6 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { - s.reactor.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { @@ -465,9 +463,6 @@ func (s *Ethereum) Stop() { s.txPool.Stop() s.stateManager.Stop() - s.reactor.Flush() - s.reactor.Stop() - ethlogger.Infoln("Server stopped") close(s.shutdownChan) } -- cgit v1.2.3 From 794e65b60e3d9cd954f9d2aa082d18fe9431c200 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 7 Jul 2014 22:08:09 +0200 Subject: Updated peer server --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index f4c497ca4..a032ef515 100644 --- a/ethereum.go +++ b/ethereum.go @@ -431,7 +431,7 @@ func (s *Ethereum) Seed() { s.ConnectToPeer(string(body)) } - s.ConnectToPeer("54.204.10.41:30303") + s.ConnectToPeer("54.72.69.180:30303") } func (s *Ethereum) peerHandler(listener net.Listener) { -- cgit v1.2.3 From d52e5f7130b58ec9ead7bb20478919f06b0b1a01 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 10 Jul 2014 15:04:19 +0200 Subject: Removed hardcoded ip --- ethereum.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a032ef515..35d98e831 100644 --- a/ethereum.go +++ b/ethereum.go @@ -430,8 +430,6 @@ func (s *Ethereum) Seed() { s.ConnectToPeer(string(body)) } - - s.ConnectToPeer("54.72.69.180:30303") } func (s *Ethereum) peerHandler(listener net.Listener) { -- cgit v1.2.3 From 9010857677ac374e09bab62a89f2fb52c11ed6d3 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 11 Jul 2014 16:04:09 +0200 Subject: Special diff output for execution --- ethereum.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 35d98e831..2806dfd9d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -20,6 +20,8 @@ import ( "time" ) +const seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" + var ethlogger = ethlog.NewLogger("SERV") func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) { @@ -416,7 +418,7 @@ func (s *Ethereum) Seed() { s.ProcessPeerList(peers) } else { // Fallback to servers.poc3.txt - resp, err := http.Get("http://www.ethereum.org/servers.poc3.txt") + resp, err := http.Get(seedTextFileUri) if err != nil { ethlogger.Warnln("Fetching seed failed:", err) return -- cgit v1.2.3 From 1735ec0362e84455126d8c1bd380ecae436d1167 Mon Sep 17 00:00:00 2001 From: zelig Date: Tue, 15 Jul 2014 01:11:06 +0100 Subject: use ethreact.Event and ethreact.ReactorEngine --- ethereum.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 2806dfd9d..c2d2f5241 100644 --- a/ethereum.go +++ b/ethereum.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" @@ -73,7 +74,7 @@ type Ethereum struct { listening bool - reactor *ethutil.ReactorEngine + reactor *ethreact.ReactorEngine RpcServer *ethrpc.JsonRpcServer @@ -108,7 +109,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager keyManager: keyManager, clientIdentity: clientIdentity, } - ethereum.reactor = ethutil.NewReactorEngine() + ethereum.reactor = ethreact.New() ethereum.txPool = ethchain.NewTxPool(ethereum) ethereum.blockChain = ethchain.NewBlockChain(ethereum) @@ -120,7 +121,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager return ethereum, nil } -func (s *Ethereum) Reactor() *ethutil.ReactorEngine { +func (s *Ethereum) Reactor() *ethreact.ReactorEngine { return s.reactor } @@ -352,6 +353,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { + s.reactor.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { @@ -462,6 +464,8 @@ func (s *Ethereum) Stop() { } s.txPool.Stop() s.stateManager.Stop() + s.reactor.Flush() + s.reactor.Stop() ethlogger.Infoln("Server stopped") close(s.shutdownChan) -- cgit v1.2.3 From 6a19b62db6466f88132f5e41868336ff74ef969c Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 17 Jul 2014 22:01:13 +0200 Subject: added chainSync event --- ethereum.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 2806dfd9d..f43d37be2 100644 --- a/ethereum.go +++ b/ethereum.go @@ -80,6 +80,8 @@ type Ethereum struct { keyManager *ethcrypto.KeyManager clientIdentity ethwire.ClientIdentity + + isUpToDate bool } func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { @@ -107,6 +109,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager nat: nat, keyManager: keyManager, clientIdentity: clientIdentity, + isUpToDate: true, } ethereum.reactor = ethutil.NewReactorEngine() @@ -371,6 +374,7 @@ func (s *Ethereum) Start(seed bool) { // Start the reaping processes go s.ReapDeadPeerHandler() + go s.update() if seed { s.Seed() @@ -510,3 +514,23 @@ out: ethlogger.Debugln("succesfully disestablished UPnP port mapping") } } + +func (self *Ethereum) update() { + upToDateTimer := time.NewTicker(1 * time.Second) + +out: + for { + select { + case <-upToDateTimer.C: + if self.IsUpToDate() && !self.isUpToDate { + self.reactor.Post("chainSync", false) + self.isUpToDate = true + } else if !self.IsUpToDate() && self.isUpToDate { + self.reactor.Post("chainSync", true) + self.isUpToDate = false + } + case <-self.quit: + break out + } + } +} -- cgit v1.2.3 From 449b9a9d688eaf6a8628a3ae9fa1dd3496f99c71 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 18 Jul 2014 11:57:44 +0200 Subject: Check if version in known + fix --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index f43d37be2..18c1f8a23 100644 --- a/ethereum.go +++ b/ethereum.go @@ -160,7 +160,7 @@ func (s *Ethereum) IsUpToDate() bool { upToDate := true eachPeer(s.peers, func(peer *Peer, e *list.Element) { if atomic.LoadInt32(&peer.connected) == 1 { - if peer.catchingUp == true { + if peer.catchingUp == true && peer.versionKnown { upToDate = false } } -- cgit v1.2.3 From 41bd38147c2e5968283facf641b2444c09f53d14 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 26 Jul 2014 11:24:44 +0200 Subject: Clean up and util methods --- ethereum.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 18c1f8a23..799e9cb39 100644 --- a/ethereum.go +++ b/ethereum.go @@ -3,12 +3,6 @@ package eth import ( "container/list" "fmt" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethcrypto" - "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethrpc" - "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/eth-go/ethwire" "io/ioutil" "math/rand" "net" @@ -18,6 +12,13 @@ import ( "sync" "sync/atomic" "time" + + "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/ethcrypto" + "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/eth-go/ethrpc" + "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/eth-go/ethwire" ) const seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" -- cgit v1.2.3 From 74d701202583b49d29f5dbca00aec419bdee8e1d Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 29 Jul 2014 23:33:59 +0200 Subject: Added temp seed --- ethereum.go | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 799e9cb39..395eba954 100644 --- a/ethereum.go +++ b/ethereum.go @@ -3,10 +3,8 @@ package eth import ( "container/list" "fmt" - "io/ioutil" "math/rand" "net" - "net/http" "strconv" "strings" "sync" @@ -21,7 +19,10 @@ import ( "github.com/ethereum/eth-go/ethwire" ) -const seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" +const ( + seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" + seedNodeAddress = "54.76.56.74:30303" +) var ethlogger = ethlog.NewLogger("SERV") @@ -421,22 +422,10 @@ func (s *Ethereum) Seed() { } // Connect to Peer list s.ProcessPeerList(peers) - } else { - // Fallback to servers.poc3.txt - resp, err := http.Get(seedTextFileUri) - if err != nil { - ethlogger.Warnln("Fetching seed failed:", err) - return - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - ethlogger.Warnln("Reading seed failed:", err) - return - } - - s.ConnectToPeer(string(body)) } + + // XXX tmp + s.ConnectToPeer(seedNodeAddress) } func (s *Ethereum) peerHandler(listener net.Listener) { -- cgit v1.2.3 From a760ce05b948e89bc564af20599dcf95698ac0eb Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 11 Aug 2014 16:23:38 +0200 Subject: Updated chain for filtering --- ethereum.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 69bb93cff..c1c4c2f2f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -44,8 +44,8 @@ type Ethereum struct { // Channel for shutting down the ethereum shutdownChan chan bool quit chan bool + // DB interface - //db *ethdb.LDBDatabase db ethutil.Database // State manager for processing new blocks and managing the over all states stateManager *ethchain.StateManager @@ -149,6 +149,9 @@ func (s *Ethereum) StateManager() *ethchain.StateManager { func (s *Ethereum) TxPool() *ethchain.TxPool { return s.txPool } +func (self *Ethereum) Db() ethutil.Database { + return self.db +} func (s *Ethereum) ServerCaps() Caps { return s.serverCaps -- cgit v1.2.3 From eaa2e8900d1036e09b002c4e20fc6e4f9cd031bb Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 Aug 2014 14:47:58 +0200 Subject: PoC 6 networking code. * Added block pool for gathering blocks from the network (chunks) * Re wrote syncing --- ethereum.go | 3 +++ 1 file changed, 3 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index c1c4c2f2f..1e1891589 100644 --- a/ethereum.go +++ b/ethereum.go @@ -54,6 +54,8 @@ type Ethereum struct { txPool *ethchain.TxPool // The canonical chain blockChain *ethchain.BlockChain + // The block pool + blockPool *BlockPool // Peers (NYI) peers *list.List // Nonce @@ -116,6 +118,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager } ethereum.reactor = ethreact.New() + ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = ethchain.NewTxPool(ethereum) ethereum.blockChain = ethchain.NewBlockChain(ethereum) ethereum.stateManager = ethchain.NewStateManager(ethereum) -- cgit v1.2.3 From 836ed9d6b70e3ae928624f9ed81ed206a66b85b8 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 22 Aug 2014 11:34:59 +0200 Subject: Write Protocol version to the db so we can perform sanity checks --- ethereum.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 1e1891589..4c5e13b6d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -90,7 +90,6 @@ type Ethereum struct { } func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { - var err error var nat NAT @@ -101,6 +100,8 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager } } + bootstrapDb(db) + ethutil.Config.Db = db nonce, _ := ethutil.RandomUint64() @@ -534,3 +535,12 @@ out: } } } + +func bootstrapDb(db ethutil.Database) { + d, _ := db.Get([]byte("ProtocolVersion")) + protov := ethutil.NewValue(d).Uint() + + if protov == 0 { + db.Put([]byte("ProtocolVersion"), ethutil.NewValue(ProtocolVersion).Bytes()) + } +} -- cgit v1.2.3 From 2fb57b2ea7b7f697ddc4811c471d87116eae07cc Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 14 Sep 2014 00:13:23 +0200 Subject: Reworked filters --- ethereum.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 4c5e13b6d..fdfb59b09 100644 --- a/ethereum.go +++ b/ethereum.go @@ -16,6 +16,7 @@ import ( "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethrpc" + "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" ) @@ -87,6 +88,8 @@ type Ethereum struct { clientIdentity ethwire.ClientIdentity isUpToDate bool + + filters map[int]*ethchain.Filter } func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { @@ -116,6 +119,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager keyManager: keyManager, clientIdentity: clientIdentity, isUpToDate: true, + filters: make(map[int]*ethchain.Filter), } ethereum.reactor = ethreact.New() @@ -386,6 +390,7 @@ func (s *Ethereum) Start(seed bool) { // Start the reaping processes go s.ReapDeadPeerHandler() go s.update() + go s.filterLoop() if seed { s.Seed() @@ -536,6 +541,60 @@ out: } } +var filterId = 0 + +func (self *Ethereum) InstallFilter(object map[string]interface{}) (*ethchain.Filter, int) { + defer func() { filterId++ }() + + filter := ethchain.NewFilterFromMap(object, self) + self.filters[filterId] = filter + + return filter, filterId +} + +func (self *Ethereum) UninstallFilter(id int) { + delete(self.filters, id) +} + +func (self *Ethereum) GetFilter(id int) *ethchain.Filter { + return self.filters[id] +} + +func (self *Ethereum) filterLoop() { + blockChan := make(chan ethreact.Event, 5) + messageChan := make(chan ethreact.Event, 5) + // Subscribe to events + reactor := self.Reactor() + reactor.Subscribe("newBlock", blockChan) + reactor.Subscribe("messages", messageChan) +out: + for { + select { + case <-self.quit: + break out + case block := <-blockChan: + if block, ok := block.Resource.(*ethchain.Block); ok { + for _, filter := range self.filters { + if filter.BlockCallback != nil { + filter.BlockCallback(block) + } + } + } + case msg := <-messageChan: + if messages, ok := msg.Resource.(ethstate.Messages); ok { + for _, filter := range self.filters { + if filter.MessageCallback != nil { + msgs := filter.FilterMessages(messages) + if len(msgs) > 0 { + filter.MessageCallback(msgs) + } + } + } + } + } + } +} + func bootstrapDb(db ethutil.Database) { d, _ := db.Get([]byte("ProtocolVersion")) protov := ethutil.NewValue(d).Uint() -- cgit v1.2.3 From 399256b38403f2e95312250d49fca3cada8956b8 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Sep 2014 22:11:05 +0200 Subject: VM execution fixes Refactoring caused executing issues --- ethereum.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index fdfb59b09..8d62fa9f2 100644 --- a/ethereum.go +++ b/ethereum.go @@ -23,7 +23,8 @@ import ( const ( seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" - seedNodeAddress = "54.76.56.74:30303" + //seedNodeAddress = "54.76.56.74:30303" + seedNodeAddress = "localhost:30303" ) var ethlogger = ethlog.NewLogger("SERV") -- cgit v1.2.3 From d02024929a3e617c16c5b33e1d245f23fa4f6c7b Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 16 Sep 2014 11:35:26 +0200 Subject: require 5 for post --- ethereum.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 8d62fa9f2..fdfb59b09 100644 --- a/ethereum.go +++ b/ethereum.go @@ -23,8 +23,7 @@ import ( const ( seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" - //seedNodeAddress = "54.76.56.74:30303" - seedNodeAddress = "localhost:30303" + seedNodeAddress = "54.76.56.74:30303" ) var ethlogger = ethlog.NewLogger("SERV") -- cgit v1.2.3 From 1549a29c9d6452eefa615baedfccfc5b5f6b7745 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 16 Sep 2014 16:36:27 +0200 Subject: Connect to previous peer --- ethereum.go | 91 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 37 deletions(-) (limited to 'ethereum.go') 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() }) -- cgit v1.2.3 From 9559b5322857edfc819f7888a791d4f2a396fd17 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 17 Sep 2014 15:57:44 +0200 Subject: Added Past peers option --- ethereum.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 729f81926..4cf1ce9e7 100644 --- a/ethereum.go +++ b/ethereum.go @@ -399,9 +399,7 @@ func (s *Ethereum) Start(seed bool) { } func (s *Ethereum) Seed() { - var ips []string - data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json")) - json.Unmarshal([]byte(data), &ips) + ips := PastPeers() if len(ips) > 0 { for _, ip := range ips { ethlogger.Infoln("Connecting to previous peer ", ip) @@ -473,8 +471,11 @@ func (s *Ethereum) Stop() { 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) + + if len(ips) > 0 { + 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() @@ -620,3 +621,11 @@ func bootstrapDb(db ethutil.Database) { db.Put([]byte("ProtocolVersion"), ethutil.NewValue(ProtocolVersion).Bytes()) } } + +func PastPeers() []string { + var ips []string + data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json")) + json.Unmarshal([]byte(data), &ips) + + return ips +} -- cgit v1.2.3 From 16871ae2b49fb2a8fad3848e3184c8ab87c7f67a Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 22 Sep 2014 16:28:49 +0200 Subject: New Peer server --- ethereum.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 4cf1ce9e7..a54399921 100644 --- a/ethereum.go +++ b/ethereum.go @@ -25,7 +25,7 @@ import ( const ( seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" - seedNodeAddress = "54.76.56.74:30303" + seedNodeAddress = "poc-6.ethdev.com:30303" ) var ethlogger = ethlog.NewLogger("SERV") @@ -208,6 +208,7 @@ func (s *Ethereum) ProcessPeerList(addrs []string) { } func (s *Ethereum) ConnectToPeer(addr string) error { + fmt.Println("ConnectToPeer", addr) if s.peers.Len() < s.MaxPeers { var alreadyConnected bool -- cgit v1.2.3 From 1bc815e0b1d3fb6f47f8747e607a03f6d8a25ac2 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 22 Sep 2014 16:30:30 +0200 Subject: Remove log --- ethereum.go | 1 - 1 file changed, 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a54399921..79e722c26 100644 --- a/ethereum.go +++ b/ethereum.go @@ -208,7 +208,6 @@ func (s *Ethereum) ProcessPeerList(addrs []string) { } func (s *Ethereum) ConnectToPeer(addr string) error { - fmt.Println("ConnectToPeer", addr) if s.peers.Len() < s.MaxPeers { var alreadyConnected bool -- cgit v1.2.3 From 57dc435f9b928f5de2a49736a2c71a7bf611289a Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 24 Sep 2014 11:39:17 +0200 Subject: Added TD for each block --- ethereum.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 79e722c26..09665336c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -4,6 +4,7 @@ import ( "container/list" "encoding/json" "fmt" + "math/big" "math/rand" "net" "path" @@ -188,6 +189,18 @@ func (s *Ethereum) IsListening() bool { return s.listening } +func (s *Ethereum) HighestTDPeer() (td *big.Int) { + td = big.NewInt(0) + + eachPeer(s.peers, func(p *Peer, v *list.Element) { + if p.td.Cmp(td) > 0 { + td = p.td + } + }) + + return +} + func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) @@ -370,6 +383,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.reactor.Start() + s.blockPool.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { -- cgit v1.2.3 From ba43364f36db690528cc62196969414ef5e98833 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 24 Sep 2014 11:41:57 +0200 Subject: tmp --- ethereum.go | 1 - 1 file changed, 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 09665336c..8f667b786 100644 --- a/ethereum.go +++ b/ethereum.go @@ -383,7 +383,6 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.reactor.Start() - s.blockPool.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { -- cgit v1.2.3 From b66fcf85dfecb13c3ed2b9f46ad6bb257ce84411 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 24 Sep 2014 11:55:02 +0200 Subject: checkp --- ethereum.go | 1 - 1 file changed, 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 09665336c..8f667b786 100644 --- a/ethereum.go +++ b/ethereum.go @@ -383,7 +383,6 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.reactor.Start() - s.blockPool.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { -- cgit v1.2.3 From cba2f6c2c472d5818541f6eabf3e18196d0c477d Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 24 Sep 2014 19:56:21 +0200 Subject: Block pool stop / start --- ethereum.go | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 8f667b786..d04b08960 100644 --- a/ethereum.go +++ b/ethereum.go @@ -158,6 +158,9 @@ func (s *Ethereum) StateManager() *ethchain.StateManager { func (s *Ethereum) TxPool() *ethchain.TxPool { return s.txPool } +func (s *Ethereum) BlockPool() *BlockPool { + return s.blockPool +} func (self *Ethereum) Db() ethutil.Database { return self.db } @@ -383,6 +386,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.reactor.Start() + s.blockPool.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { @@ -503,6 +507,7 @@ func (s *Ethereum) Stop() { s.stateManager.Stop() s.reactor.Flush() s.reactor.Stop() + s.blockPool.Stop() ethlogger.Infoln("Server stopped") close(s.shutdownChan) -- cgit v1.2.3 From 3aeba50c38e74bc1091895db1cb57e7d93864270 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 24 Sep 2014 21:13:28 +0200 Subject: merge error --- ethereum.go | 1 + 1 file changed, 1 insertion(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 389b9d4e4..d04b08960 100644 --- a/ethereum.go +++ b/ethereum.go @@ -386,6 +386,7 @@ func (s *Ethereum) ReapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.reactor.Start() + s.blockPool.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { -- cgit v1.2.3 From ab6ede51d7fedb9270cab08ee732a834be34dab2 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 29 Sep 2014 12:57:51 +0200 Subject: Working on new (blocking) event machine. The new event machine will be used for loose coupling and handle the communications between the services: 1) Block pool finds blocks which "links" with our current canonical chain 2) Posts the blocks on to the event machine 3) State manager receives blocks & processes them 4) Broadcasts new post block event --- ethereum.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index d04b08960..5fb3f2909 100644 --- a/ethereum.go +++ b/ethereum.go @@ -22,6 +22,7 @@ import ( "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" + "github.com/ethereum/eth-go/eventer" ) const ( @@ -58,7 +59,9 @@ type Ethereum struct { blockChain *ethchain.BlockChain // The block pool blockPool *BlockPool - // Peers (NYI) + // Eventer + eventer *eventer.EventMachine + // Peers peers *list.List // Nonce Nonce uint64 @@ -123,6 +126,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager filters: make(map[int]*ethchain.Filter), } ethereum.reactor = ethreact.New() + ethereum.eventer = eventer.New() ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = ethchain.NewTxPool(ethereum) @@ -161,6 +165,9 @@ func (s *Ethereum) TxPool() *ethchain.TxPool { func (s *Ethereum) BlockPool() *BlockPool { return s.blockPool } +func (s *Ethereum) Eventer() *eventer.EventMachine { + return s.eventer +} func (self *Ethereum) Db() ethutil.Database { return self.db } @@ -387,6 +394,8 @@ func (s *Ethereum) ReapDeadPeerHandler() { func (s *Ethereum) Start(seed bool) { s.reactor.Start() s.blockPool.Start() + s.stateManager.Start() + // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { -- cgit v1.2.3 From a75c92000fab997a41479c8f92e62f6b0d3f3434 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 2 Oct 2014 17:03:48 +0200 Subject: Black listing of bad peers --- ethereum.go | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 5fb3f2909..013214726 100644 --- a/ethereum.go +++ b/ethereum.go @@ -69,6 +69,8 @@ type Ethereum struct { Addr net.Addr Port string + blacklist [][]byte + peerMut sync.Mutex // Capabilities for outgoing peers @@ -211,6 +213,10 @@ func (s *Ethereum) HighestTDPeer() (td *big.Int) { return } +func (self *Ethereum) BlacklistPeer(peer *Peer) { + self.blacklist = append(self.blacklist, peer.pubkey) +} + func (s *Ethereum) AddPeer(conn net.Conn) { peer := NewPeer(conn, s, true) -- cgit v1.2.3 From 9d86a49a7327199c01977f3372c8adf748252c32 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 8 Oct 2014 12:06:39 +0200 Subject: Renamed Sha3Bin to Sha3 --- ethereum.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 013214726..987cd2016 100644 --- a/ethereum.go +++ b/ethereum.go @@ -431,6 +431,8 @@ func (s *Ethereum) Start(seed bool) { } func (s *Ethereum) Seed() { + // Sorry Py person. I must blacklist. you perform badly + s.blacklist = append(s.blacklist, ethutil.Hex2Bytes("64656330303561383532336435376331616537643864663236623336313863373537353163636634333530626263396330346237336262623931383064393031")) ips := PastPeers() if len(ips) > 0 { for _, ip := range ips { -- cgit v1.2.3 From 4de3ad1712ce0fdc62b1acc27a3922b192e943c6 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 8 Oct 2014 12:29:49 +0200 Subject: New block message --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 987cd2016..b83ceb12f 100644 --- a/ethereum.go +++ b/ethereum.go @@ -385,7 +385,7 @@ func (s *Ethereum) RemovePeer(p *Peer) { }) } -func (s *Ethereum) ReapDeadPeerHandler() { +func (s *Ethereum) reapDeadPeerHandler() { reapTimer := time.NewTicker(processReapingTimeout * time.Second) for { @@ -420,7 +420,7 @@ func (s *Ethereum) Start(seed bool) { } // Start the reaping processes - go s.ReapDeadPeerHandler() + go s.reapDeadPeerHandler() go s.update() go s.filterLoop() -- cgit v1.2.3 From e83a99903994eaadec3b58822dd18682649ac9dc Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 8 Oct 2014 19:04:58 +0200 Subject: eth: fix filter map data race This commit also documents (but doesn't enforce) that filters are immutable while they're installed. This required a minor API change. --- ethereum.go | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index b83ceb12f..204f30bec 100644 --- a/ethereum.go +++ b/ethereum.go @@ -95,7 +95,9 @@ type Ethereum struct { isUpToDate bool - filters map[int]*ethchain.Filter + filterMu sync.RWMutex + filterId int + filters map[int]*ethchain.Filter } func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { @@ -594,22 +596,29 @@ out: } } -var filterId = 0 - -func (self *Ethereum) InstallFilter(object map[string]interface{}) (*ethchain.Filter, int) { - defer func() { filterId++ }() - - filter := ethchain.NewFilterFromMap(object, self) - self.filters[filterId] = filter - - return filter, filterId +// InstallFilter adds filter for blockchain events. +// The filter's callbacks will run for matching blocks and messages. +// The filter should not be modified after it has been installed. +func (self *Ethereum) InstallFilter(filter *ethchain.Filter) (id int) { + self.filterMu.Lock() + id = self.filterId + self.filters[id] = filter + self.filterId++ + self.filterMu.Unlock() + return id } func (self *Ethereum) UninstallFilter(id int) { + self.filterMu.Lock() delete(self.filters, id) + self.filterMu.Unlock() } +// GetFilter retrieves a filter installed using InstallFilter. +// The filter may not be modified. func (self *Ethereum) GetFilter(id int) *ethchain.Filter { + self.filterMu.RLock() + defer self.filterMu.RUnlock() return self.filters[id] } @@ -627,14 +636,17 @@ out: break out case block := <-blockChan: if block, ok := block.Resource.(*ethchain.Block); ok { + self.filterMu.RLock() for _, filter := range self.filters { if filter.BlockCallback != nil { filter.BlockCallback(block) } } + self.filterMu.RUnlock() } case msg := <-messageChan: if messages, ok := msg.Resource.(ethstate.Messages); ok { + self.filterMu.RLock() for _, filter := range self.filters { if filter.MessageCallback != nil { msgs := filter.FilterMessages(messages) @@ -643,6 +655,7 @@ out: } } } + self.filterMu.RUnlock() } } } -- cgit v1.2.3 From 36cdab206849c7e363e0b9911553098c3e8ca644 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 14 Oct 2014 01:58:31 +0200 Subject: all: use (blocking) event package instead of ethreact --- ethereum.go | 74 ++++++++++++++++++++++--------------------------------------- 1 file changed, 27 insertions(+), 47 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 204f30bec..750ca8f03 100644 --- a/ethereum.go +++ b/ethereum.go @@ -17,12 +17,11 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" - "github.com/ethereum/eth-go/eventer" + "github.com/ethereum/eth-go/event" ) const ( @@ -60,7 +59,7 @@ type Ethereum struct { // The block pool blockPool *BlockPool // Eventer - eventer *eventer.EventMachine + eventMux *event.TypeMux // Peers peers *list.List // Nonce @@ -85,8 +84,6 @@ type Ethereum struct { listening bool - reactor *ethreact.ReactorEngine - RpcServer *ethrpc.JsonRpcServer keyManager *ethcrypto.KeyManager @@ -129,8 +126,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager isUpToDate: true, filters: make(map[int]*ethchain.Filter), } - ethereum.reactor = ethreact.New() - ethereum.eventer = eventer.New() + ethereum.eventMux = event.NewTypeMux() ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = ethchain.NewTxPool(ethereum) @@ -143,10 +139,6 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager return ethereum, nil } -func (s *Ethereum) Reactor() *ethreact.ReactorEngine { - return s.reactor -} - func (s *Ethereum) KeyManager() *ethcrypto.KeyManager { return s.keyManager } @@ -169,8 +161,8 @@ func (s *Ethereum) TxPool() *ethchain.TxPool { func (s *Ethereum) BlockPool() *BlockPool { return s.blockPool } -func (s *Ethereum) Eventer() *eventer.EventMachine { - return s.eventer +func (s *Ethereum) EventMux() *event.TypeMux { + return s.eventMux } func (self *Ethereum) Db() ethutil.Database { return self.db @@ -376,7 +368,7 @@ func (s *Ethereum) removePeerElement(e *list.Element) { s.peers.Remove(e) - s.reactor.Post("peerList", s.peers) + s.eventMux.Post(PeerListEvent{s.peers}) } func (s *Ethereum) RemovePeer(p *Peer) { @@ -400,7 +392,6 @@ func (s *Ethereum) reapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { - s.reactor.Start() s.blockPool.Start() s.stateManager.Start() @@ -524,8 +515,7 @@ func (s *Ethereum) Stop() { } s.txPool.Stop() s.stateManager.Stop() - s.reactor.Flush() - s.reactor.Stop() + s.eventMux.Stop() s.blockPool.Stop() ethlogger.Infoln("Server stopped") @@ -584,10 +574,10 @@ out: select { case <-upToDateTimer.C: if self.IsUpToDate() && !self.isUpToDate { - self.reactor.Post("chainSync", false) + self.eventMux.Post(ChainSyncEvent{false}) self.isUpToDate = true } else if !self.IsUpToDate() && self.isUpToDate { - self.reactor.Post("chainSync", true) + self.eventMux.Post(ChainSyncEvent{true}) self.isUpToDate = false } case <-self.quit: @@ -623,40 +613,30 @@ func (self *Ethereum) GetFilter(id int) *ethchain.Filter { } func (self *Ethereum) filterLoop() { - blockChan := make(chan ethreact.Event, 5) - messageChan := make(chan ethreact.Event, 5) // Subscribe to events - reactor := self.Reactor() - reactor.Subscribe("newBlock", blockChan) - reactor.Subscribe("messages", messageChan) -out: - for { - select { - case <-self.quit: - break out - case block := <-blockChan: - if block, ok := block.Resource.(*ethchain.Block); ok { - self.filterMu.RLock() - for _, filter := range self.filters { - if filter.BlockCallback != nil { - filter.BlockCallback(block) - } + events := self.eventMux.Subscribe(ethchain.NewBlockEvent{}, ethstate.Messages(nil)) + for event := range events.Chan() { + switch event := event.(type) { + case ethchain.NewBlockEvent: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.BlockCallback != nil { + filter.BlockCallback(event.Block) } - self.filterMu.RUnlock() } - case msg := <-messageChan: - if messages, ok := msg.Resource.(ethstate.Messages); ok { - self.filterMu.RLock() - for _, filter := range self.filters { - if filter.MessageCallback != nil { - msgs := filter.FilterMessages(messages) - if len(msgs) > 0 { - filter.MessageCallback(msgs) - } + self.filterMu.RUnlock() + + case ethstate.Messages: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.MessageCallback != nil { + msgs := filter.FilterMessages(event) + if len(msgs) > 0 { + filter.MessageCallback(msgs) } } - self.filterMu.RUnlock() } + self.filterMu.RUnlock() } } } -- cgit v1.2.3 From 20cdb73862c6ae5af10dbaceba34c5073148235d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 14 Oct 2014 02:01:46 +0200 Subject: ethchain: fix tests --- ethereum.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 750ca8f03..e5f73d507 100644 --- a/ethereum.go +++ b/ethereum.go @@ -59,7 +59,7 @@ type Ethereum struct { // The block pool blockPool *BlockPool // Eventer - eventMux *event.TypeMux + eventMux event.TypeMux // Peers peers *list.List // Nonce @@ -126,7 +126,6 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager isUpToDate: true, filters: make(map[int]*ethchain.Filter), } - ethereum.eventMux = event.NewTypeMux() ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = ethchain.NewTxPool(ethereum) @@ -162,7 +161,7 @@ func (s *Ethereum) BlockPool() *BlockPool { return s.blockPool } func (s *Ethereum) EventMux() *event.TypeMux { - return s.eventMux + return &s.eventMux } func (self *Ethereum) Db() ethutil.Database { return self.db -- cgit v1.2.3 From 097ba56df59293f9225a8ecdc9e1c43a5ad891bb Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 20 Oct 2014 11:53:11 +0200 Subject: Renamed block_chain to chain_manager --- ethereum.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index e5f73d507..bb8d6db73 100644 --- a/ethereum.go +++ b/ethereum.go @@ -55,7 +55,7 @@ type Ethereum struct { // for later including in the blocks txPool *ethchain.TxPool // The canonical chain - blockChain *ethchain.BlockChain + blockChain *ethchain.ChainManager // The block pool blockPool *BlockPool // Eventer @@ -129,7 +129,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = ethchain.NewTxPool(ethereum) - ethereum.blockChain = ethchain.NewBlockChain(ethereum) + ethereum.blockChain = ethchain.NewChainManager(ethereum) ethereum.stateManager = ethchain.NewStateManager(ethereum) // Start the tx pool @@ -146,7 +146,7 @@ func (s *Ethereum) ClientIdentity() ethwire.ClientIdentity { return s.clientIdentity } -func (s *Ethereum) BlockChain() *ethchain.BlockChain { +func (s *Ethereum) ChainManager() *ethchain.ChainManager { return s.blockChain } -- cgit v1.2.3 From 520fdfe346ab51708f4f1fdfd0b2e42cc919e613 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 21 Oct 2014 13:25:31 +0200 Subject: PoC7 Net --- ethereum.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index bb8d6db73..5209115da 100644 --- a/ethereum.go +++ b/ethereum.go @@ -17,16 +17,16 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethlog" - "github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" "github.com/ethereum/eth-go/event" + "github.com/ethereum/eth-go/rpc" ) const ( seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" - seedNodeAddress = "poc-6.ethdev.com:30303" + seedNodeAddress = "poc-7.ethdev.com:30303" ) var ethlogger = ethlog.NewLogger("SERV") @@ -84,7 +84,7 @@ type Ethereum struct { listening bool - RpcServer *ethrpc.JsonRpcServer + RpcServer *rpc.JsonRpcServer keyManager *ethcrypto.KeyManager -- cgit v1.2.3 From e252dbf989f8a8e08e3edcaf075febee315e53fd Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 29 Oct 2014 03:01:20 +0100 Subject: eth: stop eventMux first This fixes the hang in Ethereum.Stop. --- ethereum.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index c2d209597..a389c663d 100644 --- a/ethereum.go +++ b/ethereum.go @@ -490,6 +490,9 @@ func (s *Ethereum) peerHandler(listener net.Listener) { } func (s *Ethereum) Stop() { + // Stop eventMux first, it will close all subscriptions. + s.eventMux.Stop() + // Close the database defer s.db.Close() @@ -514,7 +517,6 @@ func (s *Ethereum) Stop() { } s.txPool.Stop() s.stateManager.Stop() - s.eventMux.Stop() s.blockPool.Stop() ethlogger.Infoln("Server stopped") -- cgit v1.2.3 From 3ee0461cb5b6e4a5e2d287180afbdb681805a662 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 10:59:17 +0100 Subject: Moved ethchain to chain --- ethereum.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a389c663d..489e88b8a 100644 --- a/ethereum.go +++ b/ethereum.go @@ -14,7 +14,7 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/ethchain" + "github.com/ethereum/go-ethereum/chain" "github.com/ethereum/go-ethereum/ethcrypto" "github.com/ethereum/go-ethereum/ethlog" "github.com/ethereum/go-ethereum/ethstate" @@ -50,12 +50,12 @@ type Ethereum struct { // DB interface db ethutil.Database // State manager for processing new blocks and managing the over all states - stateManager *ethchain.StateManager + stateManager *chain.StateManager // The transaction pool. Transaction can be pushed on this pool // for later including in the blocks - txPool *ethchain.TxPool + txPool *chain.TxPool // The canonical chain - blockChain *ethchain.ChainManager + blockChain *chain.ChainManager // The block pool blockPool *BlockPool // Eventer @@ -94,7 +94,7 @@ type Ethereum struct { filterMu sync.RWMutex filterId int - filters map[int]*ethchain.Filter + filters map[int]*chain.Filter } func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { @@ -124,13 +124,13 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager keyManager: keyManager, clientIdentity: clientIdentity, isUpToDate: true, - filters: make(map[int]*ethchain.Filter), + filters: make(map[int]*chain.Filter), } ethereum.blockPool = NewBlockPool(ethereum) - ethereum.txPool = ethchain.NewTxPool(ethereum) - ethereum.blockChain = ethchain.NewChainManager(ethereum) - ethereum.stateManager = ethchain.NewStateManager(ethereum) + ethereum.txPool = chain.NewTxPool(ethereum) + ethereum.blockChain = chain.NewChainManager(ethereum) + ethereum.stateManager = chain.NewStateManager(ethereum) // Start the tx pool ethereum.txPool.Start() @@ -146,15 +146,15 @@ func (s *Ethereum) ClientIdentity() ethwire.ClientIdentity { return s.clientIdentity } -func (s *Ethereum) ChainManager() *ethchain.ChainManager { +func (s *Ethereum) ChainManager() *chain.ChainManager { return s.blockChain } -func (s *Ethereum) StateManager() *ethchain.StateManager { +func (s *Ethereum) StateManager() *chain.StateManager { return s.stateManager } -func (s *Ethereum) TxPool() *ethchain.TxPool { +func (s *Ethereum) TxPool() *chain.TxPool { return s.txPool } func (s *Ethereum) BlockPool() *BlockPool { @@ -590,7 +590,7 @@ out: // InstallFilter adds filter for blockchain events. // The filter's callbacks will run for matching blocks and messages. // The filter should not be modified after it has been installed. -func (self *Ethereum) InstallFilter(filter *ethchain.Filter) (id int) { +func (self *Ethereum) InstallFilter(filter *chain.Filter) (id int) { self.filterMu.Lock() id = self.filterId self.filters[id] = filter @@ -607,7 +607,7 @@ func (self *Ethereum) UninstallFilter(id int) { // GetFilter retrieves a filter installed using InstallFilter. // The filter may not be modified. -func (self *Ethereum) GetFilter(id int) *ethchain.Filter { +func (self *Ethereum) GetFilter(id int) *chain.Filter { self.filterMu.RLock() defer self.filterMu.RUnlock() return self.filters[id] @@ -615,10 +615,10 @@ func (self *Ethereum) GetFilter(id int) *ethchain.Filter { func (self *Ethereum) filterLoop() { // Subscribe to events - events := self.eventMux.Subscribe(ethchain.NewBlockEvent{}, ethstate.Messages(nil)) + events := self.eventMux.Subscribe(chain.NewBlockEvent{}, ethstate.Messages(nil)) for event := range events.Chan() { switch event := event.(type) { - case ethchain.NewBlockEvent: + case chain.NewBlockEvent: self.filterMu.RLock() for _, filter := range self.filters { if filter.BlockCallback != nil { -- cgit v1.2.3 From fd9da72536b73351bbcdc1e9dbbbb8c0e4bfb21b Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 12:37:43 +0100 Subject: ethcrypto => crypto --- ethereum.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 489e88b8a..4f2ca85e8 100644 --- a/ethereum.go +++ b/ethereum.go @@ -15,7 +15,7 @@ import ( "time" "github.com/ethereum/go-ethereum/chain" - "github.com/ethereum/go-ethereum/ethcrypto" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethlog" "github.com/ethereum/go-ethereum/ethstate" "github.com/ethereum/go-ethereum/ethutil" @@ -86,7 +86,7 @@ type Ethereum struct { RpcServer *rpc.JsonRpcServer - keyManager *ethcrypto.KeyManager + keyManager *crypto.KeyManager clientIdentity ethwire.ClientIdentity @@ -97,7 +97,7 @@ type Ethereum struct { filters map[int]*chain.Filter } -func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *ethcrypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { +func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { var err error var nat NAT @@ -138,7 +138,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager return ethereum, nil } -func (s *Ethereum) KeyManager() *ethcrypto.KeyManager { +func (s *Ethereum) KeyManager() *crypto.KeyManager { return s.keyManager } -- cgit v1.2.3 From b1c247231b11f313ca0eedff75ea563926d23f68 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 12:56:05 +0100 Subject: ethlog => logger --- ethereum.go | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 4f2ca85e8..9b456ad7c 100644 --- a/ethereum.go +++ b/ethereum.go @@ -16,11 +16,11 @@ import ( "github.com/ethereum/go-ethereum/chain" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethlog" "github.com/ethereum/go-ethereum/ethstate" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/ethwire" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/rpc" ) @@ -29,7 +29,7 @@ const ( seedNodeAddress = "poc-7.ethdev.com:30303" ) -var ethlogger = ethlog.NewLogger("SERV") +var loggerger = logger.NewLogger("SERV") func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) { // Loop thru the peers and close them (if we had them) @@ -104,7 +104,7 @@ func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager if usePnp { nat, err = Discover() if err != nil { - ethlogger.Debugln("UPnP failed", err) + loggerger.Debugln("UPnP failed", err) } } @@ -217,7 +217,7 @@ func (s *Ethereum) AddPeer(conn net.Conn) { if s.peers.Len() < s.MaxPeers { peer.Start() } else { - ethlogger.Debugf("Max connected peers reached. Not adding incoming peer.") + loggerger.Debugf("Max connected peers reached. Not adding incoming peer.") } } } @@ -277,7 +277,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { if phost == chost { alreadyConnected = true - //ethlogger.Debugf("Peer %s already added.\n", chost) + //loggerger.Debugf("Peer %s already added.\n", chost) return } }) @@ -397,12 +397,12 @@ func (s *Ethereum) Start(seed bool) { // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) if err != nil { - ethlogger.Warnf("Port %s in use. Connection listening disabled. Acting as client", s.Port) + loggerger.Warnf("Port %s in use. Connection listening disabled. Acting as client", s.Port) s.listening = false } else { s.listening = true // Starting accepting connections - ethlogger.Infoln("Ready and accepting connections") + loggerger.Infoln("Ready and accepting connections") // Start the peer handler go s.peerHandler(ln) } @@ -419,7 +419,7 @@ func (s *Ethereum) Start(seed bool) { if seed { s.Seed() } - ethlogger.Infoln("Server started") + loggerger.Infoln("Server started") } func (s *Ethereum) Seed() { @@ -428,11 +428,11 @@ func (s *Ethereum) Seed() { ips := PastPeers() if len(ips) > 0 { for _, ip := range ips { - ethlogger.Infoln("Connecting to previous peer ", ip) + loggerger.Infoln("Connecting to previous peer ", ip) s.ConnectToPeer(ip) } } else { - ethlogger.Debugln("Retrieving seed nodes") + loggerger.Debugln("Retrieving seed nodes") // Eth-Go Bootstrapping ips, er := net.LookupIP("seed.bysh.me") @@ -440,7 +440,7 @@ func (s *Ethereum) Seed() { peers := []string{} for _, ip := range ips { node := fmt.Sprintf("%s:%d", ip.String(), 30303) - ethlogger.Debugln("Found DNS Go Peer:", node) + loggerger.Debugln("Found DNS Go Peer:", node) peers = append(peers, node) } s.ProcessPeerList(peers) @@ -460,11 +460,11 @@ func (s *Ethereum) Seed() { 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) + loggerger.Debugln("Found DNS Bootstrap Peer:", peer) peers = append(peers, peer) } } else { - ethlogger.Debugln("Couldn't resolve :", target) + loggerger.Debugln("Couldn't resolve :", target) } } // Connect to Peer list @@ -480,7 +480,7 @@ func (s *Ethereum) peerHandler(listener net.Listener) { for { conn, err := listener.Accept() if err != nil { - ethlogger.Debugln(err) + loggerger.Debugln(err) continue } @@ -519,7 +519,7 @@ func (s *Ethereum) Stop() { s.stateManager.Stop() s.blockPool.Stop() - ethlogger.Infoln("Server stopped") + loggerger.Infoln("Server stopped") close(s.shutdownChan) } @@ -541,13 +541,13 @@ out: var err error _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) if err != nil { - ethlogger.Debugln("can't add UPnP port mapping:", err) + loggerger.Debugln("can't add UPnP port mapping:", err) break out } if first && err == nil { _, err = s.nat.GetExternalAddress() if err != nil { - ethlogger.Debugln("UPnP can't get external address:", err) + loggerger.Debugln("UPnP can't get external address:", err) continue out } first = false @@ -561,9 +561,9 @@ out: timer.Stop() if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil { - ethlogger.Debugln("unable to remove UPnP port mapping:", err) + loggerger.Debugln("unable to remove UPnP port mapping:", err) } else { - ethlogger.Debugln("succesfully disestablished UPnP port mapping") + loggerger.Debugln("succesfully disestablished UPnP port mapping") } } -- cgit v1.2.3 From af8f5f0b69f1c359991d12c7708804fe8dd1f944 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 14:43:14 +0100 Subject: ethstate => state --- ethereum.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 9b456ad7c..d6f664349 100644 --- a/ethereum.go +++ b/ethereum.go @@ -16,12 +16,12 @@ import ( "github.com/ethereum/go-ethereum/chain" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethstate" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/ethwire" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/state" ) const ( @@ -615,7 +615,7 @@ func (self *Ethereum) GetFilter(id int) *chain.Filter { func (self *Ethereum) filterLoop() { // Subscribe to events - events := self.eventMux.Subscribe(chain.NewBlockEvent{}, ethstate.Messages(nil)) + events := self.eventMux.Subscribe(chain.NewBlockEvent{}, state.Messages(nil)) for event := range events.Chan() { switch event := event.(type) { case chain.NewBlockEvent: @@ -627,7 +627,7 @@ func (self *Ethereum) filterLoop() { } self.filterMu.RUnlock() - case ethstate.Messages: + case state.Messages: self.filterMu.RLock() for _, filter := range self.filters { if filter.MessageCallback != nil { -- cgit v1.2.3 From 4914a78c8c650d7fc74570f25a682598aaeb6973 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 14:53:42 +0100 Subject: ethwire => wire --- ethereum.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index d6f664349..d4abeed26 100644 --- a/ethereum.go +++ b/ethereum.go @@ -17,11 +17,11 @@ import ( "github.com/ethereum/go-ethereum/chain" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethutil" - "github.com/ethereum/go-ethereum/ethwire" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/wire" ) const ( @@ -88,7 +88,7 @@ type Ethereum struct { keyManager *crypto.KeyManager - clientIdentity ethwire.ClientIdentity + clientIdentity wire.ClientIdentity isUpToDate bool @@ -97,7 +97,7 @@ type Ethereum struct { filters map[int]*chain.Filter } -func New(db ethutil.Database, clientIdentity ethwire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { +func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { var err error var nat NAT @@ -142,7 +142,7 @@ func (s *Ethereum) KeyManager() *crypto.KeyManager { return s.keyManager } -func (s *Ethereum) ClientIdentity() ethwire.ClientIdentity { +func (s *Ethereum) ClientIdentity() wire.ClientIdentity { return s.clientIdentity } @@ -338,12 +338,12 @@ func (s *Ethereum) InOutPeers() []*Peer { return inboundPeers[:length] } -func (s *Ethereum) Broadcast(msgType ethwire.MsgType, data []interface{}) { - msg := ethwire.NewMessage(msgType, data) +func (s *Ethereum) Broadcast(msgType wire.MsgType, data []interface{}) { + msg := wire.NewMessage(msgType, data) s.BroadcastMsg(msg) } -func (s *Ethereum) BroadcastMsg(msg *ethwire.Msg) { +func (s *Ethereum) BroadcastMsg(msg *wire.Msg) { eachPeer(s.peers, func(p *Peer, e *list.Element) { p.QueueMessage(msg) }) -- cgit v1.2.3 From f59a3b67f69b26f969084e0de165435e80bd8e12 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 4 Nov 2014 10:57:02 +0100 Subject: StateManager => BlockManager --- ethereum.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index d4abeed26..54949d195 100644 --- a/ethereum.go +++ b/ethereum.go @@ -50,7 +50,7 @@ type Ethereum struct { // DB interface db ethutil.Database // State manager for processing new blocks and managing the over all states - stateManager *chain.StateManager + blockManager *chain.BlockManager // The transaction pool. Transaction can be pushed on this pool // for later including in the blocks txPool *chain.TxPool @@ -130,7 +130,7 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = chain.NewTxPool(ethereum) ethereum.blockChain = chain.NewChainManager(ethereum) - ethereum.stateManager = chain.NewStateManager(ethereum) + ethereum.blockManager = chain.NewBlockManager(ethereum) // Start the tx pool ethereum.txPool.Start() @@ -150,8 +150,8 @@ func (s *Ethereum) ChainManager() *chain.ChainManager { return s.blockChain } -func (s *Ethereum) StateManager() *chain.StateManager { - return s.stateManager +func (s *Ethereum) BlockManager() *chain.BlockManager { + return s.blockManager } func (s *Ethereum) TxPool() *chain.TxPool { @@ -392,7 +392,7 @@ func (s *Ethereum) reapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.blockPool.Start() - s.stateManager.Start() + s.blockManager.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) @@ -516,7 +516,7 @@ func (s *Ethereum) Stop() { s.RpcServer.Stop() } s.txPool.Stop() - s.stateManager.Stop() + s.blockManager.Stop() s.blockPool.Stop() loggerger.Infoln("Server stopped") -- cgit v1.2.3 From cbeebcd47da846e1b8990313f1ff1ffe7d0bf00f Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 10 Nov 2014 01:17:31 +0100 Subject: Fixed bloom, updated mining & block processing * Reverted back to process blocks in batches method * Bloom generation and lookup fix * Minor UI changed (mainly debug) --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 54949d195..a919c3191 100644 --- a/ethereum.go +++ b/ethereum.go @@ -419,6 +419,7 @@ func (s *Ethereum) Start(seed bool) { if seed { s.Seed() } + s.ConnectToPeer("localhost:40404") loggerger.Infoln("Server started") } @@ -471,7 +472,6 @@ func (s *Ethereum) Seed() { s.ProcessPeerList(peers) } - // XXX tmp s.ConnectToPeer(seedNodeAddress) } } -- cgit v1.2.3 From 20d518ee959f1621a5accf1f3432282a6c0d6c3c Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 13 Nov 2014 18:12:12 +0100 Subject: Numerous fixes for consensus. * Removed (buged) C++ specific gas specification for LOG* * Fixed LOG* where mstart went after msize * --- ethereum.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index a919c3191..ce8a92b58 100644 --- a/ethereum.go +++ b/ethereum.go @@ -233,7 +233,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error { if s.peers.Len() < s.MaxPeers { var alreadyConnected bool - ahost, _, _ := net.SplitHostPort(addr) + ahost, aport, _ := net.SplitHostPort(addr) var chost string ips, err := net.LookupIP(ahost) @@ -273,9 +273,9 @@ func (s *Ethereum) ConnectToPeer(addr string) error { if p.conn == nil { return } - phost, _, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) + phost, pport, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) - if phost == chost { + if phost == chost && pport == aport { alreadyConnected = true //loggerger.Debugf("Peer %s already added.\n", chost) return -- cgit v1.2.3 From a1b6a9ac29d0aa8d29a2c0535bafdb5fe4d4830b Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 18 Nov 2014 16:58:22 +0100 Subject: Begin of moving objects to types package * Block(s) * Transaction(s) --- ethereum.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index ce8a92b58..879a14bd5 100644 --- a/ethereum.go +++ b/ethereum.go @@ -129,8 +129,9 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = chain.NewTxPool(ethereum) - ethereum.blockChain = chain.NewChainManager(ethereum) + ethereum.blockChain = chain.NewChainManager() ethereum.blockManager = chain.NewBlockManager(ethereum) + ethereum.blockChain.SetProcessor(ethereum.blockManager) // Start the tx pool ethereum.txPool.Start() -- cgit v1.2.3 From 82405501872385b240012070bad2f0eda643d423 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 3 Dec 2014 14:05:19 +0100 Subject: updated to types --- ethereum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 879a14bd5..530d26fce 100644 --- a/ethereum.go +++ b/ethereum.go @@ -129,7 +129,7 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr ethereum.blockPool = NewBlockPool(ethereum) ethereum.txPool = chain.NewTxPool(ethereum) - ethereum.blockChain = chain.NewChainManager() + ethereum.blockChain = chain.NewChainManager(ethereum.EventMux()) ethereum.blockManager = chain.NewBlockManager(ethereum) ethereum.blockChain.SetProcessor(ethereum.blockManager) -- cgit v1.2.3 From 9008b155d3c8d2a32c4c8945f1174243d48d4e90 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 4 Dec 2014 10:28:02 +0100 Subject: Renamed `chain` => `core` --- ethereum.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 530d26fce..94e46b556 100644 --- a/ethereum.go +++ b/ethereum.go @@ -14,7 +14,7 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/chain" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/event" @@ -50,12 +50,12 @@ type Ethereum struct { // DB interface db ethutil.Database // State manager for processing new blocks and managing the over all states - blockManager *chain.BlockManager + blockManager *core.BlockManager // The transaction pool. Transaction can be pushed on this pool // for later including in the blocks - txPool *chain.TxPool + txPool *core.TxPool // The canonical chain - blockChain *chain.ChainManager + blockChain *core.ChainManager // The block pool blockPool *BlockPool // Eventer @@ -94,7 +94,7 @@ type Ethereum struct { filterMu sync.RWMutex filterId int - filters map[int]*chain.Filter + filters map[int]*core.Filter } func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { @@ -124,13 +124,13 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr keyManager: keyManager, clientIdentity: clientIdentity, isUpToDate: true, - filters: make(map[int]*chain.Filter), + filters: make(map[int]*core.Filter), } ethereum.blockPool = NewBlockPool(ethereum) - ethereum.txPool = chain.NewTxPool(ethereum) - ethereum.blockChain = chain.NewChainManager(ethereum.EventMux()) - ethereum.blockManager = chain.NewBlockManager(ethereum) + ethereum.txPool = core.NewTxPool(ethereum) + ethereum.blockChain = core.NewChainManager(ethereum.EventMux()) + ethereum.blockManager = core.NewBlockManager(ethereum) ethereum.blockChain.SetProcessor(ethereum.blockManager) // Start the tx pool @@ -147,15 +147,15 @@ func (s *Ethereum) ClientIdentity() wire.ClientIdentity { return s.clientIdentity } -func (s *Ethereum) ChainManager() *chain.ChainManager { +func (s *Ethereum) ChainManager() *core.ChainManager { return s.blockChain } -func (s *Ethereum) BlockManager() *chain.BlockManager { +func (s *Ethereum) BlockManager() *core.BlockManager { return s.blockManager } -func (s *Ethereum) TxPool() *chain.TxPool { +func (s *Ethereum) TxPool() *core.TxPool { return s.txPool } func (s *Ethereum) BlockPool() *BlockPool { @@ -591,7 +591,7 @@ out: // InstallFilter adds filter for blockchain events. // The filter's callbacks will run for matching blocks and messages. // The filter should not be modified after it has been installed. -func (self *Ethereum) InstallFilter(filter *chain.Filter) (id int) { +func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) { self.filterMu.Lock() id = self.filterId self.filters[id] = filter @@ -608,7 +608,7 @@ func (self *Ethereum) UninstallFilter(id int) { // GetFilter retrieves a filter installed using InstallFilter. // The filter may not be modified. -func (self *Ethereum) GetFilter(id int) *chain.Filter { +func (self *Ethereum) GetFilter(id int) *core.Filter { self.filterMu.RLock() defer self.filterMu.RUnlock() return self.filters[id] @@ -616,10 +616,10 @@ func (self *Ethereum) GetFilter(id int) *chain.Filter { func (self *Ethereum) filterLoop() { // Subscribe to events - events := self.eventMux.Subscribe(chain.NewBlockEvent{}, state.Messages(nil)) + events := self.eventMux.Subscribe(core.NewBlockEvent{}, state.Messages(nil)) for event := range events.Chan() { switch event := event.(type) { - case chain.NewBlockEvent: + case core.NewBlockEvent: self.filterMu.RLock() for _, filter := range self.filters { if filter.BlockCallback != nil { -- cgit v1.2.3 From af6afbaa56efa15abe6a03665c6674b0e2f591c8 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 10 Dec 2014 16:48:39 +0100 Subject: Removed start/stop methods --- ethereum.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index 94e46b556..e8b1a9500 100644 --- a/ethereum.go +++ b/ethereum.go @@ -393,7 +393,6 @@ func (s *Ethereum) reapDeadPeerHandler() { // Start the ethereum func (s *Ethereum) Start(seed bool) { s.blockPool.Start() - s.blockManager.Start() // Bind to addr and port ln, err := net.Listen("tcp", ":"+s.Port) @@ -517,7 +516,6 @@ func (s *Ethereum) Stop() { s.RpcServer.Stop() } s.txPool.Stop() - s.blockManager.Stop() s.blockPool.Stop() loggerger.Infoln("Server stopped") -- cgit v1.2.3 From 49e0267fe76cfd13eaf3e5e26caa637b93dbdd29 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 18 Dec 2014 13:12:54 +0100 Subject: Locks, refactor, tests * Added additional chain tests * Added proper mutex' on chain * Removed ethereum dependencies --- ethereum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ethereum.go') diff --git a/ethereum.go b/ethereum.go index e8b1a9500..5d74e28e9 100644 --- a/ethereum.go +++ b/ethereum.go @@ -128,9 +128,9 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr } ethereum.blockPool = NewBlockPool(ethereum) - ethereum.txPool = core.NewTxPool(ethereum) ethereum.blockChain = core.NewChainManager(ethereum.EventMux()) - ethereum.blockManager = core.NewBlockManager(ethereum) + ethereum.txPool = core.NewTxPool(ethereum.blockChain, ethereum, ethereum.EventMux()) + ethereum.blockManager = core.NewBlockManager(ethereum.txPool, ethereum.blockChain, ethereum.EventMux()) ethereum.blockChain.SetProcessor(ethereum.blockManager) // Start the tx pool -- cgit v1.2.3