From 44c77f5583d8a2d6f31ecfaf35748a7955abc428 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Thu, 16 Mar 2023 14:08:31 -0700 Subject: [PATCH] Input addresses --- evm/src/generation/mod.rs | 7 +++++++ evm/src/generation/outputs.rs | 5 +++++ evm/tests/basic_smart_contract.rs | 1 + evm/tests/empty_txn_list.rs | 1 + evm/tests/simple_transfer.rs | 1 + 5 files changed, 15 insertions(+) diff --git a/evm/src/generation/mod.rs b/evm/src/generation/mod.rs index 63da3d1c..aa17b9c9 100644 --- a/evm/src/generation/mod.rs +++ b/evm/src/generation/mod.rs @@ -46,6 +46,13 @@ pub struct GenerationInputs { pub contract_code: HashMap>, pub block_metadata: BlockMetadata, + + /// A list of known addresses in the input state trie (which itself doesn't hold addresses, + /// only state keys). This is only useful for debugging, so that we can return addresses in the + /// post-state rather than state keys. (See `GenerationOutputs`, and in particular + /// `AddressOrStateKey`.) If the caller is not interested in the post-state, this can be left + /// empty. + pub addresses: Vec
, } #[derive(Clone, Debug, Deserialize, Serialize, Default)] diff --git a/evm/src/generation/outputs.rs b/evm/src/generation/outputs.rs index a7e1a3f4..a197b1b6 100644 --- a/evm/src/generation/outputs.rs +++ b/evm/src/generation/outputs.rs @@ -30,6 +30,11 @@ pub struct AccountOutput { } pub(crate) fn get_outputs(state: &mut GenerationState) -> GenerationOutputs { + // First observe all addresses passed in the by caller. + for address in state.inputs.addresses.clone() { + state.observe_address(address); + } + let account_map = read_trie::( &state.memory, state.memory.read_global_metadata(StateTrieRoot).as_usize(), diff --git a/evm/tests/basic_smart_contract.rs b/evm/tests/basic_smart_contract.rs index 71d11933..ed326bfd 100644 --- a/evm/tests/basic_smart_contract.rs +++ b/evm/tests/basic_smart_contract.rs @@ -101,6 +101,7 @@ fn test_basic_smart_contract() -> anyhow::Result<()> { tries: tries_before, contract_code, block_metadata, + addresses: vec![], }; let mut timing = TimingTree::new("prove", log::Level::Debug); diff --git a/evm/tests/empty_txn_list.rs b/evm/tests/empty_txn_list.rs index 2bd9a116..19330417 100644 --- a/evm/tests/empty_txn_list.rs +++ b/evm/tests/empty_txn_list.rs @@ -48,6 +48,7 @@ fn test_empty_txn_list() -> anyhow::Result<()> { }, contract_code: HashMap::new(), block_metadata, + addresses: vec![], }; let mut timing = TimingTree::new("prove", log::Level::Debug); diff --git a/evm/tests/simple_transfer.rs b/evm/tests/simple_transfer.rs index 094bc070..d6e1a65f 100644 --- a/evm/tests/simple_transfer.rs +++ b/evm/tests/simple_transfer.rs @@ -75,6 +75,7 @@ fn test_simple_transfer() -> anyhow::Result<()> { tries: tries_before, contract_code: HashMap::new(), block_metadata, + addresses: vec![], }; let mut timing = TimingTree::new("prove", log::Level::Debug);