From 507cdf07a7e24de538a87555c3a532875dfe0cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Wed, 12 Feb 2025 10:30:38 +0800 Subject: [PATCH 1/8] feat(taiko-client): zk any for ontake fork --- packages/taiko-client/prover/init.go | 12 +- .../prover/proof_producer/proof_producer.go | 11 +- .../prover/proof_producer/sgx_producer.go | 6 + .../prover/proof_producer/zkvm_producer.go | 180 +++++------------- packages/taiko-client/prover/prover.go | 54 ++++-- 5 files changed, 104 insertions(+), 159 deletions(-) diff --git a/packages/taiko-client/prover/init.go b/packages/taiko-client/prover/init.go index 9740e549c67..e6c15bd830c 100644 --- a/packages/taiko-client/prover/init.go +++ b/packages/taiko-client/prover/init.go @@ -116,23 +116,15 @@ func (p *Prover) initProofSubmitters( RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, } case encoding.TierZkVMRisc0ID: - producer = &proofProducer.ZKvmProofProducer{ - ZKProofType: proofProducer.ZKProofTypeR0, - RaikoHostEndpoint: p.cfg.RaikoZKVMHostEndpoint, - JWT: p.cfg.RaikoJWT, - Dummy: p.cfg.Dummy, - RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, - } - bufferSize = p.cfg.ZKVMProofBufferSize + continue case encoding.TierZkVMSp1ID: producer = &proofProducer.ZKvmProofProducer{ - ZKProofType: proofProducer.ZKProofTypeSP1, RaikoHostEndpoint: p.cfg.RaikoZKVMHostEndpoint, JWT: p.cfg.RaikoJWT, Dummy: p.cfg.Dummy, RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, } - bufferSize = p.cfg.ZKVMProofBufferSize + bufferSize = 0 case encoding.TierGuardianMinorityID: producer = proofProducer.NewGuardianProofProducer(encoding.TierGuardianMinorityID, p.cfg.EnableLivenessBondProof) bufferSize = 0 diff --git a/packages/taiko-client/prover/proof_producer/proof_producer.go b/packages/taiko-client/prover/proof_producer/proof_producer.go index fd43a611409..e15f3404b40 100644 --- a/packages/taiko-client/prover/proof_producer/proof_producer.go +++ b/packages/taiko-client/prover/proof_producer/proof_producer.go @@ -33,11 +33,12 @@ type ContestRequestBody struct { } type ProofResponse struct { - BlockID *big.Int - Meta metadata.TaikoProposalMetaData - Proof []byte - Opts ProofRequestOptions - Tier uint16 + BlockID *big.Int + Meta metadata.TaikoProposalMetaData + Proof []byte + Opts ProofRequestOptions + Tier uint16 + ProofType string } type BatchProofs struct { diff --git a/packages/taiko-client/prover/proof_producer/sgx_producer.go b/packages/taiko-client/prover/proof_producer/sgx_producer.go index a850835ec3f..b1b71ccae9a 100644 --- a/packages/taiko-client/prover/proof_producer/sgx_producer.go +++ b/packages/taiko-client/prover/proof_producer/sgx_producer.go @@ -44,6 +44,7 @@ type RaikoRequestProofBody struct { SGX *SGXRequestProofBodyParam `json:"sgx"` RISC0 *RISC0RequestProofBodyParam `json:"risc0"` SP1 *SP1RequestProofBodyParam `json:"sp1"` + ZkAny *ZkAnyRequestProofBodyParam `json:"zk_any"` } // RaikoRequestProofBodyV3 represents the JSON body for requesting the proof. @@ -79,6 +80,11 @@ type SP1RequestProofBodyParam struct { Verify bool `json:"verify"` } +// ZkAnyRequestProofBodyParam represents the JSON body of RaikoRequestProofBody's `zk_any` field. +type ZkAnyRequestProofBodyParam struct { + Aggregation bool `json:"aggregation"` +} + // RaikoRequestProofBodyResponse represents the JSON body of the response of the proof requests. type RaikoRequestProofBodyResponse struct { Data *RaikoProofData `json:"data"` diff --git a/packages/taiko-client/prover/proof_producer/zkvm_producer.go b/packages/taiko-client/prover/proof_producer/zkvm_producer.go index 8c2bda91250..ca0619bd0bc 100644 --- a/packages/taiko-client/prover/proof_producer/zkvm_producer.go +++ b/packages/taiko-client/prover/proof_producer/zkvm_producer.go @@ -22,15 +22,15 @@ import ( ) const ( - ZKProofTypeR0 = "risc0" - ZKProofTypeSP1 = "sp1" - RecursionPlonk = "plonk" - RecursionCompressed = "compressed" + ZKProofTypeR0 = "risc0" + ZKProofTypeSP1 = "sp1" + ZKProofTypeAny = "zk_any" ) var ( ErrProofInProgress = errors.New("work_in_progress") ErrRetry = errors.New("retry") + ErrZkAnyNotDrawn = errors.New("zk_any_not_drawn_error") StatusRegistered = "registered" ) @@ -39,6 +39,7 @@ type RaikoRequestProofBodyResponseV2 struct { Data *RaikoProofDataV2 `json:"data"` ErrorMessage string `json:"message"` Error string `json:"error"` + ProofType string `json:"proof_type"` } type RaikoProofDataV2 struct { @@ -54,7 +55,6 @@ type ProofDataV2 struct { // ZKvmProofProducer generates a ZK proof for the given block. type ZKvmProofProducer struct { - ZKProofType string // ZK Proof type RaikoHostEndpoint string RaikoRequestTimeout time.Duration JWT string // JWT provided by Raiko @@ -78,7 +78,6 @@ func (s *ZKvmProofProducer) RequestProof( "Request zk proof from raiko-host service", "blockID", blockID, "coinbase", meta.Ontake().GetCoinbase(), - "zkType", s.ZKProofType, "time", time.Since(requestAt), ) @@ -86,23 +85,18 @@ func (s *ZKvmProofProducer) RequestProof( return s.DummyProofProducer.RequestProof(opts, blockID, meta, s.Tier(), requestAt) } - proof, err := s.callProverDaemon(ctx, opts, requestAt) + proof, proofType, err := s.callProverDaemon(ctx, opts, requestAt) if err != nil { return nil, err } - if s.ZKProofType == ZKProofTypeR0 { - metrics.ProverR0ProofGeneratedCounter.Add(1) - } else if s.ZKProofType == ZKProofTypeSP1 { - metrics.ProverSp1ProofGeneratedCounter.Add(1) - } - return &ProofResponse{ - BlockID: blockID, - Meta: meta, - Proof: proof, - Opts: opts, - Tier: s.Tier(), + BlockID: blockID, + Meta: meta, + Proof: proof, + Opts: opts, + Tier: s.Tier(), + ProofType: proofType, }, nil } @@ -120,9 +114,10 @@ func (s *ZKvmProofProducer) Aggregate( items []*ProofResponse, requestAt time.Time, ) (*BatchProofs, error) { + zkType := items[0].ProofType log.Info( "Aggregate zkvm batch proofs from raiko-host service", - "zkType", s.ZKProofType, + "zkType", zkType, "batchSize", len(items), "firstID", items[0].BlockID, "lastID", items[len(items)-1].BlockID, @@ -142,18 +137,12 @@ func (s *ZKvmProofProducer) Aggregate( items[0].Opts.GetProverAddress(), items[0].Opts.GetGraffiti(), requestAt, + zkType, ) if err != nil { return nil, err } - switch s.ZKProofType { - case ZKProofTypeSP1: - metrics.ProverSp1ProofAggregationGeneratedCounter.Add(1) - default: - metrics.ProverR0ProofAggregationGeneratedCounter.Add(1) - } - return &BatchProofs{ ProofResponses: items, BatchProof: batchProof, @@ -167,7 +156,7 @@ func (s *ZKvmProofProducer) callProverDaemon( ctx context.Context, opts ProofRequestOptions, requestAt time.Time, -) ([]byte, error) { +) ([]byte, string, error) { var ( proof []byte ) @@ -183,19 +172,19 @@ func (s *ZKvmProofProducer) callProverDaemon( "error", err, "endpoint", s.RaikoHostEndpoint, ) - return nil, err + return nil, "", err } if output.Data.Status == ErrProofInProgress.Error() { - return nil, ErrProofInProgress + return nil, "", ErrProofInProgress } if output.Data.Status == StatusRegistered { - return nil, ErrRetry + return nil, "", ErrRetry } if !opts.OntakeOptions().Compressed { if len(output.Data.Proof.Proof) == 0 { - return nil, errEmptyProof + return nil, "", errEmptyProof } proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) } @@ -205,13 +194,15 @@ func (s *ZKvmProofProducer) callProverDaemon( "time", time.Since(requestAt), "producer", "ZKvmProofProducer", ) - if s.ZKProofType == ZKProofTypeR0 { + if output.ProofType == ZKProofTypeR0 { metrics.ProverR0ProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) - } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverR0ProofGeneratedCounter.Add(1) + } else if output.ProofType == ZKProofTypeSP1 { metrics.ProverSP1ProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + metrics.ProverSp1ProofGeneratedCounter.Add(1) } - return proof, nil + return proof, output.ProofType, nil } // requestProof sends a RPC request to proverd to try to get the requested proof. @@ -219,41 +210,11 @@ func (s *ZKvmProofProducer) requestProof( ctx context.Context, opts ProofRequestOptions, ) (*RaikoRequestProofBodyResponseV2, error) { - var ( - reqBody RaikoRequestProofBody - recursion string - ) - if opts.OntakeOptions().Compressed { - recursion = RecursionCompressed - } else { - recursion = RecursionPlonk - } - switch s.ZKProofType { - case ZKProofTypeSP1: - reqBody = RaikoRequestProofBody{ - Type: s.ZKProofType, - Block: opts.OntakeOptions().BlockID, - Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], - Graffiti: opts.OntakeOptions().Graffiti, - SP1: &SP1RequestProofBodyParam{ - Recursion: recursion, - Prover: "network", - Verify: true, - }, - } - default: - reqBody = RaikoRequestProofBody{ - Type: s.ZKProofType, - Block: opts.OntakeOptions().BlockID, - Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], - Graffiti: opts.OntakeOptions().Graffiti, - RISC0: &RISC0RequestProofBodyParam{ - Bonsai: true, - Snark: true, - Profile: false, - ExecutionPo2: big.NewInt(20), - }, - } + reqBody := RaikoRequestProofBody{ + Type: ZKProofTypeAny, + Block: opts.OntakeOptions().BlockID, + Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], + Graffiti: opts.OntakeOptions().Graffiti, } client := &http.Client{} @@ -275,7 +236,6 @@ func (s *ZKvmProofProducer) requestProof( log.Debug( "Send proof generation request", "blockID", opts.OntakeOptions().BlockID, - "zkProofType", s.ZKProofType, "input", string(jsonValue), ) @@ -301,7 +261,6 @@ func (s *ZKvmProofProducer) requestProof( log.Debug( "Proof generation output", "blockID", opts.OntakeOptions().BlockID, - "zkType", s.ZKProofType, "output", string(resBytes), ) var output RaikoRequestProofBodyResponseV2 @@ -310,10 +269,9 @@ func (s *ZKvmProofProducer) requestProof( } if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { - return nil, fmt.Errorf("failed to get zk proof, err: %s, msg: %s, zkType: %s", + return nil, fmt.Errorf("failed to get zk proof, err: %s, msg: %s", output.Error, output.ErrorMessage, - s.ZKProofType, ) } @@ -328,41 +286,11 @@ func (s *ZKvmProofProducer) requestCancel( return fmt.Errorf("proof cancellation is not supported for Pacaya fork") } - var ( - reqBody RaikoRequestProofBody - recursion string - ) - if opts.OntakeOptions().Compressed { - recursion = RecursionCompressed - } else { - recursion = RecursionPlonk - } - switch s.ZKProofType { - case ZKProofTypeSP1: - reqBody = RaikoRequestProofBody{ - Type: s.ZKProofType, - Block: opts.OntakeOptions().BlockID, - Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], - Graffiti: opts.OntakeOptions().Graffiti, - SP1: &SP1RequestProofBodyParam{ - Recursion: recursion, - Prover: "network", - Verify: true, - }, - } - default: - reqBody = RaikoRequestProofBody{ - Type: s.ZKProofType, - Block: opts.OntakeOptions().BlockID, - Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], - Graffiti: opts.OntakeOptions().Graffiti, - RISC0: &RISC0RequestProofBodyParam{ - Bonsai: true, - Snark: true, - Profile: false, - ExecutionPo2: big.NewInt(20), - }, - } + reqBody := RaikoRequestProofBody{ + Type: ZKProofTypeAny, + Block: opts.OntakeOptions().BlockID, + Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], + Graffiti: opts.OntakeOptions().Graffiti, } client := &http.Client{} @@ -406,6 +334,7 @@ func (s *ZKvmProofProducer) requestBatchProof( proverAddress common.Address, graffiti string, requestAt time.Time, + zkType string, ) ([]byte, error) { var ( proof []byte @@ -419,31 +348,20 @@ func (s *ZKvmProofProducer) requestBatchProof( blocks[i][0] = blockIDs[i] } var reqBody RaikoRequestProofBodyV3 - switch s.ZKProofType { + switch zkType { case ZKProofTypeSP1: reqBody = RaikoRequestProofBodyV3{ - Type: s.ZKProofType, + Type: zkType, Blocks: blocks, Prover: proverAddress.Hex()[2:], Graffiti: graffiti, - SP1: &SP1RequestProofBodyParam{ - Recursion: RecursionCompressed, - Prover: "network", - Verify: true, - }, } default: reqBody = RaikoRequestProofBodyV3{ - Type: s.ZKProofType, + Type: zkType, Blocks: blocks, Prover: proverAddress.Hex()[2:], Graffiti: graffiti, - RISC0: &RISC0RequestProofBodyParam{ - Bonsai: true, - Snark: true, - Profile: false, - ExecutionPo2: big.NewInt(20), - }, } } @@ -457,7 +375,7 @@ func (s *ZKvmProofProducer) requestBatchProof( log.Debug( "Send batch proof generation request", "blockIDs", blockIDs, - "zkProofType", s.ZKProofType, + "zkProofType", zkType, "input", string(jsonValue), ) @@ -493,7 +411,6 @@ func (s *ZKvmProofProducer) requestBatchProof( log.Debug( "Batch proof generation output", "blockIDs", blockIDs, - "zkProofType", s.ZKProofType, "output", string(resBytes), ) @@ -506,7 +423,7 @@ func (s *ZKvmProofProducer) requestBatchProof( return nil, fmt.Errorf("failed to get zk batch proof, err: %s, msg: %s, zkType: %s", output.Error, output.ErrorMessage, - s.ZKProofType, + zkType, ) } if output.Data == nil { @@ -532,10 +449,12 @@ func (s *ZKvmProofProducer) requestBatchProof( "producer", "ZKvmProofProducer", ) - if s.ZKProofType == ZKProofTypeR0 { + if zkType == ZKProofTypeR0 { metrics.ProverR0AggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) - } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverR0ProofAggregationGeneratedCounter.Add(1) + } else if zkType == ZKProofTypeSP1 { metrics.ProverSP1AggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + metrics.ProverSp1ProofAggregationGeneratedCounter.Add(1) } return proof, nil @@ -543,10 +462,5 @@ func (s *ZKvmProofProducer) requestBatchProof( // Tier implements the ProofProducer interface. func (s *ZKvmProofProducer) Tier() uint16 { - switch s.ZKProofType { - case ZKProofTypeSP1: - return encoding.TierZkVMSp1ID - default: - return encoding.TierZkVMRisc0ID - } + return encoding.TierZkVMSp1ID } diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index 13a4a80dfff..02dbe9de25e 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/log" + "github.com/pkg/errors" "github.com/urfave/cli/v2" "golang.org/x/sync/errgroup" @@ -466,18 +467,49 @@ func (p *Prover) requestProofOp(meta metadata.TaikoProposalMetaData, minTier uin minTier = encoding.TierGuardianMinorityID } } - if submitter := p.selectSubmitter(minTier); submitter != nil { - if err := submitter.RequestProof(p.ctx, meta); err != nil { - log.Error( - "Request new proof error", - "blockID", meta.Ontake().GetBlockID(), - "minTier", meta.Ontake().GetMinTier(), - "error", err, - ) - return err - } + if minTier == encoding.TierOptimisticID || minTier >= encoding.TierGuardianMinorityID { + if submitter := p.selectSubmitter(minTier); submitter != nil { + if err := submitter.RequestProof(p.ctx, meta); err != nil { + log.Error( + "Request new proof error", + "blockID", meta.Ontake().GetBlockID(), + "minTier", meta.Ontake().GetMinTier(), + "error", err, + ) + return err + } - return nil + return nil + } + } else { + if submitter := p.selectSubmitter(encoding.TierZkVMSp1ID); submitter != nil { + if err := submitter.RequestProof(p.ctx, meta); err != nil { + if errors.Is(err, proofProducer.ErrZkAnyNotDrawn) { + if sgxSubmitter := p.selectSubmitter(encoding.TierSgxID); sgxSubmitter != nil { + if err := sgxSubmitter.RequestProof(p.ctx, meta); err != nil { + log.Error( + "Request new proof error", + "blockID", meta.Ontake().GetBlockID(), + "proofType", "sgx", + "error", err, + ) + return err + } + return nil + } + } else { + log.Error( + "Request new proof error", + "blockID", meta.Ontake().GetBlockID(), + "proofType", "zkAny", + "error", err, + ) + return err + } + } else { + return nil + } + } } log.Error( From 54054e135828949e8b8821d63983725eeb4108e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Wed, 12 Feb 2025 10:54:52 +0800 Subject: [PATCH 2/8] fix --- packages/taiko-client/prover/proof_producer/zkvm_producer.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/taiko-client/prover/proof_producer/zkvm_producer.go b/packages/taiko-client/prover/proof_producer/zkvm_producer.go index ca0619bd0bc..e248b684d82 100644 --- a/packages/taiko-client/prover/proof_producer/zkvm_producer.go +++ b/packages/taiko-client/prover/proof_producer/zkvm_producer.go @@ -215,6 +215,9 @@ func (s *ZKvmProofProducer) requestProof( Block: opts.OntakeOptions().BlockID, Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], Graffiti: opts.OntakeOptions().Graffiti, + ZkAny: &ZkAnyRequestProofBodyParam{ + Aggregation: opts.OntakeOptions.Compressed, + }, } client := &http.Client{} From e2302a2a320dc35c443e599391fca973e7d98cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Wed, 12 Feb 2025 14:30:34 +0800 Subject: [PATCH 3/8] fix --- .../prover/proof_producer/zkvm_producer.go | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/taiko-client/prover/proof_producer/zkvm_producer.go b/packages/taiko-client/prover/proof_producer/zkvm_producer.go index e248b684d82..1bd5fec1b65 100644 --- a/packages/taiko-client/prover/proof_producer/zkvm_producer.go +++ b/packages/taiko-client/prover/proof_producer/zkvm_producer.go @@ -216,7 +216,7 @@ func (s *ZKvmProofProducer) requestProof( Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], Graffiti: opts.OntakeOptions().Graffiti, ZkAny: &ZkAnyRequestProofBodyParam{ - Aggregation: opts.OntakeOptions.Compressed, + Aggregation: opts.OntakeOptions().Compressed, }, } @@ -350,22 +350,12 @@ func (s *ZKvmProofProducer) requestBatchProof( for i := range blockIDs { blocks[i][0] = blockIDs[i] } - var reqBody RaikoRequestProofBodyV3 - switch zkType { - case ZKProofTypeSP1: - reqBody = RaikoRequestProofBodyV3{ - Type: zkType, - Blocks: blocks, - Prover: proverAddress.Hex()[2:], - Graffiti: graffiti, - } - default: - reqBody = RaikoRequestProofBodyV3{ - Type: zkType, - Blocks: blocks, - Prover: proverAddress.Hex()[2:], - Graffiti: graffiti, - } + + reqBody := RaikoRequestProofBodyV3{ + Type: zkType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, } client := &http.Client{} From 33a090cc136431251112756f07c9a82e47f01a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Wed, 12 Feb 2025 16:01:57 +0800 Subject: [PATCH 4/8] fix --- .../prover/proof_submitter/proof_submitter_ontake.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go b/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go index b27397f0137..e15dbc85c34 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ontakeBindings "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/ontake" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" @@ -312,6 +313,15 @@ func (s *ProofSubmitterOntake) SubmitProof( } // Build the TaikoL1.proveBlock transaction and send it to the L1 node. + var tier uint16 + switch proofResponse.ProofType { + case proofProducer.ZKProofTypeR0: + tier = encoding.TierZkVMRisc0ID + case proofProducer.ZKProofTypeSP1: + tier = encoding.TierZkVMSp1ID + default: + tier = proofResponse.Tier + } if err = s.sender.Send( ctx, proofResponse, @@ -325,7 +335,7 @@ func (s *ProofSubmitterOntake) SubmitProof( Graffiti: s.graffiti, }, &ontakeBindings.TaikoDataTierProof{ - Tier: proofResponse.Tier, + Tier: tier, Data: proofResponse.Proof, }, proofResponse.Tier, From 23d7de8c139368bf3164e8248e5df92fffa579a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Wed, 12 Feb 2025 18:46:37 +0800 Subject: [PATCH 5/8] fix --- .../prover/proof_submitter/proof_submitter_ontake.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go b/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go index e15dbc85c34..e7adb6b135a 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go @@ -188,6 +188,9 @@ func (s *ProofSubmitterOntake) RequestProof(ctx context.Context, meta metadata.T } return nil } + if errors.Is(err, proofProducer.ErrZkAnyNotDrawn) { + return backoff.Permanent(err) + } return fmt.Errorf("failed to request proof (id: %d): %w", meta.Ontake().GetBlockID(), err) } if s.proofBuffer.Enabled() { From 65f425004013600f6979101246a09a0831c0efdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Fri, 14 Feb 2025 16:37:12 +0800 Subject: [PATCH 6/8] sync changes --- .../prover/proof_producer/proof_producer.go | 1 + .../prover/proof_producer/zkvm_producer.go | 28 +++++++++++++------ .../proof_submitter/proof_submitter_ontake.go | 2 ++ .../proof_submitter/transaction/sender.go | 2 ++ packages/taiko-client/prover/prover.go | 3 ++ 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/packages/taiko-client/prover/proof_producer/proof_producer.go b/packages/taiko-client/prover/proof_producer/proof_producer.go index e15f3404b40..043ff21e897 100644 --- a/packages/taiko-client/prover/proof_producer/proof_producer.go +++ b/packages/taiko-client/prover/proof_producer/proof_producer.go @@ -46,6 +46,7 @@ type BatchProofs struct { BatchProof []byte Tier uint16 BlockIDs []*big.Int + ProofType string } type ProofProducer interface { diff --git a/packages/taiko-client/prover/proof_producer/zkvm_producer.go b/packages/taiko-client/prover/proof_producer/zkvm_producer.go index 1bd5fec1b65..77e3ddaa7da 100644 --- a/packages/taiko-client/prover/proof_producer/zkvm_producer.go +++ b/packages/taiko-client/prover/proof_producer/zkvm_producer.go @@ -30,7 +30,7 @@ const ( var ( ErrProofInProgress = errors.New("work_in_progress") ErrRetry = errors.New("retry") - ErrZkAnyNotDrawn = errors.New("zk_any_not_drawn_error") + ErrZkAnyNotDrawn = errors.New("zk_any_not_drawn") StatusRegistered = "registered" ) @@ -148,6 +148,7 @@ func (s *ZKvmProofProducer) Aggregate( BatchProof: batchProof, Tier: s.Tier(), BlockIDs: blockIDs, + ProofType: zkType, }, nil } @@ -191,6 +192,7 @@ func (s *ZKvmProofProducer) callProverDaemon( log.Info( "Proof generated", "blockID", opts.OntakeOptions().BlockID, + "zkType", output.ProofType, "time", time.Since(requestAt), "producer", "ZKvmProofProducer", ) @@ -239,6 +241,7 @@ func (s *ZKvmProofProducer) requestProof( log.Debug( "Send proof generation request", "blockID", opts.OntakeOptions().BlockID, + "zkProofType", ZKProofTypeAny, "input", string(jsonValue), ) @@ -264,6 +267,7 @@ func (s *ZKvmProofProducer) requestProof( log.Debug( "Proof generation output", "blockID", opts.OntakeOptions().BlockID, + "zkProofType", ZKProofTypeAny, "output", string(resBytes), ) var output RaikoRequestProofBodyResponseV2 @@ -272,10 +276,12 @@ func (s *ZKvmProofProducer) requestProof( } if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { - return nil, fmt.Errorf("failed to get zk proof, err: %s, msg: %s", - output.Error, - output.ErrorMessage, + log.Error("Failed to get zk proof", + "err", output.Error, + "msg", output.ErrorMessage, + "zkType", ZKProofTypeAny, ) + return nil, errors.New(output.Error) } return &output, nil @@ -294,6 +300,9 @@ func (s *ZKvmProofProducer) requestCancel( Block: opts.OntakeOptions().BlockID, Prover: opts.OntakeOptions().ProverAddress.Hex()[2:], Graffiti: opts.OntakeOptions().Graffiti, + ZkAny: &ZkAnyRequestProofBodyParam{ + Aggregation: opts.OntakeOptions().Compressed, + }, } client := &http.Client{} @@ -404,6 +413,7 @@ func (s *ZKvmProofProducer) requestBatchProof( log.Debug( "Batch proof generation output", "blockIDs", blockIDs, + "zkProofType", zkType, "output", string(resBytes), ) @@ -413,11 +423,12 @@ func (s *ZKvmProofProducer) requestBatchProof( } if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { - return nil, fmt.Errorf("failed to get zk batch proof, err: %s, msg: %s, zkType: %s", - output.Error, - output.ErrorMessage, - zkType, + log.Error("Failed to get zk batch proof", + "err", output.Error, + "msg", output.ErrorMessage, + "zkType", zkType, ) + return nil, errors.New(output.Error) } if output.Data == nil { return nil, fmt.Errorf("unexpected structure error, response: %s", string(resBytes)) @@ -438,6 +449,7 @@ func (s *ZKvmProofProducer) requestBatchProof( log.Info( "Batch proof generated", "blockIDs", blockIDs, + "zkType", zkType, "time", time.Since(requestAt), "producer", "ZKvmProofProducer", ) diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go b/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go index e7adb6b135a..3d1b2dec647 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter_ontake.go @@ -208,6 +208,7 @@ func (s *ProofSubmitterOntake) RequestProof(ctx context.Context, meta metadata.T "blockID", meta.Ontake().GetBlockID(), "bufferSize", bufferSize, "maxBufferSize", s.proofBuffer.MaxLength, + "proofType", result.ProofType, "bufferIsAggregating", s.proofBuffer.IsAggregating(), "bufferLastUpdatedAt", s.proofBuffer.lastUpdatedAt, ) @@ -245,6 +246,7 @@ func (s *ProofSubmitterOntake) SubmitProof( "parentHash", proofResponse.Opts.OntakeOptions().ParentHash, "proof", common.Bytes2Hex(proofResponse.Proof), "tier", proofResponse.Tier, + "proofType", proofResponse.ProofType, ) // Check if we still need to generate a new proof for that block. diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender.go b/packages/taiko-client/prover/proof_submitter/transaction/sender.go index 6b463d79e0f..a046b0960fb 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender.go @@ -124,6 +124,7 @@ func (s *Sender) Send( "Failed to submit proof", "blockID", proofResponse.BlockID, "tier", proofResponse.Tier, + "proofType", proofResponse.ProofType, "txHash", receipt.TxHash, "isPrivateMempool", isPrivate, "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, txMgr.From(), receipt), @@ -146,6 +147,7 @@ func (s *Sender) Send( "hash", proofResponse.Opts.OntakeOptions().BlockHash, "txHash", receipt.TxHash, "tier", proofResponse.Tier, + "proofType", proofResponse.ProofType, "isContest", len(proofResponse.Proof) == 0, ) } diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index 02dbe9de25e..9edbcbce363 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -485,6 +485,9 @@ func (p *Prover) requestProofOp(meta metadata.TaikoProposalMetaData, minTier uin if submitter := p.selectSubmitter(encoding.TierZkVMSp1ID); submitter != nil { if err := submitter.RequestProof(p.ctx, meta); err != nil { if errors.Is(err, proofProducer.ErrZkAnyNotDrawn) { + log.Debug("ZK proof was not chosen, attempting to request SGX proof", + "blockID", meta.Ontake().GetBlockID(), + ) if sgxSubmitter := p.selectSubmitter(encoding.TierSgxID); sgxSubmitter != nil { if err := sgxSubmitter.RequestProof(p.ctx, meta); err != nil { log.Error( From 44bddf2289368b259c129ba5576d55cb7adba469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gavin=20=E2=80=9Cyoghurt=E2=80=9D=20Yu?= Date: Sat, 22 Feb 2025 19:44:34 +0800 Subject: [PATCH 7/8] fix --- packages/taiko-client/prover/prover.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index 9edbcbce363..610e05dbc76 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -467,7 +467,9 @@ func (p *Prover) requestProofOp(meta metadata.TaikoProposalMetaData, minTier uin minTier = encoding.TierGuardianMinorityID } } - if minTier == encoding.TierOptimisticID || minTier >= encoding.TierGuardianMinorityID { + if minTier == encoding.TierOptimisticID || + minTier >= encoding.TierGuardianMinorityID || + len(p.cfg.RaikoZKVMHostEndpoint) == 0 { if submitter := p.selectSubmitter(minTier); submitter != nil { if err := submitter.RequestProof(p.ctx, meta); err != nil { log.Error( From 0ef1552a85d4e5a52fa08f8aa1bd32c48f78cf33 Mon Sep 17 00:00:00 2001 From: gavin Date: Mon, 24 Feb 2025 10:20:35 +0800 Subject: [PATCH 8/8] refactor(taiko-client): optimize logging to avoid misunderstanding --- packages/taiko-client/prover/prover.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index 610e05dbc76..e920899b4b3 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -565,8 +565,7 @@ func (p *Prover) submitProofAggregationOp(batchProof *proofProducer.BatchProofs) } if err := submitter.BatchSubmitProofs(p.ctx, batchProof); err != nil { - if strings.Contains(err.Error(), vm.ErrExecutionReverted.Error()) || - strings.Contains(err.Error(), proofSubmitter.ErrInvalidProof.Error()) { + if strings.Contains(err.Error(), vm.ErrExecutionReverted.Error()) { log.Error( "Proof submission reverted", "blockIDs", batchProof.BlockIDs, @@ -574,6 +573,14 @@ func (p *Prover) submitProofAggregationOp(batchProof *proofProducer.BatchProofs) "error", err, ) return nil + } else if strings.Contains(err.Error(), proofSubmitter.ErrInvalidProof.Error()) { + log.Warn( + "Detected proven blocks", + "blockIDs", batchProof.BlockIDs, + "tier", batchProof.Tier, + "error", err, + ) + return nil } log.Error( "Submit proof error",