Skip to content

Commit 444e272

Browse files
committed
feat(prover): upgrade zkvm-prover to bf887150 (OpenVM v2.0, guest v0.9.0) with halo2-gpu SNARK acceleration
- Bump scroll-zkvm-prover/verifier/types pins ed3b964 -> bf887150 (OpenVM v1.6 -> v2.0.0); rust-toolchain nightly-2025-08-18 -> nightly-2025-11-20. - prover-bin: OpenVM v2 deferred STARK verification for batch/bundle aggregation — new deferral module computes input_commits / DeferralInputs / DeferralStates from child proofs; handlers enable_deferral against child circuits (bundle also initializes batch-over-chunk) and release child GPU SDKs after setup to avoid VRAM starvation of the halo2-gpu SNARK phase. - prover-bin: download pre-built agg_vk.bin circuit asset and new child_circuit_vks config; new halo2-gpu cargo feature + prover_halo2gpu make target for GPU SNARK (bundle) proving. - libzkp: read batch circuit agg_vk.bin for root-proof verification; tasks carry input_commits; drop pre-v0.9.0 universal task compatibility shim. - common/coordinator: adopt v0.9.0 StarkProof wire format (proof / user_pvs_proof / baseline / deferral_merkle_proofs) in message types, proof receiver, mock verifier and tests. - Point prover/e2e circuit base_url at scroll-zkvm/releases/v0.9.0/.
1 parent 788fdf0 commit 444e272

26 files changed

Lines changed: 1842 additions & 1366 deletions

File tree

Cargo.lock

Lines changed: 1407 additions & 1232 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ repository = "https://github.com/scroll-tech/scroll"
1717
version = "4.7.12"
1818

1919
[workspace.dependencies]
20-
scroll-zkvm-prover = { git = "https://github.com/scroll-tech/zkvm-prover", rev = "ed3b964" }
21-
scroll-zkvm-verifier = { git = "https://github.com/scroll-tech/zkvm-prover", rev = "ed3b964" }
22-
scroll-zkvm-types = { git = "https://github.com/scroll-tech/zkvm-prover", rev = "ed3b964" }
20+
scroll-zkvm-prover = { git = "https://github.com/scroll-tech/zkvm-prover", rev = "bf887150bb671af9b17dd53e92b7f2bbf01ec745" }
21+
scroll-zkvm-verifier = { git = "https://github.com/scroll-tech/zkvm-prover", rev = "bf887150bb671af9b17dd53e92b7f2bbf01ec745" }
22+
scroll-zkvm-types = { git = "https://github.com/scroll-tech/zkvm-prover", rev = "bf887150bb671af9b17dd53e92b7f2bbf01ec745" }
2323

2424
sbv-primitives = { git = "https://github.com/scroll-tech/stateless-block-verifier", tag = "scroll-v91.2", features = ["scroll", "rkyv"] }
2525
sbv-utils = { git = "https://github.com/scroll-tech/stateless-block-verifier", tag = "scroll-v91.2" }

common/types/message/message.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,18 @@ type OpenVMProofStat struct {
165165

166166
// Proof for flatten VM proof
167167
type OpenVMProof struct {
168-
Proof []byte `json:"proofs"`
169-
PublicValues []byte `json:"public_values"`
170-
Stat *OpenVMProofStat `json:"stat,omitempty"`
168+
Proof []byte `json:"proofs"`
169+
PublicValues []byte `json:"public_values"`
170+
}
171+
172+
// Proof for flatten VM stark proof (v0.9.0+).
173+
// Mirrors scroll_zkvm_types::proof::StarkProof used by the OpenVM v2 prover.
174+
type OpenVMStarkProof struct {
175+
Proof []byte `json:"proof"`
176+
UserPvsProof []byte `json:"user_pvs_proof"`
177+
Baseline []byte `json:"baseline,omitempty"`
178+
DeferralMerkleProofs []byte `json:"deferral_merkle_proofs,omitempty"`
179+
Stat *OpenVMProofStat `json:"stat,omitempty"`
171180
}
172181

173182
// Proof for flatten EVM proof
@@ -183,13 +192,13 @@ type OpenVMChunkProof struct {
183192
TotalGasUsed uint64 `json:"chunk_total_gas"`
184193
} `json:"metadata"`
185194

186-
VmProof *OpenVMProof `json:"proof"`
187-
Vk []byte `json:"vk,omitempty"`
188-
GitVersion string `json:"git_version,omitempty"`
195+
StarkProof *OpenVMStarkProof `json:"proof"`
196+
Vk []byte `json:"vk,omitempty"`
197+
GitVersion string `json:"git_version,omitempty"`
189198
}
190199

191200
func (p *OpenVMChunkProof) Proof() []byte {
192-
proofJson, err := json.Marshal(p.VmProof)
201+
proofJson, err := json.Marshal(p.StarkProof)
193202
if err != nil {
194203
panic(fmt.Sprint("marshaling error", err))
195204
}
@@ -217,13 +226,13 @@ type OpenVMBatchProof struct {
217226
BatchHash common.Hash `json:"batch_hash"`
218227
} `json:"metadata"`
219228

220-
VmProof *OpenVMProof `json:"proof"`
221-
Vk []byte `json:"vk,omitempty"`
222-
GitVersion string `json:"git_version,omitempty"`
229+
StarkProof *OpenVMStarkProof `json:"proof"`
230+
Vk []byte `json:"vk,omitempty"`
231+
GitVersion string `json:"git_version,omitempty"`
223232
}
224233

225234
func (p *OpenVMBatchProof) Proof() []byte {
226-
proofJson, err := json.Marshal(p.VmProof)
235+
proofJson, err := json.Marshal(p.StarkProof)
227236
if err != nil {
228237
panic(fmt.Sprint("marshaling error", err))
229238
}
@@ -240,17 +249,17 @@ func (ap *OpenVMBatchProof) SanityCheck() error {
240249
return errors.New("batch info not ready")
241250
}
242251

243-
if ap.VmProof == nil {
252+
if ap.StarkProof == nil {
244253
return errors.New("proof not ready")
245254
} else {
246255
if len(ap.Vk) == 0 {
247256
return errors.New("vk not ready")
248257
}
249-
pf := ap.VmProof
250-
if pf.Proof == nil {
258+
pf := ap.StarkProof
259+
if len(pf.Proof) == 0 {
251260
return errors.New("proof data not ready")
252261
}
253-
if len(pf.PublicValues) == 0 {
262+
if len(pf.UserPvsProof) == 0 {
254263
return errors.New("proof public value not ready")
255264
}
256265
}

coordinator/internal/logic/submitproof/proof_receiver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ func (m *ProofReceiverLogic) HandleZkProof(ctx *gin.Context, proofParameter coor
232232
return unmarshalErr
233233
}
234234
success, verifyErr = m.verifier.VerifyChunkProof(chunkProof, hardForkName)
235-
if stat := chunkProof.VmProof.Stat; stat != nil {
235+
if stat := chunkProof.StarkProof.Stat; stat != nil {
236236
if g, _ := m.proverSpeed.GetMetricWithLabelValues("chunk", "exec"); g != nil && stat.ExecutionTimeMills > 0 {
237237
g.Set(float64(stat.TotalCycle) / float64(stat.ExecutionTimeMills*1000))
238238
}
@@ -252,7 +252,7 @@ func (m *ProofReceiverLogic) HandleZkProof(ctx *gin.Context, proofParameter coor
252252
return unmarshalErr
253253
}
254254
success, verifyErr = m.verifier.VerifyBatchProof(batchProof, hardForkName)
255-
if stat := batchProof.VmProof.Stat; stat != nil {
255+
if stat := batchProof.StarkProof.Stat; stat != nil {
256256
if g, _ := m.proverSpeed.GetMetricWithLabelValues("batch", "exec"); g != nil && stat.ExecutionTimeMills > 0 {
257257
g.Set(float64(stat.TotalCycle) / float64(stat.ExecutionTimeMills*1000))
258258
}

coordinator/internal/logic/verifier/mock.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ func NewVerifier(cfg *config.VerifierConfig, _ bool) (*Verifier, error) {
2121

2222
// VerifyChunkProof return a mock verification result for a ChunkProof.
2323
func (v *Verifier) VerifyChunkProof(proof *message.OpenVMChunkProof, forkName string) (bool, error) {
24-
if proof.VmProof != nil && string(proof.VmProof.Proof) == InvalidTestProof {
24+
if proof.StarkProof != nil && string(proof.StarkProof.Proof) == InvalidTestProof {
2525
return false, nil
2626
}
2727
return true, nil
2828
}
2929

3030
// VerifyBatchProof return a mock verification result for a BatchProof.
3131
func (v *Verifier) VerifyBatchProof(proof *message.OpenVMBatchProof, forkName string) (bool, error) {
32-
if proof.VmProof != nil && string(proof.VmProof.Proof) == InvalidTestProof {
32+
if proof.StarkProof != nil && string(proof.StarkProof.Proof) == InvalidTestProof {
3333
return false, nil
3434
}
3535
return true, nil

coordinator/test/api_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ func testTimeoutProof(t *testing.T) {
687687
assert.NoError(t, err)
688688
err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 100, batch.Hash)
689689
assert.NoError(t, err)
690-
encodeData, err := json.Marshal(message.OpenVMChunkProof{VmProof: &message.OpenVMProof{}, MetaData: struct {
690+
encodeData, err := json.Marshal(message.OpenVMChunkProof{StarkProof: &message.OpenVMStarkProof{}, MetaData: struct {
691691
ChunkInfo *message.ChunkInfo `json:"chunk_info"`
692692
TotalGasUsed uint64 `json:"chunk_total_gas"`
693693
}{ChunkInfo: &message.ChunkInfo{}}})

coordinator/test/mock_prover.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ func (r *mockProver) submitProof(t *testing.T, proverTaskSchema *types.GetTaskSc
229229
case message.ProofTypeChunk:
230230
fallthrough
231231
case message.ProofTypeBatch:
232-
encodeData, err := json.Marshal(&message.OpenVMProof{})
232+
encodeData, err := json.Marshal(&message.OpenVMStarkProof{})
233233
assert.NoError(t, err)
234234
assert.NotEmpty(t, encodeData)
235235
proof = encodeData
@@ -245,7 +245,7 @@ func (r *mockProver) submitProof(t *testing.T, proverTaskSchema *types.GetTaskSc
245245
case message.ProofTypeChunk:
246246
fallthrough
247247
case message.ProofTypeBatch:
248-
encodeData, err := json.Marshal(&message.OpenVMProof{Proof: []byte(verifier.InvalidTestProof)})
248+
encodeData, err := json.Marshal(&message.OpenVMStarkProof{Proof: []byte(verifier.InvalidTestProof), UserPvsProof: []byte{0x01}})
249249
assert.NoError(t, err)
250250
assert.NotEmpty(t, encodeData)
251251
proof = encodeData

crates/libzkp/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ edition.workspace = true
77
[dependencies]
88
scroll-zkvm-types = { workspace = true, features = ["scroll"] }
99
scroll-zkvm-verifier.workspace = true
10+
openvm-sdk = { git = "https://github.com/openvm-org/openvm.git", tag = "v2.0.0" }
11+
openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v2.0.0" }
1012

1113
alloy-primitives.workspace = true #depress the effect of "native-keccak"
1214
sbv-primitives = {workspace = true, features = ["scroll-compress-info", "scroll"]}

crates/libzkp/src/lib.rs

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -55,43 +55,8 @@ pub fn checkout_chunk_task(
5555

5656
/// Convert the universal task json into compatible form for old prover
5757
pub fn univ_task_compatibility_fix(task_json: &str) -> eyre::Result<String> {
58-
use scroll_zkvm_types::proof::VmInternalStarkProof;
59-
60-
let task: tasks::ProvingTask = serde_json::from_str(task_json)?;
61-
let aggregated_proofs: Vec<VmInternalStarkProof> = task
62-
.aggregated_proofs
63-
.into_iter()
64-
.map(|proof| VmInternalStarkProof {
65-
proofs: proof.proofs,
66-
public_values: proof.public_values,
67-
})
68-
.collect();
69-
70-
#[derive(Serialize)]
71-
struct CompatibleProvingTask {
72-
/// seralized witness which should be written into stdin first
73-
pub serialized_witness: Vec<Vec<u8>>,
74-
/// aggregated proof carried by babybear fields, should be written into stdin
75-
/// followed `serialized_witness`
76-
pub aggregated_proofs: Vec<VmInternalStarkProof>,
77-
/// Fork name specify
78-
pub fork_name: String,
79-
/// The vk of app which is expcted to prove this task
80-
pub vk: Vec<u8>,
81-
/// An identifier assigned by coordinator, it should be kept identify for the
82-
/// same task (for example, using chunk, batch and bundle hashes)
83-
pub identifier: String,
84-
}
85-
86-
let compatible_u_task = CompatibleProvingTask {
87-
serialized_witness: task.serialized_witness,
88-
aggregated_proofs,
89-
fork_name: task.fork_name,
90-
vk: task.vk,
91-
identifier: task.identifier,
92-
};
93-
94-
Ok(serde_json::to_string(&compatible_u_task)?)
58+
// v0.9.0+ provers consume the new ProvingTask format directly; no translation needed.
59+
Ok(task_json.to_string())
9560
}
9661

9762
/// Generate required staff for proving tasks

crates/libzkp/src/tasks/batch.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ impl BatchProvingTask {
131131
.collect(),
132132
serialized_witness: vec![serialized_witness],
133133
vk: Vec::new(),
134+
input_commits: Vec::new(),
134135
};
135136

136137
Ok((proving_task, metadata, batch_pi_hash))

0 commit comments

Comments
 (0)