From 0169d579d0eed4f6366697985a7b0f0b99402783 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 5 Jan 2022 16:12:47 +0100 Subject: [PATCH] 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 --- ethclient/ethclient.go | 54 +++++++++++++++++++++++++++++++++++++++--- interfaces.go | 7 +++++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 78194d04a..e6a93c96f 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -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), + } +} diff --git a/interfaces.go b/interfaces.go index daea1afb6..76c1ef690 100644 --- a/interfaces.go +++ b/interfaces.go @@ -102,7 +102,12 @@ type SyncProgress struct { CurrentBlock uint64 // Current block number where sync is at HighestBlock uint64 // Highest alleged block number in the chain - // Fields belonging to snap sync + // "fast sync" fields. These used to be sent by geth, but are no longer used + // since version v1.10. + PulledStates uint64 // Number of state trie entries already downloaded + KnownStates uint64 // Total number of state trie entries known about + + // "snap sync" fields. SyncedAccounts uint64 // Number of accounts downloaded SyncedAccountBytes uint64 // Number of account trie bytes persisted to disk SyncedBytecodes uint64 // Number of bytecodes downloaded