Skip to content

Commit 8f03e3b

Browse files
tests/fuzzers/les: add fuzzer for les server handler (ethereum#22282)
* les: refactored server handler * tests/fuzzers/les: add fuzzer for les server handler * tests, les: update les fuzzer tests: update les fuzzer tests/fuzzer/les: release resources tests/fuzzer/les: pre-initialize all resources * les: refactored server handler and fuzzer Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
1 parent 8647233 commit 8f03e3b

File tree

9 files changed

+1218
-687
lines changed

9 files changed

+1218
-687
lines changed

les/handler_test.go

+17-17
Original file line numberDiff line numberDiff line change
@@ -65,27 +65,27 @@ func testGetBlockHeaders(t *testing.T, protocol int) {
6565
// Create a batch of tests for various scenarios
6666
limit := uint64(MaxHeaderFetch)
6767
tests := []struct {
68-
query *getBlockHeadersData // The query to execute for header retrieval
68+
query *GetBlockHeadersData // The query to execute for header retrieval
6969
expect []common.Hash // The hashes of the block whose headers are expected
7070
}{
7171
// A single random block should be retrievable by hash and number too
7272
{
73-
&getBlockHeadersData{Origin: hashOrNumber{Hash: bc.GetBlockByNumber(limit / 2).Hash()}, Amount: 1},
73+
&GetBlockHeadersData{Origin: hashOrNumber{Hash: bc.GetBlockByNumber(limit / 2).Hash()}, Amount: 1},
7474
[]common.Hash{bc.GetBlockByNumber(limit / 2).Hash()},
7575
}, {
76-
&getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 1},
76+
&GetBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 1},
7777
[]common.Hash{bc.GetBlockByNumber(limit / 2).Hash()},
7878
},
7979
// Multiple headers should be retrievable in both directions
8080
{
81-
&getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 3},
81+
&GetBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 3},
8282
[]common.Hash{
8383
bc.GetBlockByNumber(limit / 2).Hash(),
8484
bc.GetBlockByNumber(limit/2 + 1).Hash(),
8585
bc.GetBlockByNumber(limit/2 + 2).Hash(),
8686
},
8787
}, {
88-
&getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 3, Reverse: true},
88+
&GetBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 3, Reverse: true},
8989
[]common.Hash{
9090
bc.GetBlockByNumber(limit / 2).Hash(),
9191
bc.GetBlockByNumber(limit/2 - 1).Hash(),
@@ -94,14 +94,14 @@ func testGetBlockHeaders(t *testing.T, protocol int) {
9494
},
9595
// Multiple headers with skip lists should be retrievable
9696
{
97-
&getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3},
97+
&GetBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3},
9898
[]common.Hash{
9999
bc.GetBlockByNumber(limit / 2).Hash(),
100100
bc.GetBlockByNumber(limit/2 + 4).Hash(),
101101
bc.GetBlockByNumber(limit/2 + 8).Hash(),
102102
},
103103
}, {
104-
&getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3, Reverse: true},
104+
&GetBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3, Reverse: true},
105105
[]common.Hash{
106106
bc.GetBlockByNumber(limit / 2).Hash(),
107107
bc.GetBlockByNumber(limit/2 - 4).Hash(),
@@ -110,51 +110,51 @@ func testGetBlockHeaders(t *testing.T, protocol int) {
110110
},
111111
// The chain endpoints should be retrievable
112112
{
113-
&getBlockHeadersData{Origin: hashOrNumber{Number: 0}, Amount: 1},
113+
&GetBlockHeadersData{Origin: hashOrNumber{Number: 0}, Amount: 1},
114114
[]common.Hash{bc.GetBlockByNumber(0).Hash()},
115115
}, {
116-
&getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64()}, Amount: 1},
116+
&GetBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64()}, Amount: 1},
117117
[]common.Hash{bc.CurrentBlock().Hash()},
118118
},
119119
// Ensure protocol limits are honored
120120
//{
121-
// &getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 1}, Amount: limit + 10, Reverse: true},
121+
// &GetBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 1}, Amount: limit + 10, Reverse: true},
122122
// []common.Hash{},
123123
//},
124124
// Check that requesting more than available is handled gracefully
125125
{
126-
&getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 4}, Skip: 3, Amount: 3},
126+
&GetBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 4}, Skip: 3, Amount: 3},
127127
[]common.Hash{
128128
bc.GetBlockByNumber(bc.CurrentBlock().NumberU64() - 4).Hash(),
129129
bc.GetBlockByNumber(bc.CurrentBlock().NumberU64()).Hash(),
130130
},
131131
}, {
132-
&getBlockHeadersData{Origin: hashOrNumber{Number: 4}, Skip: 3, Amount: 3, Reverse: true},
132+
&GetBlockHeadersData{Origin: hashOrNumber{Number: 4}, Skip: 3, Amount: 3, Reverse: true},
133133
[]common.Hash{
134134
bc.GetBlockByNumber(4).Hash(),
135135
bc.GetBlockByNumber(0).Hash(),
136136
},
137137
},
138138
// Check that requesting more than available is handled gracefully, even if mid skip
139139
{
140-
&getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 4}, Skip: 2, Amount: 3},
140+
&GetBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 4}, Skip: 2, Amount: 3},
141141
[]common.Hash{
142142
bc.GetBlockByNumber(bc.CurrentBlock().NumberU64() - 4).Hash(),
143143
bc.GetBlockByNumber(bc.CurrentBlock().NumberU64() - 1).Hash(),
144144
},
145145
}, {
146-
&getBlockHeadersData{Origin: hashOrNumber{Number: 4}, Skip: 2, Amount: 3, Reverse: true},
146+
&GetBlockHeadersData{Origin: hashOrNumber{Number: 4}, Skip: 2, Amount: 3, Reverse: true},
147147
[]common.Hash{
148148
bc.GetBlockByNumber(4).Hash(),
149149
bc.GetBlockByNumber(1).Hash(),
150150
},
151151
},
152152
// Check that non existing headers aren't returned
153153
{
154-
&getBlockHeadersData{Origin: hashOrNumber{Hash: unknown}, Amount: 1},
154+
&GetBlockHeadersData{Origin: hashOrNumber{Hash: unknown}, Amount: 1},
155155
[]common.Hash{},
156156
}, {
157-
&getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() + 1}, Amount: 1},
157+
&GetBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() + 1}, Amount: 1},
158158
[]common.Hash{},
159159
},
160160
}
@@ -619,7 +619,7 @@ func TestStopResumeLes3(t *testing.T) {
619619
header := server.handler.blockchain.CurrentHeader()
620620
req := func() {
621621
reqID++
622-
sendRequest(server.peer.app, GetBlockHeadersMsg, reqID, &getBlockHeadersData{Origin: hashOrNumber{Hash: header.Hash()}, Amount: 1})
622+
sendRequest(server.peer.app, GetBlockHeadersMsg, reqID, &GetBlockHeadersData{Origin: hashOrNumber{Hash: header.Hash()}, Amount: 1})
623623
}
624624
for i := 1; i <= 5; i++ {
625625
// send requests while we still have enough buffer and expect a response

les/peer.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -432,14 +432,14 @@ func (p *serverPeer) sendRequest(msgcode, reqID uint64, data interface{}, amount
432432
// specified header query, based on the hash of an origin block.
433433
func (p *serverPeer) requestHeadersByHash(reqID uint64, origin common.Hash, amount int, skip int, reverse bool) error {
434434
p.Log().Debug("Fetching batch of headers", "count", amount, "fromhash", origin, "skip", skip, "reverse", reverse)
435-
return p.sendRequest(GetBlockHeadersMsg, reqID, &getBlockHeadersData{Origin: hashOrNumber{Hash: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}, amount)
435+
return p.sendRequest(GetBlockHeadersMsg, reqID, &GetBlockHeadersData{Origin: hashOrNumber{Hash: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}, amount)
436436
}
437437

438438
// requestHeadersByNumber fetches a batch of blocks' headers corresponding to the
439439
// specified header query, based on the number of an origin block.
440440
func (p *serverPeer) requestHeadersByNumber(reqID, origin uint64, amount int, skip int, reverse bool) error {
441441
p.Log().Debug("Fetching batch of headers", "count", amount, "fromnum", origin, "skip", skip, "reverse", reverse)
442-
return p.sendRequest(GetBlockHeadersMsg, reqID, &getBlockHeadersData{Origin: hashOrNumber{Number: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}, amount)
442+
return p.sendRequest(GetBlockHeadersMsg, reqID, &GetBlockHeadersData{Origin: hashOrNumber{Number: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}, amount)
443443
}
444444

445445
// requestBodies fetches a batch of blocks' bodies corresponding to the hashes

les/protocol.go

+57-8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"math/big"
2525

2626
"github.com/ethereum/go-ethereum/common"
27+
"github.com/ethereum/go-ethereum/core/types"
2728
"github.com/ethereum/go-ethereum/crypto"
2829
vfc "github.com/ethereum/go-ethereum/les/vflux/client"
2930
"github.com/ethereum/go-ethereum/p2p/enode"
@@ -83,6 +84,62 @@ const (
8384
ResumeMsg = 0x17
8485
)
8586

87+
// GetBlockHeadersData represents a block header query (the request ID is not included)
88+
type GetBlockHeadersData struct {
89+
Origin hashOrNumber // Block from which to retrieve headers
90+
Amount uint64 // Maximum number of headers to retrieve
91+
Skip uint64 // Blocks to skip between consecutive headers
92+
Reverse bool // Query direction (false = rising towards latest, true = falling towards genesis)
93+
}
94+
95+
// GetBlockHeadersPacket represents a block header request
96+
type GetBlockHeadersPacket struct {
97+
ReqID uint64
98+
Query GetBlockHeadersData
99+
}
100+
101+
// GetBlockBodiesPacket represents a block body request
102+
type GetBlockBodiesPacket struct {
103+
ReqID uint64
104+
Hashes []common.Hash
105+
}
106+
107+
// GetCodePacket represents a contract code request
108+
type GetCodePacket struct {
109+
ReqID uint64
110+
Reqs []CodeReq
111+
}
112+
113+
// GetReceiptsPacket represents a block receipts request
114+
type GetReceiptsPacket struct {
115+
ReqID uint64
116+
Hashes []common.Hash
117+
}
118+
119+
// GetProofsPacket represents a proof request
120+
type GetProofsPacket struct {
121+
ReqID uint64
122+
Reqs []ProofReq
123+
}
124+
125+
// GetHelperTrieProofsPacket represents a helper trie proof request
126+
type GetHelperTrieProofsPacket struct {
127+
ReqID uint64
128+
Reqs []HelperTrieReq
129+
}
130+
131+
// SendTxPacket represents a transaction propagation request
132+
type SendTxPacket struct {
133+
ReqID uint64
134+
Txs []*types.Transaction
135+
}
136+
137+
// GetTxStatusPacket represents a transaction status query
138+
type GetTxStatusPacket struct {
139+
ReqID uint64
140+
Hashes []common.Hash
141+
}
142+
86143
type requestInfo struct {
87144
name string
88145
maxCount uint64
@@ -229,14 +286,6 @@ type blockInfo struct {
229286
Td *big.Int // Total difficulty of one particular block being announced
230287
}
231288

232-
// getBlockHeadersData represents a block header query.
233-
type getBlockHeadersData struct {
234-
Origin hashOrNumber // Block from which to retrieve headers
235-
Amount uint64 // Maximum number of headers to retrieve
236-
Skip uint64 // Blocks to skip between consecutive headers
237-
Reverse bool // Query direction (false = rising towards latest, true = falling towards genesis)
238-
}
239-
240289
// hashOrNumber is a combined field for specifying an origin block.
241290
type hashOrNumber struct {
242291
Hash common.Hash // Block hash from which to retrieve headers (excludes Number)

0 commit comments

Comments
 (0)