Skip to content

Commit aff4b93

Browse files
authored
Portal beacon: reset LC store on setting new trusted block root (#3331)
1 parent b7c89e0 commit aff4b93

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

portal/client/nimbus_portal_client.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ proc run(portalClient: PortalClient, config: PortalConf) {.raises: [CatchableErr
328328
rpcServer.installPortalBeaconApiHandlers(
329329
node.beaconNetwork.value.portalProtocol
330330
)
331-
rpcServer.installPortalNimbusBeaconApiHandlers(node.beaconNetwork.value)
331+
if node.beaconLightClient.isSome():
332+
rpcServer.installPortalNimbusBeaconApiHandlers(node.beaconLightClient.value)
332333
if node.stateNetwork.isSome():
333334
rpcServer.installPortalCommonApiHandlers(
334335
node.stateNetwork.value.portalProtocol, PortalSubnetwork.state

portal/network/beacon/beacon_light_client.nim

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Nimbus - Portal Network
2-
# Copyright (c) 2022-2024 Status Research & Development GmbH
2+
# Copyright (c) 2022-2025 Status Research & Development GmbH
33
# Licensed and distributed under either of
44
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
55
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
@@ -193,6 +193,29 @@ proc stop*(lightClient: LightClient) {.async: (raises: []).} =
193193
proc resetToFinalizedHeader*(
194194
lightClient: LightClient,
195195
header: ForkedLightClientHeader,
196-
current_sync_committee: altair.SyncCommittee,
196+
current_sync_committee: SyncCommittee,
197197
) =
198198
lightClient.processor[].resetToFinalizedHeader(header, current_sync_committee)
199+
200+
proc resetToTrustedBlockRoot*(
201+
lightClient: LightClient, trustedBlockRoot: Digest
202+
) {.async: (raises: [CancelledError]).} =
203+
lightClient.network.trustedBlockRoot = Opt.some(trustedBlockRoot)
204+
205+
let bootstrap = (await lightClient.network.getLightClientBootstrap(trustedBlockRoot)).valueOr:
206+
warn "Could not get bootstrap, wait for offer"
207+
# Empty, this will reset the LC store.
208+
# Then it will continue requesting or can receive through an offer
209+
lightClient.processor[].resetToFinalizedHeader(
210+
ForkedLightClientHeader(), SyncCommittee()
211+
)
212+
return
213+
214+
withForkyBootstrap(bootstrap):
215+
when lcDataFork > LightClientDataFork.None:
216+
let forkedHeader = ForkedLightClientHeader.init(forkyBootstrap.header)
217+
lightClient.resetToFinalizedHeader(
218+
forkedHeader, forkyBootstrap.current_sync_committee
219+
)
220+
else:
221+
warn "Could not reset to trusted block root: no light client header pre Altair"

portal/rpc/rpc_portal_nimbus_beacon_api.nim

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
{.push raises: [].}
99

10-
import json_rpc/rpcserver, ../network/beacon/beacon_network
10+
import json_rpc/rpcserver, ../network/beacon/beacon_light_client
1111

1212
export rpcserver
1313

1414
# nimbus portal specific RPC methods for the Portal beacon network.
15-
proc installPortalNimbusBeaconApiHandlers*(rpcServer: RpcServer, n: BeaconNetwork) =
15+
proc installPortalNimbusBeaconApiHandlers*(rpcServer: RpcServer, lc: LightClient) =
1616
rpcServer.rpc("portal_nimbus_beaconSetTrustedBlockRoot") do(blockRoot: string) -> bool:
1717
let root = Digest.fromHex(blockRoot)
18-
n.trustedBlockRoot = Opt.some(root)
18+
await lc.resetToTrustedBlockRoot(root)
1919
true

0 commit comments

Comments
 (0)