use crate::{
circuit_input_builder::{
get_state_accesses, Block, CircuitInputBuilder, CircuitsParams, DynamicCParams,
FeatureConfig, FixedCParams,
},
state_db::{self, CodeDB, StateDB},
};
use eth_types::{geth_types::GethData, Word};
#[derive(Debug)]
pub struct BlockData<C: CircuitsParams> {
pub sdb: StateDB,
pub code_db: CodeDB,
pub chain_id: Word,
pub history_hashes: Vec<Word>,
pub eth_block: eth_types::Block<eth_types::Transaction>,
pub geth_traces: Vec<eth_types::GethExecTrace>,
pub circuits_params: C,
}
impl<C: CircuitsParams> BlockData<C> {
pub fn new_circuit_input_builder(&self) -> CircuitInputBuilder<C> {
self.new_circuit_input_builder_with_feature(FeatureConfig::default())
}
pub fn new_circuit_input_builder_with_feature(
&self,
feature_config: FeatureConfig,
) -> CircuitInputBuilder<C> {
CircuitInputBuilder::new(
self.sdb.clone(),
self.code_db.clone(),
Block::new(
self.chain_id,
self.history_hashes.clone(),
Word::default(),
&self.eth_block,
)
.unwrap(),
self.circuits_params,
feature_config,
)
}
fn init_dbs(geth_data: &GethData) -> (StateDB, CodeDB) {
let mut sdb = StateDB::new();
let mut code_db = CodeDB::default();
let access_set = get_state_accesses(&geth_data.eth_block, &geth_data.geth_traces)
.expect("state accesses");
for addr in access_set.state.keys() {
sdb.set_account(addr, state_db::Account::zero());
}
for account in &geth_data.accounts {
code_db.insert(account.code.to_vec());
sdb.set_account(&account.address, state_db::Account::from(account.clone()));
}
(sdb, code_db)
}
}
impl BlockData<FixedCParams> {
pub fn new_from_geth_data_with_params(
geth_data: GethData,
circuits_params: FixedCParams,
) -> Self {
let (sdb, code_db) = Self::init_dbs(&geth_data);
Self {
sdb,
code_db,
chain_id: geth_data.chain_id,
history_hashes: geth_data.history_hashes,
eth_block: geth_data.eth_block,
geth_traces: geth_data.geth_traces,
circuits_params,
}
}
}
impl BlockData<DynamicCParams> {
pub fn new_from_geth_data(geth_data: GethData) -> Self {
Self::new_from_geth_data_chunked(geth_data, 1)
}
pub fn new_from_geth_data_chunked(geth_data: GethData, total_chunks: usize) -> Self {
let (sdb, code_db) = Self::init_dbs(&geth_data);
Self {
sdb,
code_db,
chain_id: geth_data.chain_id,
history_hashes: geth_data.history_hashes,
eth_block: geth_data.eth_block,
geth_traces: geth_data.geth_traces,
circuits_params: DynamicCParams { total_chunks },
}
}
}