From e09c870f7fa4f9076514e21bddb94f6b56135e74 Mon Sep 17 00:00:00 2001 From: Steven Jack Date: Sat, 3 Mar 2018 07:16:05 +0000 Subject: [PATCH 1/2] Fix bug where channel for peers events is called after it's closed (#34) * Disconnect once go routines signal so * Send msg if cmd is other than cmdUnknown * Remove typo * Fix lock file * Updates README * Comment typo * Fix issue * Revert old changes * Handle error --- Makefile | 7 ++++++- README.md | 10 ++++++++-- pkg/network/message.go | 23 +++++++++++++++++++---- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 8171d1195..7cc8e0666 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ BRANCH = "master" VERSION = $(shell cat ./VERSION) +SEEDS ?= "127.0.0.1:20333" +PORT ?= "3000" build: @go build -o ./bin/neo-go ./cli/main.go @@ -16,8 +18,11 @@ push-tag: git tag ${VERSION} git push origin ${BRANCH} --tags +run: build + ./bin/neo-go node -seed ${SEEDS} -tcp ${PORT} + test: @go test ./... -cover vet: - @go vet ./... \ No newline at end of file + @go vet ./... diff --git a/README.md b/README.md index 813dd8a2f..97e958a0c 100644 --- a/README.md +++ b/README.md @@ -75,18 +75,24 @@ If you dont, take a look at [docker-privnet-with-gas](https://hub.docker.com/r/m Start a NEO node: ``` -./bin/neo-go node -seed 127.0.0.1:20333 +make run ``` You can add multiple seeds if you want: ``` -./bin/neo-go node -seed 127.0.0.1:20333,127.0.01:20334 +make run -e SEEDS="127.0.0.1:20333,127.0.01:20334" ``` By default the server will currently run on port 3000, for testing purposes. You can change that by setting the tcp flag: +``` +make run -e PORT="1337" +``` + +To run the binary directly: + ``` ./bin/neo-go node -seed 127.0.0.1:20333 -tcp 1337 ``` diff --git a/pkg/network/message.go b/pkg/network/message.go index 06fb6e87c..ae484f58a 100644 --- a/pkg/network/message.go +++ b/pkg/network/message.go @@ -141,10 +141,25 @@ func (m *Message) commandType() commandType { // decode a Message from the given reader. func (m *Message) decode(r io.Reader) error { - binary.Read(r, binary.LittleEndian, &m.Magic) - binary.Read(r, binary.LittleEndian, &m.Command) - binary.Read(r, binary.LittleEndian, &m.Length) - binary.Read(r, binary.LittleEndian, &m.Checksum) + err := binary.Read(r, binary.LittleEndian, &m.Magic) + if err != nil { + return err + } + + err = binary.Read(r, binary.LittleEndian, &m.Command) + if err != nil { + return err + } + + err = binary.Read(r, binary.LittleEndian, &m.Length) + if err != nil { + return err + } + + err = binary.Read(r, binary.LittleEndian, &m.Checksum) + if err != nil { + return err + } // return if their is no payload. if m.Length == 0 { From 42195b1af401456a55f77417d0e13da3e718b34d Mon Sep 17 00:00:00 2001 From: Steven Jack Date: Sun, 4 Mar 2018 13:47:56 +0000 Subject: [PATCH 2/2] Refactor peer message sending into single interface method .Send() (#40) * Adds Send method to Peer interface and removes redundant methods * Fix imports * Bumps version --- VERSION | 2 +- pkg/network/peer.go | 44 ++++++++---------------- pkg/network/server.go | 18 +++++----- pkg/network/tcp.go | 63 +++-------------------------------- pkg/wallet/account.go | 2 +- pkg/wallet/transfer_output.go | 2 +- 6 files changed, 30 insertions(+), 101 deletions(-) diff --git a/VERSION b/VERSION index 885415662..ca222b7cf 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.21.0 +0.23.0 diff --git a/pkg/network/peer.go b/pkg/network/peer.go index c2aa0e913..f492d565c 100644 --- a/pkg/network/peer.go +++ b/pkg/network/peer.go @@ -11,13 +11,8 @@ type Peer interface { id() uint32 addr() util.Endpoint disconnect() + Send(*Message) error version() *payload.Version - callVersion(*Message) error - callGetaddr(*Message) error - callVerack(*Message) error - callGetdata(*Message) error - callGetblocks(*Message) error - callGetheaders(*Message) error } // LocalPeer is the simplest kind of peer, mapped to a server in the @@ -35,36 +30,23 @@ func NewLocalPeer(s *Server) *LocalPeer { return &LocalPeer{endpoint: e, s: s} } +func (p *LocalPeer) Send(msg *Message) error { + switch msg.commandType() { + case cmdVersion: + version := msg.Payload.(*payload.Version) + return p.s.handleVersionCmd(version, p) + case cmdGetAddr: + return p.s.handleGetaddrCmd(msg, p) + default: + return nil + } +} + // Version implements the Peer interface. func (p *LocalPeer) version() *payload.Version { return p.pVersion } -func (p *LocalPeer) callVersion(msg *Message) error { - version := msg.Payload.(*payload.Version) - return p.s.handleVersionCmd(version, p) -} - -func (p *LocalPeer) callVerack(msg *Message) error { - return nil -} - -func (p *LocalPeer) callGetaddr(msg *Message) error { - return p.s.handleGetaddrCmd(msg, p) -} - -func (p *LocalPeer) callGetblocks(msg *Message) error { - return nil -} - -func (p *LocalPeer) callGetheaders(msg *Message) error { - return nil -} - -func (p *LocalPeer) callGetdata(msg *Message) error { - return nil -} - func (p *LocalPeer) id() uint32 { return p.nonce } func (p *LocalPeer) addr() util.Endpoint { return p.endpoint } func (p *LocalPeer) disconnect() {} diff --git a/pkg/network/server.go b/pkg/network/server.go index f7dfa93da..af9986d1d 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -209,7 +209,7 @@ func (s *Server) handlePeerConnected(p Peer) error { // TODO: get the blockheight of this server once core implemented this. payload := payload.NewVersion(s.id, s.port, s.userAgent, s.bc.HeaderHeight(), s.relay) msg := newMessage(s.net, cmdVersion, payload) - return p.callVersion(msg) + return p.Send(msg) } func (s *Server) handleVersionCmd(version *payload.Version, p Peer) error { @@ -220,7 +220,9 @@ func (s *Server) handleVersionCmd(version *payload.Version, p Peer) error { return fmt.Errorf("port mismatch: %d and %d", version.Port, p.addr().Port) } - return p.callVerack(newMessage(s.net, cmdVerack, nil)) + return p.Send( + newMessage(s.net, cmdVerack, nil), + ) } func (s *Server) handleGetaddrCmd(msg *Message, p Peer) error { @@ -242,7 +244,7 @@ func (s *Server) handleInvCmd(inv *payload.Inventory, p Peer) error { payload := payload.NewInventory(inv.Type, inv.Hashes) resp := newMessage(s.net, cmdGetData, payload) - return p.callGetdata(resp) + return p.Send(resp) } // handleBlockCmd processes the received block. @@ -297,7 +299,7 @@ func (s *Server) askMoreHeaders(p Peer) error { payload := payload.NewGetBlocks(start, util.Uint256{}) msg := newMessage(s.net, cmdGetHeaders, payload) - return p.callGetheaders(msg) + return p.Send(msg) } // check if the addr is already connected to the server. @@ -318,7 +320,7 @@ func (s *Server) startProtocol(p Peer) { } for { getaddrMsg := newMessage(s.net, cmdGetAddr, nil) - p.callGetaddr(getaddrMsg) + p.Send(getaddrMsg) time.Sleep(30 * time.Second) } @@ -351,10 +353,10 @@ type StartOpts struct { func logo() string { return ` - _ ____________ __________ + _ ____________ __________ / | / / ____/ __ \ / ____/ __ \ / |/ / __/ / / / /_____/ / __/ / / / - / /| / /___/ /_/ /_____/ /_/ / /_/ / -/_/ |_/_____/\____/ \____/\____/ + / /| / /___/ /_/ /_____/ /_/ / /_/ / +/_/ |_/_____/\____/ \____/\____/ ` } diff --git a/pkg/network/tcp.go b/pkg/network/tcp.go index 9f54de4e3..80c836585 100644 --- a/pkg/network/tcp.go +++ b/pkg/network/tcp.go @@ -181,7 +181,10 @@ func NewTCPPeer(conn net.Conn, s *Server) *TCPPeer { } } -func (p *TCPPeer) callVersion(msg *Message) error { +// Send needed to implement the network.Peer interface +// and provide the functionality to send a message to +// the current peer. +func (p *TCPPeer) Send(msg *Message) error { t := sendTuple{ msg: msg, err: make(chan error), @@ -206,64 +209,6 @@ func (p *TCPPeer) addr() util.Endpoint { return p.endpoint } -// callGetaddr will send the "getaddr" command to the remote. -func (p *TCPPeer) callGetaddr(msg *Message) error { - t := sendTuple{ - msg: msg, - err: make(chan error), - } - - p.send <- t - - return <-t.err -} - -// callGetblocks will send the "getblocks" command to the remote. -func (p *TCPPeer) callGetblocks(msg *Message) error { - t := sendTuple{ - msg: msg, - err: make(chan error), - } - - p.send <- t - - return <-t.err -} - -// callGetheaders will send the "getheaders" command to the remote. -func (p *TCPPeer) callGetheaders(msg *Message) error { - t := sendTuple{ - msg: msg, - err: make(chan error), - } - - p.send <- t - - return <-t.err -} - -func (p *TCPPeer) callVerack(msg *Message) error { - t := sendTuple{ - msg: msg, - err: make(chan error), - } - - p.send <- t - - return <-t.err -} - -func (p *TCPPeer) callGetdata(msg *Message) error { - t := sendTuple{ - msg: msg, - err: make(chan error), - } - - p.send <- t - - return <-t.err -} - // disconnect disconnects the peer, cleaning up all its resources. // 3 goroutines needs to be cleanup (writeLoop, handleConnection and handleMessage) func (p *TCPPeer) disconnect() { diff --git a/pkg/wallet/account.go b/pkg/wallet/account.go index 1c4ca3a73..8d35c6320 100644 --- a/pkg/wallet/account.go +++ b/pkg/wallet/account.go @@ -1,6 +1,6 @@ package wallet -import "github.com/anthdm/neo-go/pkg/util" +import "github.com/CityOfZion/neo-go/pkg/util" // Account represents a NEO account. It holds the private and public key // along with some metadata. diff --git a/pkg/wallet/transfer_output.go b/pkg/wallet/transfer_output.go index a6de5be14..0e463f0ce 100644 --- a/pkg/wallet/transfer_output.go +++ b/pkg/wallet/transfer_output.go @@ -3,7 +3,7 @@ package wallet import ( "math/big" - "github.com/anthdm/neo-go/pkg/util" + "github.com/CityOfZion/neo-go/pkg/util" ) // TransferOutput respresents the output of a transaction.