Skip to content

Commit 1fd459d

Browse files
authored
l1-beacon-client: verify blobs using commitment only (not the proof) (ethereum-optimism#17725)
* recompute blob proof if skipBlobVerification * use even simpler verification * replace verification logic * refactor to make verification more direct This approach does not use any additional data from the beacon endpoint, aside from the blob itself, so anticipates future API changes where this will be the only data provided. * tweak comments * rename to verifyBlob * tweak test comments * Revert "op-service/L1BeaconClient: allow blob proof verification to be skipped via `l1.beacon.skip-blob-verification` flag (ethereum-optimism#17713)" This reverts commit 05ba528. * Revert "Add `skip-blob-verification` flag to op-program and op-challenger (ethereum-optimism#17718)" This reverts commit 3ee883b. * add an extra unit test
1 parent 25032f2 commit 1fd459d

18 files changed

Lines changed: 246 additions & 415 deletions

‎op-challenger/config/config.go‎

Lines changed: 70 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,16 @@ const (
6565
// This also contains config options for auxiliary services.
6666
// It is used to initialize the challenger.
6767
type Config struct {
68-
L1EthRpc string // L1 RPC Url
69-
L1Beacon string // L1 Beacon API Url
70-
L1BeaconSkipBlobVerification bool // Skip verification of the KZG proof for each blob. Not recommended unless the provided beacon endpoints are trusted.
71-
GameFactoryAddress common.Address // Address of the dispute game factory
72-
GameAllowlist []common.Address // Allowlist of fault game addresses
73-
GameWindow time.Duration // Maximum time duration to look for games to progress
74-
Datadir string // Data Directory
75-
MaxConcurrency uint // Maximum number of threads to use when progressing games
76-
PollInterval time.Duration // Polling interval for latest-block subscription when using an HTTP RPC provider
77-
AllowInvalidPrestate bool // Whether to allow responding to games where the prestate does not match
78-
MinUpdateInterval time.Duration // Minimum duration the L1 head block time must advance before scheduling a new update cycle
68+
L1EthRpc string // L1 RPC Url
69+
L1Beacon string // L1 Beacon API Url
70+
GameFactoryAddress common.Address // Address of the dispute game factory
71+
GameAllowlist []common.Address // Allowlist of fault game addresses
72+
GameWindow time.Duration // Maximum time duration to look for games to progress
73+
Datadir string // Data Directory
74+
MaxConcurrency uint // Maximum number of threads to use when progressing games
75+
PollInterval time.Duration // Polling interval for latest-block subscription when using an HTTP RPC provider
76+
AllowInvalidPrestate bool // Whether to allow responding to games where the prestate does not match
77+
MinUpdateInterval time.Duration // Minimum duration the L1 head block time must advance before scheduling a new update cycle
7978

8079
AdditionalBondClaimants []common.Address // List of addresses to claim bonds for in addition to the tx manager sender
8180

@@ -152,46 +151,42 @@ func NewInteropConfig(
152151
Datadir: datadir,
153152

154153
Cannon: vm.Config{
155-
VmType: types.TraceTypeCannon,
156-
L1: l1EthRpc,
157-
L1Beacon: l1BeaconApi,
158-
L1BeaconSkipBlobVerification: false,
159-
L2s: l2Rpcs,
160-
SnapshotFreq: DefaultCannonSnapshotFreq,
161-
InfoFreq: DefaultCannonInfoFreq,
162-
DebugInfo: true,
163-
BinarySnapshots: true,
154+
VmType: types.TraceTypeCannon,
155+
L1: l1EthRpc,
156+
L1Beacon: l1BeaconApi,
157+
L2s: l2Rpcs,
158+
SnapshotFreq: DefaultCannonSnapshotFreq,
159+
InfoFreq: DefaultCannonInfoFreq,
160+
DebugInfo: true,
161+
BinarySnapshots: true,
164162
},
165163
CannonKona: vm.Config{
166-
VmType: types.TraceTypeCannonKona,
167-
L1: l1EthRpc,
168-
L1Beacon: l1BeaconApi,
169-
L1BeaconSkipBlobVerification: false,
170-
L2s: l2Rpcs,
171-
SnapshotFreq: DefaultCannonSnapshotFreq,
172-
InfoFreq: DefaultCannonInfoFreq,
173-
DebugInfo: true,
174-
BinarySnapshots: true,
164+
VmType: types.TraceTypeCannonKona,
165+
L1: l1EthRpc,
166+
L1Beacon: l1BeaconApi,
167+
L2s: l2Rpcs,
168+
SnapshotFreq: DefaultCannonSnapshotFreq,
169+
InfoFreq: DefaultCannonInfoFreq,
170+
DebugInfo: true,
171+
BinarySnapshots: true,
175172
},
176173
Asterisc: vm.Config{
177-
VmType: types.TraceTypeAsterisc,
178-
L1: l1EthRpc,
179-
L1Beacon: l1BeaconApi,
180-
L1BeaconSkipBlobVerification: false,
181-
L2s: l2Rpcs,
182-
SnapshotFreq: DefaultAsteriscSnapshotFreq,
183-
InfoFreq: DefaultAsteriscInfoFreq,
184-
BinarySnapshots: true,
174+
VmType: types.TraceTypeAsterisc,
175+
L1: l1EthRpc,
176+
L1Beacon: l1BeaconApi,
177+
L2s: l2Rpcs,
178+
SnapshotFreq: DefaultAsteriscSnapshotFreq,
179+
InfoFreq: DefaultAsteriscInfoFreq,
180+
BinarySnapshots: true,
185181
},
186182
AsteriscKona: vm.Config{
187-
VmType: types.TraceTypeAsteriscKona,
188-
L1: l1EthRpc,
189-
L1Beacon: l1BeaconApi,
190-
L1BeaconSkipBlobVerification: false,
191-
L2s: l2Rpcs,
192-
SnapshotFreq: DefaultAsteriscSnapshotFreq,
193-
InfoFreq: DefaultAsteriscInfoFreq,
194-
BinarySnapshots: true,
183+
VmType: types.TraceTypeAsteriscKona,
184+
L1: l1EthRpc,
185+
L1Beacon: l1BeaconApi,
186+
L2s: l2Rpcs,
187+
SnapshotFreq: DefaultAsteriscSnapshotFreq,
188+
InfoFreq: DefaultAsteriscInfoFreq,
189+
BinarySnapshots: true,
195190
},
196191
GameWindow: DefaultGameWindow,
197192
}
@@ -226,46 +221,42 @@ func NewConfig(
226221
Datadir: datadir,
227222

228223
Cannon: vm.Config{
229-
VmType: types.TraceTypeCannon,
230-
L1: l1EthRpc,
231-
L1Beacon: l1BeaconApi,
232-
L1BeaconSkipBlobVerification: false,
233-
L2s: []string{l2EthRpc},
234-
SnapshotFreq: DefaultCannonSnapshotFreq,
235-
InfoFreq: DefaultCannonInfoFreq,
236-
DebugInfo: true,
237-
BinarySnapshots: true,
224+
VmType: types.TraceTypeCannon,
225+
L1: l1EthRpc,
226+
L1Beacon: l1BeaconApi,
227+
L2s: []string{l2EthRpc},
228+
SnapshotFreq: DefaultCannonSnapshotFreq,
229+
InfoFreq: DefaultCannonInfoFreq,
230+
DebugInfo: true,
231+
BinarySnapshots: true,
238232
},
239233
CannonKona: vm.Config{
240-
VmType: types.TraceTypeCannonKona,
241-
L1: l1EthRpc,
242-
L1Beacon: l1BeaconApi,
243-
L1BeaconSkipBlobVerification: false,
244-
L2s: []string{l2EthRpc},
245-
SnapshotFreq: DefaultCannonSnapshotFreq,
246-
InfoFreq: DefaultCannonInfoFreq,
247-
DebugInfo: true,
248-
BinarySnapshots: true,
234+
VmType: types.TraceTypeCannonKona,
235+
L1: l1EthRpc,
236+
L1Beacon: l1BeaconApi,
237+
L2s: []string{l2EthRpc},
238+
SnapshotFreq: DefaultCannonSnapshotFreq,
239+
InfoFreq: DefaultCannonInfoFreq,
240+
DebugInfo: true,
241+
BinarySnapshots: true,
249242
},
250243
Asterisc: vm.Config{
251-
VmType: types.TraceTypeAsterisc,
252-
L1: l1EthRpc,
253-
L1Beacon: l1BeaconApi,
254-
L1BeaconSkipBlobVerification: false,
255-
L2s: []string{l2EthRpc},
256-
SnapshotFreq: DefaultAsteriscSnapshotFreq,
257-
InfoFreq: DefaultAsteriscInfoFreq,
258-
BinarySnapshots: true,
244+
VmType: types.TraceTypeAsterisc,
245+
L1: l1EthRpc,
246+
L1Beacon: l1BeaconApi,
247+
L2s: []string{l2EthRpc},
248+
SnapshotFreq: DefaultAsteriscSnapshotFreq,
249+
InfoFreq: DefaultAsteriscInfoFreq,
250+
BinarySnapshots: true,
259251
},
260252
AsteriscKona: vm.Config{
261-
VmType: types.TraceTypeAsteriscKona,
262-
L1: l1EthRpc,
263-
L1Beacon: l1BeaconApi,
264-
L1BeaconSkipBlobVerification: false,
265-
L2s: []string{l2EthRpc},
266-
SnapshotFreq: DefaultAsteriscSnapshotFreq,
267-
InfoFreq: DefaultAsteriscInfoFreq,
268-
BinarySnapshots: true,
253+
VmType: types.TraceTypeAsteriscKona,
254+
L1: l1EthRpc,
255+
L1Beacon: l1BeaconApi,
256+
L2s: []string{l2EthRpc},
257+
SnapshotFreq: DefaultAsteriscSnapshotFreq,
258+
InfoFreq: DefaultAsteriscInfoFreq,
259+
BinarySnapshots: true,
269260
},
270261
GameWindow: DefaultGameWindow,
271262
}

‎op-challenger/flags/flags.go‎

Lines changed: 79 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,6 @@ var (
283283
EnvVars: prefixEnvVars("RESPONSE_DELAY_AFTER"),
284284
Value: config.DefaultResponseDelayAfter,
285285
}
286-
L1BeaconSkipBlobVerificationFlag = &cli.BoolFlag{
287-
Name: "l1-beacon-skip-blob-verification",
288-
Usage: "Skip verification of the KZG proof for each blob returned by the Beacon node. Not recommended unless the provided beacon endpoints are trusted.",
289-
EnvVars: prefixEnvVars("L1_BEACON_SKIP_BLOB_VERIFICATION"),
290-
Value: false,
291-
Hidden: true,
292-
}
293286
)
294287

295288
// requiredFlags are checked by [CheckRequired]
@@ -337,7 +330,6 @@ var optionalFlags = []cli.Flag{
337330
ResponseDelayFlag,
338331
ResponseDelayAfterFlag,
339332
L1GenesisFlag,
340-
L1BeaconSkipBlobVerificationFlag,
341333
}
342334

343335
func init() {
@@ -703,109 +695,103 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro
703695
networks := ctx.StringSlice(flags.NetworkFlagName)
704696
l1EthRpc := ctx.String(L1EthRpcFlag.Name)
705697
l1Beacon := ctx.String(L1BeaconFlag.Name)
706-
l1BeaconSkipBlobVerification := ctx.Bool(L1BeaconSkipBlobVerificationFlag.Name)
707698
l2Rpcs := ctx.StringSlice(L2EthRpcFlag.Name)
708699
l2Experimental := ctx.String(L2ExperimentalEthRpcFlag.Name)
709700
return &config.Config{
710701
// Required Flags
711-
L1EthRpc: l1EthRpc,
712-
L1Beacon: l1Beacon,
713-
L1BeaconSkipBlobVerification: l1BeaconSkipBlobVerification,
714-
TraceTypes: traceTypes,
715-
GameFactoryAddress: gameFactoryAddress,
716-
GameAllowlist: allowedGames,
717-
GameWindow: ctx.Duration(GameWindowFlag.Name),
718-
MaxConcurrency: maxConcurrency,
719-
L2Rpcs: l2Rpcs,
720-
MaxPendingTx: ctx.Uint64(MaxPendingTransactionsFlag.Name),
721-
PollInterval: ctx.Duration(HTTPPollInterval.Name),
722-
MinUpdateInterval: ctx.Duration(MinUpdateInterval.Name),
723-
AdditionalBondClaimants: claimants,
724-
RollupRpc: ctx.String(RollupRpcFlag.Name),
725-
SupervisorRPC: ctx.String(SupervisorRpcFlag.Name),
702+
L1EthRpc: l1EthRpc,
703+
L1Beacon: l1Beacon,
704+
TraceTypes: traceTypes,
705+
GameFactoryAddress: gameFactoryAddress,
706+
GameAllowlist: allowedGames,
707+
GameWindow: ctx.Duration(GameWindowFlag.Name),
708+
MaxConcurrency: maxConcurrency,
709+
L2Rpcs: l2Rpcs,
710+
MaxPendingTx: ctx.Uint64(MaxPendingTransactionsFlag.Name),
711+
PollInterval: ctx.Duration(HTTPPollInterval.Name),
712+
MinUpdateInterval: ctx.Duration(MinUpdateInterval.Name),
713+
AdditionalBondClaimants: claimants,
714+
RollupRpc: ctx.String(RollupRpcFlag.Name),
715+
SupervisorRPC: ctx.String(SupervisorRpcFlag.Name),
726716
Cannon: vm.Config{
727-
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
728-
VmType: types.TraceTypeCannon,
729-
L1: l1EthRpc,
730-
L1Beacon: l1Beacon,
731-
L1BeaconSkipBlobVerification: l1BeaconSkipBlobVerification,
732-
L2s: l2Rpcs,
733-
L2Experimental: l2Experimental,
734-
VmBin: ctx.String(CannonBinFlag.Name),
735-
Server: ctx.String(CannonServerFlag.Name),
736-
Networks: networks,
737-
L2Custom: ctx.Bool(CannonL2CustomFlag.Name),
738-
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeCannon),
739-
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeCannon),
740-
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeCannon),
741-
SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name),
742-
InfoFreq: ctx.Uint(CannonInfoFreqFlag.Name),
743-
DebugInfo: true,
744-
BinarySnapshots: true,
717+
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
718+
VmType: types.TraceTypeCannon,
719+
L1: l1EthRpc,
720+
L1Beacon: l1Beacon,
721+
L2s: l2Rpcs,
722+
L2Experimental: l2Experimental,
723+
VmBin: ctx.String(CannonBinFlag.Name),
724+
Server: ctx.String(CannonServerFlag.Name),
725+
Networks: networks,
726+
L2Custom: ctx.Bool(CannonL2CustomFlag.Name),
727+
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeCannon),
728+
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeCannon),
729+
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeCannon),
730+
SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name),
731+
InfoFreq: ctx.Uint(CannonInfoFreqFlag.Name),
732+
DebugInfo: true,
733+
BinarySnapshots: true,
745734
},
746735
CannonAbsolutePreState: ctx.String(CannonPreStateFlag.Name),
747736
CannonAbsolutePreStateBaseURL: cannonPreStatesURL,
748737
CannonKona: vm.Config{
749-
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
750-
VmType: types.TraceTypeCannonKona,
751-
L1: l1EthRpc,
752-
L1Beacon: l1Beacon,
753-
L1BeaconSkipBlobVerification: l1BeaconSkipBlobVerification,
754-
L2s: l2Rpcs,
755-
L2Experimental: l2Experimental,
756-
VmBin: ctx.String(CannonBinFlag.Name),
757-
Server: ctx.String(CannonKonaServerFlag.Name),
758-
Networks: networks,
759-
L2Custom: ctx.Bool(CannonKonaL2CustomFlag.Name),
760-
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeCannonKona),
761-
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeCannonKona),
762-
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeCannonKona),
763-
SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name),
764-
InfoFreq: ctx.Uint(CannonInfoFreqFlag.Name),
765-
DebugInfo: true,
766-
BinarySnapshots: true,
738+
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
739+
VmType: types.TraceTypeCannonKona,
740+
L1: l1EthRpc,
741+
L1Beacon: l1Beacon,
742+
L2s: l2Rpcs,
743+
L2Experimental: l2Experimental,
744+
VmBin: ctx.String(CannonBinFlag.Name),
745+
Server: ctx.String(CannonKonaServerFlag.Name),
746+
Networks: networks,
747+
L2Custom: ctx.Bool(CannonKonaL2CustomFlag.Name),
748+
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeCannonKona),
749+
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeCannonKona),
750+
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeCannonKona),
751+
SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name),
752+
InfoFreq: ctx.Uint(CannonInfoFreqFlag.Name),
753+
DebugInfo: true,
754+
BinarySnapshots: true,
767755
},
768756
CannonKonaAbsolutePreState: ctx.String(CannonKonaPreStateFlag.Name),
769757
CannonKonaAbsolutePreStateBaseURL: cannonKonaPreStatesURL,
770758
Datadir: ctx.String(DatadirFlag.Name),
771759
Asterisc: vm.Config{
772-
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
773-
VmType: types.TraceTypeAsterisc,
774-
L1: l1EthRpc,
775-
L1Beacon: l1Beacon,
776-
L1BeaconSkipBlobVerification: l1BeaconSkipBlobVerification,
777-
L2s: l2Rpcs,
778-
L2Experimental: l2Experimental,
779-
VmBin: ctx.String(AsteriscBinFlag.Name),
780-
Server: ctx.String(AsteriscServerFlag.Name),
781-
Networks: networks,
782-
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeAsterisc),
783-
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeAsterisc),
784-
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeAsterisc),
785-
SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name),
786-
InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.Name),
787-
BinarySnapshots: true,
760+
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
761+
VmType: types.TraceTypeAsterisc,
762+
L1: l1EthRpc,
763+
L1Beacon: l1Beacon,
764+
L2s: l2Rpcs,
765+
L2Experimental: l2Experimental,
766+
VmBin: ctx.String(AsteriscBinFlag.Name),
767+
Server: ctx.String(AsteriscServerFlag.Name),
768+
Networks: networks,
769+
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeAsterisc),
770+
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeAsterisc),
771+
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeAsterisc),
772+
SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name),
773+
InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.Name),
774+
BinarySnapshots: true,
788775
},
789776
AsteriscAbsolutePreState: ctx.String(AsteriscPreStateFlag.Name),
790777
AsteriscAbsolutePreStateBaseURL: asteriscPreStatesURL,
791778
AsteriscKona: vm.Config{
792-
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
793-
VmType: types.TraceTypeAsteriscKona,
794-
L1: l1EthRpc,
795-
L1Beacon: l1Beacon,
796-
L1BeaconSkipBlobVerification: l1BeaconSkipBlobVerification,
797-
L2s: l2Rpcs,
798-
L2Experimental: l2Experimental,
799-
VmBin: ctx.String(AsteriscBinFlag.Name),
800-
Server: ctx.String(AsteriscKonaServerFlag.Name),
801-
Networks: networks,
802-
L2Custom: ctx.Bool(AsteriscKonaL2CustomFlag.Name),
803-
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeAsteriscKona),
804-
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeAsteriscKona),
805-
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeAsteriscKona),
806-
SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name),
807-
InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.Name),
808-
BinarySnapshots: true,
779+
L1GenesisPath: ctx.String(L1GenesisFlag.Name),
780+
VmType: types.TraceTypeAsteriscKona,
781+
L1: l1EthRpc,
782+
L1Beacon: l1Beacon,
783+
L2s: l2Rpcs,
784+
L2Experimental: l2Experimental,
785+
VmBin: ctx.String(AsteriscBinFlag.Name),
786+
Server: ctx.String(AsteriscKonaServerFlag.Name),
787+
Networks: networks,
788+
L2Custom: ctx.Bool(AsteriscKonaL2CustomFlag.Name),
789+
RollupConfigPaths: RollupConfigFlag.StringSlice(ctx, types.TraceTypeAsteriscKona),
790+
L2GenesisPaths: L2GenesisFlag.StringSlice(ctx, types.TraceTypeAsteriscKona),
791+
DepsetConfigPath: DepsetConfigFlag.String(ctx, types.TraceTypeAsteriscKona),
792+
SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name),
793+
InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.Name),
794+
BinarySnapshots: true,
809795
},
810796
AsteriscKonaAbsolutePreState: ctx.String(AsteriscKonaPreStateFlag.Name),
811797
AsteriscKonaAbsolutePreStateBaseURL: asteriscKonaPreStatesURL,

0 commit comments

Comments
 (0)