Skip to content

Commit 59b63ca

Browse files
committed
p2p: API cleanup and PoC 7 compatibility
Whoa, one more big commit. I didn't manage to untangle the changes while working towards compatibility.
1 parent e4a601c commit 59b63ca

17 files changed

+1665
-1902
lines changed

p2p/client_identity.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import (
55
"runtime"
66
)
77

8-
// should be used in Peer handleHandshake, incorporate Caps, ProtocolVersion, Pubkey etc.
8+
// ClientIdentity represents the identity of a peer.
99
type ClientIdentity interface {
10-
String() string
11-
Pubkey() []byte
10+
String() string // human readable identity
11+
Pubkey() []byte // 512-bit public key
1212
}
1313

1414
type SimpleClientIdentity struct {

p2p/message.go

+53-9
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
"github.com/ethereum/go-ethereum/ethutil"
1212
)
1313

14-
type MsgCode uint64
15-
1614
// Msg defines the structure of a p2p message.
1715
//
1816
// Note that a Msg can only be sent once since the Payload reader is
@@ -21,13 +19,13 @@ type MsgCode uint64
2119
// structure, encode the payload into a byte array and create a
2220
// separate Msg with a bytes.Reader as Payload for each send.
2321
type Msg struct {
24-
Code MsgCode
22+
Code uint64
2523
Size uint32 // size of the paylod
2624
Payload io.Reader
2725
}
2826

2927
// NewMsg creates an RLP-encoded message with the given code.
30-
func NewMsg(code MsgCode, params ...interface{}) Msg {
28+
func NewMsg(code uint64, params ...interface{}) Msg {
3129
buf := new(bytes.Buffer)
3230
for _, p := range params {
3331
buf.Write(ethutil.Encode(p))
@@ -63,6 +61,52 @@ func (msg Msg) Discard() error {
6361
return err
6462
}
6563

64+
type MsgReader interface {
65+
ReadMsg() (Msg, error)
66+
}
67+
68+
type MsgWriter interface {
69+
// WriteMsg sends an existing message.
70+
// The Payload reader of the message is consumed.
71+
// Note that messages can be sent only once.
72+
WriteMsg(Msg) error
73+
74+
// EncodeMsg writes an RLP-encoded message with the given
75+
// code and data elements.
76+
EncodeMsg(code uint64, data ...interface{}) error
77+
}
78+
79+
// MsgReadWriter provides reading and writing of encoded messages.
80+
type MsgReadWriter interface {
81+
MsgReader
82+
MsgWriter
83+
}
84+
85+
// MsgLoop reads messages off the given reader and
86+
// calls the handler function for each decoded message until
87+
// it returns an error or the peer connection is closed.
88+
//
89+
// If a message is larger than the given maximum size,
90+
// MsgLoop returns an appropriate error.
91+
func MsgLoop(r MsgReader, maxsize uint32, f func(code uint64, data *ethutil.Value) error) error {
92+
for {
93+
msg, err := r.ReadMsg()
94+
if err != nil {
95+
return err
96+
}
97+
if msg.Size > maxsize {
98+
return newPeerError(errInvalidMsg, "size %d exceeds maximum size of %d", msg.Size, maxsize)
99+
}
100+
value, err := msg.Data()
101+
if err != nil {
102+
return err
103+
}
104+
if err := f(msg.Code, value); err != nil {
105+
return err
106+
}
107+
}
108+
}
109+
66110
var magicToken = []byte{34, 64, 8, 145}
67111

68112
func writeMsg(w io.Writer, msg Msg) error {
@@ -103,10 +147,10 @@ func readMsg(r byteReader) (msg Msg, err error) {
103147
// read magic and payload size
104148
start := make([]byte, 8)
105149
if _, err = io.ReadFull(r, start); err != nil {
106-
return msg, NewPeerError(ReadError, "%v", err)
150+
return msg, newPeerError(errRead, "%v", err)
107151
}
108152
if !bytes.HasPrefix(start, magicToken) {
109-
return msg, NewPeerError(MagicTokenMismatch, "got %x, want %x", start[:4], magicToken)
153+
return msg, newPeerError(errMagicTokenMismatch, "got %x, want %x", start[:4], magicToken)
110154
}
111155
size := binary.BigEndian.Uint32(start[4:])
112156

@@ -152,13 +196,13 @@ func readListHeader(r byteReader) (len uint64, hdrlen uint32, err error) {
152196
}
153197

154198
// readUint reads an RLP-encoded unsigned integer from r.
155-
func readMsgCode(r byteReader) (code MsgCode, codelen uint32, err error) {
199+
func readMsgCode(r byteReader) (code uint64, codelen uint32, err error) {
156200
b, err := r.ReadByte()
157201
if err != nil {
158202
return 0, 0, err
159203
}
160204
if b < 0x80 {
161-
return MsgCode(b), 1, nil
205+
return uint64(b), 1, nil
162206
} else if b < 0x89 { // max length for uint64 is 8 bytes
163207
codelen = uint32(b - 0x80)
164208
if codelen == 0 {
@@ -168,7 +212,7 @@ func readMsgCode(r byteReader) (code MsgCode, codelen uint32, err error) {
168212
if _, err := io.ReadFull(r, buf[8-codelen:]); err != nil {
169213
return 0, 0, err
170214
}
171-
return MsgCode(binary.BigEndian.Uint64(buf)), codelen, nil
215+
return binary.BigEndian.Uint64(buf), codelen, nil
172216
}
173217
return 0, 0, fmt.Errorf("bad RLP type for message code: %x", b)
174218
}

p2p/messenger.go

-221
This file was deleted.

0 commit comments

Comments
 (0)