mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
les: fix checkpoint challenge
This commit is contained in:
parent
2b183c8355
commit
bdc80c155b
2 changed files with 17 additions and 19 deletions
|
|
@ -47,8 +47,8 @@ type clientHandler struct {
|
||||||
wg sync.WaitGroup // WaitGroup used to track all connected peers.
|
wg sync.WaitGroup // WaitGroup used to track all connected peers.
|
||||||
|
|
||||||
// Testing fields or hooks
|
// Testing fields or hooks
|
||||||
ignoreHeaders bool // Indicator whether ignore received headers
|
ignoreCheckpoint bool // Indicator whether ignore received checkpoint
|
||||||
syncDone func() // Test hooks when syncing is done.
|
syncDone func() // Test hooks when syncing is done.
|
||||||
}
|
}
|
||||||
|
|
||||||
func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.TrustedCheckpoint, backend *LightEthereum) *clientHandler {
|
func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.TrustedCheckpoint, backend *LightEthereum) *clientHandler {
|
||||||
|
|
@ -68,7 +68,7 @@ func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.T
|
||||||
}
|
}
|
||||||
var height uint64
|
var height uint64
|
||||||
if checkpoint != nil {
|
if checkpoint != nil {
|
||||||
height = (checkpoint.SectionIndex+1)*params.CHTFrequency - 1
|
height = (checkpoint.SectionIndex+1)*backend.iConfig.ChtSize - 1
|
||||||
}
|
}
|
||||||
handler.fetcher = newLightFetcher(handler)
|
handler.fetcher = newLightFetcher(handler)
|
||||||
handler.downloader = downloader.New(height, backend.chainDb, nil, backend.eventMux, nil, backend.blockchain, handler.removePeer)
|
handler.downloader = downloader.New(height, backend.chainDb, nil, backend.eventMux, nil, backend.blockchain, handler.removePeer)
|
||||||
|
|
@ -228,25 +228,23 @@ func (h *clientHandler) handleMsg(p *peer) error {
|
||||||
}
|
}
|
||||||
p.fcServer.ReceivedReply(resp.ReqID, resp.BV)
|
p.fcServer.ReceivedReply(resp.ReqID, resp.BV)
|
||||||
|
|
||||||
// If we are still waiting the checkpoint response.
|
// If no headers were received, but we're expecting a checkpoint header,
|
||||||
if !h.ignoreHeaders && p.syncDrop != nil {
|
// drop the unsynced server.
|
||||||
// First stop timer anyway.
|
if len(resp.Headers) == 0 && p.syncDrop != nil {
|
||||||
p.syncDrop.Stop()
|
p.syncDrop.Stop()
|
||||||
p.syncDrop = nil
|
p.syncDrop = nil
|
||||||
// If no headers were received or more headers received than we expect,
|
return errResp(ErrUselessPeer, "msg %v: %v", msg, err)
|
||||||
// reject the server directly.
|
}
|
||||||
//
|
// If we are still waiting the checkpoint response.
|
||||||
// Two cases here:
|
if len(resp.Headers) == 1 && p.syncDrop != nil {
|
||||||
// (1) The server is not synced, so no checkpoint header to response
|
if !h.ignoreCheckpoint && resp.Headers[0].Number.Uint64() == (h.checkpoint.SectionIndex+1)*h.backend.iConfig.ChtSize-1 {
|
||||||
// (2) The server sends us useless headers which we don't explicitly
|
// First stop timer anyway.
|
||||||
// request.
|
p.syncDrop.Stop()
|
||||||
if len(resp.Headers) != 1 {
|
p.syncDrop = nil
|
||||||
return errResp(ErrUselessPeer, "msg %v: %v", msg, err)
|
if resp.Headers[0].Hash() != h.checkpoint.SectionHead {
|
||||||
} else {
|
|
||||||
header := resp.Headers[0]
|
|
||||||
if header.Hash() != h.checkpoint.SectionHead {
|
|
||||||
return errResp(ErrUselessPeer, "msg %v: %v", msg, err)
|
return errResp(ErrUselessPeer, "msg %v: %v", msg, err)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Deliver response header to concrete requester.
|
// Deliver response header to concrete requester.
|
||||||
|
|
|
||||||
|
|
@ -687,7 +687,7 @@ func testCheckpointChallenge(t *testing.T, protocol int) {
|
||||||
t.Fatalf("Should pass checkpoint challenge")
|
t.Fatalf("Should pass checkpoint challenge")
|
||||||
}
|
}
|
||||||
|
|
||||||
client.handler.ignoreHeaders = true // Explicitly ignore all received headers, trigger timer
|
client.handler.ignoreCheckpoint = true // Explicitly ignore all received headers, trigger timer
|
||||||
// Create connected peer pair.
|
// Create connected peer pair.
|
||||||
_, err1, _, err2 = newTestPeerPair("peer2", protocol, server.handler, client.handler)
|
_, err1, _, err2 = newTestPeerPair("peer2", protocol, server.handler, client.handler)
|
||||||
select {
|
select {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue