diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-09-06 17:39:14 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-09-06 18:41:43 +0800 |
commit | 2924fdfcf7ab67a66a4ed3fb95cb9140be0cc809 (patch) | |
tree | 8ff6bb9a21870f6b26d2887ad82949a923d0d4df /ethclient/ethclient.go | |
parent | eac390f28955d66f9152102058e0d85d972bc033 (diff) | |
download | dexon-2924fdfcf7ab67a66a4ed3fb95cb9140be0cc809.tar.gz dexon-2924fdfcf7ab67a66a4ed3fb95cb9140be0cc809.tar.zst dexon-2924fdfcf7ab67a66a4ed3fb95cb9140be0cc809.zip |
ethereum, ethclient: add SyncProgress API endpoint
Diffstat (limited to 'ethclient/ethclient.go')
-rw-r--r-- | ethclient/ethclient.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 575a7cb44..50346f6ae 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -191,6 +191,39 @@ func toBlockNumArg(number *big.Int) string { return fmt.Sprintf("%#x", number) } +type rpcProgress struct { + StartingBlock rpc.HexNumber + CurrentBlock rpc.HexNumber + HighestBlock rpc.HexNumber + PulledStates rpc.HexNumber + KnownStates rpc.HexNumber +} + +// SyncProgress retrieves the current progress of the sync algorithm. If there's +// no sync currently running, it returns nil. +func (ec *Client) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { + var raw json.RawMessage + if err := ec.c.CallContext(ctx, &raw, "eth_syncing"); err != nil { + return nil, err + } + // Handle the possible response types + var syncing bool + if err := json.Unmarshal(raw, &syncing); err == nil { + return nil, nil // Not syncing (always false) + } + var progress *rpcProgress + if err := json.Unmarshal(raw, &progress); err != nil { + return nil, err + } + return ðereum.SyncProgress{ + StartingBlock: progress.StartingBlock.Uint64(), + CurrentBlock: progress.CurrentBlock.Uint64(), + HighestBlock: progress.HighestBlock.Uint64(), + PulledStates: progress.PulledStates.Uint64(), + KnownStates: progress.KnownStates.Uint64(), + }, nil +} + // SubscribeNewHead subscribes to notifications about the current blockchain head // on the given channel. func (ec *Client) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { |