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
c368f728
Unverified
Commit
c368f728
authored
Aug 20, 2021
by
Péter Szilágyi
Committed by
GitHub
Aug 20, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert "eth: drop eth/65, the last non-reqid protocol version" (#23426)
parent
5566e5d1
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
609 additions
and
179 deletions
+609
-179
suite_test.go
cmd/devp2p/internal/ethtest/suite_test.go
+1
-1
downloader.go
eth/downloader/downloader.go
+2
-2
downloader_test.go
eth/downloader/downloader_test.go
+93
-2
peer.go
eth/downloader/peer.go
+4
-4
handler.go
eth/handler.go
+4
-1
handler_eth_test.go
eth/handler_eth_test.go
+17
-21
handler.go
eth/protocols/eth/handler.go
+32
-15
handler_test.go
eth/protocols/eth/handler_test.go
+87
-47
handlers.go
eth/protocols/eth/handlers.go
+107
-0
handshake_test.go
eth/protocols/eth/handshake_test.go
+1
-0
peer.go
eth/protocols/eth/peer.go
+142
-66
protocol.go
eth/protocols/eth/protocol.go
+19
-15
sync.go
eth/sync.go
+98
-4
sync_test.go
eth/sync_test.go
+1
-0
client_handler.go
les/client_handler.go
+1
-1
No files found.
cmd/devp2p/internal/ethtest/suite_test.go
View file @
c368f728
...
...
@@ -45,7 +45,7 @@ func TestEthSuite(t *testing.T) {
if
err
!=
nil
{
t
.
Fatalf
(
"could not create new test suite: %v"
,
err
)
}
for
_
,
test
:=
range
suite
.
Eth66
Tests
()
{
for
_
,
test
:=
range
suite
.
AllEth
Tests
()
{
t
.
Run
(
test
.
Name
,
func
(
t
*
testing
.
T
)
{
result
:=
utesting
.
RunTAP
([]
utesting
.
Test
{{
Name
:
test
.
Name
,
Fn
:
test
.
Fn
}},
os
.
Stdout
)
if
result
[
0
]
.
Failed
{
...
...
eth/downloader/downloader.go
View file @
c368f728
...
...
@@ -448,8 +448,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I
d
.
mux
.
Post
(
DoneEvent
{
latest
})
}
}()
if
p
.
version
<
eth
.
ETH6
6
{
return
fmt
.
Errorf
(
"%w: advertized %d < required %d"
,
errTooOld
,
p
.
version
,
eth
.
ETH6
6
)
if
p
.
version
<
eth
.
ETH6
5
{
return
fmt
.
Errorf
(
"%w: advertized %d < required %d"
,
errTooOld
,
p
.
version
,
eth
.
ETH6
5
)
}
mode
:=
d
.
getMode
()
...
...
eth/downloader/downloader_test.go
View file @
c368f728
This diff is collapsed.
Click to expand it.
eth/downloader/peer.go
View file @
c368f728
...
...
@@ -413,7 +413,7 @@ func (ps *peerSet) HeaderIdlePeers() ([]*peerConnection, int) {
throughput
:=
func
(
p
*
peerConnection
)
int
{
return
p
.
rates
.
Capacity
(
eth
.
BlockHeadersMsg
,
time
.
Second
)
}
return
ps
.
idlePeers
(
eth
.
ETH6
6
,
eth
.
ETH66
,
idle
,
throughput
)
return
ps
.
idlePeers
(
eth
.
ETH6
5
,
eth
.
ETH66
,
idle
,
throughput
)
}
// BodyIdlePeers retrieves a flat list of all the currently body-idle peers within
...
...
@@ -425,7 +425,7 @@ func (ps *peerSet) BodyIdlePeers() ([]*peerConnection, int) {
throughput
:=
func
(
p
*
peerConnection
)
int
{
return
p
.
rates
.
Capacity
(
eth
.
BlockBodiesMsg
,
time
.
Second
)
}
return
ps
.
idlePeers
(
eth
.
ETH6
6
,
eth
.
ETH66
,
idle
,
throughput
)
return
ps
.
idlePeers
(
eth
.
ETH6
5
,
eth
.
ETH66
,
idle
,
throughput
)
}
// ReceiptIdlePeers retrieves a flat list of all the currently receipt-idle peers
...
...
@@ -437,7 +437,7 @@ func (ps *peerSet) ReceiptIdlePeers() ([]*peerConnection, int) {
throughput
:=
func
(
p
*
peerConnection
)
int
{
return
p
.
rates
.
Capacity
(
eth
.
ReceiptsMsg
,
time
.
Second
)
}
return
ps
.
idlePeers
(
eth
.
ETH6
6
,
eth
.
ETH66
,
idle
,
throughput
)
return
ps
.
idlePeers
(
eth
.
ETH6
5
,
eth
.
ETH66
,
idle
,
throughput
)
}
// NodeDataIdlePeers retrieves a flat list of all the currently node-data-idle
...
...
@@ -449,7 +449,7 @@ func (ps *peerSet) NodeDataIdlePeers() ([]*peerConnection, int) {
throughput
:=
func
(
p
*
peerConnection
)
int
{
return
p
.
rates
.
Capacity
(
eth
.
NodeDataMsg
,
time
.
Second
)
}
return
ps
.
idlePeers
(
eth
.
ETH6
6
,
eth
.
ETH66
,
idle
,
throughput
)
return
ps
.
idlePeers
(
eth
.
ETH6
5
,
eth
.
ETH66
,
idle
,
throughput
)
}
// idlePeers retrieves a flat list of all currently idle peers satisfying the
...
...
eth/handler.go
View file @
c368f728
...
...
@@ -117,6 +117,7 @@ type handler struct {
whitelist
map
[
uint64
]
common
.
Hash
// channels for fetcher, syncer, txsyncLoop
txsyncCh
chan
*
txsync
quitSync
chan
struct
{}
chainSync
*
chainSyncer
...
...
@@ -139,6 +140,7 @@ func newHandler(config *handlerConfig) (*handler, error) {
chain
:
config
.
Chain
,
peers
:
newPeerSet
(),
whitelist
:
config
.
Whitelist
,
txsyncCh
:
make
(
chan
*
txsync
),
quitSync
:
make
(
chan
struct
{}),
}
if
config
.
Sync
==
downloader
.
FullSync
{
...
...
@@ -406,8 +408,9 @@ func (h *handler) Start(maxPeers int) {
go
h
.
minedBroadcastLoop
()
// start sync handlers
h
.
wg
.
Add
(
1
)
h
.
wg
.
Add
(
2
)
go
h
.
chainSync
.
loop
()
go
h
.
txsyncLoop64
()
// TODO(karalabe): Legacy initial tx echange, drop with eth/64.
}
func
(
h
*
handler
)
Stop
()
{
...
...
eth/handler_eth_test.go
View file @
c368f728
...
...
@@ -80,6 +80,7 @@ func (h *testEthHandler) Handle(peer *eth.Peer, packet eth.Packet) error {
// Tests that peers are correctly accepted (or rejected) based on the advertised
// fork IDs in the protocol handshake.
func
TestForkIDSplit65
(
t
*
testing
.
T
)
{
testForkIDSplit
(
t
,
eth
.
ETH65
)
}
func
TestForkIDSplit66
(
t
*
testing
.
T
)
{
testForkIDSplit
(
t
,
eth
.
ETH66
)
}
func
testForkIDSplit
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -235,6 +236,7 @@ func testForkIDSplit(t *testing.T, protocol uint) {
}
// Tests that received transactions are added to the local pool.
func
TestRecvTransactions65
(
t
*
testing
.
T
)
{
testRecvTransactions
(
t
,
eth
.
ETH65
)
}
func
TestRecvTransactions66
(
t
*
testing
.
T
)
{
testRecvTransactions
(
t
,
eth
.
ETH66
)
}
func
testRecvTransactions
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -292,6 +294,7 @@ func testRecvTransactions(t *testing.T, protocol uint) {
}
// This test checks that pending transactions are sent.
func
TestSendTransactions65
(
t
*
testing
.
T
)
{
testSendTransactions
(
t
,
eth
.
ETH65
)
}
func
TestSendTransactions66
(
t
*
testing
.
T
)
{
testSendTransactions
(
t
,
eth
.
ETH66
)
}
func
testSendTransactions
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -303,7 +306,7 @@ func testSendTransactions(t *testing.T, protocol uint) {
insert
:=
make
([]
*
types
.
Transaction
,
100
)
for
nonce
:=
range
insert
{
tx
:=
types
.
NewTransaction
(
uint64
(
nonce
),
common
.
Address
{},
big
.
NewInt
(
0
),
100000
,
big
.
NewInt
(
0
),
make
([]
byte
,
1024
0
))
tx
:=
types
.
NewTransaction
(
uint64
(
nonce
),
common
.
Address
{},
big
.
NewInt
(
0
),
100000
,
big
.
NewInt
(
0
),
make
([]
byte
,
txsyncPackSize
/
1
0
))
tx
,
_
=
types
.
SignTx
(
tx
,
types
.
HomesteadSigner
{},
testKey
)
insert
[
nonce
]
=
tx
...
...
@@ -377,6 +380,7 @@ func testSendTransactions(t *testing.T, protocol uint) {
// Tests that transactions get propagated to all attached peers, either via direct
// broadcasts or via announcements/retrievals.
func
TestTransactionPropagation65
(
t
*
testing
.
T
)
{
testTransactionPropagation
(
t
,
eth
.
ETH65
)
}
func
TestTransactionPropagation66
(
t
*
testing
.
T
)
{
testTransactionPropagation
(
t
,
eth
.
ETH66
)
}
func
testTransactionPropagation
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -517,8 +521,8 @@ func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpo
defer
p2pLocal
.
Close
()
defer
p2pRemote
.
Close
()
local
:=
eth
.
NewPeer
(
eth
.
ETH6
6
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
1
},
""
,
nil
,
p2pLocal
),
p2pLocal
,
handler
.
txpool
)
remote
:=
eth
.
NewPeer
(
eth
.
ETH6
6
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
2
},
""
,
nil
,
p2pRemote
),
p2pRemote
,
handler
.
txpool
)
local
:=
eth
.
NewPeer
(
eth
.
ETH6
5
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
1
},
""
,
nil
,
p2pLocal
),
p2pLocal
,
handler
.
txpool
)
remote
:=
eth
.
NewPeer
(
eth
.
ETH6
5
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
2
},
""
,
nil
,
p2pRemote
),
p2pRemote
,
handler
.
txpool
)
defer
local
.
Close
()
defer
remote
.
Close
()
...
...
@@ -539,39 +543,30 @@ func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpo
if
err
:=
remote
.
Handshake
(
1
,
td
,
head
.
Hash
(),
genesis
.
Hash
(),
forkid
.
NewIDWithChain
(
handler
.
chain
),
forkid
.
NewFilter
(
handler
.
chain
));
err
!=
nil
{
t
.
Fatalf
(
"failed to run protocol handshake"
)
}
// Connect a new peer and check that we receive the checkpoint challenge.
if
checkpoint
{
msg
,
err
:=
p2pRemote
.
ReadMsg
()
if
err
!=
nil
{
t
.
Fatalf
(
"failed to read checkpoint challenge: %v"
,
err
)
}
request
:=
new
(
eth
.
GetBlockHeadersPacket66
)
if
err
:=
msg
.
Decode
(
request
);
err
!=
nil
{
t
.
Fatalf
(
"failed to decode checkpoint challenge: %v"
,
err
)
}
query
:=
request
.
GetBlockHeadersPacket
if
query
.
Origin
.
Number
!=
response
.
Number
.
Uint64
()
||
query
.
Amount
!=
1
||
query
.
Skip
!=
0
||
query
.
Reverse
{
t
.
Fatalf
(
"challenge mismatch: have [%d, %d, %d, %v] want [%d, %d, %d, %v]"
,
query
.
Origin
.
Number
,
query
.
Amount
,
query
.
Skip
,
query
.
Reverse
,
response
.
Number
.
Uint64
(),
1
,
0
,
false
)
if
err
:=
remote
.
ExpectRequestHeadersByNumber
(
response
.
Number
.
Uint64
(),
1
,
0
,
false
);
err
!=
nil
{
t
.
Fatalf
(
"challenge mismatch: %v"
,
err
)
}
// Create a block to reply to the challenge if no timeout is simulated.
if
!
timeout
{
if
empty
{
if
err
:=
remote
.
ReplyBlockHeaders
(
request
.
RequestId
,
[]
*
types
.
Header
{});
err
!=
nil
{
if
err
:=
remote
.
SendBlockHeaders
(
[]
*
types
.
Header
{});
err
!=
nil
{
t
.
Fatalf
(
"failed to answer challenge: %v"
,
err
)
}
}
else
if
match
{
if
err
:=
remote
.
ReplyBlockHeaders
(
request
.
RequestId
,
[]
*
types
.
Header
{
response
});
err
!=
nil
{
if
err
:=
remote
.
SendBlockHeaders
(
[]
*
types
.
Header
{
response
});
err
!=
nil
{
t
.
Fatalf
(
"failed to answer challenge: %v"
,
err
)
}
}
else
{
if
err
:=
remote
.
ReplyBlockHeaders
(
request
.
RequestId
,
[]
*
types
.
Header
{{
Number
:
response
.
Number
}});
err
!=
nil
{
if
err
:=
remote
.
SendBlockHeaders
(
[]
*
types
.
Header
{{
Number
:
response
.
Number
}});
err
!=
nil
{
t
.
Fatalf
(
"failed to answer challenge: %v"
,
err
)
}
}
}
}
// Wait until the test timeout passes to ensure proper cleanup
time
.
Sleep
(
syncChallengeTimeout
+
300
*
time
.
Millisecond
)
...
...
@@ -624,8 +619,8 @@ func testBroadcastBlock(t *testing.T, peers, bcasts int) {
defer
sourcePipe
.
Close
()
defer
sinkPipe
.
Close
()
sourcePeer
:=
eth
.
NewPeer
(
eth
.
ETH6
6
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
byte
(
i
)},
""
,
nil
,
sourcePipe
),
sourcePipe
,
nil
)
sinkPeer
:=
eth
.
NewPeer
(
eth
.
ETH6
6
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
0
},
""
,
nil
,
sinkPipe
),
sinkPipe
,
nil
)
sourcePeer
:=
eth
.
NewPeer
(
eth
.
ETH6
5
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
byte
(
i
)},
""
,
nil
,
sourcePipe
),
sourcePipe
,
nil
)
sinkPeer
:=
eth
.
NewPeer
(
eth
.
ETH6
5
,
p2p
.
NewPeerPipe
(
enode
.
ID
{
0
},
""
,
nil
,
sinkPipe
),
sinkPipe
,
nil
)
defer
sourcePeer
.
Close
()
defer
sinkPeer
.
Close
()
...
...
@@ -676,6 +671,7 @@ func testBroadcastBlock(t *testing.T, peers, bcasts int) {
// Tests that a propagated malformed block (uncles or transactions don't match
// with the hashes in the header) gets discarded and not broadcast forward.
func
TestBroadcastMalformedBlock65
(
t
*
testing
.
T
)
{
testBroadcastMalformedBlock
(
t
,
eth
.
ETH65
)
}
func
TestBroadcastMalformedBlock66
(
t
*
testing
.
T
)
{
testBroadcastMalformedBlock
(
t
,
eth
.
ETH66
)
}
func
testBroadcastMalformedBlock
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
eth/protocols/eth/handler.go
View file @
c368f728
...
...
@@ -171,21 +171,39 @@ type Decoder interface {
Time
()
time
.
Time
}
var
eth65
=
map
[
uint64
]
msgHandler
{
GetBlockHeadersMsg
:
handleGetBlockHeaders
,
BlockHeadersMsg
:
handleBlockHeaders
,
GetBlockBodiesMsg
:
handleGetBlockBodies
,
BlockBodiesMsg
:
handleBlockBodies
,
GetNodeDataMsg
:
handleGetNodeData
,
NodeDataMsg
:
handleNodeData
,
GetReceiptsMsg
:
handleGetReceipts
,
ReceiptsMsg
:
handleReceipts
,
NewBlockHashesMsg
:
handleNewBlockhashes
,
NewBlockMsg
:
handleNewBlock
,
TransactionsMsg
:
handleTransactions
,
NewPooledTransactionHashesMsg
:
handleNewPooledTransactionHashes
,
GetPooledTransactionsMsg
:
handleGetPooledTransactions
,
PooledTransactionsMsg
:
handlePooledTransactions
,
}
var
eth66
=
map
[
uint64
]
msgHandler
{
NewBlockHashesMsg
:
handleNewBlockhashes
,
NewBlockMsg
:
handleNewBlock
,
TransactionsMsg
:
handleTransactions
,
NewPooledTransactionHashesMsg
:
handleNewPooledTransactionHashes
,
GetBlockHeadersMsg
:
handleGetBlockHeaders66
,
BlockHeadersMsg
:
handleBlockHeaders66
,
GetBlockBodiesMsg
:
handleGetBlockBodies66
,
BlockBodiesMsg
:
handleBlockBodies66
,
GetNodeDataMsg
:
handleGetNodeData66
,
NodeDataMsg
:
handleNodeData66
,
GetReceiptsMsg
:
handleGetReceipts66
,
ReceiptsMsg
:
handleReceipts66
,
GetPooledTransactionsMsg
:
handleGetPooledTransactions66
,
PooledTransactionsMsg
:
handlePooledTransactions66
,
// eth66 messages with request-id
GetBlockHeadersMsg
:
handleGetBlockHeaders66
,
BlockHeadersMsg
:
handleBlockHeaders66
,
GetBlockBodiesMsg
:
handleGetBlockBodies66
,
BlockBodiesMsg
:
handleBlockBodies66
,
GetNodeDataMsg
:
handleGetNodeData66
,
NodeDataMsg
:
handleNodeData66
,
GetReceiptsMsg
:
handleGetReceipts66
,
ReceiptsMsg
:
handleReceipts66
,
GetPooledTransactionsMsg
:
handleGetPooledTransactions66
,
PooledTransactionsMsg
:
handlePooledTransactions66
,
}
// handleMessage is invoked whenever an inbound message is received from a remote
...
...
@@ -201,11 +219,10 @@ func handleMessage(backend Backend, peer *Peer) error {
}
defer
msg
.
Discard
()
var
handlers
=
eth66
//if peer.Version() >= ETH67 { // Left in as a sample when new protocol is added
// handlers = eth67
//}
var
handlers
=
eth65
if
peer
.
Version
()
>=
ETH66
{
handlers
=
eth66
}
// Track the amount of time it takes to serve the request and run the handler
if
metrics
.
Enabled
{
h
:=
fmt
.
Sprintf
(
"%s/%s/%d/%#02x"
,
p2p
.
HandleHistName
,
ProtocolName
,
peer
.
Version
(),
msg
.
Code
)
...
...
eth/protocols/eth/handler_test.go
View file @
c368f728
...
...
@@ -110,6 +110,7 @@ func (b *testBackend) Handle(*Peer, Packet) error {
}
// Tests that block headers can be retrieved from a remote chain based on user queries.
func
TestGetBlockHeaders65
(
t
*
testing
.
T
)
{
testGetBlockHeaders
(
t
,
ETH65
)
}
func
TestGetBlockHeaders66
(
t
*
testing
.
T
)
{
testGetBlockHeaders
(
t
,
ETH66
)
}
func
testGetBlockHeaders
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -253,30 +254,44 @@ func testGetBlockHeaders(t *testing.T, protocol uint) {
headers
=
append
(
headers
,
backend
.
chain
.
GetBlockByHash
(
hash
)
.
Header
())
}
// Send the hash request and verify the response
p2p
.
Send
(
peer
.
app
,
GetBlockHeadersMsg
,
GetBlockHeadersPacket66
{
RequestId
:
123
,
GetBlockHeadersPacket
:
tt
.
query
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockHeadersMsg
,
BlockHeadersPacket66
{
RequestId
:
123
,
BlockHeadersPacket
:
headers
,
});
err
!=
nil
{
t
.
Errorf
(
"test %d: headers mismatch: %v"
,
i
,
err
)
if
protocol
<=
ETH65
{
p2p
.
Send
(
peer
.
app
,
GetBlockHeadersMsg
,
tt
.
query
)
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockHeadersMsg
,
headers
);
err
!=
nil
{
t
.
Errorf
(
"test %d: headers mismatch: %v"
,
i
,
err
)
}
}
else
{
p2p
.
Send
(
peer
.
app
,
GetBlockHeadersMsg
,
GetBlockHeadersPacket66
{
RequestId
:
123
,
GetBlockHeadersPacket
:
tt
.
query
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockHeadersMsg
,
BlockHeadersPacket66
{
RequestId
:
123
,
BlockHeadersPacket
:
headers
,
});
err
!=
nil
{
t
.
Errorf
(
"test %d: headers mismatch: %v"
,
i
,
err
)
}
}
// If the test used number origins, repeat with hashes as the too
if
tt
.
query
.
Origin
.
Hash
==
(
common
.
Hash
{})
{
if
origin
:=
backend
.
chain
.
GetBlockByNumber
(
tt
.
query
.
Origin
.
Number
);
origin
!=
nil
{
tt
.
query
.
Origin
.
Hash
,
tt
.
query
.
Origin
.
Number
=
origin
.
Hash
(),
0
p2p
.
Send
(
peer
.
app
,
GetBlockHeadersMsg
,
GetBlockHeadersPacket66
{
RequestId
:
456
,
GetBlockHeadersPacket
:
tt
.
query
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockHeadersMsg
,
BlockHeadersPacket66
{
RequestId
:
456
,
BlockHeadersPacket
:
headers
,
});
err
!=
nil
{
t
.
Errorf
(
"test %d: headers mismatch: %v"
,
i
,
err
)
if
protocol
<=
ETH65
{
p2p
.
Send
(
peer
.
app
,
GetBlockHeadersMsg
,
tt
.
query
)
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockHeadersMsg
,
headers
);
err
!=
nil
{
t
.
Errorf
(
"test %d: headers mismatch: %v"
,
i
,
err
)
}
}
else
{
p2p
.
Send
(
peer
.
app
,
GetBlockHeadersMsg
,
GetBlockHeadersPacket66
{
RequestId
:
456
,
GetBlockHeadersPacket
:
tt
.
query
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockHeadersMsg
,
BlockHeadersPacket66
{
RequestId
:
456
,
BlockHeadersPacket
:
headers
,
});
err
!=
nil
{
t
.
Errorf
(
"test %d: headers mismatch: %v"
,
i
,
err
)
}
}
}
}
...
...
@@ -284,6 +299,7 @@ func testGetBlockHeaders(t *testing.T, protocol uint) {
}
// Tests that block contents can be retrieved from a remote chain based on their hashes.
func
TestGetBlockBodies65
(
t
*
testing
.
T
)
{
testGetBlockBodies
(
t
,
ETH65
)
}
func
TestGetBlockBodies66
(
t
*
testing
.
T
)
{
testGetBlockBodies
(
t
,
ETH66
)
}
func
testGetBlockBodies
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -353,20 +369,28 @@ func testGetBlockBodies(t *testing.T, protocol uint) {
}
}
// Send the hash request and verify the response
p2p
.
Send
(
peer
.
app
,
GetBlockBodiesMsg
,
GetBlockBodiesPacket66
{
RequestId
:
123
,
GetBlockBodiesPacket
:
hashes
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockBodiesMsg
,
BlockBodiesPacket66
{
RequestId
:
123
,
BlockBodiesPacket
:
bodies
,
});
err
!=
nil
{
t
.
Errorf
(
"test %d: bodies mismatch: %v"
,
i
,
err
)
if
protocol
<=
ETH65
{
p2p
.
Send
(
peer
.
app
,
GetBlockBodiesMsg
,
hashes
)
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockBodiesMsg
,
bodies
);
err
!=
nil
{
t
.
Errorf
(
"test %d: bodies mismatch: %v"
,
i
,
err
)
}
}
else
{
p2p
.
Send
(
peer
.
app
,
GetBlockBodiesMsg
,
GetBlockBodiesPacket66
{
RequestId
:
123
,
GetBlockBodiesPacket
:
hashes
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
BlockBodiesMsg
,
BlockBodiesPacket66
{
RequestId
:
123
,
BlockBodiesPacket
:
bodies
,
});
err
!=
nil
{
t
.
Errorf
(
"test %d: bodies mismatch: %v"
,
i
,
err
)
}
}
}
}
// Tests that the state trie nodes can be retrieved based on hashes.
func
TestGetNodeData65
(
t
*
testing
.
T
)
{
testGetNodeData
(
t
,
ETH65
)
}
func
TestGetNodeData66
(
t
*
testing
.
T
)
{
testGetNodeData
(
t
,
ETH66
)
}
func
testGetNodeData
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -425,10 +449,14 @@ func testGetNodeData(t *testing.T, protocol uint) {
}
it
.
Release
()
p2p
.
Send
(
peer
.
app
,
GetNodeDataMsg
,
GetNodeDataPacket66
{
RequestId
:
123
,
GetNodeDataPacket
:
hashes
,
})
if
protocol
<=
ETH65
{
p2p
.
Send
(
peer
.
app
,
GetNodeDataMsg
,
hashes
)
}
else
{
p2p
.
Send
(
peer
.
app
,
GetNodeDataMsg
,
GetNodeDataPacket66
{
RequestId
:
123
,
GetNodeDataPacket
:
hashes
,
})
}
msg
,
err
:=
peer
.
app
.
ReadMsg
()
if
err
!=
nil
{
t
.
Fatalf
(
"failed to read node data response: %v"
,
err
)
...
...
@@ -436,14 +464,18 @@ func testGetNodeData(t *testing.T, protocol uint) {
if
msg
.
Code
!=
NodeDataMsg
{
t
.
Fatalf
(
"response packet code mismatch: have %x, want %x"
,
msg
.
Code
,
NodeDataMsg
)
}
var
(
data
[][]
byte
res
NodeDataPacket66
)
if
err
:=
msg
.
Decode
(
&
res
);
err
!=
nil
{
t
.
Fatalf
(
"failed to decode response node data: %v"
,
err
)
var
data
[][]
byte
if
protocol
<=
ETH65
{
if
err
:=
msg
.
Decode
(
&
data
);
err
!=
nil
{
t
.
Fatalf
(
"failed to decode response node data: %v"
,
err
)
}
}
else
{
var
res
NodeDataPacket66
if
err
:=
msg
.
Decode
(
&
res
);
err
!=
nil
{
t
.
Fatalf
(
"failed to decode response node data: %v"
,
err
)
}
data
=
res
.
NodeDataPacket
}
data
=
res
.
NodeDataPacket
// Verify that all hashes correspond to the requested data, and reconstruct a state tree
for
i
,
want
:=
range
hashes
{
if
hash
:=
crypto
.
Keccak256Hash
(
data
[
i
]);
hash
!=
want
{
...
...
@@ -474,6 +506,7 @@ func testGetNodeData(t *testing.T, protocol uint) {
}
// Tests that the transaction receipts can be retrieved based on hashes.
func
TestGetBlockReceipts65
(
t
*
testing
.
T
)
{
testGetBlockReceipts
(
t
,
ETH65
)
}
func
TestGetBlockReceipts66
(
t
*
testing
.
T
)
{
testGetBlockReceipts
(
t
,
ETH66
)
}
func
testGetBlockReceipts
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
@@ -533,14 +566,21 @@ func testGetBlockReceipts(t *testing.T, protocol uint) {
receipts
=
append
(
receipts
,
backend
.
chain
.
GetReceiptsByHash
(
block
.
Hash
()))
}
// Send the hash request and verify the response
p2p
.
Send
(
peer
.
app
,
GetReceiptsMsg
,
GetReceiptsPacket66
{
RequestId
:
123
,
GetReceiptsPacket
:
hashes
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
ReceiptsMsg
,
ReceiptsPacket66
{
RequestId
:
123
,
ReceiptsPacket
:
receipts
,
});
err
!=
nil
{
t
.
Errorf
(
"receipts mismatch: %v"
,
err
)
if
protocol
<=
ETH65
{
p2p
.
Send
(
peer
.
app
,
GetReceiptsMsg
,
hashes
)
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
ReceiptsMsg
,
receipts
);
err
!=
nil
{
t
.
Errorf
(
"receipts mismatch: %v"
,
err
)
}
}
else
{
p2p
.
Send
(
peer
.
app
,
GetReceiptsMsg
,
GetReceiptsPacket66
{
RequestId
:
123
,
GetReceiptsPacket
:
hashes
,
})
if
err
:=
p2p
.
ExpectMsg
(
peer
.
app
,
ReceiptsMsg
,
ReceiptsPacket66
{
RequestId
:
123
,
ReceiptsPacket
:
receipts
,
});
err
!=
nil
{
t
.
Errorf
(
"receipts mismatch: %v"
,
err
)
}
}
}
eth/protocols/eth/handlers.go
View file @
c368f728
...
...
@@ -27,6 +27,17 @@ import (
"github.com/ethereum/go-ethereum/trie"
)
// handleGetBlockHeaders handles Block header query, collect the requested headers and reply
func
handleGetBlockHeaders
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the complex header query
var
query
GetBlockHeadersPacket
if
err
:=
msg
.
Decode
(
&
query
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
response
:=
answerGetBlockHeadersQuery
(
backend
,
&
query
,
peer
)
return
peer
.
SendBlockHeaders
(
response
)
}
// handleGetBlockHeaders66 is the eth/66 version of handleGetBlockHeaders
func
handleGetBlockHeaders66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the complex header query
...
...
@@ -124,6 +135,16 @@ func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, p
return
headers
}
func
handleGetBlockBodies
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the block body retrieval message
var
query
GetBlockBodiesPacket
if
err
:=
msg
.
Decode
(
&
query
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
response
:=
answerGetBlockBodiesQuery
(
backend
,
query
,
peer
)
return
peer
.
SendBlockBodiesRLP
(
response
)
}
func
handleGetBlockBodies66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the block body retrieval message
var
query
GetBlockBodiesPacket66
...
...
@@ -153,6 +174,16 @@ func answerGetBlockBodiesQuery(backend Backend, query GetBlockBodiesPacket, peer
return
bodies
}
func
handleGetNodeData
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the trie node data retrieval message
var
query
GetNodeDataPacket
if
err
:=
msg
.
Decode
(
&
query
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
response
:=
answerGetNodeDataQuery
(
backend
,
query
,
peer
)
return
peer
.
SendNodeData
(
response
)
}
func
handleGetNodeData66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the trie node data retrieval message
var
query
GetNodeDataPacket66
...
...
@@ -192,6 +223,16 @@ func answerGetNodeDataQuery(backend Backend, query GetNodeDataPacket, peer *Peer
return
nodes
}
func
handleGetReceipts
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the block receipts retrieval message
var
query
GetReceiptsPacket
if
err
:=
msg
.
Decode
(
&
query
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
response
:=
answerGetReceiptsQuery
(
backend
,
query
,
peer
)
return
peer
.
SendReceiptsRLP
(
response
)
}
func
handleGetReceipts66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the block receipts retrieval message
var
query
GetReceiptsPacket66
...
...
@@ -271,6 +312,15 @@ func handleNewBlock(backend Backend, msg Decoder, peer *Peer) error {
return
backend
.
Handle
(
peer
,
ann
)
}
func
handleBlockHeaders
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of headers arrived to one of our previous requests
res
:=
new
(
BlockHeadersPacket
)
if
err
:=
msg
.
Decode
(
res
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
return
backend
.
Handle
(
peer
,
res
)
}
func
handleBlockHeaders66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of headers arrived to one of our previous requests
res
:=
new
(
BlockHeadersPacket66
)
...
...
@@ -282,6 +332,15 @@ func handleBlockHeaders66(backend Backend, msg Decoder, peer *Peer) error {
return
backend
.
Handle
(
peer
,
&
res
.
BlockHeadersPacket
)
}
func
handleBlockBodies
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of block bodies arrived to one of our previous requests
res
:=
new
(
BlockBodiesPacket
)
if
err
:=
msg
.
Decode
(
res
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
return
backend
.
Handle
(
peer
,
res
)
}
func
handleBlockBodies66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of block bodies arrived to one of our previous requests
res
:=
new
(
BlockBodiesPacket66
)
...
...
@@ -293,6 +352,15 @@ func handleBlockBodies66(backend Backend, msg Decoder, peer *Peer) error {
return
backend
.
Handle
(
peer
,
&
res
.
BlockBodiesPacket
)
}
func
handleNodeData
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of node state data arrived to one of our previous requests
res
:=
new
(
NodeDataPacket
)
if
err
:=
msg
.
Decode
(
res
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
return
backend
.
Handle
(
peer
,
res
)
}
func
handleNodeData66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of node state data arrived to one of our previous requests
res
:=
new
(
NodeDataPacket66
)
...
...
@@ -304,6 +372,15 @@ func handleNodeData66(backend Backend, msg Decoder, peer *Peer) error {
return
backend
.
Handle
(
peer
,
&
res
.
NodeDataPacket
)
}
func
handleReceipts
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of receipts arrived to one of our previous requests
res
:=
new
(
ReceiptsPacket
)
if
err
:=
msg
.
Decode
(
res
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
return
backend
.
Handle
(
peer
,
res
)
}
func
handleReceipts66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// A batch of receipts arrived to one of our previous requests
res
:=
new
(
ReceiptsPacket66
)
...
...
@@ -332,6 +409,16 @@ func handleNewPooledTransactionHashes(backend Backend, msg Decoder, peer *Peer)
return
backend
.
Handle
(
peer
,
ann
)
}
func
handleGetPooledTransactions
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the pooled transactions retrieval message
var
query
GetPooledTransactionsPacket
if
err
:=
msg
.
Decode
(
&
query
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
hashes
,
txs
:=
answerGetPooledTransactions
(
backend
,
query
,
peer
)
return
peer
.
SendPooledTransactionsRLP
(
hashes
,
txs
)
}
func
handleGetPooledTransactions66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Decode the pooled transactions retrieval message
var
query
GetPooledTransactionsPacket66
...
...
@@ -390,6 +477,26 @@ func handleTransactions(backend Backend, msg Decoder, peer *Peer) error {
return
backend
.
Handle
(
peer
,
&
txs
)
}
func
handlePooledTransactions
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Transactions arrived, make sure we have a valid and fresh chain to handle them
if
!
backend
.
AcceptTxs
()
{
return
nil
}
// Transactions can be processed, parse all of them and deliver to the pool
var
txs
PooledTransactionsPacket
if
err
:=
msg
.
Decode
(
&
txs
);
err
!=
nil
{
return
fmt
.
Errorf
(
"%w: message %v: %v"
,
errDecode
,
msg
,
err
)
}
for
i
,
tx
:=
range
txs
{
// Validate and mark the remote transaction
if
tx
==
nil
{
return
fmt
.
Errorf
(
"%w: transaction %d is nil"
,
errDecode
,
i
)
}
peer
.
markTransaction
(
tx
.
Hash
())
}
return
backend
.
Handle
(
peer
,
&
txs
)
}
func
handlePooledTransactions66
(
backend
Backend
,
msg
Decoder
,
peer
*
Peer
)
error
{
// Transactions arrived, make sure we have a valid and fresh chain to handle them
if
!
backend
.
AcceptTxs
()
{
...
...
eth/protocols/eth/handshake_test.go
View file @
c368f728
...
...
@@ -27,6 +27,7 @@ import (
)
// Tests that handshake failures are detected and reported correctly.
func
TestHandshake65
(
t
*
testing
.
T
)
{
testHandshake
(
t
,
ETH65
)
}
func
TestHandshake66
(
t
*
testing
.
T
)
{
testHandshake
(
t
,
ETH66
)
}
func
testHandshake
(
t
*
testing
.
T
,
protocol
uint
)
{
...
...
eth/protocols/eth/peer.go
View file @
c368f728
This diff is collapsed.
Click to expand it.
eth/protocols/eth/protocol.go
View file @
c368f728
...
...
@@ -30,6 +30,7 @@ import (
// Constants to match up protocol versions and messages
const
(
ETH65
=
65
ETH66
=
66
)
...
...
@@ -39,28 +40,31 @@ const ProtocolName = "eth"
// ProtocolVersions are the supported versions of the `eth` protocol (first
// is primary).
var
ProtocolVersions
=
[]
uint
{
ETH66
}
var
ProtocolVersions
=
[]
uint
{
ETH66
,
ETH65
}
// protocolLengths are the number of implemented message corresponding to
// different protocol versions.
var
protocolLengths
=
map
[
uint
]
uint64
{
ETH66
:
17
}
var
protocolLengths
=
map
[
uint
]
uint64
{
ETH66
:
17
,
ETH65
:
17
}
// maxMessageSize is the maximum cap on the size of a protocol message.
const
maxMessageSize
=
10
*
1024
*
1024
const
(
StatusMsg
=
0x00
NewBlockHashesMsg
=
0x01
TransactionsMsg
=
0x02
GetBlockHeadersMsg
=
0x03
BlockHeadersMsg
=
0x04
GetBlockBodiesMsg
=
0x05
BlockBodiesMsg
=
0x06
NewBlockMsg
=
0x07
GetNodeDataMsg
=
0x0d
NodeDataMsg
=
0x0e
GetReceiptsMsg
=
0x0f
ReceiptsMsg
=
0x10
// Protocol messages in eth/64
StatusMsg
=
0x00
NewBlockHashesMsg
=
0x01
TransactionsMsg
=
0x02
GetBlockHeadersMsg
=
0x03
BlockHeadersMsg
=
0x04
GetBlockBodiesMsg
=
0x05
BlockBodiesMsg
=
0x06
NewBlockMsg
=
0x07
GetNodeDataMsg
=
0x0d
NodeDataMsg
=
0x0e
GetReceiptsMsg
=
0x0f
ReceiptsMsg
=
0x10
// Protocol messages overloaded in eth/65
NewPooledTransactionHashesMsg
=
0x08
GetPooledTransactionsMsg
=
0x09
PooledTransactionsMsg
=
0x0a
...
...
@@ -124,7 +128,7 @@ type GetBlockHeadersPacket struct {
Reverse
bool
// Query direction (false = rising towards latest, true = falling towards genesis)
}
// GetBlockHeadersPacket
66
represents a block header query over eth/66
// GetBlockHeadersPacket represents a block header query over eth/66
type
GetBlockHeadersPacket66
struct
{
RequestId
uint64
*
GetBlockHeadersPacket
...
...
eth/sync.go
View file @
c368f728
...
...
@@ -18,6 +18,7 @@ package eth
import
(
"math/big"
"math/rand"
"sync/atomic"
"time"
...
...
@@ -27,13 +28,23 @@ import (
"github.com/ethereum/go-ethereum/eth/downloader"
"github.com/ethereum/go-ethereum/eth/protocols/eth"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p/enode"
)
const
(
forceSyncCycle
=
10
*
time
.
Second
// Time interval to force syncs, even if few peers are available
defaultMinSyncPeers
=
5
// Amount of peers desired to start syncing
// This is the target size for the packs of transactions sent by txsyncLoop64.
// A pack can get larger than this if a single transactions exceeds this size.
txsyncPackSize
=
100
*
1024
)
type
txsync
struct
{
p
*
eth
.
Peer
txs
[]
*
types
.
Transaction
}
// syncTransactions starts sending all currently pending transactions to the given peer.
func
(
h
*
handler
)
syncTransactions
(
p
*
eth
.
Peer
)
{
// Assemble the set of transaction to broadcast or announce to the remote
...
...
@@ -53,11 +64,94 @@ func (h *handler) syncTransactions(p *eth.Peer) {
// The eth/65 protocol introduces proper transaction announcements, so instead
// of dripping transactions across multiple peers, just send the entire list as
// an announcement and let the remote side decide what they need (likely nothing).
hashes
:=
make
([]
common
.
Hash
,
len
(
txs
))
for
i
,
tx
:=
range
txs
{
hashes
[
i
]
=
tx
.
Hash
()
if
p
.
Version
()
>=
eth
.
ETH65
{
hashes
:=
make
([]
common
.
Hash
,
len
(
txs
))
for
i
,
tx
:=
range
txs
{
hashes
[
i
]
=
tx
.
Hash
()
}
p
.
AsyncSendPooledTransactionHashes
(
hashes
)
return
}
// Out of luck, peer is running legacy protocols, drop the txs over
select
{
case
h
.
txsyncCh
<-
&
txsync
{
p
:
p
,
txs
:
txs
}
:
case
<-
h
.
quitSync
:
}
}
// txsyncLoop64 takes care of the initial transaction sync for each new
// connection. When a new peer appears, we relay all currently pending
// transactions. In order to minimise egress bandwidth usage, we send
// the transactions in small packs to one peer at a time.
func
(
h
*
handler
)
txsyncLoop64
()
{
defer
h
.
wg
.
Done
()
var
(
pending
=
make
(
map
[
enode
.
ID
]
*
txsync
)
sending
=
false
// whether a send is active
pack
=
new
(
txsync
)
// the pack that is being sent
done
=
make
(
chan
error
,
1
)
// result of the send
)
// send starts a sending a pack of transactions from the sync.
send
:=
func
(
s
*
txsync
)
{
if
s
.
p
.
Version
()
>=
eth
.
ETH65
{
panic
(
"initial transaction syncer running on eth/65+"
)
}
// Fill pack with transactions up to the target size.
size
:=
common
.
StorageSize
(
0
)
pack
.
p
=
s
.
p
pack
.
txs
=
pack
.
txs
[
:
0
]
for
i
:=
0
;
i
<
len
(
s
.
txs
)
&&
size
<
txsyncPackSize
;
i
++
{
pack
.
txs
=
append
(
pack
.
txs
,
s
.
txs
[
i
])
size
+=
s
.
txs
[
i
]
.
Size
()
}
// Remove the transactions that will be sent.
s
.
txs
=
s
.
txs
[
:
copy
(
s
.
txs
,
s
.
txs
[
len
(
pack
.
txs
)
:
])]
if
len
(
s
.
txs
)
==
0
{
delete
(
pending
,
s
.
p
.
Peer
.
ID
())
}
// Send the pack in the background.
s
.
p
.
Log
()
.
Trace
(
"Sending batch of transactions"
,
"count"
,
len
(
pack
.
txs
),
"bytes"
,
size
)
sending
=
true
go
func
()
{
done
<-
pack
.
p
.
SendTransactions
(
pack
.
txs
)
}()
}
// pick chooses the next pending sync.
pick
:=
func
()
*
txsync
{
if
len
(
pending
)
==
0
{
return
nil
}
n
:=
rand
.
Intn
(
len
(
pending
))
+
1
for
_
,
s
:=
range
pending
{
if
n
--
;
n
==
0
{
return
s
}
}
return
nil
}
for
{
select
{
case
s
:=
<-
h
.
txsyncCh
:
pending
[
s
.
p
.
Peer
.
ID
()]
=
s
if
!
sending
{
send
(
s
)
}
case
err
:=
<-
done
:
sending
=
false
// Stop tracking peers that cause send failures.
if
err
!=
nil
{
pack
.
p
.
Log
()
.
Debug
(
"Transaction send failed"
,
"err"
,
err
)
delete
(
pending
,
pack
.
p
.
Peer
.
ID
())
}
// Schedule the next send.
if
s
:=
pick
();
s
!=
nil
{
send
(
s
)
}
case
<-
h
.
quitSync
:
return
}
}
p
.
AsyncSendPooledTransactionHashes
(
hashes
)
}
// chainSyncer coordinates blockchain sync components.
...
...
eth/sync_test.go
View file @
c368f728
...
...
@@ -28,6 +28,7 @@ import (
)
// Tests that fast sync is disabled after a successful sync cycle.
func
TestFastSyncDisabling65
(
t
*
testing
.
T
)
{
testFastSyncDisabling
(
t
,
eth
.
ETH65
)
}
func
TestFastSyncDisabling66
(
t
*
testing
.
T
)
{
testFastSyncDisabling
(
t
,
eth
.
ETH66
)
}
// Tests that fast sync gets disabled as soon as a real block is successfully
...
...
les/client_handler.go
View file @
c368f728
...
...
@@ -472,7 +472,7 @@ func (d *downloaderPeerNotify) registerPeer(p *serverPeer) {
handler
:
h
,
peer
:
p
,
}
h
.
downloader
.
RegisterLightPeer
(
p
.
id
,
eth
.
ETH6
6
,
pc
)
h
.
downloader
.
RegisterLightPeer
(
p
.
id
,
eth
.
ETH6
5
,
pc
)
}
func
(
d
*
downloaderPeerNotify
)
unregisterPeer
(
p
*
serverPeer
)
{
...
...
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