ethclient: fix unmarshaling of ethereum.SyncProgress (#24199)
SyncProgress was modified in PR #23576 to add the fields reported for snap sync. The PR also changed ethclient to use the SyncProgress struct directly instead of wrapping it for hex-decoding. This broke the SyncProgress method. Fix it by putting back the custom wrapper. While here, also put back the fast sync related fields because SyncProgress is stable API and thus removing fields is not allowed. Fixes #24180 Fixes #24176
This commit is contained in:
@ -298,11 +298,11 @@ func (ec *Client) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, err
|
||||
if err := json.Unmarshal(raw, &syncing); err == nil {
|
||||
return nil, nil // Not syncing (always false)
|
||||
}
|
||||
var progress *ethereum.SyncProgress
|
||||
if err := json.Unmarshal(raw, &progress); err != nil {
|
||||
var p *rpcProgress
|
||||
if err := json.Unmarshal(raw, &p); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return progress, nil
|
||||
return p.toSyncProgress(), nil
|
||||
}
|
||||
|
||||
// SubscribeNewHead subscribes to notifications about the current blockchain head
|
||||
@ -542,3 +542,51 @@ func toCallArg(msg ethereum.CallMsg) interface{} {
|
||||
}
|
||||
return arg
|
||||
}
|
||||
|
||||
// rpcProgress is a copy of SyncProgress with hex-encoded fields.
|
||||
type rpcProgress struct {
|
||||
StartingBlock hexutil.Uint64
|
||||
CurrentBlock hexutil.Uint64
|
||||
HighestBlock hexutil.Uint64
|
||||
|
||||
PulledStates hexutil.Uint64
|
||||
KnownStates hexutil.Uint64
|
||||
|
||||
SyncedAccounts hexutil.Uint64
|
||||
SyncedAccountBytes hexutil.Uint64
|
||||
SyncedBytecodes hexutil.Uint64
|
||||
SyncedBytecodeBytes hexutil.Uint64
|
||||
SyncedStorage hexutil.Uint64
|
||||
SyncedStorageBytes hexutil.Uint64
|
||||
HealedTrienodes hexutil.Uint64
|
||||
HealedTrienodeBytes hexutil.Uint64
|
||||
HealedBytecodes hexutil.Uint64
|
||||
HealedBytecodeBytes hexutil.Uint64
|
||||
HealingTrienodes hexutil.Uint64
|
||||
HealingBytecode hexutil.Uint64
|
||||
}
|
||||
|
||||
func (p *rpcProgress) toSyncProgress() *ethereum.SyncProgress {
|
||||
if p == nil {
|
||||
return nil
|
||||
}
|
||||
return ðereum.SyncProgress{
|
||||
StartingBlock: uint64(p.StartingBlock),
|
||||
CurrentBlock: uint64(p.CurrentBlock),
|
||||
HighestBlock: uint64(p.HighestBlock),
|
||||
PulledStates: uint64(p.PulledStates),
|
||||
KnownStates: uint64(p.KnownStates),
|
||||
SyncedAccounts: uint64(p.SyncedAccounts),
|
||||
SyncedAccountBytes: uint64(p.SyncedAccountBytes),
|
||||
SyncedBytecodes: uint64(p.SyncedBytecodes),
|
||||
SyncedBytecodeBytes: uint64(p.SyncedBytecodeBytes),
|
||||
SyncedStorage: uint64(p.SyncedStorage),
|
||||
SyncedStorageBytes: uint64(p.SyncedStorageBytes),
|
||||
HealedTrienodes: uint64(p.HealedTrienodes),
|
||||
HealedTrienodeBytes: uint64(p.HealedTrienodeBytes),
|
||||
HealedBytecodes: uint64(p.HealedBytecodes),
|
||||
HealedBytecodeBytes: uint64(p.HealedBytecodeBytes),
|
||||
HealingTrienodes: uint64(p.HealingTrienodes),
|
||||
HealingBytecode: uint64(p.HealingBytecode),
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user