Skip to content

Commit 856fa89

Browse files
committed
Load PeerDAS KZG only if PeerDAS is enabled.
1 parent 8156092 commit 856fa89

File tree

3 files changed

+66
-44
lines changed

3 files changed

+66
-44
lines changed

beacon_node/beacon_chain/src/kzg_utils.rs

+34-23
Original file line numberDiff line numberDiff line change
@@ -285,36 +285,43 @@ pub fn reconstruct_data_columns<E: EthSpec>(
285285
#[cfg(test)]
286286
mod test {
287287
use crate::kzg_utils::{blobs_to_data_column_sidecars, reconstruct_data_columns};
288-
use crate::test_utils::KZG;
289288
use bls::Signature;
290-
use kzg::KzgCommitment;
289+
use eth2_network_config::TRUSTED_SETUP_BYTES;
290+
use kzg::{Kzg, KzgCommitment, TrustedSetup};
291291
use types::{
292292
beacon_block_body::KzgCommitments, BeaconBlock, BeaconBlockDeneb, Blob, BlobsList,
293293
ChainSpec, EmptyBlock, EthSpec, MainnetEthSpec, SignedBeaconBlock,
294294
};
295295

296+
type E = MainnetEthSpec;
297+
298+
// Loading and initializing PeerDAS KZG is expensive and slow, so we group the tests together
299+
// only load it once.
296300
#[test]
297-
fn test_build_sidecars_empty() {
298-
type E = MainnetEthSpec;
299-
let num_of_blobs = 0;
301+
fn test_build_data_columns_sidecars() {
300302
let spec = E::default_spec();
301-
let (signed_block, blob_sidecars) = create_test_block_and_blobs::<E>(num_of_blobs, &spec);
303+
let kzg = get_kzg();
304+
test_build_data_columns_empty(&kzg, &spec);
305+
test_build_data_columns(&kzg, &spec);
306+
test_reconstruct_data_columns(&kzg, &spec);
307+
}
302308

309+
#[track_caller]
310+
fn test_build_data_columns_empty(kzg: &Kzg, spec: &ChainSpec) {
311+
let num_of_blobs = 0;
312+
let (signed_block, blob_sidecars) = create_test_block_and_blobs::<E>(num_of_blobs, spec);
303313
let column_sidecars =
304-
blobs_to_data_column_sidecars(&blob_sidecars, &signed_block, &KZG, &spec).unwrap();
305-
314+
blobs_to_data_column_sidecars(&blob_sidecars, &signed_block, kzg, spec).unwrap();
306315
assert!(column_sidecars.is_empty());
307316
}
308317

309-
#[test]
310-
fn test_build_sidecars() {
311-
type E = MainnetEthSpec;
318+
#[track_caller]
319+
fn test_build_data_columns(kzg: &Kzg, spec: &ChainSpec) {
312320
let num_of_blobs = 6;
313-
let spec = E::default_spec();
314-
let (signed_block, blob_sidecars) = create_test_block_and_blobs::<E>(num_of_blobs, &spec);
321+
let (signed_block, blob_sidecars) = create_test_block_and_blobs::<E>(num_of_blobs, spec);
315322

316323
let column_sidecars =
317-
blobs_to_data_column_sidecars(&blob_sidecars, &signed_block, &KZG, &spec).unwrap();
324+
blobs_to_data_column_sidecars(&blob_sidecars, &signed_block, kzg, spec).unwrap();
318325

319326
let block_kzg_commitments = signed_block
320327
.message()
@@ -345,21 +352,18 @@ mod test {
345352
}
346353
}
347354

348-
#[test]
349-
fn build_and_reconstruct() {
350-
type E = MainnetEthSpec;
355+
#[track_caller]
356+
fn test_reconstruct_data_columns(kzg: &Kzg, spec: &ChainSpec) {
351357
let num_of_blobs = 6;
352-
let spec = E::default_spec();
353-
let (signed_block, blob_sidecars) = create_test_block_and_blobs::<E>(num_of_blobs, &spec);
354-
358+
let (signed_block, blob_sidecars) = create_test_block_and_blobs::<E>(num_of_blobs, spec);
355359
let column_sidecars =
356-
blobs_to_data_column_sidecars(&blob_sidecars, &signed_block, &KZG, &spec).unwrap();
360+
blobs_to_data_column_sidecars(&blob_sidecars, &signed_block, kzg, spec).unwrap();
357361

358362
// Now reconstruct
359363
let reconstructed_columns = reconstruct_data_columns(
360-
&KZG,
364+
kzg,
361365
&column_sidecars.iter().as_slice()[0..column_sidecars.len() / 2],
362-
&spec,
366+
spec,
363367
)
364368
.unwrap();
365369

@@ -368,6 +372,13 @@ mod test {
368372
}
369373
}
370374

375+
fn get_kzg() -> Kzg {
376+
let trusted_setup: TrustedSetup = serde_json::from_reader(TRUSTED_SETUP_BYTES)
377+
.map_err(|e| format!("Unable to read trusted setup file: {}", e))
378+
.expect("should have trusted setup");
379+
Kzg::new_from_trusted_setup_das_enabled(trusted_setup).expect("should create kzg")
380+
}
381+
371382
fn create_test_block_and_blobs<E: EthSpec>(
372383
num_of_blobs: usize,
373384
spec: &ChainSpec,

beacon_node/client/src/builder.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use beacon_chain::graffiti_calculator::start_engine_version_cache_refresh_servic
1010
use beacon_chain::otb_verification_service::start_otb_verification_service;
1111
use beacon_chain::proposer_prep_service::start_proposer_prep_service;
1212
use beacon_chain::schema_change::migrate_schema;
13-
use beacon_chain::LightClientProducerEvent;
1413
use beacon_chain::{
1514
builder::{BeaconChainBuilder, Witness},
1615
eth1_chain::{CachingEth1Backend, Eth1Chain},
@@ -19,6 +18,7 @@ use beacon_chain::{
1918
store::{HotColdDB, ItemStore, LevelDB, StoreConfig},
2019
BeaconChain, BeaconChainTypes, Eth1ChainBackend, MigratorConfig, ServerSentEventHandler,
2120
};
21+
use beacon_chain::{Kzg, LightClientProducerEvent};
2222
use beacon_processor::{BeaconProcessor, BeaconProcessorChannels};
2323
use beacon_processor::{BeaconProcessorConfig, BeaconProcessorQueueLengths};
2424
use environment::RuntimeContext;
@@ -505,7 +505,7 @@ where
505505
deposit_snapshot.and_then(|snapshot| match Eth1Service::from_deposit_snapshot(
506506
config.eth1,
507507
context.log().clone(),
508-
spec,
508+
spec.clone(),
509509
&snapshot,
510510
) {
511511
Ok(service) => {
@@ -624,12 +624,15 @@ where
624624
};
625625

626626
let beacon_chain_builder = if let Some(trusted_setup) = config.trusted_setup {
627-
let kzg = trusted_setup
628-
.try_into()
629-
.map(Arc::new)
630-
.map(Some)
631-
.map_err(|e| format!("Failed to load trusted setup: {:?}", e))?;
632-
beacon_chain_builder.kzg(kzg)
627+
let kzg_err_msg = |e| format!("Failed to load trusted setup: {:?}", e);
628+
629+
let kzg = if spec.is_peer_das_scheduled() {
630+
Kzg::new_from_trusted_setup_das_enabled(trusted_setup).map_err(kzg_err_msg)?
631+
} else {
632+
Kzg::new_from_trusted_setup(trusted_setup).map_err(kzg_err_msg)?
633+
};
634+
635+
beacon_chain_builder.kzg(Some(Arc::new(kzg)))
633636
} else {
634637
beacon_chain_builder
635638
};

crypto/kzg/src/lib.rs

+21-13
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ pub enum Error {
3737
InconsistentArrayLength(String),
3838
/// Error reconstructing data columns.
3939
ReconstructFailed(String),
40+
/// Kzg was not initialized with PeerDAS enabled.
41+
DASContextUninitialized,
4042
}
4143

4244
impl From<c_kzg::Error> for Error {
@@ -49,12 +51,22 @@ impl From<c_kzg::Error> for Error {
4951
#[derive(Debug)]
5052
pub struct Kzg {
5153
trusted_setup: KzgSettings,
52-
context: DASContext,
54+
context: Option<DASContext>,
5355
}
5456

5557
impl Kzg {
5658
/// Load the kzg trusted setup parameters from a vec of G1 and G2 points.
5759
pub fn new_from_trusted_setup(trusted_setup: TrustedSetup) -> Result<Self, Error> {
60+
Ok(Self {
61+
trusted_setup: KzgSettings::load_trusted_setup(
62+
&trusted_setup.g1_points(),
63+
&trusted_setup.g2_points(),
64+
)?,
65+
context: None,
66+
})
67+
}
68+
69+
pub fn new_from_trusted_setup_das_enabled(trusted_setup: TrustedSetup) -> Result<Self, Error> {
5870
// Initialize the trusted setup using default parameters
5971
//
6072
// Note: One can also use `from_json` to initialize it from the consensus-specs
@@ -72,10 +84,14 @@ impl Kzg {
7284
&trusted_setup.g1_points(),
7385
&trusted_setup.g2_points(),
7486
)?,
75-
context,
87+
context: Some(context),
7688
})
7789
}
7890

91+
fn context(&self) -> Result<&DASContext, Error> {
92+
self.context.as_ref().ok_or(Error::DASContextUninitialized)
93+
}
94+
7995
/// Compute the kzg proof given a blob and its kzg commitment.
8096
pub fn compute_blob_kzg_proof(
8197
&self,
@@ -180,7 +196,7 @@ impl Kzg {
180196
blob: KzgBlobRef<'_>,
181197
) -> Result<CellsAndKzgProofs, Error> {
182198
let (cells, proofs) = self
183-
.context
199+
.context()?
184200
.compute_cells_and_kzg_proofs(blob)
185201
.map_err(Error::PeerDASKZG)?;
186202

@@ -206,7 +222,7 @@ impl Kzg {
206222
.iter()
207223
.map(|commitment| commitment.as_ref())
208224
.collect();
209-
let verification_result = self.context.verify_cell_kzg_proof_batch(
225+
let verification_result = self.context()?.verify_cell_kzg_proof_batch(
210226
commitments.to_vec(),
211227
columns,
212228
cells.to_vec(),
@@ -227,7 +243,7 @@ impl Kzg {
227243
cells: &[CellRef<'_>],
228244
) -> Result<CellsAndKzgProofs, Error> {
229245
let (cells, proofs) = self
230-
.context
246+
.context()?
231247
.recover_cells_and_proofs(cell_ids.to_vec(), cells.to_vec())
232248
.map_err(Error::PeerDASKZG)?;
233249

@@ -236,11 +252,3 @@ impl Kzg {
236252
Ok((cells, c_kzg_proof))
237253
}
238254
}
239-
240-
impl TryFrom<TrustedSetup> for Kzg {
241-
type Error = Error;
242-
243-
fn try_from(trusted_setup: TrustedSetup) -> Result<Self, Self::Error> {
244-
Kzg::new_from_trusted_setup(trusted_setup)
245-
}
246-
}

0 commit comments

Comments
 (0)