From d2b6ce38019e12df456cfa9b1647a8fddbfff61a Mon Sep 17 00:00:00 2001 From: N Date: Tue, 1 Jul 2025 15:19:34 +0800 Subject: [PATCH] eth: add debug_syncTarget API --- eth/api_debug.go | 23 +++++++++++++++++++++++ internal/web3ext/web3ext.go | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/eth/api_debug.go b/eth/api_debug.go index 188dee11aa5b..cfac22087e6a 100644 --- a/eth/api_debug.go +++ b/eth/api_debug.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -443,3 +444,25 @@ func (api *DebugAPI) GetTrieFlushInterval() (string, error) { } return api.eth.blockchain.GetTrieFlushInterval().String(), nil } + +// SyncTarget sets the sync target for the downloader to a specific block hash. +func (api *DebugAPI) SyncTarget(target common.Hash) error { + if header := api.eth.BlockChain().GetHeaderByHash(target); header != nil { + return errors.New("sync target is already known in the chain") + } + + dl := api.eth.Downloader() + header, err := dl.GetHeader(target) + if err != nil { + return fmt.Errorf("failed to retrieve header for target %s: %w", target, err) + } + + // Trigger beacon sync with the new target + err = dl.BeaconSync(ethconfig.FullSync, header, header) + if err != nil { + return fmt.Errorf("failed to start beacon sync to target %s: %w", target, err) + } + + log.Info("BeaconSync set target to", "target", target, "number", header.Number) + return nil +} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index a6d93fc1c531..12e9d330ae9f 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -217,6 +217,11 @@ web3._extend({ call: 'debug_setHead', params: 1 }), + new web3._extend.Method({ + name: 'syncTarget', + call: 'debug_syncTarget', + params: 1 + }), new web3._extend.Method({ name: 'seedHash', call: 'debug_seedHash',