Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c0f15e9
feat: try to make full sync work. add log in syncState
wgr523 Jan 25, 2026
23fcba6
fix: when error getting snapshot, skip the error
wgr523 Feb 9, 2026
cee5d89
feat(downloader): add configurable pivot block for fast sync
wgr523 Feb 27, 2026
3724c25
chore: add fast sync args into docker entry start.sh
wgr523 Feb 28, 2026
e6bd9b1
style: more log about pivot
wgr523 Feb 28, 2026
144522d
feat: add FASTSYNC_PIVOT_ROOT, remove unnecessary verify
wgr523 Mar 1, 2026
0283f08
feat: re-add verify header for block after pivot
wgr523 Mar 2, 2026
7c90905
feat(downloader): sync multiple gap pivots during fast sync
wgr523 Mar 16, 2026
3493c0d
feat: move gap sync state after pivot sync state
wgr523 Mar 16, 2026
1d56bf3
feat: let processHeader wiat for state sync
wgr523 Mar 17, 2026
fbd8f9f
feat: add generateSnapshot in downloader for state sync
wgr523 Mar 18, 2026
ba6eb2d
feat: generate snapshot after state sync
wgr523 Mar 18, 2026
e55af5f
skip all header full verify during fast sync
wgr523 Mar 19, 2026
1845dab
chore: add fastsync args to devnet start.sh
wgr523 Mar 20, 2026
f499084
fix: statedb function, and better root choice in fast sync
wgr523 Mar 22, 2026
5b3204b
feat: when fullVerify=false, skip checkSignersOnCheckpoint
wgr523 Mar 29, 2026
d403c2b
fix: gen_config.go
wgr523 Mar 29, 2026
8f0705a
style: clean code comment
wgr523 Apr 2, 2026
d6618b3
feat: in fastsync make multiple headers feasible rather than one-by-one
wgr523 Apr 2, 2026
1f36fd3
feat: add fastsync args in start.sh
wgr523 Apr 3, 2026
b3bd2fa
Update cmd/utils/flags.go or better check on flags
wgr523 Apr 6, 2026
cfd954c
fix: use xdc_sort; better flags
wgr523 Apr 6, 2026
b04ac82
test: add fast sync pivot gap tests
wgr523 Apr 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions cicd/devnet/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,23 @@ else
gc_mode=$GC_MODE
fi

fastsync_args=""
if test -n "$FASTSYNC_PIVOT_NUMBER"
then
echo "FASTSYNC_PIVOT_NUMBER found, set to $FASTSYNC_PIVOT_NUMBER"
fastsync_args="${fastsync_args} --fastsyncpivotnumber ${FASTSYNC_PIVOT_NUMBER}"
fi
if test -n "$FASTSYNC_PIVOT_HASH"
then
echo "FASTSYNC_PIVOT_HASH found, set to $FASTSYNC_PIVOT_HASH"
fastsync_args="${fastsync_args} --fastsyncpivothash ${FASTSYNC_PIVOT_HASH}"
fi
if test -n "$FASTSYNC_PIVOT_ROOT"
then
echo "FASTSYNC_PIVOT_ROOT found, set to $FASTSYNC_PIVOT_ROOT"
fastsync_args="${fastsync_args} --fastsyncpivotroot ${FASTSYNC_PIVOT_ROOT}"
fi

miner_gaslimit=50000000
if test -z "$MINER_GASLIMIT"
then
Expand Down Expand Up @@ -133,5 +150,6 @@ XDC --ethstats ${netstats} \
--miner-gasprice "1" --miner-gaslimit "${miner_gaslimit}" --verbosity ${log_level} \
--debugdatadir /work/xdcchain \
--store-reward \
${fastsync_args} \
--ws --ws-addr=0.0.0.0 --ws-port $ws_port \
--ws-origins "*" 2>&1 >>/work/xdcchain/xdc.log | tee -a /work/xdcchain/xdc.log
17 changes: 17 additions & 0 deletions cicd/local/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,22 @@ else
fi

netstats="${NODE_NAME}-${wallet}:$ethstats_secret@$ethstats_address"
fastsync_args=""
if test -n "$FASTSYNC_PIVOT_NUMBER"
then
echo "FASTSYNC_PIVOT_NUMBER found, set to $FASTSYNC_PIVOT_NUMBER"
fastsync_args="${fastsync_args} --fastsyncpivotnumber ${FASTSYNC_PIVOT_NUMBER}"
fi
if test -n "$FASTSYNC_PIVOT_HASH"
then
echo "FASTSYNC_PIVOT_HASH found, set to $FASTSYNC_PIVOT_HASH"
fastsync_args="${fastsync_args} --fastsyncpivothash ${FASTSYNC_PIVOT_HASH}"
fi
if test -n "$FASTSYNC_PIVOT_ROOT"
then
echo "FASTSYNC_PIVOT_ROOT found, set to $FASTSYNC_PIVOT_ROOT"
fastsync_args="${fastsync_args} --fastsyncpivotroot ${FASTSYNC_PIVOT_ROOT}"
fi

echo "Running a node with wallet: ${wallet} at IP: ${instance_ip}"
echo "Starting nodes with $bootnodes ..."
Expand All @@ -148,5 +164,6 @@ XDC \
--miner-gasprice "1" --miner-gaslimit "${miner_gaslimit}" --verbosity ${log_level} \
--debugdatadir /work/xdcchain \
--store-reward \
${fastsync_args} \
--ws --ws-addr=0.0.0.0 --ws-port $ws_port \
--ws-origins "*" 2>&1 >>/work/xdcchain/xdc.log | tee -a /work/xdcchain/xdc.log
18 changes: 18 additions & 0 deletions cicd/mainnet/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,23 @@ fi

netstats="${NODE_NAME}-${wallet}:$ethstats_secret@$ethstats_address"

fastsync_args=""
if test -n "$FASTSYNC_PIVOT_NUMBER"
then
echo "FASTSYNC_PIVOT_NUMBER found, set to $FASTSYNC_PIVOT_NUMBER"
fastsync_args="${fastsync_args} --fastsyncpivotnumber ${FASTSYNC_PIVOT_NUMBER}"
fi
if test -n "$FASTSYNC_PIVOT_HASH"
then
echo "FASTSYNC_PIVOT_HASH found, set to $FASTSYNC_PIVOT_HASH"
fastsync_args="${fastsync_args} --fastsyncpivothash ${FASTSYNC_PIVOT_HASH}"
fi
if test -n "$FASTSYNC_PIVOT_ROOT"
then
echo "FASTSYNC_PIVOT_ROOT found, set to $FASTSYNC_PIVOT_ROOT"
fastsync_args="${fastsync_args} --fastsyncpivotroot ${FASTSYNC_PIVOT_ROOT}"
fi

INSTANCE_IP=$(curl https://checkip.amazonaws.com)

echo "Running a node with wallet: ${wallet} at IP: ${INSTANCE_IP}"
Expand All @@ -120,5 +137,6 @@ XDC --ethstats ${netstats} \
--miner-gasprice "1" --miner-gaslimit "420000000" --verbosity ${log_level} \
--debugdatadir /work/xdcchain \
--store-reward \
${fastsync_args} \
--ws --ws-addr=0.0.0.0 --ws-port $ws_port \
--ws-origins "*" 2>&1 >>/work/xdcchain/xdc.log | tee -a /work/xdcchain/xdc.log
18 changes: 18 additions & 0 deletions cicd/testnet/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,23 @@ fi

netstats="${NODE_NAME}-${wallet}:$ethstats_secret@$ethstats_address"

fastsync_args=""
if test -n "$FASTSYNC_PIVOT_NUMBER"
then
echo "FASTSYNC_PIVOT_NUMBER found, set to $FASTSYNC_PIVOT_NUMBER"
fastsync_args="${fastsync_args} --fastsyncpivotnumber ${FASTSYNC_PIVOT_NUMBER}"
fi
if test -n "$FASTSYNC_PIVOT_HASH"
then
echo "FASTSYNC_PIVOT_HASH found, set to $FASTSYNC_PIVOT_HASH"
fastsync_args="${fastsync_args} --fastsyncpivothash ${FASTSYNC_PIVOT_HASH}"
fi
if test -n "$FASTSYNC_PIVOT_ROOT"
then
echo "FASTSYNC_PIVOT_ROOT found, set to $FASTSYNC_PIVOT_ROOT"
fastsync_args="${fastsync_args} --fastsyncpivotroot ${FASTSYNC_PIVOT_ROOT}"
fi

INSTANCE_IP=$(curl https://checkip.amazonaws.com)


Expand All @@ -134,5 +151,6 @@ XDC --ethstats ${netstats} \
--miner-gasprice "1" --miner-gaslimit "420000000" --verbosity ${log_level} \
--debugdatadir /work/xdcchain \
--store-reward \
${fastsync_args} \
--ws --ws-addr=0.0.0.0 --ws-port $ws_port \
--ws-origins "*" 2>&1 >>/work/xdcchain/xdc.log | tee -a /work/xdcchain/xdc.log
3 changes: 3 additions & 0 deletions cmd/XDC/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ var (
utils.TxPoolGlobalQueueFlag,
utils.TxPoolLifetimeFlag,
utils.SyncModeFlag,
utils.FastSyncPivotNumberFlag,
utils.FastSyncPivotHashFlag,
utils.FastSyncPivotRootFlag,
utils.GCModeFlag,
// utils.LightServFlag, // deprecated
// utils.LightPeersFlag, // deprecated
Expand Down
42 changes: 42 additions & 0 deletions cmd/utils/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,24 @@ var (
Value: ethconfig.Defaults.SyncMode.String(),
Category: flags.EthCategory,
}
FastSyncPivotNumberFlag = &cli.Uint64Flag{
Name: "fastsyncpivotnumber",
Usage: "Pivot block number for fast sync (0 = use default calculation)",
Value: 0,
Category: flags.EthCategory,
}
FastSyncPivotHashFlag = &cli.StringFlag{
Name: "fastsyncpivothash",
Usage: "Pivot block hash for fast sync verification (hex string, must be set if fastsyncpivotnumber is set)",
Value: "",
Category: flags.EthCategory,
}
FastSyncPivotRootFlag = &cli.StringFlag{
Name: "fastsyncpivotroot",
Usage: "State root of pivot block for fast sync state download (hex string, zero = use latest.Root)",
Value: "",
Category: flags.EthCategory,
}
GCModeFlag = &cli.StringFlag{
Name: "gcmode",
Usage: `Blockchain garbage collection mode ("full", "archive")`,
Expand Down Expand Up @@ -1521,6 +1539,30 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) {
Fatalf("invalid --syncmode flag: %v", err)
}
}
pivotNumberSet := ctx.IsSet(FastSyncPivotNumberFlag.Name)
pivotHashSet := ctx.IsSet(FastSyncPivotHashFlag.Name)
pivotRootSet := ctx.IsSet(FastSyncPivotRootFlag.Name)
pivotHash := ctx.String(FastSyncPivotHashFlag.Name)
pivotRoot := ctx.String(FastSyncPivotRootFlag.Name)

if pivotNumberSet {
if !pivotHashSet || pivotHash == "" {
Fatalf("--%s must be set if --%s is set", FastSyncPivotHashFlag.Name, FastSyncPivotNumberFlag.Name)
}
if !pivotRootSet || pivotRoot == "" {
Fatalf("--%s must be set if --%s is set", FastSyncPivotRootFlag.Name, FastSyncPivotNumberFlag.Name)
}
cfg.FastSyncPivotNumber = ctx.Uint64(FastSyncPivotNumberFlag.Name)
cfg.FastSyncPivotHash = common.HexToHash(pivotHash)
cfg.FastSyncPivotRoot = common.HexToHash(pivotRoot)
} else {
if pivotHashSet {
Fatalf("--%s must not be set without --%s", FastSyncPivotHashFlag.Name, FastSyncPivotNumberFlag.Name)
}
if pivotRootSet {
Fatalf("--%s must not be set without --%s", FastSyncPivotRootFlag.Name, FastSyncPivotNumberFlag.Name)
}
}

if ctx.IsSet(CacheFlag.Name) || ctx.IsSet(CacheDatabaseFlag.Name) {
cfg.DatabaseCache = ctx.Int(CacheFlag.Name) * ctx.Int(CacheDatabaseFlag.Name) / 100
Expand Down
46 changes: 24 additions & 22 deletions consensus/XDPoS/engines/engine_v1/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,32 +243,34 @@ func (x *XDPoS_v1) verifyCascadingFields(chain consensus.ChainReader, header *ty
return x.verifySeal(chain, header, parents, fullVerify)
}

/*
BUG: snapshot returns wrong signers sometimes
when it happens we get the signers list by requesting smart contract
*/
// Retrieve the snapshot needed to verify this header and cache it
snap, err := x.snapshot(chain, number-1, header.ParentHash, parents, nil)
if err != nil {
return err
}
if fullVerify {
/*
BUG: snapshot returns wrong signers sometimes
when it happens we get the signers list by requesting smart contract
*/
// Retrieve the snapshot needed to verify this header and cache it
snap, err := x.snapshot(chain, number-1, header.ParentHash, parents, nil)
if err != nil {
return err
}

signers := snap.GetSigners()
err = x.checkSignersOnCheckpoint(chain, header, signers)
if err == nil {
return x.verifySeal(chain, header, parents, fullVerify)
}
signers := snap.GetSigners()
err = x.checkSignersOnCheckpoint(chain, header, signers)
if err == nil {
return x.verifySeal(chain, header, parents, fullVerify)
}

signers, err = x.getSignersFromContract(chain, header)
if err != nil {
return err
}
err = x.checkSignersOnCheckpoint(chain, header, signers)
if err == nil {
return x.verifySeal(chain, header, parents, fullVerify)
signers, err = x.getSignersFromContract(chain, header)
if err != nil {
return err
}
err = x.checkSignersOnCheckpoint(chain, header, signers)
if err == nil {
return x.verifySeal(chain, header, parents, fullVerify)
}
}

return err
return x.verifySeal(chain, header, parents, fullVerify)
}

func (x *XDPoS_v1) checkSignersOnCheckpoint(chain consensus.ChainReader, header *types.Header, signers []common.Address) error {
Expand Down
23 changes: 14 additions & 9 deletions consensus/XDPoS/engines/engine_v2/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,9 @@ func (x *XDPoS_v2) initial(chain consensus.ChainReader, header *types.Header) er
return fmt.Errorf("masternodes are empty v2 switch number: %d", x.config.V2.SwitchBlock.Uint64())
}

snap := newSnapshot(lastGapNum, lastGapHeader.Hash(), masternodes)
snap := NewSnapshot(lastGapNum, lastGapHeader.Hash(), masternodes)
x.snapshots.Add(snap.Hash, snap)
err = storeSnapshot(snap, x.db)
err = StoreSnapshot(snap, x.db)
if err != nil {
log.Error("[initial] Error while store snapshot", "error", err)
return err
Expand Down Expand Up @@ -594,11 +594,11 @@ func (x *XDPoS_v2) UpdateMasternodes(chain consensus.ChainReader, header *types.
}

x.lock.RLock()
snap := newSnapshot(number, header.Hash(), masterNodes)
snap := NewSnapshot(number, header.Hash(), masterNodes)
log.Info("[UpdateMasternodes] take snapshot", "number", number, "hash", header.Hash())
x.lock.RUnlock()

err := storeSnapshot(snap, x.db)
err := StoreSnapshot(snap, x.db)
if err != nil {
log.Error("[UpdateMasternodes] Error while store snapshot", "hash", header.Hash(), "currentRound", x.currentRound, "error", err)
return err
Expand Down Expand Up @@ -740,13 +740,18 @@ func (x *XDPoS_v2) VerifyBlockInfo(blockChainReader consensus.ChainReader, block
return nil
}

func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert *types.QuorumCert, parentHeader *types.Header) error {
func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert *types.QuorumCert, parents []*types.Header) error {
if quorumCert == nil {
log.Warn("[verifyQC] QC is Nil")
return utils.ErrInvalidQC
}

epochInfo, err := x.getEpochSwitchInfo(blockChainReader, parentHeader, quorumCert.ProposedBlockInfo.Hash)
// Find the parent header from the parents slice if available
var parentHeader *types.Header
if len(parents) != 0 {
parentHeader = parents[len(parents)-1]
}
epochInfo, err := x.getEpochSwitchInfo(blockChainReader, parents, quorumCert.ProposedBlockInfo.Hash)
if err != nil {
log.Error("[verifyQC] Error when getting epoch switch Info to verify QC", "Error", err)
return errors.New("fail to verify QC due to failure in getting epoch switch info")
Expand Down Expand Up @@ -934,7 +939,7 @@ func (x *XDPoS_v2) GetMasternodesFromEpochSwitchHeader(epochSwitchHeader *types.

// Given header, get master node from the epoch switch block of that epoch
func (x *XDPoS_v2) GetMasternodes(chain consensus.ChainReader, header *types.Header) []common.Address {
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, header, header.Hash())
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, []*types.Header{header}, header.Hash())
if err != nil {
log.Error("[GetMasternodes] Adaptor v2 getEpochSwitchInfo has error", "err", err)
return []common.Address{}
Expand All @@ -944,7 +949,7 @@ func (x *XDPoS_v2) GetMasternodes(chain consensus.ChainReader, header *types.Hea

// Given header, get master node from the epoch switch block of that epoch
func (x *XDPoS_v2) GetPenalties(chain consensus.ChainReader, header *types.Header) []common.Address {
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, header, header.Hash())
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, []*types.Header{header}, header.Hash())
if err != nil {
log.Error("[GetPenalties] Adaptor v2 getEpochSwitchInfo has error", "err", err)
return []common.Address{}
Expand All @@ -953,7 +958,7 @@ func (x *XDPoS_v2) GetPenalties(chain consensus.ChainReader, header *types.Heade
}

func (x *XDPoS_v2) GetStandbynodes(chain consensus.ChainReader, header *types.Header) []common.Address {
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, header, header.Hash())
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, []*types.Header{header}, header.Hash())
if err != nil {
log.Error("[GetStandbynodes] Adaptor v2 getEpochSwitchInfo has error", "err", err)
return []common.Address{}
Expand Down
Loading
Loading