Skip to content

Commit 05178a5

Browse files
committed
les: split handshake
les, core: introduce forkid for les4 les: update peer unit test les: check peer version in handler les: fix linter les: address comments
1 parent 23c8c74 commit 05178a5

File tree

6 files changed

+300
-362
lines changed

6 files changed

+300
-362
lines changed

core/forkid/forkid.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"strings"
2828

2929
"github.com/ethereum/go-ethereum/common"
30-
"github.com/ethereum/go-ethereum/core"
30+
"github.com/ethereum/go-ethereum/core/types"
3131
"github.com/ethereum/go-ethereum/log"
3232
"github.com/ethereum/go-ethereum/params"
3333
)
@@ -44,6 +44,18 @@ var (
4444
ErrLocalIncompatibleOrStale = errors.New("local incompatible or needs update")
4545
)
4646

47+
// Blockchain defines all necessary method to build a forkID.
48+
type Blockchain interface {
49+
// Config retrieves the chain's fork configuration.
50+
Config() *params.ChainConfig
51+
52+
// Genesis retrieves the chain's genesis block.
53+
Genesis() *types.Block
54+
55+
// CurrentHeader retrieves the current head header of the canonical chain.
56+
CurrentHeader() *types.Header
57+
}
58+
4759
// ID is a fork identifier as defined by EIP-2124.
4860
type ID struct {
4961
Hash [4]byte // CRC32 checksum of the genesis block and passed fork block numbers
@@ -54,7 +66,7 @@ type ID struct {
5466
type Filter func(id ID) error
5567

5668
// NewID calculates the Ethereum fork ID from the chain config and head.
57-
func NewID(chain *core.BlockChain) ID {
69+
func NewID(chain Blockchain) ID {
5870
return newID(
5971
chain.Config(),
6072
chain.Genesis().Hash(),
@@ -85,7 +97,7 @@ func newID(config *params.ChainConfig, genesis common.Hash, head uint64) ID {
8597

8698
// NewFilter creates a filter that returns if a fork ID should be rejected or not
8799
// based on the local chain's status.
88-
func NewFilter(chain *core.BlockChain) Filter {
100+
func NewFilter(chain Blockchain) Filter {
89101
return newFilter(
90102
chain.Config(),
91103
chain.Genesis().Hash(),

les/client_handler.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"github.com/ethereum/go-ethereum/common"
2525
"github.com/ethereum/go-ethereum/common/mclock"
26+
"github.com/ethereum/go-ethereum/core/forkid"
2627
"github.com/ethereum/go-ethereum/core/types"
2728
"github.com/ethereum/go-ethereum/eth/downloader"
2829
"github.com/ethereum/go-ethereum/light"
@@ -35,6 +36,7 @@ import (
3536
// responses.
3637
type clientHandler struct {
3738
ulc *ulc
39+
forkFilter forkid.Filter
3840
checkpoint *params.TrustedCheckpoint
3941
fetcher *lightFetcher
4042
downloader *downloader.Downloader
@@ -47,6 +49,7 @@ type clientHandler struct {
4749

4850
func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.TrustedCheckpoint, backend *LightEthereum) *clientHandler {
4951
handler := &clientHandler{
52+
forkFilter: forkid.NewFilter(backend.blockchain),
5053
checkpoint: checkpoint,
5154
backend: backend,
5255
closeCh: make(chan struct{}),
@@ -107,7 +110,7 @@ func (h *clientHandler) handle(p *peer) error {
107110
number = head.Number.Uint64()
108111
td = h.backend.blockchain.GetTd(hash, number)
109112
)
110-
if err := p.Handshake(td, hash, number, h.backend.blockchain.Genesis().Hash(), nil); err != nil {
113+
if err := p.handshakeWithServer(td, hash, number, h.backend.blockchain.Genesis().Hash(), forkid.NewID(h.backend.blockchain), h.forkFilter); err != nil {
111114
p.Log().Debug("Light Ethereum handshake failed", "err", err)
112115
return err
113116
}
@@ -159,8 +162,8 @@ func (h *clientHandler) handleMsg(p *peer) error {
159162
var deliverMsg *Msg
160163

161164
// Handle the message depending on its contents
162-
switch msg.Code {
163-
case AnnounceMsg:
165+
switch {
166+
case msg.Code == AnnounceMsg:
164167
p.Log().Trace("Received announce message")
165168
var req announceData
166169
if err := msg.Decode(&req); err != nil {
@@ -189,7 +192,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
189192
p.Log().Trace("Announce message content", "number", req.Number, "hash", req.Hash, "td", req.Td, "reorg", req.ReorgDepth)
190193
h.fetcher.announce(p, &req)
191194
}
192-
case BlockHeadersMsg:
195+
case msg.Code == BlockHeadersMsg:
193196
p.Log().Trace("Received block header response message")
194197
var resp struct {
195198
ReqID, BV uint64
@@ -206,7 +209,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
206209
log.Debug("Failed to deliver headers", "err", err)
207210
}
208211
}
209-
case BlockBodiesMsg:
212+
case msg.Code == BlockBodiesMsg:
210213
p.Log().Trace("Received block bodies response")
211214
var resp struct {
212215
ReqID, BV uint64
@@ -221,7 +224,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
221224
ReqID: resp.ReqID,
222225
Obj: resp.Data,
223226
}
224-
case CodeMsg:
227+
case msg.Code == CodeMsg:
225228
p.Log().Trace("Received code response")
226229
var resp struct {
227230
ReqID, BV uint64
@@ -236,7 +239,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
236239
ReqID: resp.ReqID,
237240
Obj: resp.Data,
238241
}
239-
case ReceiptsMsg:
242+
case msg.Code == ReceiptsMsg:
240243
p.Log().Trace("Received receipts response")
241244
var resp struct {
242245
ReqID, BV uint64
@@ -251,7 +254,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
251254
ReqID: resp.ReqID,
252255
Obj: resp.Receipts,
253256
}
254-
case ProofsV2Msg:
257+
case msg.Code == ProofsV2Msg:
255258
p.Log().Trace("Received les/2 proofs response")
256259
var resp struct {
257260
ReqID, BV uint64
@@ -266,7 +269,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
266269
ReqID: resp.ReqID,
267270
Obj: resp.Data,
268271
}
269-
case HelperTrieProofsMsg:
272+
case msg.Code == HelperTrieProofsMsg:
270273
p.Log().Trace("Received helper trie proof response")
271274
var resp struct {
272275
ReqID, BV uint64
@@ -281,7 +284,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
281284
ReqID: resp.ReqID,
282285
Obj: resp.Data,
283286
}
284-
case TxStatusMsg:
287+
case msg.Code == TxStatusMsg:
285288
p.Log().Trace("Received tx status response")
286289
var resp struct {
287290
ReqID, BV uint64
@@ -296,11 +299,11 @@ func (h *clientHandler) handleMsg(p *peer) error {
296299
ReqID: resp.ReqID,
297300
Obj: resp.Status,
298301
}
299-
case StopMsg:
302+
case msg.Code == StopMsg && p.version >= lpv3:
300303
p.freezeServer(true)
301304
h.backend.retriever.frozen(p)
302305
p.Log().Debug("Service stopped")
303-
case ResumeMsg:
306+
case msg.Code == ResumeMsg && p.version >= lpv3:
304307
var bv uint64
305308
if err := msg.Decode(&bv); err != nil {
306309
return errResp(ErrDecode, "msg %v: %v", msg, err)

0 commit comments

Comments
 (0)