Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
3b8725e0
Commit
3b8725e0
authored
Jan 06, 2015
by
Jeffrey Wilcke
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #239 from fjl/grab-bag
Grab bag of fixes
parents
117f66e8
3caa4ad1
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
116 additions
and
93 deletions
+116
-93
main.go
cmd/evm/main.go
+6
-0
main.go
cmd/peerserver/main.go
+18
-16
main.go
cmd/rlpdump/main.go
+1
-2
protocol.go
eth/protocol.go
+4
-4
protocol_test.go
eth/protocol_test.go
+0
-4
message.go
p2p/message.go
+9
-11
message_test.go
p2p/message_test.go
+3
-3
peer.go
p2p/peer.go
+0
-22
peer_test.go
p2p/peer_test.go
+2
-2
protocol.go
p2p/protocol.go
+28
-6
protocol_test.go
p2p/protocol_test.go
+45
-23
No files found.
cmd/evm/main.go
View file @
3b8725e0
...
...
@@ -131,6 +131,12 @@ func (self *VMEnv) Value() *big.Int { return self.value }
func
(
self
*
VMEnv
)
GasLimit
()
*
big
.
Int
{
return
big
.
NewInt
(
1000000000
)
}
func
(
self
*
VMEnv
)
Depth
()
int
{
return
0
}
func
(
self
*
VMEnv
)
SetDepth
(
i
int
)
{
self
.
depth
=
i
}
func
(
self
*
VMEnv
)
GetHash
(
n
uint64
)
[]
byte
{
if
self
.
block
.
Number
()
.
Cmp
(
big
.
NewInt
(
int64
(
n
)))
==
0
{
return
self
.
block
.
Hash
()
}
return
nil
}
func
(
self
*
VMEnv
)
AddLog
(
log
state
.
Log
)
{
self
.
state
.
AddLog
(
log
)
}
...
...
cmd/peerserver/main.go
View file @
3b8725e0
...
...
@@ -18,9 +18,8 @@ package main
import
(
"crypto/elliptic"
"f
mt
"
"f
lag
"
"log"
"net"
"os"
"github.com/ethereum/go-ethereum/crypto"
...
...
@@ -28,29 +27,32 @@ import (
"github.com/ethereum/go-ethereum/p2p"
)
var
(
natType
=
flag
.
String
(
"nat"
,
""
,
"NAT traversal implementation"
)
pmpGateway
=
flag
.
String
(
"gateway"
,
""
,
"gateway address for NAT-PMP"
)
listenAddr
=
flag
.
String
(
"addr"
,
":30301"
,
"listen address"
)
)
func
main
()
{
flag
.
Parse
()
nat
,
err
:=
p2p
.
ParseNAT
(
*
natType
,
*
pmpGateway
)
if
err
!=
nil
{
log
.
Fatal
(
"invalid nat:"
,
err
)
}
logger
.
AddLogSystem
(
logger
.
NewStdLogSystem
(
os
.
Stdout
,
log
.
LstdFlags
,
logger
.
InfoLevel
))
key
,
_
:=
crypto
.
GenerateKey
()
marshaled
:=
elliptic
.
Marshal
(
crypto
.
S256
(),
key
.
PublicKey
.
X
,
key
.
PublicKey
.
Y
)
srv
:=
p2p
.
Server
{
MaxPeers
:
100
,
Identity
:
p2p
.
NewSimpleClientIdentity
(
"Ethereum(G)"
,
"0.1"
,
"Peer Server Two"
,
string
(
marshaled
)),
ListenAddr
:
":30301"
,
NAT
:
p2p
.
UPNP
(),
Identity
:
p2p
.
NewSimpleClientIdentity
(
"Ethereum(G)"
,
"0.1"
,
"Peer Server Two"
,
marshaled
),
ListenAddr
:
*
listenAddr
,
NAT
:
nat
,
NoDial
:
true
,
}
if
err
:=
srv
.
Start
();
err
!=
nil
{
fmt
.
Println
(
"could not start server:"
,
err
)
os
.
Exit
(
1
)
log
.
Fatal
(
"could not start server:"
,
err
)
}
// add seed peers
seed
,
err
:=
net
.
ResolveTCPAddr
(
"tcp"
,
"poc-8.ethdev.com:30303"
)
if
err
!=
nil
{
fmt
.
Println
(
"couldn't resolve:"
,
err
)
}
else
{
srv
.
SuggestPeer
(
seed
.
IP
,
seed
.
Port
,
nil
)
}
select
{}
}
cmd/rlpdump/main.go
View file @
3b8725e0
...
...
@@ -110,8 +110,7 @@ func dump(s *rlp.Stream, depth int) error {
s
.
List
()
defer
s
.
ListEnd
()
if
size
==
0
{
fmt
.
Printf
(
ws
(
depth
)
+
"[]"
)
return
nil
fmt
.
Print
(
ws
(
depth
)
+
"[]"
)
}
else
{
fmt
.
Println
(
ws
(
depth
)
+
"["
)
for
i
:=
0
;
;
i
++
{
...
...
eth/protocol.go
View file @
3b8725e0
...
...
@@ -140,7 +140,7 @@ func (self *ethProtocol) handle() error {
return
self
.
protoError
(
ErrDecode
,
"->msg %v: %v"
,
msg
,
err
)
}
hashes
:=
self
.
chainManager
.
GetBlockHashesFromHash
(
request
.
Hash
,
request
.
Amount
)
return
self
.
rw
.
EncodeMsg
(
BlockHashesMsg
,
ethutil
.
ByteSliceToInterface
(
hashes
)
...
)
return
p2p
.
EncodeMsg
(
self
.
rw
,
BlockHashesMsg
,
ethutil
.
ByteSliceToInterface
(
hashes
)
...
)
case
BlockHashesMsg
:
// TODO: redo using lazy decode , this way very inefficient on known chains
...
...
@@ -185,7 +185,7 @@ func (self *ethProtocol) handle() error {
break
}
}
return
self
.
rw
.
EncodeMsg
(
BlocksMsg
,
blocks
...
)
return
p2p
.
EncodeMsg
(
self
.
rw
,
BlocksMsg
,
blocks
...
)
case
BlocksMsg
:
msgStream
:=
rlp
.
NewStream
(
msg
.
Payload
)
...
...
@@ -298,12 +298,12 @@ func (self *ethProtocol) handleStatus() error {
func
(
self
*
ethProtocol
)
requestBlockHashes
(
from
[]
byte
)
error
{
self
.
peer
.
Debugf
(
"fetching hashes (%d) %x...
\n
"
,
blockHashesBatchSize
,
from
[
0
:
4
])
return
self
.
rw
.
EncodeMsg
(
GetBlockHashesMsg
,
interface
{}(
from
),
uint64
(
blockHashesBatchSize
))
return
p2p
.
EncodeMsg
(
self
.
rw
,
GetBlockHashesMsg
,
interface
{}(
from
),
uint64
(
blockHashesBatchSize
))
}
func
(
self
*
ethProtocol
)
requestBlocks
(
hashes
[][]
byte
)
error
{
self
.
peer
.
Debugf
(
"fetching %v blocks"
,
len
(
hashes
))
return
self
.
rw
.
EncodeMsg
(
GetBlocksMsg
,
ethutil
.
ByteSliceToInterface
(
hashes
)
...
)
return
p2p
.
EncodeMsg
(
self
.
rw
,
GetBlocksMsg
,
ethutil
.
ByteSliceToInterface
(
hashes
)
...
)
}
func
(
self
*
ethProtocol
)
protoError
(
code
int
,
format
string
,
params
...
interface
{})
(
err
*
protocolError
)
{
...
...
eth/protocol_test.go
View file @
3b8725e0
...
...
@@ -41,10 +41,6 @@ func (self *testMsgReadWriter) WriteMsg(msg p2p.Msg) error {
return
nil
}
func
(
self
*
testMsgReadWriter
)
EncodeMsg
(
code
uint64
,
data
...
interface
{})
error
{
return
self
.
WriteMsg
(
p2p
.
NewMsg
(
code
,
data
...
))
}
func
(
self
*
testMsgReadWriter
)
ReadMsg
()
(
p2p
.
Msg
,
error
)
{
msg
,
ok
:=
<-
self
.
in
if
!
ok
{
...
...
p2p/message.go
View file @
3b8725e0
...
...
@@ -71,14 +71,11 @@ type MsgReader interface {
}
type
MsgWriter
interface
{
// WriteMsg sends an existing message.
// The Payload reader of the message is consumed.
// WriteMsg sends a message. It will block until the message's
// Payload has been consumed by the other end.
//
// Note that messages can be sent only once.
WriteMsg
(
Msg
)
error
// EncodeMsg writes an RLP-encoded message with the given
// code and data elements.
EncodeMsg
(
code
uint64
,
data
...
interface
{})
error
}
// MsgReadWriter provides reading and writing of encoded messages.
...
...
@@ -87,6 +84,12 @@ type MsgReadWriter interface {
MsgWriter
}
// EncodeMsg writes an RLP-encoded message with the given code and
// data elements.
func
EncodeMsg
(
w
MsgWriter
,
code
uint64
,
data
...
interface
{})
error
{
return
w
.
WriteMsg
(
NewMsg
(
code
,
data
...
))
}
var
magicToken
=
[]
byte
{
34
,
64
,
8
,
145
}
func
writeMsg
(
w
io
.
Writer
,
msg
Msg
)
error
{
...
...
@@ -209,11 +212,6 @@ func (p *MsgPipeRW) WriteMsg(msg Msg) error {
return
ErrPipeClosed
}
// EncodeMsg is a convenient shorthand for sending an RLP-encoded message.
func
(
p
*
MsgPipeRW
)
EncodeMsg
(
code
uint64
,
data
...
interface
{})
error
{
return
p
.
WriteMsg
(
NewMsg
(
code
,
data
...
))
}
// ReadMsg returns a message sent on the other end of the pipe.
func
(
p
*
MsgPipeRW
)
ReadMsg
()
(
Msg
,
error
)
{
if
atomic
.
LoadInt32
(
p
.
closed
)
==
0
{
...
...
p2p/message_test.go
View file @
3b8725e0
...
...
@@ -75,8 +75,8 @@ func TestDecodeRealMsg(t *testing.T) {
func
ExampleMsgPipe
()
{
rw1
,
rw2
:=
MsgPipe
()
go
func
()
{
rw1
.
EncodeMsg
(
8
,
[]
byte
{
0
,
0
})
rw1
.
EncodeMsg
(
5
,
[]
byte
{
1
,
1
})
EncodeMsg
(
rw1
,
8
,
[]
byte
{
0
,
0
})
EncodeMsg
(
rw1
,
5
,
[]
byte
{
1
,
1
})
rw1
.
Close
()
}()
...
...
@@ -100,7 +100,7 @@ loop:
rw1
,
rw2
:=
MsgPipe
()
done
:=
make
(
chan
struct
{})
go
func
()
{
if
err
:=
rw1
.
EncodeMsg
(
1
);
err
==
nil
{
if
err
:=
EncodeMsg
(
rw1
,
1
);
err
==
nil
{
t
.
Error
(
"EncodeMsg returned nil error"
)
}
else
if
err
!=
ErrPipeClosed
{
t
.
Error
(
"EncodeMsg returned wrong error: got %v, want %v"
,
err
,
ErrPipeClosed
)
...
...
p2p/peer.go
View file @
3b8725e0
...
...
@@ -460,25 +460,3 @@ func (r *eofSignal) Read(buf []byte) (int, error) {
}
return
n
,
err
}
func
(
peer
*
Peer
)
PeerList
()
[]
interface
{}
{
peers
:=
peer
.
otherPeers
()
ds
:=
make
([]
interface
{},
0
,
len
(
peers
))
for
_
,
p
:=
range
peers
{
p
.
infolock
.
Lock
()
addr
:=
p
.
listenAddr
p
.
infolock
.
Unlock
()
// filter out this peer and peers that are not listening or
// have not completed the handshake.
// TODO: track previously sent peers and exclude them as well.
if
p
==
peer
||
addr
==
nil
{
continue
}
ds
=
append
(
ds
,
addr
)
}
ourAddr
:=
peer
.
ourListenAddr
if
ourAddr
!=
nil
&&
!
ourAddr
.
IP
.
IsLoopback
()
&&
!
ourAddr
.
IP
.
IsUnspecified
()
{
ds
=
append
(
ds
,
ourAddr
)
}
return
ds
}
p2p/peer_test.go
View file @
3b8725e0
...
...
@@ -126,10 +126,10 @@ func TestPeerProtoEncodeMsg(t *testing.T) {
Name
:
"a"
,
Length
:
2
,
Run
:
func
(
peer
*
Peer
,
rw
MsgReadWriter
)
error
{
if
err
:=
rw
.
EncodeMsg
(
2
);
err
==
nil
{
if
err
:=
EncodeMsg
(
rw
,
2
);
err
==
nil
{
t
.
Error
(
"expected error for out-of-range msg code, got nil"
)
}
if
err
:=
rw
.
EncodeMsg
(
1
,
"foo"
,
"bar"
);
err
!=
nil
{
if
err
:=
EncodeMsg
(
rw
,
1
,
"foo"
,
"bar"
);
err
!=
nil
{
t
.
Errorf
(
"write error: %v"
,
err
)
}
return
nil
...
...
p2p/protocol.go
View file @
3b8725e0
...
...
@@ -119,14 +119,14 @@ func (bp *baseProtocol) loop(quit <-chan error) error {
getPeersTick
:=
time
.
NewTicker
(
10
*
time
.
Second
)
defer
getPeersTick
.
Stop
()
err
:=
bp
.
rw
.
EncodeMsg
(
getPeersMsg
)
err
:=
EncodeMsg
(
bp
.
rw
,
getPeersMsg
)
for
err
==
nil
{
select
{
case
err
=
<-
quit
:
return
err
case
<-
getPeersTick
.
C
:
err
=
bp
.
rw
.
EncodeMsg
(
getPeersMsg
)
err
=
EncodeMsg
(
bp
.
rw
,
getPeersMsg
)
case
event
:=
<-
activity
.
Chan
()
:
ping
.
Reset
(
pingTimeout
)
lastActive
=
event
.
(
time
.
Time
)
...
...
@@ -134,7 +134,7 @@ func (bp *baseProtocol) loop(quit <-chan error) error {
if
lastActive
.
Add
(
pingTimeout
*
2
)
.
Before
(
t
)
{
err
=
newPeerError
(
errPingTimeout
,
""
)
}
else
if
lastActive
.
Add
(
pingTimeout
)
.
Before
(
t
)
{
err
=
bp
.
rw
.
EncodeMsg
(
pingMsg
)
err
=
EncodeMsg
(
bp
.
rw
,
pingMsg
)
}
}
}
...
...
@@ -164,12 +164,12 @@ func (bp *baseProtocol) handle(rw MsgReadWriter) error {
return
discRequestedError
(
reason
[
0
])
case
pingMsg
:
return
bp
.
rw
.
EncodeMsg
(
pongMsg
)
return
EncodeMsg
(
bp
.
rw
,
pongMsg
)
case
pongMsg
:
case
getPeersMsg
:
peers
:=
bp
.
peer
.
Peer
List
()
peers
:=
bp
.
peerList
()
// 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
...
...
@@ -177,7 +177,7 @@ func (bp *baseProtocol) handle(rw MsgReadWriter) error {
//
// TODO: add event mechanism to notify baseProtocol for new peers
if
len
(
peers
)
>
0
{
return
bp
.
rw
.
EncodeMsg
(
peersMsg
,
peers
...
)
return
EncodeMsg
(
bp
.
rw
,
peersMsg
,
peers
...
)
}
case
peersMsg
:
...
...
@@ -264,3 +264,25 @@ func (bp *baseProtocol) handshakeMsg() Msg {
bp
.
peer
.
ourID
.
Pubkey
()[
1
:
],
)
}
func
(
bp
*
baseProtocol
)
peerList
()
[]
interface
{}
{
peers
:=
bp
.
peer
.
otherPeers
()
ds
:=
make
([]
interface
{},
0
,
len
(
peers
))
for
_
,
p
:=
range
peers
{
p
.
infolock
.
Lock
()
addr
:=
p
.
listenAddr
p
.
infolock
.
Unlock
()
// filter out this peer and peers that are not listening or
// have not completed the handshake.
// TODO: track previously sent peers and exclude them as well.
if
p
==
bp
.
peer
||
addr
==
nil
{
continue
}
ds
=
append
(
ds
,
addr
)
}
ourAddr
:=
bp
.
peer
.
ourListenAddr
if
ourAddr
!=
nil
&&
!
ourAddr
.
IP
.
IsLoopback
()
&&
!
ourAddr
.
IP
.
IsUnspecified
()
{
ds
=
append
(
ds
,
ourAddr
)
}
return
ds
}
p2p/protocol_test.go
View file @
3b8725e0
...
...
@@ -4,6 +4,7 @@ import (
"fmt"
"net"
"reflect"
"sync"
"testing"
"github.com/ethereum/go-ethereum/crypto"
...
...
@@ -36,50 +37,71 @@ func newTestPeer() (peer *Peer) {
}
func
TestBaseProtocolPeers
(
t
*
testing
.
T
)
{
cannedP
eerList
:=
[]
*
peerAddr
{
p
eerList
:=
[]
*
peerAddr
{
{
IP
:
net
.
ParseIP
(
"1.2.3.4"
),
Port
:
2222
,
Pubkey
:
[]
byte
{}},
{
IP
:
net
.
ParseIP
(
"5.6.7.8"
),
Port
:
3333
,
Pubkey
:
[]
byte
{}},
}
var
ownAddr
*
peerAddr
=
&
peerAddr
{
IP
:
net
.
ParseIP
(
"1.3.5.7"
),
Port
:
1111
,
Pubkey
:
[]
byte
{}}
listenAddr
:
=
&
peerAddr
{
IP
:
net
.
ParseIP
(
"1.3.5.7"
),
Port
:
1111
,
Pubkey
:
[]
byte
{}}
rw1
,
rw2
:=
MsgPipe
()
defer
rw1
.
Close
()
wg
:=
new
(
sync
.
WaitGroup
)
// run matcher, close pipe when addresses have arrived
addrChan
:=
make
(
chan
*
peerAddr
,
len
(
cannedPeerList
))
numPeers
:=
len
(
peerList
)
+
1
addrChan
:=
make
(
chan
*
peerAddr
)
wg
.
Add
(
1
)
go
func
()
{
for
_
,
want
:=
range
cannedPeerList
{
got
:=
<-
addrChan
t
.
Logf
(
"got peer: %+v"
,
got
)
i
:=
0
for
got
:=
range
addrChan
{
var
want
*
peerAddr
switch
{
case
i
<
len
(
peerList
)
:
want
=
peerList
[
i
]
case
i
==
len
(
peerList
)
:
want
=
listenAddr
// listenAddr should be the last thing sent
}
t
.
Logf
(
"got peer %d/%d: %v"
,
i
+
1
,
numPeers
,
got
)
if
!
reflect
.
DeepEqual
(
want
,
got
)
{
t
.
Errorf
(
"mismatch: got %#v, want %#v"
,
got
,
want
)
t
.
Errorf
(
"mismatch: got %+v, want %+v"
,
got
,
want
)
}
i
++
if
i
==
numPeers
{
break
}
}
close
(
addrChan
)
var
own
[]
*
peerAddr
var
got
*
peerAddr
for
got
=
range
addrChan
{
own
=
append
(
own
,
got
)
}
if
len
(
own
)
!=
1
||
!
reflect
.
DeepEqual
(
ownAddr
,
own
[
0
])
{
t
.
Errorf
(
"mismatch: peers own address is incorrectly or not given, got %v, want %#v"
,
ownAddr
)
if
i
!=
numPeers
{
t
.
Errorf
(
"wrong number of peers received: got %d, want %d"
,
i
,
numPeers
)
}
rw2
.
Close
()
rw1
.
Close
()
wg
.
Done
()
}()
// run first peer
// run first peer (in background)
peer1
:=
newTestPeer
()
peer1
.
ourListenAddr
=
ow
nAddr
peer1
.
ourListenAddr
=
liste
nAddr
peer1
.
otherPeers
=
func
()
[]
*
Peer
{
pl
:=
make
([]
*
Peer
,
len
(
cannedP
eerList
))
for
i
,
addr
:=
range
cannedP
eerList
{
pl
:=
make
([]
*
Peer
,
len
(
p
eerList
))
for
i
,
addr
:=
range
p
eerList
{
pl
[
i
]
=
&
Peer
{
listenAddr
:
addr
}
}
return
pl
}
go
runBaseProtocol
(
peer1
,
rw1
)
wg
.
Add
(
1
)
go
func
()
{
runBaseProtocol
(
peer1
,
rw1
)
wg
.
Done
()
}()
// run second peer
peer2
:=
newTestPeer
()
peer2
.
newPeerAddr
=
addrChan
// feed peer suggestions into matcher
if
err
:=
runBaseProtocol
(
peer2
,
rw2
);
err
!=
ErrPipeClosed
{
t
.
Errorf
(
"peer2 terminated with unexpected error: %v"
,
err
)
}
// terminate matcher
close
(
addrChan
)
wg
.
Wait
()
}
func
TestBaseProtocolDisconnect
(
t
*
testing
.
T
)
{
...
...
@@ -93,7 +115,7 @@ func TestBaseProtocolDisconnect(t *testing.T) {
if
err
:=
expectMsg
(
rw2
,
handshakeMsg
);
err
!=
nil
{
t
.
Error
(
err
)
}
err
:=
rw2
.
EncodeMsg
(
handshakeMsg
,
err
:=
EncodeMsg
(
rw2
,
handshakeMsg
,
baseProtocolVersion
,
""
,
[]
interface
{}{},
...
...
@@ -106,7 +128,7 @@ func TestBaseProtocolDisconnect(t *testing.T) {
if
err
:=
expectMsg
(
rw2
,
getPeersMsg
);
err
!=
nil
{
t
.
Error
(
err
)
}
if
err
:=
rw2
.
EncodeMsg
(
discMsg
,
DiscQuitting
);
err
!=
nil
{
if
err
:=
EncodeMsg
(
rw2
,
discMsg
,
DiscQuitting
);
err
!=
nil
{
t
.
Error
(
err
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment