Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(prover)!: Add EIP4844 support for provers subsystem #1200

Merged
merged 55 commits into from
Mar 1, 2024
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
728f801
Dirty initial commit
EmilLuta Feb 22, 2024
d1ed0ba
Should have BWG working
EmilLuta Feb 22, 2024
0689ceb
More wip
EmilLuta Feb 22, 2024
47a44fc
Using new 4844 enabled scheduler (still have to update snark vk)
mm-zk Feb 22, 2024
84c5a81
update snark wrapper key
mm-zk Feb 22, 2024
31c0c60
Wit Gens working
EmilLuta Feb 22, 2024
0eb861d
Merge branch 'main' into evl-4844-branch
EmilLuta Feb 22, 2024
f272b80
Working witness, prover works, but there's a bug on saving
EmilLuta Feb 23, 2024
e8062f7
Working basic provers (with too many hacks in place)
EmilLuta Feb 23, 2024
0b9d99b
move to harness 1.4.2
mm-zk Feb 23, 2024
c17a2ed
Merge branch 'main' into mmzk0222_new_scheduler
mm-zk Feb 23, 2024
223f64e
revert changes to non-prover
mm-zk Feb 23, 2024
1444131
kzg revert
mm-zk Feb 23, 2024
f15c5cf
revert keygenerator main
mm-zk Feb 23, 2024
f279b4c
WIP for scheduler proving
EmilLuta Feb 23, 2024
74bfd4c
Merge remote-tracking branch 'origin/mmzk0222_new_scheduler' into evl…
EmilLuta Feb 23, 2024
bfaed97
Breaking scheduler
EmilLuta Feb 23, 2024
b4545ea
fully working scrappy
EmilLuta Feb 23, 2024
a37e235
Update scheduler vk
EmilLuta Feb 23, 2024
af3cf7c
Fix scheduler being picked before blobs
EmilLuta Feb 24, 2024
ac840dc
Fix typos for scheduler query
EmilLuta Feb 24, 2024
03c0f07
Update GPU prover
EmilLuta Feb 24, 2024
89f2034
Update sqlx stuff
EmilLuta Feb 24, 2024
6513c1a
First round of cleanup
EmilLuta Feb 26, 2024
6e81b9a
Second round of cleanup
EmilLuta Feb 26, 2024
4ff98a0
Undo prometheus comments
EmilLuta Feb 26, 2024
af7503d
Fix type mix
EmilLuta Feb 26, 2024
f5d24ee
Add assertions for fast failing
EmilLuta Feb 26, 2024
80ae865
Add more defensive asserts
EmilLuta Feb 26, 2024
ca31787
Enforce blob constraints through type system + invariants
EmilLuta Feb 27, 2024
2005634
Fix Eip4844Blobs typo
EmilLuta Feb 27, 2024
7135016
Rename circuit_255_final_prover_job_id to eip_4844_final_prover_job_id
EmilLuta Feb 27, 2024
559fcb6
Rename sequence to blob_ordering
EmilLuta Feb 27, 2024
cd762c9
Remove unnecessary asserts -- moved to Eip4844Blobs
EmilLuta Feb 27, 2024
bdb9bb4
Small fixes + intermediary commit to merge from master
EmilLuta Feb 27, 2024
d60bc5c
Merge branch 'main' into evl-4844-branch
EmilLuta Feb 27, 2024
bb20e65
Intermediary commit -- addressed comments
EmilLuta Feb 27, 2024
facb2e8
Update usage of constants 2 to MAX_4844_BLOBS_PER_BLOCK
EmilLuta Feb 27, 2024
f811160
Proof Data Handler + Prover Gateway working
EmilLuta Feb 27, 2024
67ed792
WGs working
EmilLuta Feb 27, 2024
ee72930
Add tests
EmilLuta Feb 27, 2024
c871335
Revert etc/env
EmilLuta Feb 27, 2024
d9493a5
Add more docs
EmilLuta Feb 27, 2024
e5cc1c0
s/Eip4844/EIP4844/ to satisfy spellchecker
EmilLuta Feb 27, 2024
2405e48
Update database interactions -- preparing for tests
EmilLuta Feb 27, 2024
26f4574
Fix comment typos.
EmilLuta Feb 27, 2024
197420b
Fix more comment typos.
EmilLuta Feb 27, 2024
7d4a74e
Fix blobs handling
EmilLuta Feb 27, 2024
e01b13f
Address CR requests (simplify Eip4844Blobs + map on scheduler)
EmilLuta Feb 27, 2024
e670905
update GPU setup-data keys
zksync-admin-bot2 Feb 29, 2024
1c4dbf1
Merge pull request #1302 from matter-labs/update-gpu-setup-data-keys-…
EmilLuta Feb 29, 2024
5b516af
Merge branch 'main' into evl-4844-branch
EmilLuta Feb 29, 2024
e776783
Post merge update
EmilLuta Feb 29, 2024
436efda
update GPU setup-data keys
zksync-admin-bot2 Feb 29, 2024
649b55a
Merge pull request #1304 from matter-labs/update-gpu-setup-data-keys-…
EmilLuta Feb 29, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ALTER TABLE scheduler_dependency_tracker_fri DROP COLUMN IF EXISTS circuit_255_final_prover_job_id_1;
ALTER TABLE scheduler_dependency_tracker_fri DROP COLUMN IF EXISTS circuit_255_final_prover_job_id_0;

ALTER TABLE witness_inputs_fri DROP COLUMN IF EXISTS eip_4844_blobs;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ALTER TABLE witness_inputs_fri ADD COLUMN eip_4844_blobs BYTEA;
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved

ALTER TABLE scheduler_dependency_tracker_fri ADD COLUMN IF NOT EXISTS circuit_255_final_prover_job_id_0 BIGINT DEFAULT NULL;
ALTER TABLE scheduler_dependency_tracker_fri ADD COLUMN IF NOT EXISTS circuit_255_final_prover_job_id_1 BIGINT DEFAULT NULL;
7 changes: 6 additions & 1 deletion core/lib/dal/src/fri_prover_dal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ pub mod types {
use sqlx::types::chrono::{DateTime, Utc};
use zksync_types::{basic_fri_types::AggregationRound, L1BatchNumber};

// This currently lives in zksync_prover_types -- we don't want a dependency between prover types (zkevm_test_harness) and DAL.
// This will be gone as part of 1.5.0, when EIP_4844 becomes normal jobs, rather than special cased ones.
pub(crate) const EIP_4844_CIRCUIT_ID: u8 = 255;

#[derive(Debug, Clone)]
pub struct FriProverJobMetadata {
pub id: u32,
Expand Down Expand Up @@ -249,14 +253,15 @@ impl FriProverDal<'_, '_> {
for (sequence_number, (circuit_id, circuit_blob_url)) in
circuit_ids_and_urls.iter().enumerate()
{
let is_final = *circuit_id == types::EIP_4844_CIRCUIT_ID;
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
self.insert_prover_job(
l1_batch_number,
*circuit_id,
depth,
sequence_number,
aggregation_round,
circuit_blob_url,
false,
is_final,
protocol_version_id,
)
.await;
Expand Down
62 changes: 41 additions & 21 deletions core/lib/dal/src/fri_scheduler_dependency_tracker_dal.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use zksync_types::L1BatchNumber;

use crate::StorageProcessor;
use crate::{fri_prover_dal::types, StorageProcessor};

#[derive(Debug)]
pub struct FriSchedulerDependencyTrackerDal<'a, 'c> {
Expand Down Expand Up @@ -35,6 +35,8 @@ impl FriSchedulerDependencyTrackerDal<'_, '_> {
AND circuit_11_final_prover_job_id IS NOT NULL
AND circuit_12_final_prover_job_id IS NOT NULL
AND circuit_13_final_prover_job_id IS NOT NULL
AND circuit_255_final_prover_job_id_0 IS NOT NULL
AND circuit_255_final_prover_job_id_1 IS NOT NULL
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
)
RETURNING
l1_batch_number;
Expand Down Expand Up @@ -69,15 +71,27 @@ impl FriSchedulerDependencyTrackerDal<'_, '_> {
circuit_id: u8,
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
final_prover_job_id: u32,
l1_batch_number: L1BatchNumber,
sequence: u16,
) {
let query = format!(
r#"
let query = if circuit_id != types::EIP_4844_CIRCUIT_ID {
format!(
r#"
UPDATE scheduler_dependency_tracker_fri
SET circuit_{}_final_prover_job_id = $1
WHERE l1_batch_number = $2
"#,
circuit_id
);
circuit_id
)
} else {
format!(
r#"
UPDATE scheduler_dependency_tracker_fri
SET circuit_{}_final_prover_job_id_{} = $1
WHERE l1_batch_number = $2
"#,
circuit_id, sequence,
)
};
sqlx::query(&query)
.bind(final_prover_job_id as i64)
.bind(l1_batch_number.0 as i64)
Expand All @@ -89,7 +103,7 @@ impl FriSchedulerDependencyTrackerDal<'_, '_> {
pub async fn get_final_prover_job_ids_for(
&mut self,
l1_batch_number: L1BatchNumber,
) -> [u32; 13] {
) -> ([u32; 13], [u32; 2]) {
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
sqlx::query!(
r#"
SELECT
Expand All @@ -107,21 +121,27 @@ impl FriSchedulerDependencyTrackerDal<'_, '_> {
.into_iter()
.next()
.map(|row| {
[
row.circuit_1_final_prover_job_id.unwrap() as u32,
row.circuit_2_final_prover_job_id.unwrap() as u32,
row.circuit_3_final_prover_job_id.unwrap() as u32,
row.circuit_4_final_prover_job_id.unwrap() as u32,
row.circuit_5_final_prover_job_id.unwrap() as u32,
row.circuit_6_final_prover_job_id.unwrap() as u32,
row.circuit_7_final_prover_job_id.unwrap() as u32,
row.circuit_8_final_prover_job_id.unwrap() as u32,
row.circuit_9_final_prover_job_id.unwrap() as u32,
row.circuit_10_final_prover_job_id.unwrap() as u32,
row.circuit_11_final_prover_job_id.unwrap() as u32,
row.circuit_12_final_prover_job_id.unwrap() as u32,
row.circuit_13_final_prover_job_id.unwrap() as u32,
]
(
[
row.circuit_1_final_prover_job_id.unwrap() as u32,
row.circuit_2_final_prover_job_id.unwrap() as u32,
row.circuit_3_final_prover_job_id.unwrap() as u32,
row.circuit_4_final_prover_job_id.unwrap() as u32,
row.circuit_5_final_prover_job_id.unwrap() as u32,
row.circuit_6_final_prover_job_id.unwrap() as u32,
row.circuit_7_final_prover_job_id.unwrap() as u32,
row.circuit_8_final_prover_job_id.unwrap() as u32,
row.circuit_9_final_prover_job_id.unwrap() as u32,
row.circuit_10_final_prover_job_id.unwrap() as u32,
row.circuit_11_final_prover_job_id.unwrap() as u32,
row.circuit_12_final_prover_job_id.unwrap() as u32,
row.circuit_13_final_prover_job_id.unwrap() as u32,
],
[
row.circuit_255_final_prover_job_id_0.unwrap() as u32,
row.circuit_255_final_prover_job_id_1.unwrap() as u32,
],
)
})
.unwrap()
}
Expand Down
15 changes: 12 additions & 3 deletions core/lib/dal/src/fri_witness_generator_dal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ impl FriWitnessGeneratorDal<'_, '_> {
block_number: L1BatchNumber,
object_key: &str,
protocol_version_id: FriProtocolVersionId,
eip_4844_blobs: Vec<u8>,
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
) {
sqlx::query!(
r#"
Expand All @@ -47,17 +48,19 @@ impl FriWitnessGeneratorDal<'_, '_> {
l1_batch_number,
merkle_tree_paths_blob_url,
protocol_version,
eip_4844_blobs,
status,
created_at,
updated_at
)
VALUES
($1, $2, $3, 'queued', NOW(), NOW())
($1, $2, $3, $4, 'queued', NOW(), NOW())
ON CONFLICT (l1_batch_number) DO NOTHING
"#,
block_number.0 as i64,
object_key,
protocol_version_id as i32,
bincode::serialize(&eip_4844_blobs).expect("Failed to serialize 4844 blobs to bytes"),
)
.fetch_optional(self.storage.conn())
.await
Expand All @@ -69,7 +72,7 @@ impl FriWitnessGeneratorDal<'_, '_> {
last_l1_batch_to_process: u32,
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
protocol_versions: &[FriProtocolVersionId],
picked_by: &str,
) -> Option<L1BatchNumber> {
) -> Option<(L1BatchNumber, Vec<u8>)> {
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
let protocol_versions: Vec<i32> = protocol_versions.iter().map(|&id| id as i32).collect();
sqlx::query!(
r#"
Expand Down Expand Up @@ -107,7 +110,13 @@ impl FriWitnessGeneratorDal<'_, '_> {
.fetch_optional(self.storage.conn())
.await
.unwrap()
.map(|row| L1BatchNumber(row.l1_batch_number as u32))
.map(|row| {
(
L1BatchNumber(row.l1_batch_number as u32),
bincode::deserialize(&row.eip_4844_blobs.unwrap())
.expect("Failed to serialize 4844 blobs to bytes"),
)
})
}

pub async fn get_basic_circuit_witness_job_attempts(
Expand Down
32 changes: 32 additions & 0 deletions core/lib/prover_interface/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,44 @@ use zksync_types::{

use crate::{inputs::PrepareBasicCircuitsJob, outputs::L1BatchProofForL1};

const BLOB_CHUNK_SIZE: usize = 31;
const ELEMENTS_PER_4844_BLOCK: usize = 4096;

pub const EIP_4844_BLOB_SIZE: usize = BLOB_CHUNK_SIZE * ELEMENTS_PER_4844_BLOCK;

pub type Blob = Vec<u8>;

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Eip4844Blobs {
pub blobs: Vec<Blob>,
}

impl From<Vec<u8>> for Eip4844Blobs {
fn from(mut blobs: Vec<u8>) -> Self {
let blob_size = blobs.len() / EIP_4844_BLOB_SIZE * EIP_4844_BLOB_SIZE;
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
blobs.resize(blob_size, 0u8);
Self {
blobs: blobs
.chunks(EIP_4844_BLOB_SIZE)
.map(|chunk| chunk.into())
.collect(),
}
}
}

impl From<Eip4844Blobs> for Vec<u8> {
fn from(eip_4844_blobs: Eip4844Blobs) -> Self {
eip_4844_blobs.blobs.iter().flatten().copied().collect()
}
}

#[derive(Debug, Serialize, Deserialize)]
pub struct ProofGenerationData {
pub l1_batch_number: L1BatchNumber,
pub data: PrepareBasicCircuitsJob,
pub fri_protocol_version_id: FriProtocolVersionId,
pub l1_verifier_config: L1VerifierConfig,
pub eip_4844_blobs: Eip4844Blobs,
}

#[derive(Debug, Serialize, Deserialize)]
Expand Down
22 changes: 20 additions & 2 deletions core/lib/zksync_core/src/proof_data_handler/request_processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use zksync_config::configs::{
use zksync_dal::{ConnectionPool, SqlxError};
use zksync_object_store::{ObjectStore, ObjectStoreError};
use zksync_prover_interface::api::{
ProofGenerationData, ProofGenerationDataRequest, ProofGenerationDataResponse,
Eip4844Blobs, ProofGenerationData, ProofGenerationDataRequest, ProofGenerationDataResponse,
SubmitProofRequest, SubmitProofResponse,
};
use zksync_types::{
Expand Down Expand Up @@ -118,13 +118,31 @@ impl RequestProcessor {
}
};

let storage_batch = self
perekopskiy marked this conversation as resolved.
Show resolved Hide resolved
.pool
.access_storage()
.await
.unwrap()
.blocks_dal()
.get_storage_l1_batch(l1_batch_number)
.await
.unwrap()
.unwrap();

let eip_4844_blobs: Eip4844Blobs = storage_batch
EmilLuta marked this conversation as resolved.
Show resolved Hide resolved
.pubdata_input
.expect(&format!(
"expected pubdata, but it is not available for batch {l1_batch_number:?}"
))
.into();

let proof_gen_data = ProofGenerationData {
l1_batch_number,
data: blob,
fri_protocol_version_id,
l1_verifier_config,
eip_4844_blobs,
};

Ok(Json(ProofGenerationDataResponse::Success(Some(
proof_gen_data,
))))
Expand Down
Loading
Loading