diff --git a/packages/taiko-client/cmd/flags/common.go b/packages/taiko-client/cmd/flags/common.go index c77c89259ad..c03e38ac20f 100644 --- a/packages/taiko-client/cmd/flags/common.go +++ b/packages/taiko-client/cmd/flags/common.go @@ -28,6 +28,12 @@ var ( Category: commonCategory, EnvVars: []string{"L1_WS"}, } + L1PrivateTxEndpoint = &cli.StringFlag{ + Name: "l1.privateTx", + Usage: "RPC endpoint of a L1 private tx ethereum node", + Category: commonCategory, + EnvVars: []string{"L1_PRIVATE_TX"}, + } L2WSEndpoint = &cli.StringFlag{ Name: "l2.ws", Usage: "Websocket RPC endpoint of a L2 taiko-geth execution engine", @@ -167,6 +173,7 @@ var CommonFlags = []cli.Flag{ BackOffMaxRetries, BackOffRetryInterval, RPCTimeout, + L1PrivateTxEndpoint, } // MergeFlags merges the given flag slices. diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go b/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go index 200a3d6ada8..2d5f35b0104 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go @@ -216,7 +216,22 @@ func (s *BlobSyncerTestSuite) initProposer() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - }, nil)) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = prop } diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go b/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go index 117b2a0b5a9..2d3f225a3d1 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go @@ -79,7 +79,22 @@ func (s *ChainSyncerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - }, nil)) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = prop } diff --git a/packages/taiko-client/driver/driver_test.go b/packages/taiko-client/driver/driver_test.go index 1c2280e6f8e..82dc9fded7e 100644 --- a/packages/taiko-client/driver/driver_test.go +++ b/packages/taiko-client/driver/driver_test.go @@ -323,7 +323,22 @@ func (s *DriverTestSuite) InitProposer() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - }, nil)) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = p } diff --git a/packages/taiko-client/proposer/config.go b/packages/taiko-client/proposer/config.go index 4d1ea6c1caa..481e415c3c0 100644 --- a/packages/taiko-client/proposer/config.go +++ b/packages/taiko-client/proposer/config.go @@ -38,6 +38,7 @@ type Config struct { IncludeParentMetaHash bool BlobAllowed bool TxmgrConfigs *txmgr.CLIConfig + PrivateTxmgrConfigs *txmgr.CLIConfig } // NewConfigFromCliContext initializes a Config instance from @@ -105,5 +106,10 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { l1ProposerPrivKey, c, ), + PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( + c.String(flags.L1PrivateTxEndpoint.Name), + l1ProposerPrivKey, + c, + ), }, nil } diff --git a/packages/taiko-client/proposer/proposer.go b/packages/taiko-client/proposer/proposer.go index 517b04faad6..43ca187040b 100644 --- a/packages/taiko-client/proposer/proposer.go +++ b/packages/taiko-client/proposer/proposer.go @@ -51,7 +51,8 @@ type Proposer struct { lastProposedAt time.Time totalEpochs uint64 - txmgr *txmgr.SimpleTxManager + txmgr *txmgr.SimpleTxManager + privateTxmgr *txmgr.SimpleTxManager ctx context.Context wg sync.WaitGroup @@ -64,11 +65,15 @@ func (p *Proposer) InitFromCli(ctx context.Context, c *cli.Context) error { return err } - return p.InitFromConfig(ctx, cfg, nil) + return p.InitFromConfig(ctx, cfg, nil, nil) } // InitFromConfig initializes the proposer instance based on the given configurations. -func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config, txMgr *txmgr.SimpleTxManager) (err error) { +func (p *Proposer) InitFromConfig( + ctx context.Context, cfg *Config, + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, +) (err error) { p.proposerAddress = crypto.PubkeyToAddress(cfg.L1ProposerPrivKey.PublicKey) p.ctx = ctx p.Config = cfg @@ -100,6 +105,22 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config, txMgr *txmgr return err } } + if privateTxMgr != nil { + p.privateTxmgr = privateTxMgr + } else { + if cfg.PrivateTxmgrConfigs != nil && len(cfg.PrivateTxmgrConfigs.L1RPCURL) > 0 { + if p.privateTxmgr, err = txmgr.NewSimpleTxManager( + "privateTxProposer", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.PrivateTxmgrConfigs, + ); err != nil { + return err + } + } else { + p.privateTxmgr = nil + } + } chainConfig := config.NewChainConfig(p.rpc.L2.ChainID, new(big.Int).SetUint64(p.protocolConfigs.OntakeForkHeight)) @@ -356,16 +377,10 @@ func (p *Proposer) ProposeTxList( return err } - receipt, err := p.txmgr.Send(ctx, *txCandidate) - if err != nil { - log.Warn("Failed to send TaikoL1.proposeBlock transaction", "error", encoding.TryParsingCustomError(err)) + if err := p.sendTx(ctx, txCandidate); err != nil { return err } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("failed to propose block: %s", receipt.TxHash.Hex()) - } - log.Info("📝 Propose transactions succeeded", "txs", txNum) metrics.ProposerProposedTxListsCounter.Add(1) @@ -392,6 +407,29 @@ func (p *Proposer) updateProposingTicker() { p.proposingTimer = time.NewTimer(duration) } +func (p *Proposer) sendTx(ctx context.Context, txCandidate *txmgr.TxCandidate) error { + if p.privateTxmgr != nil { + receipt, err := p.privateTxmgr.Send(ctx, *txCandidate) + if err != nil || receipt.Status != types.ReceiptStatusSuccessful { + log.Warn("Failed to send TaikoL1.proposeBlock transaction by private tx manager", + "error", encoding.TryParsingCustomError(err), + ) + } else { + return nil + } + } + receipt, err := p.txmgr.Send(ctx, *txCandidate) + if err != nil { + log.Warn("Failed to send TaikoL1.proposeBlock transaction", "error", encoding.TryParsingCustomError(err)) + return err + } + + if receipt.Status != types.ReceiptStatusSuccessful { + return fmt.Errorf("failed to propose block: %s", receipt.TxHash.Hex()) + } + return nil +} + // Name returns the application name. func (p *Proposer) Name() string { return "proposer" diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index 778e9c4eade..5694a17d057 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -98,7 +98,22 @@ func (s *ProposerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - }, nil)) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = p s.cancel = cancel diff --git a/packages/taiko-client/prover/config.go b/packages/taiko-client/prover/config.go index 1a94d8c2731..2b12120bd10 100644 --- a/packages/taiko-client/prover/config.go +++ b/packages/taiko-client/prover/config.go @@ -59,6 +59,7 @@ type Config struct { L2NodeVersion string BlockConfirmations uint64 TxmgrConfigs *txmgr.CLIConfig + PrivateTxmgrConfigs *txmgr.CLIConfig } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -177,5 +178,10 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { l1ProverPrivKey, c, ), + PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( + c.String(flags.L1PrivateTxEndpoint.Name), + l1ProverPrivKey, + c, + ), }, nil } diff --git a/packages/taiko-client/prover/event_handler/transition_proved_test.go b/packages/taiko-client/prover/event_handler/transition_proved_test.go index b5ce3862770..763e2e76f75 100644 --- a/packages/taiko-client/prover/event_handler/transition_proved_test.go +++ b/packages/taiko-client/prover/event_handler/transition_proved_test.go @@ -103,7 +103,22 @@ func (s *EventHandlerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - }, nil)) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 1, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.proposer = prop } diff --git a/packages/taiko-client/prover/init.go b/packages/taiko-client/prover/init.go index 956184ef3a0..d47f84cbdcc 100644 --- a/packages/taiko-client/prover/init.go +++ b/packages/taiko-client/prover/init.go @@ -93,7 +93,6 @@ func (p *Prover) setApprovalAmount(ctx context.Context, contract common.Address) // initProofSubmitters initializes the proof submitters from the given tiers in protocol. func (p *Prover) initProofSubmitters( - txmgr *txmgr.SimpleTxManager, txBuilder *transaction.ProveBlockTxBuilder, tiers []*rpc.TierProviderTierWithID, ) error { @@ -138,7 +137,8 @@ func (p *Prover) initProofSubmitters( p.cfg.TaikoL2Address, p.cfg.Graffiti, p.cfg.ProveBlockGasLimit, - txmgr, + p.txmgr, + p.privateTxmgr, txBuilder, tiers, p.IsGuardianProver(), diff --git a/packages/taiko-client/prover/proof_submitter/proof_contester.go b/packages/taiko-client/prover/proof_submitter/proof_contester.go index 9207036452e..a68b57b1056 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_contester.go +++ b/packages/taiko-client/prover/proof_submitter/proof_contester.go @@ -33,6 +33,7 @@ func NewProofContester( rpcClient *rpc.Client, gasLimit uint64, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, proverSetAddress common.Address, graffiti string, builder *transaction.ProveBlockTxBuilder, @@ -40,7 +41,7 @@ func NewProofContester( return &ProofContester{ rpc: rpcClient, txBuilder: builder, - sender: transaction.NewSender(rpcClient, txmgr, proverSetAddress, gasLimit), + sender: transaction.NewSender(rpcClient, txmgr, privateTxmgr, proverSetAddress, gasLimit), graffiti: rpc.StringToBytes32(graffiti), } } @@ -93,7 +94,6 @@ func (c *ProofContester) SubmitContest( if err != nil { return err } - return c.sender.Send( ctx, &proofProducer.ProofWithHeader{ diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter.go b/packages/taiko-client/prover/proof_submitter/proof_submitter.go index 03d8859ac6f..a4d3b77c851 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter.go @@ -60,6 +60,7 @@ func NewProofSubmitter( graffiti string, gasLimit uint64, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, builder *transaction.ProveBlockTxBuilder, tiers []*rpc.TierProviderTierWithID, isGuardian bool, @@ -76,7 +77,7 @@ func NewProofSubmitter( resultCh: resultCh, anchorValidator: anchorValidator, txBuilder: builder, - sender: transaction.NewSender(rpcClient, txmgr, proverSetAddress, gasLimit), + sender: transaction.NewSender(rpcClient, txmgr, privateTxmgr, proverSetAddress, gasLimit), proverAddress: txmgr.From(), proverSetAddress: proverSetAddress, taikoL2Address: taikoL2Address, diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go b/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go index b9612151fa7..84926335d96 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go @@ -87,6 +87,7 @@ func (s *ProofSubmitterTestSuite) SetupTest() { "test", 0, txMgr, + nil, builder, tiers, false, @@ -97,6 +98,7 @@ func (s *ProofSubmitterTestSuite) SetupTest() { s.RPCClient, 0, txMgr, + nil, rpc.ZeroAddress, "test", builder, @@ -137,7 +139,7 @@ func (s *ProofSubmitterTestSuite) SetupTest() { L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - }, txMgr)) + }, txMgr, txMgr)) s.proposer = prop } @@ -176,6 +178,7 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { "test", 0, txMgr, + nil, s.submitter.txBuilder, s.submitter.tiers, false, @@ -196,6 +199,7 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { "test", 0, txMgr, + nil, s.submitter.txBuilder, s.submitter.tiers, false, diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender.go b/packages/taiko-client/prover/proof_submitter/transaction/sender.go index 1753ce6f711..3abd907acbe 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender.go @@ -22,6 +22,7 @@ import ( type Sender struct { rpc *rpc.Client txmgr *txmgr.SimpleTxManager + privateTxmgr *txmgr.SimpleTxManager proverSetAddress common.Address gasLimit uint64 } @@ -30,12 +31,14 @@ type Sender struct { func NewSender( cli *rpc.Client, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, proverSetAddress common.Address, gasLimit uint64, ) *Sender { return &Sender{ rpc: cli, txmgr: txmgr, + privateTxmgr: privateTxmgr, proverSetAddress: proverSetAddress, gasLimit: gasLimit, } @@ -75,6 +78,16 @@ func (s *Sender) Send( } // Send the transaction. + if s.privateTxmgr != nil { + receipt, err := s.privateTxmgr.Send(ctx, *txCandidate) + if err != nil || receipt.Status != types.ReceiptStatusSuccessful { + log.Warn("Failed to send transaction by private tx manager in sender", + "error", encoding.TryParsingCustomError(err), + ) + } else { + return nil + } + } receipt, err := s.txmgr.Send(ctx, *txCandidate) if err != nil { return encoding.TryParsingCustomError(err) diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go b/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go index 7d7df889061..35471a6e347 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go @@ -63,7 +63,7 @@ func (s *TransactionTestSuite) SetupTest() { ) s.Nil(err) - s.sender = NewSender(s.RPCClient, txmgr, ZeroAddress, 0) + s.sender = NewSender(s.RPCClient, txmgr, txmgr, ZeroAddress, 0) } func (s *TransactionTestSuite) TestIsSubmitProofTxErrorRetryable() { diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index 375d002448c..1a657e3a38e 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -70,7 +70,8 @@ type Prover struct { proofGenerationCh chan *proofProducer.ProofWithHeader // Transactions manager - txmgr *txmgr.SimpleTxManager + txmgr *txmgr.SimpleTxManager + privateTxmgr *txmgr.SimpleTxManager ctx context.Context wg sync.WaitGroup @@ -83,11 +84,16 @@ func (p *Prover) InitFromCli(ctx context.Context, c *cli.Context) error { return err } - return InitFromConfig(ctx, p, cfg, nil) + return InitFromConfig(ctx, p, cfg, nil, nil) } // InitFromConfig initializes the prover instance based on the given configurations. -func InitFromConfig(ctx context.Context, p *Prover, cfg *Config, txMgr *txmgr.SimpleTxManager) (err error) { +func InitFromConfig( + ctx context.Context, + p *Prover, cfg *Config, + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, +) (err error) { p.cfg = cfg p.ctx = ctx // Initialize state which will be shared by event handlers. @@ -158,8 +164,25 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config, txMgr *txmgr.Si } } + if privateTxMgr != nil { + p.privateTxmgr = privateTxMgr + } else { + if cfg.PrivateTxmgrConfigs != nil && len(cfg.PrivateTxmgrConfigs.L1RPCURL) > 0 { + if p.privateTxmgr, err = txmgr.NewSimpleTxManager( + "privateTxProver", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.PrivateTxmgrConfigs, + ); err != nil { + return err + } + } else { + p.privateTxmgr = nil + } + } + // Proof submitters - if err := p.initProofSubmitters(p.txmgr, txBuilder, tiers); err != nil { + if err := p.initProofSubmitters(txBuilder, tiers); err != nil { return err } @@ -168,6 +191,7 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config, txMgr *txmgr.Si p.rpc, p.cfg.ProveBlockGasLimit, p.txmgr, + p.privateTxmgr, p.cfg.ProverSetAddress, p.cfg.Graffiti, txBuilder, @@ -460,7 +484,6 @@ func (p *Prover) selectSubmitter(minTier uint16) proofSubmitter.Submitter { if !p.IsGuardianProver() && s.Tier() >= encoding.TierGuardianMinorityID { continue } - log.Debug("Proof submitter selected", "tier", s.Tier(), "minTier", minTier) return s } diff --git a/packages/taiko-client/prover/prover_test.go b/packages/taiko-client/prover/prover_test.go index 3f186bdb6af..4ef524d751c 100644 --- a/packages/taiko-client/prover/prover_test.go +++ b/packages/taiko-client/prover/prover_test.go @@ -110,7 +110,7 @@ func (s *ProverTestSuite) SetupTest() { L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - }, s.txmgr)) + }, s.txmgr, s.txmgr)) s.proposer = prop } @@ -140,7 +140,7 @@ func (s *ProverTestSuite) TestInitError() { RPCTimeout: 10 * time.Minute, BackOffRetryInterval: 3 * time.Second, BackOffMaxRetries: 12, - }, s.txmgr)) + }, s.txmgr, s.txmgr)) } func (s *ProverTestSuite) TestOnBlockProposed() { @@ -324,7 +324,7 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { // Protocol proof tiers tiers, err := s.RPCClient.GetTiers(context.Background()) s.Nil(err) - s.Nil(s.p.initProofSubmitters(s.p.txmgr, txBuilder, tiers)) + s.Nil(s.p.initProofSubmitters(txBuilder, tiers)) s.p.rpc.GuardianProverMinority, err = bindings.NewGuardianProver(s.p.cfg.GuardianProverMinorityAddress, s.p.rpc.L1) s.Nil(err) @@ -537,7 +537,7 @@ func (s *ProverTestSuite) initProver( BackOffMaxRetries: 12, L1NodeVersion: "1.0.0", L2NodeVersion: "0.1.0", - }, s.txmgr)) + }, s.txmgr, s.txmgr)) p.guardianProverHeartbeater = guardianProverHeartbeater.New( key,