Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Snap sync moving root/healing implementation #3332

Open
wants to merge 63 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
ff41a35
Add updateRoot method to fetchers
Mar 22, 2024
6c00e9c
Update the fetcher roots in syncWithPeer if fetcher already exists
Mar 22, 2024
74f0adc
Merge branch 'master' into snap-sync-moving-root
scorbajio Mar 22, 2024
8990b1f
Merge branch 'master' of https://github.com/ethereumjs/ethereumjs-mon…
Mar 27, 2024
dd21e73
Update fetcher roots on FCUs
Apr 4, 2024
9932c21
Merge branch 'master' of https://github.com/ethereumjs/ethereumjs-mon…
Apr 4, 2024
628135e
Merge branch 'snap-sync-moving-root' of https://github.com/ethereumjs…
Apr 4, 2024
19adeea
Call syncWithPeer directly from buildHeadState for updating root
Apr 5, 2024
1e1b1cc
Keep track of requested pathStrings to remove duplicate requests in T…
Apr 9, 2024
92ecef8
Merge branch 'master' into snap-sync-moving-root
scorbajio Apr 9, 2024
8077f4d
Fix test
Apr 10, 2024
6a2b266
Client -> Peer: add lastEthStatusUpdate property to Peer, set initial…
holgerd77 Apr 11, 2024
4dd9bf8
Redo handshake in client peer pool periodically, add force option to …
holgerd77 Apr 11, 2024
e268f9a
Some basic refinement of peer pool periodic request logic (refactor p…
holgerd77 Apr 15, 2024
b053277
Client: consolidate latest() method in base Synchronizer class
holgerd77 Apr 15, 2024
72a28d1
Client: add preparatory updatedBestHeader to Peer, refactor latest() …
holgerd77 Apr 15, 2024
f29c3c6
Client: add potential best header num differentiated logic to Peer, l…
holgerd77 Apr 15, 2024
6ea23b0
Client: add Fetcher hack to call peer.latest()
holgerd77 Apr 15, 2024
fabf53c
Various cleanups
holgerd77 Apr 15, 2024
ccf9366
Client: Fix lightsync.spec.ts tests
holgerd77 Apr 16, 2024
4cd01aa
Some clean-ups
holgerd77 Apr 16, 2024
5777c42
Client: Fix beaconsync.spec.ts tests
holgerd77 Apr 16, 2024
9ea28d8
Client: Fix fullsync.spec.tst tests
holgerd77 Apr 16, 2024
9a6ae27
Client: Fix snapsync.spec.ts tests
holgerd77 Apr 16, 2024
5c42d73
Client: Fix fetcher tests
holgerd77 Apr 16, 2024
9e60a09
Client: Fix eth syncing.spec.ts tests
holgerd77 Apr 16, 2024
d6c2a6c
Client: Fix integration tests
holgerd77 Apr 16, 2024
58cb2b4
Client: Backup lightsync integration tests (lightsync not supported a…
holgerd77 Apr 16, 2024
c53fa4b
Lightsync tests deprecation note
holgerd77 Apr 16, 2024
20bf36f
Merge remote-tracking branch 'origin/master' into client-add-mechanis…
acolytec3 Apr 17, 2024
fe9a4ec
Make lightsync tests run (but fail)
acolytec3 Apr 17, 2024
0117083
Merge branch 'master' into client-add-mechanism-to-redo-peer-handshak…
scorbajio Apr 18, 2024
694211e
Merge branch 'client-add-mechanism-to-redo-peer-handshake-for-status-…
Apr 18, 2024
d8028eb
Receive peer updates only in request function of fetchers
Apr 18, 2024
52d1f6e
Update fetcher roots on new latestHeader
Apr 18, 2024
2f88a6b
Merge branch 'snap-sync-moving-root' of https://github.com/ethereumjs…
Apr 18, 2024
560de58
Merge branch 'master' of https://github.com/ethereumjs/ethereumjs-mon…
Apr 23, 2024
9eb92a8
Merge branch 'master' of https://github.com/ethereumjs/ethereumjs-mon…
Apr 25, 2024
a1da2e6
Merge branch 'master' into snap-sync-moving-root
scorbajio Jun 24, 2024
d469538
Latest changes for integrating updated roots from latest function
scorbajio Jul 9, 2024
6488935
Merge branch 'master' into snap-sync-moving-root
scorbajio Jul 9, 2024
87ee2aa
fix linting issue
scorbajio Jul 9, 2024
d678d20
Merge branch 'snap-sync-moving-root' of github.com:ethereumjs/ethereu…
scorbajio Jul 9, 2024
50fb30b
Move over to getting latest in request function of relevant fetchers
scorbajio Jul 26, 2024
b6c02c4
Remove root field from fetcher classes that use the root in the flags…
scorbajio Jul 26, 2024
1cd9315
Remove unused parameter inputs
scorbajio Jul 26, 2024
591762e
Merge branch 'master' of github.com:ethereumjs/ethereumjs-monorepo in…
scorbajio Jul 26, 2024
9c8495f
Fix import and usage of proof function
scorbajio Jul 26, 2024
20db364
Do not set fetcherDoneFlags.stateRoot on FCU root updates
scorbajio Jul 29, 2024
edd0866
Update storageFetcher to track root and height of each request create…
scorbajio Jul 29, 2024
dca3e3f
Add constant for lookback window and debug
scorbajio Jul 30, 2024
3e8a1e4
debug, fix and get the snapsync sim working on dencun
g11tech Sep 6, 2024
9a3b14c
Add heal cycle repeat flag
scorbajio Sep 13, 2024
9395829
Make repeats accurate
scorbajio Sep 13, 2024
a73b659
Remove unused field
scorbajio Sep 13, 2024
4058a27
Merge branch 'master' of github.com:ethereumjs/ethereumjs-monorepo in…
scorbajio Sep 13, 2024
98808b5
Merge branch 'master' of github.com:ethereumjs/ethereumjs-monorepo in…
scorbajio Sep 19, 2024
e26989f
Merge branch 'master' of github.com:ethereumjs/ethereumjs-monorepo in…
scorbajio Sep 23, 2024
b5ede5e
Setup connect script for debugging devp2p payloads with live client
scorbajio Oct 14, 2024
b2f471a
Get connection established
scorbajio Oct 15, 2024
15f8906
Add capability to send message to live peer
scorbajio Oct 15, 2024
a17fe93
Add payload encoding to connect script
scorbajio Oct 17, 2024
c3946da
Merge branch 'master' of github.com:ethereumjs/ethereumjs-monorepo in…
scorbajio Oct 17, 2024
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
7 changes: 7 additions & 0 deletions packages/blockchain/src/blockchain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1319,6 +1319,13 @@ export class Blockchain implements BlockchainInterface {
number: 0,
stateRoot,
withdrawalsRoot: common.isActivatedEIP(4895) ? KECCAK256_RLP : undefined,
...(common.isActivatedEIP(4844)
? {
blobGasUsed: 0,
excessBlobGas: 0,
parentBeaconBlockRoot: new Uint8Array(32),
}
: undefined),
}
if (common.consensusType() === 'poa') {
if (common.genesis().extraData) {
Expand Down
4 changes: 4 additions & 0 deletions packages/client/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ export interface ConfigOptions {
pruneEngineCache?: boolean
snapAvailabilityDepth?: bigint
snapTransitionSafeDepth?: bigint
snapLookbackWindow?: number

/**
* Save account keys preimages in the meta db (default: false)
Expand Down Expand Up @@ -397,6 +398,7 @@ export class Config {
// distance from head at which we can safely transition from a synced snapstate to vmexecution
// randomly kept it at 5 for fast testing purposes but ideally should be >=32 slots
public static readonly SNAP_TRANSITION_SAFE_DEPTH = BigInt(5)
public static readonly SNAP_LOOKBACK_WINDOW = 1

// support blobs and proofs cache for CL getBlobs for upto 1 epoch of data
public static readonly BLOBS_AND_PROOFS_CACHE_BLOCKS = 32
Expand Down Expand Up @@ -448,6 +450,7 @@ export class Config {
public readonly engineNewpayloadMaxTxsExecute: number
public readonly snapAvailabilityDepth: bigint
public readonly snapTransitionSafeDepth: bigint
public readonly snapLookbackWindow: number

public readonly prefixStorageTrieKeys: boolean
// Defaulting to false as experimental as of now
Expand Down Expand Up @@ -543,6 +546,7 @@ export class Config {
this.snapAvailabilityDepth = options.snapAvailabilityDepth ?? Config.SNAP_AVAILABILITY_DEPTH
this.snapTransitionSafeDepth =
options.snapTransitionSafeDepth ?? Config.SNAP_TRANSITION_SAFE_DEPTH
this.snapLookbackWindow = options.snapLookbackWindow ?? Config.SNAP_LOOKBACK_WINDOW

this.prefixStorageTrieKeys = options.prefixStorageTrieKeys ?? true
this.enableSnapSync = options.enableSnapSync ?? false
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/net/server/rlpxserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export class RlpxServer extends Server {
super(options)
// As of now, the devp2p dpt server listens on the ip4 protocol by default and hence the ip in the
// bootnode needs to be of ip4 by default
this.ip = options.config.extIP ?? '0.0.0.0'
this.ip = options.config.extIP ?? '127.0.0.1'
this.discovery = options.config.discV4 || options.config.discDns
this.clientFilter = options.clientFilter ?? [
'go1.5',
Expand Down
68 changes: 46 additions & 22 deletions packages/client/src/sync/fetcher/accountfetcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ type AccountDataResponse = AccountData[] & { completed?: boolean }
* @memberof module:sync/fetcher
*/
export interface AccountFetcherOptions extends FetcherOptions {
/** Root hash of the account trie to serve */
root: Uint8Array
// height of block being targeted for snap sync
height: bigint

/** The origin to start account fetcher from (including), by default starts from 0 (0x0000...) */
first: bigint
Expand Down Expand Up @@ -72,7 +72,7 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
stateManager: MerkleStateManager
accountTrie: MerklePatriciaTrie

root: Uint8Array
height: bigint
highestKnownHash: Uint8Array | undefined

/** The origin to start account fetcher from (including), by default starts from 0 (0x0000...) */
Expand All @@ -92,7 +92,7 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
super(options)
this.fetcherDoneFlags = options.fetcherDoneFlags ?? getInitFetcherDoneFlags()

this.root = options.root
this.height = options.height
this.first = options.first
this.count = options.count ?? BIGINT_2EXP256 - this.first

Expand All @@ -104,7 +104,7 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
this.storageFetcher = new StorageFetcher({
config: this.config,
pool: this.pool,
root: this.root,
height: this.height,
storageRequests: [],
first: BIGINT_1,
destroyWhenDone: false,
Expand All @@ -122,7 +122,7 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
this.trieNodeFetcher = new TrieNodeFetcher({
config: this.config,
pool: this.pool,
root: this.root,
height: this.height,
stateManager: this.stateManager,
destroyWhenDone: false,
fetcherDoneFlags: this.fetcherDoneFlags,
Expand All @@ -138,7 +138,7 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>

this.DEBUG &&
this.debug(
`Account fetcher instantiated root=${short(this.root)} origin=${short(origin)} limit=${short(
`Account fetcher instantiated root=${short(this.fetcherDoneFlags.snapTargetRoot!)} origin=${short(origin)} limit=${short(
limit,
)} destroyWhenDone=${this.destroyWhenDone}`,
)
Expand Down Expand Up @@ -277,6 +277,12 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
}
break
case TrieNodeFetcher:
// TODO update to check if heal phase completed successfully and then continue with next
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this function with this case would/should anyway be called when heal phase completed successfully

// healing phase
if (fetcherDoneFlags.trieNodeFetcher.healCycleRepeatCount > 1) {
fetcherDoneFlags.trieNodeFetcher.healCycleRepeatCount--
break
}
fetcherDoneFlags.trieNodeFetcher.done = true
break
}
Expand All @@ -286,15 +292,21 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
accountFetcher.done && storageFetcher.done && byteCodeFetcher.done && trieNodeFetcher.done

this.config.superMsg(
`snapFetchersCompletion root=${short(this.root)} accountsRoot=${short(
fetcherDoneFlags.stateRoot ?? 'na',
)} done=${this.fetcherDoneFlags.done} accountsDone=${accountFetcher.done} storageDone=${
storageFetcher.done
} byteCodesDone=${byteCodeFetcher.done} trieNodesDone=${trieNodeFetcher.done}`,
`snapFetchersCompletion root=${short(
this.fetcherDoneFlags.snapTargetRoot!,
)} accountsRoot=${short(fetcherDoneFlags.stateRoot ?? 'na')} done=${
this.fetcherDoneFlags.done
} accountsDone=${accountFetcher.done} storageDone=${storageFetcher.done} byteCodesDone=${
byteCodeFetcher.done
} trieNodesDone=${trieNodeFetcher.done}`,
)

if (this.fetcherDoneFlags.done) {
this.config.events.emit(Event.SYNC_SNAPSYNC_COMPLETE, this.root, this.stateManager)
this.config.events.emit(
Event.SYNC_SNAPSYNC_COMPLETE,
this.fetcherDoneFlags.snapTargetRoot!,
this.stateManager,
)
}
}

Expand Down Expand Up @@ -378,18 +390,30 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
// TODOs:
// 1. Properly rewrite Fetcher with async/await -> allow to at least place in Fetcher.next()
// 2. Properly implement ETH request IDs -> allow to call on non-idle in Peer Pool
await peer?.latest()
const latest = await peer?.latest()
if (latest !== undefined && latest.stateRoot !== undefined) {
// TODO currently doing this check and update both in account and trienode fetchers since they
// could be running independently of eachother in some cases
const currentHeight = this.height
const newestHeight = latest.number
if (newestHeight - currentHeight >= this.config.snapLookbackWindow) {
this.fetcherDoneFlags.snapTargetHeight = latest.number
this.fetcherDoneFlags.snapTargetRoot = latest.stateRoot
this.fetcherDoneFlags.snapTargetHash = latest.hash()
this.height = newestHeight
}
}

const origin = this.getOrigin(job)
const limit = this.getLimit(job)

if (this.highestKnownHash && compareBytes(limit, this.highestKnownHash) < 0) {
// skip this job and don't rerequest it if it's limit is lower than the highest known key hash
this.DEBUG && this.debug(`skipping request with limit lower than highest known hash`)
return Object.assign([], [{ skipped: true }], { completed: true })
}

const rangeResult = await peer!.snap!.getAccountRange({
root: this.root,
root: this.fetcherDoneFlags.snapTargetRoot!,
origin,
limit,
bytes: BigInt(this.config.maxRangeBytes),
Expand All @@ -406,7 +430,7 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
if (rangeResult.proof.length > 0) {
try {
const isMissingRightRange = await verifyMerkleRangeProof(
this.root,
this.fetcherDoneFlags.snapTargetRoot!,
origin,
null,
[],
Expand All @@ -433,7 +457,11 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
try {
// verifyRangeProof will also verify validate there are no missed states between origin and
// response data
const isMissingRightRange = await this.verifyRangeProof(this.root, origin, rangeResult)
const isMissingRightRange = await this.verifyRangeProof(
this.fetcherDoneFlags.snapTargetRoot!,
origin,
rangeResult,
)

// Check if there is any pending data to be synced to the right
let completed: boolean
Expand Down Expand Up @@ -586,10 +614,6 @@ export class AccountFetcher extends Fetcher<JobTask, AccountData[], AccountData>
return tasks
}

updateStateRoot(stateRoot: Uint8Array) {
this.root = stateRoot
}

nextTasks(): void {
if (
this.in.length === 0 &&
Expand Down
54 changes: 46 additions & 8 deletions packages/client/src/sync/fetcher/storagefetcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,17 @@ export type StorageRequest = {
storageRoot: Uint8Array
first: bigint
count: bigint
stateRoot: Uint8Array // needed for verifying request if targetRoot has been updated since the creation of this request
height: bigint // needed for checking if request is still safely within stateRoot-lookback-window before requesting to avoid being banned by peer
}

/**
* Implements a snap1 based storage fetcher
* @memberof module:sync/fetcher
*/
export interface StorageFetcherOptions extends FetcherOptions {
/** Root hash of the account trie to serve */
root: Uint8Array
// height of block being targeted for snap sync
height: bigint

/** Storage requests to fetch */
storageRequests?: StorageRequest[]
Expand All @@ -64,11 +66,13 @@ export interface StorageFetcherOptions extends FetcherOptions {
export type JobTask = {
storageRequests: StorageRequest[]
multi: boolean
stateRoot: Uint8Array // needed for verifying request if targetRoot has been updated since the creation of this request
height: bigint // needed for checking if request is still safely within stateRoot-lookback-window before requesting to avoid being banned by peer
}

export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageData[]> {
protected debug: Debugger
root: Uint8Array
height: bigint
stateManager: MerkleStateManager
fetcherDoneFlags: SnapFetcherDoneFlags

Expand All @@ -87,7 +91,7 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
super(options)
this.fragmentedRequests = []

this.root = options.root
this.height = options.height
this.stateManager = options.stateManager ?? new MerkleStateManager()
this.fetcherDoneFlags = options.fetcherDoneFlags ?? getInitFetcherDoneFlags()
this.storageRequests = options.storageRequests ?? []
Expand All @@ -105,7 +109,7 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
this.debug(
`Storage fetcher instantiated with ${
fullJob.task.storageRequests.length
} accounts requested and root=${short(this.root)} origin=${short(origin)} limit=${short(
} accounts requested and root=${short(this.fetcherDoneFlags.snapTargetRoot!)} origin=${short(origin)} limit=${short(
limit,
)} destroyWhenDone=${this.destroyWhenDone}`,
)
Expand Down Expand Up @@ -223,12 +227,23 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
// TODOs:
// 1. Properly rewrite Fetcher with async/await -> allow to at least place in Fetcher.next()
// 2. Properly implement ETH request IDs -> allow to call on non-idle in Peer Pool
await peer?.latest()
const latest = await peer?.latest()
if (latest !== undefined && latest.stateRoot !== undefined) {
// TODO currently doing this check and update both in account and trienode fetchers since they
// could be running independently of eachother in some cases
const currentHeight = this.height
const newestHeight = latest.number
if (newestHeight - currentHeight >= this.config.snapLookbackWindow) {
this.fetcherDoneFlags.snapTargetHeight = latest.number
this.fetcherDoneFlags.snapTargetRoot = latest.stateRoot
this.fetcherDoneFlags.snapTargetHash = latest.hash()
}
}

const origin = this.getOrigin(job)
const limit = this.getLimit(job)

this.DEBUG && this.debug(`requested root: ${bytesToHex(this.root)}`)
this.DEBUG && this.debug(`requested root: ${bytesToHex(this.fetcherDoneFlags.snapTargetRoot!)}`)
this.DEBUG && this.debug(`requested origin: ${bytesToHex(origin)}`)
this.DEBUG && this.debug(`requested limit: ${bytesToHex(limit)}`)
this.DEBUG &&
Expand All @@ -251,8 +266,17 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
}
}

if (
this.fetcherDoneFlags.snapTargetHeight! - (task.height ?? task.storageRequests[0].height) >=
this.config.snapLookbackWindow
) {
// skip request if we are close to being outside of lookback range to avoid getting banned
this.debug(`skipping request that is close to being outside of lookback range`)
return Object.assign([], [{ skipped: true }], { completed: true })
}

const rangeResult = await peer!.snap!.getStorageRanges({
root: this.root,
root: task.stateRoot,
accounts: task.storageRequests.map((req) => req.accountHash),
origin,
limit,
Expand Down Expand Up @@ -393,6 +417,8 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
// start fetching from next hash after last slot hash of last account received
first: bytesToBigInt(highestReceivedhash),
count: TOTAL_RANGE_END - bytesToBigInt(highestReceivedhash),
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
} as StorageRequest)
}
// finally, we have to requeue account requests after fragmented account that were ignored
Expand Down Expand Up @@ -555,6 +581,8 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
tasks.unshift({
storageRequests: this.storageRequests, // TODO limit max number of accounts per single fetch request
multi: true,
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
})
this.storageRequests = [] // greedily request as many account slots by requesting all known ones
return tasks
Expand All @@ -579,8 +607,12 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
storageRoot: storageRequest!.storageRoot,
first: myFirst,
count: max,
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
},
],
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
first: myFirst,
count: max,
multi: false,
Expand All @@ -598,8 +630,12 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
storageRoot: storageRequest!.storageRoot,
first: myFirst,
count: myCount,
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
},
],
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
first: myFirst,
count: myCount,
multi: false,
Expand All @@ -615,6 +651,8 @@ export class StorageFetcher extends Fetcher<JobTask, StorageData[][], StorageDat
if (myCount !== BIGINT_0 && startedWith === whereFirstWas) {
// create new fragmented request to keep track of where to start building the next set of tasks for fetching the same account
this.fragmentedRequests.unshift({
stateRoot: this.fetcherDoneFlags.snapTargetRoot!, // TODO make sure the flags root or height being undefined isn't a possiblity here
height: this.fetcherDoneFlags.snapTargetHeight!,
accountHash: storageRequest!.accountHash,
storageRoot: storageRequest!.storageRoot,
first: myFirst,
Expand Down
Loading
Loading