Skip to content
This repository has been archived by the owner on May 3, 2024. It is now read-only.

Commit

Permalink
add feature to disable l2 debug trace (#176)
Browse files Browse the repository at this point in the history
  • Loading branch information
smtmfft authored Jan 14, 2024
1 parent 85c5048 commit 4314b27
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 66 deletions.
11 changes: 6 additions & 5 deletions bus-mapping/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ mock = { path = "../mock", optional = true }
sha3 = "0.10"
once_cell = "1.17.1"
alloy-primitives = { version = "0.4", default-features = false, features = [
"rlp",
"serde",
"std",
"rlp",
"serde",
"std",
] }
alloy-sol-types = { version = "0.4"}
alloy-dyn-abi = { version = "0.4"}
alloy-sol-types = { version = "0.4" }
alloy-dyn-abi = { version = "0.4" }

ethers-core = "=2.0.0"
ethers-providers = "=2.0.0"
Expand All @@ -45,3 +45,4 @@ rand = "0.8"

[features]
test = ["mock"]
disable_l2_trace_block = []
111 changes: 62 additions & 49 deletions bus-mapping/src/circuit_input_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,18 +212,20 @@ impl<'a> CircuitInputBuilder {
eth_block: &EthBlock,
geth_traces: &[eth_types::GethExecTrace],
) -> Result<(), Error> {
// accumulates gas across all txs in the block
for (tx_index, tx) in eth_block.transactions.iter().enumerate() {
let geth_trace = &geth_traces[tx_index];
self.handle_tx(
eth_block,
tx,
geth_trace,
tx_index + 1 == eth_block.transactions.len(),
)?;
if !cfg!(feature = "disable_l2_trace_block") {
// accumulates gas across all txs in the block
for (tx_index, tx) in eth_block.transactions.iter().enumerate() {
let geth_trace = &geth_traces[tx_index];
self.handle_tx(
eth_block,
tx,
geth_trace,
tx_index + 1 == eth_block.transactions.len(),
)?;
}
self.set_value_ops_call_context_rwc_eor();
self.set_end_block();
}
self.set_value_ops_call_context_rwc_eor();
self.set_end_block();
Ok(())
}

Expand Down Expand Up @@ -421,31 +423,37 @@ pub fn get_state_accesses(
geth_traces: &[eth_types::GethExecTrace],
protocol_instance: &Option<ProtocolInstance>,
) -> Result<AccessSet, Error> {
let mut block_access_trace = vec![Access::new(
None,
RW::WRITE,
AccessValue::Account {
address: eth_block
.author
.ok_or(Error::EthTypeError(eth_types::Error::IncompleteBlock))?,
},
)];
for (tx_index, tx) in eth_block.transactions.iter().enumerate() {
let geth_trace = &geth_traces[tx_index];
let tx_access_trace = gen_state_access_trace(eth_block, tx, geth_trace)?;
block_access_trace.extend(tx_access_trace);
}
if let Some(_pi) = protocol_instance {
block_access_trace.push(Access::new(
if cfg!(feature = "disable_l2_trace_block") {
Ok(AccessSet::from(vec![]))
} else {
let mut block_access_trace = vec![Access::new(
None,
RW::WRITE,
AccessValue::Account {
address: *protocol_instance::TREASURY,
address: eth_block
.author
.ok_or(Error::EthTypeError(eth_types::Error::IncompleteBlock))?,
},
));
}
)];

for (tx_index, tx) in eth_block.transactions.iter().enumerate() {
let geth_trace = &geth_traces[tx_index];
let tx_access_trace = gen_state_access_trace(eth_block, tx, geth_trace)?;
block_access_trace.extend(tx_access_trace);
}

Ok(AccessSet::from(block_access_trace))
if let Some(_pi) = protocol_instance {
block_access_trace.push(Access::new(
None,
RW::WRITE,
AccessValue::Account {
address: *protocol_instance::TREASURY,
},
));
}

Ok(AccessSet::from(block_access_trace))
}
}

/// Build a partial StateDB from step 3
Expand Down Expand Up @@ -561,26 +569,31 @@ impl<P: JsonRpcClient> BuilderClient<P> {
Error,
> {
let mut proofs = Vec::new();
for (address, key_set) in access_set.state {
let mut keys: Vec<Word> = key_set.iter().cloned().collect();
keys.sort();
let proof = self
.cli
.get_proof(address, keys, (block_num - 1).into())
.await
.unwrap();
proofs.push(proof);
}
let mut codes: HashMap<Address, Vec<u8>> = HashMap::new();
for address in access_set.code {
let code = self
.cli
.get_code(address, (block_num - 1).into())
.await
.unwrap();
codes.insert(address, code);
if cfg!(feature = "disable_l2_trace_block") {
Ok((proofs, codes))
} else {
for (address, key_set) in access_set.state {
let mut keys: Vec<Word> = key_set.iter().cloned().collect();
keys.sort();
let proof = self
.cli
.get_proof(address, keys, (block_num - 1).into())
.await
.unwrap();
proofs.push(proof);
}
for address in access_set.code {
let code = self
.cli
.get_code(address, (block_num - 1).into())
.await
.unwrap();
codes.insert(address, code);
}

Ok((proofs, codes))
}
Ok((proofs, codes))
}

/// Step 4. Build a partial StateDB from step 3
Expand Down
33 changes: 21 additions & 12 deletions bus-mapping/src/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,16 @@ impl<P: JsonRpcClient> GethClient<P> {
pub async fn trace_block_by_hash(&self, hash: Hash) -> Result<Vec<GethExecTrace>, Error> {
let hash = serialize(&hash);
let cfg = serialize(&GethLoggerConfig::default());
let resp: ResultGethExecTraces = self
.0
.request("debug_traceBlockByHash", [hash, cfg])
.await
.map_err(|e| Error::JSONRpcError(e.into()))?;
Ok(resp.0.into_iter().map(|step| step.result).collect())
if cfg!(feature = "disable_l2_trace_block") {
Ok(vec![])
} else {
let resp: ResultGethExecTraces = self
.0
.request("debug_traceBlockByHash", [hash, cfg])
.await
.map_err(|e| Error::JSONRpcError(e.into()))?;
Ok(resp.0.into_iter().map(|step| step.result).collect())
}
}

/// Calls `debug_traceBlockByNumber` via JSON-RPC returning a
Expand All @@ -124,12 +128,17 @@ impl<P: JsonRpcClient> GethClient<P> {
) -> Result<Vec<GethExecTrace>, Error> {
let num = serialize(&block_num);
let cfg = serialize(&GethLoggerConfig::default());
let resp: ResultGethExecTraces = self
.0
.request("debug_traceBlockByNumber", [num, cfg])
.await
.map_err(|e| Error::JSONRpcError(e.into()))?;
Ok(resp.0.into_iter().map(|step| step.result).collect())
if cfg!(feature = "disable_l2_trace_block") {
Ok(vec![])
} else {
println!("enable_debug_trace_block");
let resp: ResultGethExecTraces = self
.0
.request("debug_traceBlockByNumber", [num, cfg])
.await
.map_err(|e| Error::JSONRpcError(e.into()))?;
Ok(resp.0.into_iter().map(|step| step.result).collect())
}
}

/// Calls `eth_getCode` via JSON-RPC returning a contract code
Expand Down

0 comments on commit 4314b27

Please sign in to comment.