good morning!!!!
Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
B
bor
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Harbor Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
open
bor
Commits
c1fca725
Commit
c1fca725
authored
Nov 24, 2014
by
Felix Lange
Browse files
Options
Downloads
Patches
Plain Diff
p2p: use package rlp
parent
205af02a
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
p2p/message.go
+27
-66
27 additions, 66 deletions
p2p/message.go
p2p/message_test.go
+3
-0
3 additions, 0 deletions
p2p/message_test.go
p2p/peer_test.go
+1
-1
1 addition, 1 deletion
p2p/peer_test.go
with
31 additions
and
67 deletions
p2p/message.go
+
27
−
66
View file @
c1fca725
...
@@ -3,12 +3,12 @@ package p2p
...
@@ -3,12 +3,12 @@ package p2p
import
(
import
(
"bytes"
"bytes"
"encoding/binary"
"encoding/binary"
"fmt"
"io"
"io"
"io/ioutil"
"io/ioutil"
"math/big"
"math/big"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/rlp"
)
)
// Msg defines the structure of a p2p message.
// Msg defines the structure of a p2p message.
...
@@ -43,16 +43,10 @@ func encodePayload(params ...interface{}) []byte {
...
@@ -43,16 +43,10 @@ func encodePayload(params ...interface{}) []byte {
// Data returns the decoded RLP payload items in a message.
// Data returns the decoded RLP payload items in a message.
func
(
msg
Msg
)
Data
()
(
*
ethutil
.
Value
,
error
)
{
func
(
msg
Msg
)
Data
()
(
*
ethutil
.
Value
,
error
)
{
// TODO: avoid copying when we have a better RLP decoder
s
:=
rlp
.
NewListStream
(
msg
.
Payload
,
uint64
(
msg
.
Size
))
buf
:=
new
(
bytes
.
Buffer
)
var
v
[]
interface
{}
var
s
[]
interface
{}
err
:=
s
.
Decode
(
&
v
)
if
_
,
err
:=
buf
.
ReadFrom
(
msg
.
Payload
);
err
!=
nil
{
return
ethutil
.
NewValue
(
v
),
err
return
nil
,
err
}
for
buf
.
Len
()
>
0
{
s
=
append
(
s
,
ethutil
.
DecodeWithReader
(
buf
))
}
return
ethutil
.
NewValue
(
s
),
nil
}
}
// Discard reads any remaining payload data into a black hole.
// Discard reads any remaining payload data into a black hole.
...
@@ -137,13 +131,9 @@ func makeListHeader(length uint32) []byte {
...
@@ -137,13 +131,9 @@ func makeListHeader(length uint32) []byte {
return
append
([]
byte
{
lenb
},
enc
...
)
return
append
([]
byte
{
lenb
},
enc
...
)
}
}
type
byteReader
interface
{
io
.
Reader
io
.
ByteReader
}
// readMsg reads a message header from r.
// readMsg reads a message header from r.
func
readMsg
(
r
byteReader
)
(
msg
Msg
,
err
error
)
{
// It takes an rlp.ByteReader to ensure that the decoding doesn't buffer.
func
readMsg
(
r
rlp
.
ByteReader
)
(
msg
Msg
,
err
error
)
{
// read magic and payload size
// read magic and payload size
start
:=
make
([]
byte
,
8
)
start
:=
make
([]
byte
,
8
)
if
_
,
err
=
io
.
ReadFull
(
r
,
start
);
err
!=
nil
{
if
_
,
err
=
io
.
ReadFull
(
r
,
start
);
err
!=
nil
{
...
@@ -155,64 +145,35 @@ func readMsg(r byteReader) (msg Msg, err error) {
...
@@ -155,64 +145,35 @@ func readMsg(r byteReader) (msg Msg, err error) {
size
:=
binary
.
BigEndian
.
Uint32
(
start
[
4
:
])
size
:=
binary
.
BigEndian
.
Uint32
(
start
[
4
:
])
// decode start of RLP message to get the message code
// decode start of RLP message to get the message code
_
,
hdrlen
,
err
:=
readListHeader
(
r
)
posr
:=
&
postrack
{
r
,
0
}
if
err
!=
nil
{
s
:=
rlp
.
NewStream
(
posr
)
if
_
,
err
:=
s
.
List
();
err
!=
nil
{
return
msg
,
err
return
msg
,
err
}
}
code
,
codelen
,
err
:=
readMsgCode
(
r
)
code
,
err
:=
s
.
Uint
(
)
if
err
!=
nil
{
if
err
!=
nil
{
return
msg
,
err
return
msg
,
err
}
}
payloadsize
:=
size
-
posr
.
p
rlpsize
:=
size
-
hdrlen
-
codelen
return
Msg
{
code
,
payloadsize
,
io
.
LimitReader
(
r
,
int64
(
payloadsize
))},
nil
return
Msg
{
Code
:
code
,
Size
:
rlpsize
,
Payload
:
io
.
LimitReader
(
r
,
int64
(
rlpsize
)),
},
nil
}
}
// readListHeader reads an RLP list header from r.
// postrack wraps an rlp.ByteReader with a position counter.
func
readListHeader
(
r
byteReader
)
(
len
uint64
,
hdrlen
uint32
,
err
error
)
{
type
postrack
struct
{
b
,
err
:=
r
.
ReadByte
()
r
rlp
.
ByteReader
if
err
!=
nil
{
p
uint32
return
0
,
0
,
err
}
if
b
<
0xC0
{
return
0
,
0
,
fmt
.
Errorf
(
"expected list start byte >= 0xC0, got %x"
,
b
)
}
else
if
b
<
0xF7
{
len
=
uint64
(
b
-
0xc0
)
hdrlen
=
1
}
else
{
lenlen
:=
b
-
0xF7
lenbuf
:=
make
([]
byte
,
8
)
if
_
,
err
:=
io
.
ReadFull
(
r
,
lenbuf
[
8
-
lenlen
:
]);
err
!=
nil
{
return
0
,
0
,
err
}
len
=
binary
.
BigEndian
.
Uint64
(
lenbuf
)
hdrlen
=
1
+
uint32
(
lenlen
)
}
return
len
,
hdrlen
,
nil
}
}
// readUint reads an RLP-encoded unsigned integer from r.
func
(
r
*
postrack
)
Read
(
buf
[]
byte
)
(
int
,
error
)
{
func
readMsgCode
(
r
byteReader
)
(
code
uint64
,
codelen
uint32
,
err
error
)
{
n
,
err
:=
r
.
r
.
Read
(
buf
)
b
,
err
:=
r
.
ReadByte
()
r
.
p
+=
uint32
(
n
)
if
err
!=
nil
{
return
n
,
err
return
0
,
0
,
err
}
}
if
b
<
0x80
{
return
uint64
(
b
),
1
,
nil
func
(
r
*
postrack
)
ReadByte
()
(
byte
,
error
)
{
}
else
if
b
<
0x89
{
// max length for uint64 is 8 bytes
b
,
err
:=
r
.
r
.
ReadByte
()
codelen
=
uint32
(
b
-
0x80
)
if
err
==
nil
{
if
codelen
==
0
{
r
.
p
++
return
0
,
1
,
nil
}
buf
:=
make
([]
byte
,
8
)
if
_
,
err
:=
io
.
ReadFull
(
r
,
buf
[
8
-
codelen
:
]);
err
!=
nil
{
return
0
,
0
,
err
}
return
binary
.
BigEndian
.
Uint64
(
buf
),
codelen
,
nil
}
}
return
0
,
0
,
fmt
.
Errorf
(
"bad RLP type for message code: %x"
,
b
)
return
b
,
err
}
}
This diff is collapsed.
Click to expand it.
p2p/message_test.go
+
3
−
0
View file @
c1fca725
...
@@ -46,6 +46,9 @@ func TestEncodeDecodeMsg(t *testing.T) {
...
@@ -46,6 +46,9 @@ func TestEncodeDecodeMsg(t *testing.T) {
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatalf
(
"first payload item decode error: %v"
,
err
)
t
.
Fatalf
(
"first payload item decode error: %v"
,
err
)
}
}
if
v
:=
data
.
Len
();
v
!=
2
{
t
.
Errorf
(
"incorrect data.Len(): got %v, expected %d"
,
v
,
1
)
}
if
v
:=
data
.
Get
(
0
)
.
Uint
();
v
!=
1
{
if
v
:=
data
.
Get
(
0
)
.
Uint
();
v
!=
1
{
t
.
Errorf
(
"incorrect data[0]: got %v, expected %d"
,
v
,
1
)
t
.
Errorf
(
"incorrect data[0]: got %v, expected %d"
,
v
,
1
)
}
}
...
...
This diff is collapsed.
Click to expand it.
p2p/peer_test.go
+
1
−
1
View file @
c1fca725
...
@@ -57,7 +57,7 @@ func TestPeerProtoReadMsg(t *testing.T) {
...
@@ -57,7 +57,7 @@ func TestPeerProtoReadMsg(t *testing.T) {
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"data decoding error: %v"
,
err
)
t
.
Errorf
(
"data decoding error: %v"
,
err
)
}
}
expdata
:=
[]
interface
{}{
1
,
[]
byte
{
0x30
,
0x30
,
0x30
}}
expdata
:=
[]
interface
{}{
[]
byte
{
0x01
}
,
[]
byte
{
0x30
,
0x30
,
0x30
}}
if
!
reflect
.
DeepEqual
(
data
.
Slice
(),
expdata
)
{
if
!
reflect
.
DeepEqual
(
data
.
Slice
(),
expdata
)
{
t
.
Errorf
(
"incorrect msg data %#v"
,
data
.
Slice
())
t
.
Errorf
(
"incorrect msg data %#v"
,
data
.
Slice
())
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment