Skip to content

Commit e7b8f05

Browse files
davidtaikochaCopilotcyberhorsey
authored
feat(taiko-client): introduce --prover.localProposerAddresses flag (#19517)
Co-authored-by: Copilot <[email protected]> Co-authored-by: jeff <[email protected]>
1 parent 3fc156e commit e7b8f05

File tree

4 files changed

+88
-52
lines changed

4 files changed

+88
-52
lines changed

packages/taiko-client/cmd/flags/prover.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ var (
8080
Value: 10 * time.Second,
8181
EnvVars: []string{"PROVER_PROOF_POLLING_INTERVAL"},
8282
}
83+
LocalProposerAddresses = &cli.StringSliceFlag{
84+
Name: "prover.localProposerAddresses",
85+
Usage: "Comma separated list of local proposer addresses, " +
86+
"if set, prover will prove the batches proposed by these addresses before the assignment expiration time",
87+
Category: proverCategory,
88+
EnvVars: []string{"PROVER_LOCAL_PROPOSER_ADDRESSES"},
89+
}
8390
// Confirmations specific flag
8491
BlockConfirmations = &cli.Uint64Flag{
8592
Name: "prover.blockConfirmations",
@@ -128,6 +135,7 @@ var ProverFlags = MergeFlags(CommonFlags, []cli.Flag{
128135
TaikoTokenAddress,
129136
Allowance,
130137
ProofPollingInterval,
138+
LocalProposerAddresses,
131139
BlockConfirmations,
132140
RaikoRequestTimeout,
133141
RaikoZKVMHostEndpoint,

packages/taiko-client/prover/config.go

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/ethereum-optimism/optimism/op-service/txmgr"
1010
"github.com/ethereum/go-ethereum/common"
1111
"github.com/ethereum/go-ethereum/crypto"
12+
"github.com/ethereum/go-ethereum/log"
1213
"github.com/urfave/cli/v2"
1314

1415
"github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags"
@@ -38,6 +39,7 @@ type Config struct {
3839
RaikoZKVMHostEndpoint string
3940
RaikoJWT string
4041
RaikoRequestTimeout time.Duration
42+
LocalProposerAddresses []common.Address
4143
BlockConfirmations uint64
4244
TxmgrConfigs *txmgr.CLIConfig
4345
PrivateTxmgrConfigs *txmgr.CLIConfig
@@ -80,29 +82,40 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) {
8082
}
8183
}
8284

85+
var localProposerAddresses []common.Address
86+
for _, localProposerAddress := range c.StringSlice(flags.LocalProposerAddresses.Name) {
87+
if !common.IsHexAddress(localProposerAddress) {
88+
log.Debug("Invalid local proposer address", "address", localProposerAddress)
89+
continue
90+
}
91+
addr := common.HexToAddress(localProposerAddress)
92+
localProposerAddresses = append(localProposerAddresses, addr)
93+
}
94+
8395
return &Config{
84-
L1WsEndpoint: c.String(flags.L1WSEndpoint.Name),
85-
L2WsEndpoint: c.String(flags.L2WSEndpoint.Name),
86-
L2HttpEndpoint: c.String(flags.L2HTTPEndpoint.Name),
87-
TaikoInboxAddress: common.HexToAddress(c.String(flags.TaikoInboxAddress.Name)),
88-
TaikoAnchorAddress: common.HexToAddress(c.String(flags.TaikoAnchorAddress.Name)),
89-
TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)),
90-
ProverSetAddress: common.HexToAddress(c.String(flags.ProverSetAddress.Name)),
91-
L1ProverPrivKey: l1ProverPrivKey,
92-
RaikoHostEndpoint: c.String(flags.RaikoHostEndpoint.Name),
93-
RaikoZKVMHostEndpoint: c.String(flags.RaikoZKVMHostEndpoint.Name),
94-
RaikoJWT: common.Bytes2Hex(jwtSecret),
95-
RaikoRequestTimeout: c.Duration(flags.RaikoRequestTimeout.Name),
96-
StartingBatchID: startingBatchID,
97-
Dummy: c.Bool(flags.Dummy.Name),
98-
BackOffMaxRetries: c.Uint64(flags.BackOffMaxRetries.Name),
99-
BackOffRetryInterval: c.Duration(flags.BackOffRetryInterval.Name),
100-
ProveUnassignedBlocks: c.Bool(flags.ProveUnassignedBlocks.Name),
101-
RPCTimeout: c.Duration(flags.RPCTimeout.Name),
102-
ProveBatchesGasLimit: c.Uint64(flags.TxGasLimit.Name),
103-
Allowance: allowance,
104-
BlockConfirmations: c.Uint64(flags.BlockConfirmations.Name),
105-
TxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli(c.String(flags.L1WSEndpoint.Name), l1ProverPrivKey, c),
96+
L1WsEndpoint: c.String(flags.L1WSEndpoint.Name),
97+
L2WsEndpoint: c.String(flags.L2WSEndpoint.Name),
98+
L2HttpEndpoint: c.String(flags.L2HTTPEndpoint.Name),
99+
TaikoInboxAddress: common.HexToAddress(c.String(flags.TaikoInboxAddress.Name)),
100+
TaikoAnchorAddress: common.HexToAddress(c.String(flags.TaikoAnchorAddress.Name)),
101+
TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)),
102+
ProverSetAddress: common.HexToAddress(c.String(flags.ProverSetAddress.Name)),
103+
L1ProverPrivKey: l1ProverPrivKey,
104+
RaikoHostEndpoint: c.String(flags.RaikoHostEndpoint.Name),
105+
RaikoZKVMHostEndpoint: c.String(flags.RaikoZKVMHostEndpoint.Name),
106+
RaikoJWT: common.Bytes2Hex(jwtSecret),
107+
RaikoRequestTimeout: c.Duration(flags.RaikoRequestTimeout.Name),
108+
StartingBatchID: startingBatchID,
109+
Dummy: c.Bool(flags.Dummy.Name),
110+
BackOffMaxRetries: c.Uint64(flags.BackOffMaxRetries.Name),
111+
BackOffRetryInterval: c.Duration(flags.BackOffRetryInterval.Name),
112+
ProveUnassignedBlocks: c.Bool(flags.ProveUnassignedBlocks.Name),
113+
RPCTimeout: c.Duration(flags.RPCTimeout.Name),
114+
ProveBatchesGasLimit: c.Uint64(flags.TxGasLimit.Name),
115+
Allowance: allowance,
116+
LocalProposerAddresses: localProposerAddresses,
117+
BlockConfirmations: c.Uint64(flags.BlockConfirmations.Name),
118+
TxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli(c.String(flags.L1WSEndpoint.Name), l1ProverPrivKey, c),
106119
PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli(
107120
c.String(flags.L1PrivateEndpoint.Name),
108121
l1ProverPrivKey,

packages/taiko-client/prover/event_handler/batch_proposed.go

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"math/big"
8+
"slices"
89
"time"
910

1011
"github.com/cenkalti/backoff"
@@ -27,28 +28,30 @@ var (
2728

2829
// BatchProposedEventHandler is responsible for handling the BatchProposed event as a prover.
2930
type BatchProposedEventHandler struct {
30-
sharedState *state.SharedState
31-
proverAddress common.Address
32-
proverSetAddress common.Address
33-
rpc *rpc.Client
34-
assignmentExpiredCh chan<- metadata.TaikoProposalMetaData
35-
proofSubmissionCh chan<- *proofProducer.ProofRequestBody
36-
backOffRetryInterval time.Duration
37-
backOffMaxRetrys uint64
38-
proveUnassignedBlocks bool
31+
sharedState *state.SharedState
32+
proverAddress common.Address
33+
proverSetAddress common.Address
34+
rpc *rpc.Client
35+
localProposerAddresses []common.Address
36+
assignmentExpiredCh chan<- metadata.TaikoProposalMetaData
37+
proofSubmissionCh chan<- *proofProducer.ProofRequestBody
38+
backOffRetryInterval time.Duration
39+
backOffMaxRetrys uint64
40+
proveUnassignedBlocks bool
3941
}
4042

4143
// NewBatchProposedEventHandlerOps is the options for creating a new BatchProposedEventHandler.
4244
type NewBatchProposedEventHandlerOps struct {
43-
SharedState *state.SharedState
44-
ProverAddress common.Address
45-
ProverSetAddress common.Address
46-
RPC *rpc.Client
47-
AssignmentExpiredCh chan metadata.TaikoProposalMetaData
48-
ProofSubmissionCh chan *proofProducer.ProofRequestBody
49-
BackOffRetryInterval time.Duration
50-
BackOffMaxRetrys uint64
51-
ProveUnassignedBlocks bool
45+
SharedState *state.SharedState
46+
ProverAddress common.Address
47+
ProverSetAddress common.Address
48+
RPC *rpc.Client
49+
LocalProposerAddresses []common.Address
50+
AssignmentExpiredCh chan metadata.TaikoProposalMetaData
51+
ProofSubmissionCh chan *proofProducer.ProofRequestBody
52+
BackOffRetryInterval time.Duration
53+
BackOffMaxRetrys uint64
54+
ProveUnassignedBlocks bool
5255
}
5356

5457
// NewBatchProposedEventHandler creates a new BatchProposedEventHandler instance.
@@ -58,6 +61,7 @@ func NewBatchProposedEventHandler(opts *NewBatchProposedEventHandlerOps) *BatchP
5861
opts.ProverAddress,
5962
opts.ProverSetAddress,
6063
opts.RPC,
64+
opts.LocalProposerAddresses,
6165
opts.AssignmentExpiredCh,
6266
opts.ProofSubmissionCh,
6367
opts.BackOffRetryInterval,
@@ -196,12 +200,14 @@ func (h *BatchProposedEventHandler) checkExpirationAndSubmitProofPacaya(
196200
// if no and the current prover wants to prove unassigned blocks, then we should wait for its expiration.
197201
if !windowExpired &&
198202
meta.GetProposer() != h.proverAddress &&
199-
meta.GetProposer() != h.proverSetAddress {
203+
meta.GetProposer() != h.proverSetAddress &&
204+
!slices.Contains(h.localProposerAddresses, meta.GetProposer()) {
200205
log.Info(
201206
"Proposed batch is not provable by current prover at the moment",
202207
"batchID", meta.Pacaya().GetBatchID(),
203208
"prover", meta.GetProposer(),
204209
"timeToExpire", timeToExpire,
210+
"localProposerAddresses", h.localProposerAddresses,
205211
)
206212

207213
if h.proveUnassignedBlocks {
@@ -210,6 +216,7 @@ func (h *BatchProposedEventHandler) checkExpirationAndSubmitProofPacaya(
210216
"batchID", meta.Pacaya().GetBatchID(),
211217
"assignProver", meta.GetProposer(),
212218
"timeToExpire", timeToExpire,
219+
"localProposerAddresses", h.localProposerAddresses,
213220
)
214221
time.AfterFunc(
215222
// Add another 72 seconds, to ensure one more L1 block will be mined before the proof submission
@@ -225,18 +232,25 @@ func (h *BatchProposedEventHandler) checkExpirationAndSubmitProofPacaya(
225232
// we should skip proving this batch.
226233
if !h.proveUnassignedBlocks &&
227234
meta.GetProposer() != h.proverAddress &&
228-
meta.GetProposer() != h.proverSetAddress {
235+
meta.GetProposer() != h.proverSetAddress &&
236+
!slices.Contains(h.localProposerAddresses, meta.GetProposer()) {
229237
log.Info(
230238
"Expired batch is not provable by current prover",
231239
"batchID", meta.Pacaya().GetBatchID(),
232240
"currentProver", h.proverAddress,
233241
"currentProverSet", h.proverSetAddress,
234242
"assignProver", meta.GetProposer(),
243+
"localProposerAddresses", h.localProposerAddresses,
235244
)
236245
return nil
237246
}
238247

239-
log.Info("Proposed batch is provable", "batchID", meta.Pacaya().GetBatchID(), "assignProver", meta.GetProposer())
248+
log.Info(
249+
"Proposed batch is provable",
250+
"batchID", meta.Pacaya().GetBatchID(),
251+
"assignProver", meta.GetProposer(),
252+
"localProposerAddresses", h.localProposerAddresses,
253+
)
240254

241255
metrics.ProverProofsAssigned.Add(1)
242256

packages/taiko-client/prover/init.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -308,15 +308,16 @@ func (p *Prover) initEventHandlers() error {
308308
p.eventHandlers = &eventHandlers{}
309309
// ------- BatchProposed -------
310310
opts := &handler.NewBatchProposedEventHandlerOps{
311-
SharedState: p.sharedState,
312-
ProverAddress: p.ProverAddress(),
313-
ProverSetAddress: p.cfg.ProverSetAddress,
314-
RPC: p.rpc,
315-
AssignmentExpiredCh: p.assignmentExpiredCh,
316-
ProofSubmissionCh: p.proofSubmissionCh,
317-
BackOffRetryInterval: p.cfg.BackOffRetryInterval,
318-
BackOffMaxRetrys: p.cfg.BackOffMaxRetries,
319-
ProveUnassignedBlocks: p.cfg.ProveUnassignedBlocks,
311+
SharedState: p.sharedState,
312+
ProverAddress: p.ProverAddress(),
313+
ProverSetAddress: p.cfg.ProverSetAddress,
314+
RPC: p.rpc,
315+
LocalProposerAddresses: p.cfg.LocalProposerAddresses,
316+
AssignmentExpiredCh: p.assignmentExpiredCh,
317+
ProofSubmissionCh: p.proofSubmissionCh,
318+
BackOffRetryInterval: p.cfg.BackOffRetryInterval,
319+
BackOffMaxRetrys: p.cfg.BackOffMaxRetries,
320+
ProveUnassignedBlocks: p.cfg.ProveUnassignedBlocks,
320321
}
321322
p.eventHandlers.batchProposedHandler = handler.NewBatchProposedEventHandler(opts)
322323
// ------- BatchesProved -------

0 commit comments

Comments
 (0)