diff --git a/eth/protocol.go b/eth/protocol.go index 621f22c1b4..056380b04c 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -3,6 +3,7 @@ package eth import ( "bytes" "fmt" + "io" "math/big" "github.com/ethereum/go-ethereum/core/types" @@ -139,11 +140,11 @@ func (self *ethProtocol) handle() error { self.txPool.AddTransactions(txs) case GetBlockHashesMsg: - var request [1]getBlockHashesMsgData + var request getBlockHashesMsgData if err := msg.Decode(&request); err != nil { return self.protoError(ErrDecode, "->msg %v: %v", msg, err) } - hashes := self.chainManager.GetBlockHashesFromHash(request[0].Hash, request[0].Amount) + hashes := self.chainManager.GetBlockHashesFromHash(request.Hash, request.Amount) protologger.Debugf("hashes length %v", len(hashes)) return self.rw.EncodeMsg(BlockHashesMsg, ethutil.ByteSliceToInterface(hashes)...) @@ -151,7 +152,6 @@ func (self *ethProtocol) handle() error { // TODO: redo using lazy decode , this way very inefficient on known chains protologger.Debugf("payload size %v", msg.Size) msgStream := rlp.NewStream(msg.Payload) - msgStream.List() var err error var i int @@ -161,7 +161,7 @@ func (self *ethProtocol) handle() error { i++ ok = true } else { - if err != rlp.EOL { + if err != io.EOF { self.protoError(ErrDecode, "msg %v: after %v hashes : %v", msg, i, err) } } @@ -172,14 +172,13 @@ func (self *ethProtocol) handle() error { case GetBlocksMsg: msgStream := rlp.NewStream(msg.Payload) - msgStream.List() var blocks []interface{} var i int for { i++ var hash []byte if err := msgStream.Decode(&hash); err != nil { - if err == rlp.EOL { + if err == io.EOF { break } else { return self.protoError(ErrDecode, "msg %v: %v", msg, err) @@ -197,11 +196,10 @@ func (self *ethProtocol) handle() error { case BlocksMsg: msgStream := rlp.NewStream(msg.Payload) - msgStream.List() for { var block types.Block if err := msgStream.Decode(&block); err != nil { - if err == rlp.EOL { + if err == io.EOF { break } else { return self.protoError(ErrDecode, "msg %v: %v", msg, err) @@ -211,15 +209,15 @@ func (self *ethProtocol) handle() error { } case NewBlockMsg: - var request [1]newBlockMsgData + var request newBlockMsgData if err := msg.Decode(&request); err != nil { return self.protoError(ErrDecode, "msg %v: %v", msg, err) } - hash := request[0].Block.Hash() + hash := request.Block.Hash() // to simplify backend interface adding a new block // uses AddPeer followed by AddHashes, AddBlock only if peer is the best peer // (or selected as new best peer) - if self.blockPool.AddPeer(request[0].TD, hash, self.id, self.requestBlockHashes, self.requestBlocks, self.protoErrorDisconnect) { + if self.blockPool.AddPeer(request.TD, hash, self.id, self.requestBlockHashes, self.requestBlocks, self.protoErrorDisconnect) { called := true iter := func() (hash []byte, ok bool) { if called { @@ -230,7 +228,7 @@ func (self *ethProtocol) handle() error { } } self.blockPool.AddBlockHashes(iter, self.id) - self.blockPool.AddBlock(request[0].Block, self.id) + self.blockPool.AddBlock(request.Block, self.id) } default: diff --git a/eth/protocol_test.go b/eth/protocol_test.go index 81926322d8..d5c2bad467 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -42,7 +42,7 @@ func (self *testMsgReadWriter) WriteMsg(msg p2p.Msg) error { } func (self *testMsgReadWriter) EncodeMsg(code uint64, data ...interface{}) error { - return self.WriteMsg(p2p.NewMsg(code, data)) + return self.WriteMsg(p2p.NewMsg(code, data...)) } func (self *testMsgReadWriter) ReadMsg() (p2p.Msg, error) { diff --git a/p2p/peer.go b/p2p/peer.go index f00d7cbc4b..72e225c244 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -46,7 +46,7 @@ func (d peerAddr) String() string { } func (d *peerAddr) RlpData() interface{} { - return []interface{}{d.IP, d.Port, d.Pubkey} + return []interface{}{string(d.IP), d.Port, d.Pubkey} } // Peer represents a remote peer. @@ -426,7 +426,7 @@ func (rw *proto) WriteMsg(msg Msg) error { } func (rw *proto) EncodeMsg(code uint64, data ...interface{}) error { - return rw.WriteMsg(NewMsg(code, data)) + return rw.WriteMsg(NewMsg(code, data...)) } func (rw *proto) ReadMsg() (Msg, error) { @@ -463,7 +463,6 @@ func (r *eofSignal) Read(buf []byte) (int, error) { func (peer *Peer) PeerList() []interface{} { peers := peer.otherPeers() - fmt.Printf("address length: %v\n", len(peers)) ds := make([]interface{}, 0, len(peers)) for _, p := range peers { p.infolock.Lock() @@ -482,6 +481,5 @@ func (peer *Peer) PeerList() []interface{} { // if ourAddr != nil && !ourAddr.IP.IsLoopback() && !ourAddr.IP.IsUnspecified() { ds = append(ds, ourAddr) } - fmt.Printf("address length: %v\n", len(ds)) return ds } diff --git a/p2p/peer_test.go b/p2p/peer_test.go index f7759786ef..ecf7146609 100644 --- a/p2p/peer_test.go +++ b/p2p/peer_test.go @@ -130,7 +130,7 @@ func TestPeerProtoEncodeMsg(t *testing.T) { if err := rw.EncodeMsg(2); err == nil { t.Error("expected error for out-of-range msg code, got nil") } - if err := rw.EncodeMsg(1); err != nil { + if err := rw.EncodeMsg(1, "foo", "bar"); err != nil { t.Errorf("write error: %v", err) } return nil @@ -148,6 +148,13 @@ func TestPeerProtoEncodeMsg(t *testing.T) { if msg.Code != 17 { t.Errorf("incorrect message code: got %d, expected %d", msg.Code, 17) } + var data []string + if err := msg.Decode(&data); err != nil { + t.Errorf("payload decode error: %v", err) + } + if !reflect.DeepEqual(data, []string{"foo", "bar"}) { + t.Errorf("payload RLP mismatch, got %#v, want %#v", data, []string{"foo", "bar"}) + } } func TestPeerWrite(t *testing.T) { diff --git a/p2p/protocol.go b/p2p/protocol.go index 381f09dfc5..dd8cbc4ecd 100644 --- a/p2p/protocol.go +++ b/p2p/protocol.go @@ -2,7 +2,6 @@ package p2p import ( "bytes" - "fmt" "time" ) @@ -171,8 +170,6 @@ func (bp *baseProtocol) handle(rw MsgReadWriter) error { case getPeersMsg: peers := bp.peer.PeerList() - fmt.Printf("get Peers Msg: peers length:%v\n", len(peers)) - // this is dangerous. the spec says that we should _delay_ // sending the response if no new information is available. // this means that would need to send a response later when @@ -186,7 +183,7 @@ func (bp *baseProtocol) handle(rw MsgReadWriter) error { case peersMsg: var peers []*peerAddr if err := msg.Decode(&peers); err != nil { - return newPeerError(errInvalidMsg, "msg %v : %v", msg, err) + return err } for _, addr := range peers { bp.peer.Debugf("received peer suggestion: %v", addr)