Skip to content

Commit 10090e7

Browse files
committed
fix code_hash verification
1 parent bd2243e commit 10090e7

File tree

9 files changed

+161
-35
lines changed

9 files changed

+161
-35
lines changed

core/src/execution/client/rpc.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet};
33
use alloy::consensus::BlockHeader;
44
use alloy::eips::BlockId;
55
use alloy::network::{BlockResponse, ReceiptResponse, TransactionBuilder};
6-
use alloy::primitives::{keccak256, Address, B256, U256};
6+
use alloy::primitives::{Address, B256, U256};
77
use alloy::rlp;
88
use alloy::rpc::types::{EIP1186AccountProofResponse, Filter, FilterChanges, Log};
99
use async_trait::async_trait;
@@ -21,7 +21,8 @@ use crate::execution::constants::{
2121
};
2222
use crate::execution::errors::ExecutionError;
2323
use crate::execution::proof::{
24-
ordered_trie_root_noop_encoder, verify_account_proof, verify_storage_proof,
24+
ordered_trie_root_noop_encoder, verify_account_proof, verify_code_hash_proof,
25+
verify_storage_proof,
2526
};
2627
use crate::execution::rpc::ExecutionRpc;
2728
use crate::execution::state::State;
@@ -255,17 +256,10 @@ impl<N: NetworkSpec, R: ExecutionRpc<N>> ExecutionInnerRpcClient<N, R> {
255256
let code = self
256257
.rpc
257258
.get_code(proof.address, block.header().number().into())
258-
.await?;
259-
let code_hash = keccak256(&code);
260-
if proof.code_hash != code_hash {
261-
return Err(ExecutionError::CodeHashMismatch(
262-
proof.address,
263-
code_hash,
264-
proof.code_hash,
265-
)
266-
.into());
267-
}
268-
Some(code.into())
259+
.await?
260+
.into();
261+
verify_code_hash_proof(proof, &code)?;
262+
Some(code)
269263
} else {
270264
None
271265
};
@@ -510,7 +504,11 @@ mod tests {
510504
async fn test_create_access_list() {
511505
let client = get_client().await;
512506
let address = rpc_proof().address;
513-
let tx = TransactionRequest::default().from(address).to(address);
507+
let block_beneficiary = rpc_block().header.beneficiary;
508+
let tx = TransactionRequest::default()
509+
.from(address)
510+
.to(block_beneficiary)
511+
.value(U256::ZERO);
514512

515513
let response = client
516514
.create_access_list(&tx, BlockId::latest().into())
@@ -519,6 +517,10 @@ mod tests {
519517

520518
assert_eq!(response.len(), 2);
521519
assert_eq!(response.get(&address).unwrap(), &rpc_account());
520+
assert_eq!(
521+
response.get(&block_beneficiary).unwrap(),
522+
&rpc_block_miner_account()
523+
);
522524
}
523525

524526
#[tokio::test]

core/src/execution/client/verifiable_api.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::{hash_map::Entry, HashMap};
33
use alloy::consensus::BlockHeader;
44
use alloy::eips::BlockId;
55
use alloy::network::{BlockResponse, ReceiptResponse};
6-
use alloy::primitives::{keccak256, Address, B256, U256};
6+
use alloy::primitives::{Address, B256, U256};
77
use alloy::rlp;
88
use alloy::rpc::types::{EIP1186AccountProofResponse, Filter, FilterChanges, Log};
99
use async_trait::async_trait;
@@ -16,7 +16,9 @@ use helios_common::{
1616
use helios_verifiable_api_client::{types::*, VerifiableApi};
1717

1818
use crate::execution::errors::ExecutionError;
19-
use crate::execution::proof::{verify_account_proof, verify_receipt_proof, verify_storage_proof};
19+
use crate::execution::proof::{
20+
verify_account_proof, verify_code_hash_proof, verify_receipt_proof, verify_storage_proof,
21+
};
2022
use crate::execution::state::State;
2123

2224
use super::{ExecutionInner, ExecutionSpec};
@@ -216,15 +218,7 @@ impl<N: NetworkSpec, A: VerifiableApi<N>> ExecutionInnerVerifiableApiClient<N, A
216218
// Verify the code hash (if code is included in the response)
217219
let code = match account.code {
218220
Some(code) => {
219-
let code_hash = keccak256(&code);
220-
if proof.code_hash != code_hash {
221-
return Err(ExecutionError::CodeHashMismatch(
222-
address,
223-
code_hash,
224-
proof.code_hash,
225-
)
226-
.into());
227-
}
221+
verify_code_hash_proof(&proof, &code)?;
228222
Some(code)
229223
}
230224
None => None,

core/src/execution/proof.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use alloy_trie::root::ordered_trie_root_with_encoder;
99
use alloy_trie::{
1010
proof::{verify_proof, ProofRetainer},
1111
root::adjust_index_for_rlp,
12-
HashBuilder, Nibbles, TrieAccount,
12+
HashBuilder, Nibbles, TrieAccount, KECCAK_EMPTY,
1313
};
1414
use eyre::{eyre, Result};
1515

@@ -50,6 +50,24 @@ pub fn verify_storage_proof(proof: &EIP1186AccountProofResponse) -> Result<HashM
5050
Ok(slot_map)
5151
}
5252

53+
/// Verify a given `EIP1186AccountProofResponse`'s code hash against the given code.
54+
pub fn verify_code_hash_proof(proof: &EIP1186AccountProofResponse, code: &Bytes) -> Result<()> {
55+
if (proof.code_hash == KECCAK_EMPTY || proof.code_hash == B256::ZERO) && code.is_empty() {
56+
Ok(())
57+
} else {
58+
let code_hash = keccak256(code);
59+
if proof.code_hash != code_hash {
60+
return Err(ExecutionError::CodeHashMismatch(
61+
proof.address,
62+
code_hash,
63+
proof.code_hash,
64+
)
65+
.into());
66+
}
67+
Ok(())
68+
}
69+
}
70+
5371
/// Verifies a MPT proof for a given key-value pair against the provided root hash.
5472
/// This function wraps `alloy_trie::proof::verify_proof` and checks
5573
/// if the value represents an empty account or slot to support exclusion proofs.
@@ -202,6 +220,37 @@ mod tests {
202220
assert_eq!(result.unwrap(), expected.slots);
203221
}
204222

223+
#[test]
224+
fn test_verify_code_hash_proof() {
225+
let proof = rpc_proof();
226+
let code = rpc_account().code.unwrap();
227+
228+
let result = verify_code_hash_proof(&proof, &code);
229+
230+
assert!(result.is_ok());
231+
}
232+
233+
#[test]
234+
fn test_verify_code_hash_proof_empty_hash() {
235+
let proof = EIP1186AccountProofResponse::default();
236+
let code = Bytes::new();
237+
238+
let result = verify_code_hash_proof(&proof, &code);
239+
240+
assert!(result.is_ok());
241+
}
242+
243+
#[test]
244+
fn test_verify_code_hash_proof_empty_keccak() {
245+
let mut proof = EIP1186AccountProofResponse::default();
246+
proof.code_hash = KECCAK_EMPTY;
247+
let code = Bytes::new();
248+
249+
let result = verify_code_hash_proof(&proof, &code);
250+
251+
assert!(result.is_ok());
252+
}
253+
205254
#[test]
206255
fn test_create_receipt_proof() {
207256
let receipts = rpc_block_receipts();

core/src/execution/rpc/mock_rpc.rs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ use alloy::rpc::types::{
77
FilterChanges, Log,
88
};
99
use async_trait::async_trait;
10-
use eyre::Result;
10+
use eyre::{Ok, Result};
1111

12-
use helios_common::network_spec::NetworkSpec;
12+
use helios_common::{network_spec::NetworkSpec, types::Account};
1313

1414
use crate::execution::errors::ExecutionError;
1515

@@ -30,12 +30,19 @@ impl<N: NetworkSpec> ExecutionRpc<N> for MockRpc {
3030

3131
async fn get_proof(
3232
&self,
33-
_address: Address,
33+
address: Address,
3434
_slots: &[B256],
3535
_block: BlockId,
3636
) -> Result<EIP1186AccountProofResponse> {
37-
let proof = read_to_string(self.path.join("proof.json"))?;
38-
Ok(serde_json::from_str(&proof)?)
37+
let proof: EIP1186AccountProofResponse =
38+
serde_json::from_str(&read_to_string(self.path.join("proof.json"))?)?;
39+
let block_miner_proof: EIP1186AccountProofResponse =
40+
serde_json::from_str(&read_to_string(self.path.join("block_miner_proof.json"))?)?;
41+
match address {
42+
address if address == proof.address => Ok(proof),
43+
address if address == block_miner_proof.address => Ok(block_miner_proof),
44+
_ => Err(ExecutionError::InvalidAccountProof(address).into()),
45+
}
3946
}
4047

4148
async fn create_access_list(
@@ -47,9 +54,25 @@ impl<N: NetworkSpec> ExecutionRpc<N> for MockRpc {
4754
Ok(serde_json::from_str(&access_list)?)
4855
}
4956

50-
async fn get_code(&self, _address: Address, _block: BlockId) -> Result<Vec<u8>> {
51-
let code = read_to_string(self.path.join("code.txt"))?;
52-
Ok(hex::decode(&code[2..code.len()])?)
57+
async fn get_code(&self, address: Address, _block: BlockId) -> Result<Vec<u8>> {
58+
let proof: EIP1186AccountProofResponse =
59+
serde_json::from_str(&read_to_string(self.path.join("proof.json"))?)?;
60+
let block_miner_proof: EIP1186AccountProofResponse =
61+
serde_json::from_str(&read_to_string(self.path.join("block_miner_proof.json"))?)?;
62+
let account: Account =
63+
serde_json::from_str(&read_to_string(self.path.join("account.json"))?)?;
64+
let block_miner_account: Account =
65+
serde_json::from_str(&read_to_string(self.path.join("block_miner_account.json"))?)?;
66+
67+
let code = match address {
68+
address if address == proof.address => Ok(account.code.unwrap()),
69+
address if address == block_miner_proof.address => {
70+
Ok(block_miner_account.code.unwrap())
71+
}
72+
_ => Err(ExecutionError::InvalidAccountProof(address).into()),
73+
}?;
74+
75+
Ok(code.into())
5376
}
5477

5578
async fn send_raw_transaction(&self, _bytes: &[u8]) -> Result<B256> {

tests/test-utils/src/lib.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ pub fn rpc_account() -> Account {
3131
serde_json::from_str(&json_str).unwrap()
3232
}
3333

34+
pub fn rpc_block_miner_account() -> Account {
35+
let json_str = read_to_string(testdata_dir().join("rpc/block_miner_account.json")).unwrap();
36+
serde_json::from_str(&json_str).unwrap()
37+
}
38+
3439
pub fn rpc_tx() -> <EthereumSpec as Network>::TransactionResponse {
3540
let json_str = read_to_string(testdata_dir().join("rpc/transaction.json")).unwrap();
3641
serde_json::from_str(&json_str).unwrap()
@@ -91,6 +96,12 @@ pub fn verifiable_api_account_response() -> AccountResponse {
9196
serde_json::from_str(&resp).unwrap()
9297
}
9398

99+
pub fn verifiable_api_block_miner_account_response() -> AccountResponse {
100+
let resp =
101+
read_to_string(testdata_dir().join("verifiable_api/block_miner_account.json")).unwrap();
102+
serde_json::from_str(&resp).unwrap()
103+
}
104+
94105
pub fn verifiable_api_tx_receipt_response() -> TransactionReceiptResponse<EthereumSpec> {
95106
let resp = read_to_string(testdata_dir().join("verifiable_api/receipt.json")).unwrap();
96107
serde_json::from_str(&resp).unwrap()
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"balance": "0x9305538e4df80dba",
3+
"nonce": 1304478,
4+
"code_hash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
5+
"code": "0x",
6+
"storage_hash": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
7+
"slots": {}
8+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"address": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97",
3+
"accountProof": [
4+
"0xf90211a04de781e40db9ece5b6973caf04a42cf328d37ba81a0c210d55ff6ffb1fb5c03ca0f8e60afac14ee5dfda9c732ef2be18d5facc909eb678aff05f4b5502b8457e4fa0940319a4f40630df6a7f6ac17d19b4919e569114b92d31f1e4c25244751a7efba0a30596deb86fbe518db16adfa9fb68c2c1220b60aa477eb1638a43c7aed02cfba03ff6f9ed223cd6ac0d461d891f627e0a9bc516df79adb0ac548d7caa74be854ca03afb47d898836c5c86937381833963fa1a7158701f2f4cbe2387844b1117575da04405917712d691fa37b2da09ae871d4597acde8a2b89572f9d46b79ede75a5a2a04ff81b810a750b2b8a131de13985cdd4879910f11a5ebdf4d5ceee66fb748817a0093bd629861d55711482bb6ec0b6f7b55c00dedbaf8165ab89e74f2f16cf66b7a0bc99964c4cc436e3998a400b0c0b7dd6c5018d560408dfa40bc4c403cf96c92ba0d071cb24698db09572d44f0f139eb5ccc163ab77e2edf193736804bbdae02016a0d3fad07e78263bf7c3ed5db4500fbc4aad4e18a1cff1855ca448127cbc010cc8a04af7e522a9c40996024df03dca73f7473195896ee1de9fd28d2bc46ebdf620c8a0edcee94a49718bcd03b87aadb6d0770022ddb0c00550f91dc826c91ddc8d85a2a0599e0552baeb7ca71f0a5d181a5223cdbb9ce5d5f4ae93760acb12178f15d691a0e3f15326a38a5458ff766a61c2920025241e80325a857749284e3ad3c03c37ac80",
5+
"0xf90211a006c3985c78b3d55eedde596f4395d1b8556ae460412cd5bd7540f831e3adfe2da0e5f4f7136dedb749cea97a0aafd3516e9a4d0d805de909acb96a04deaffc835ca04cb49d3fca46608e3f5b067341f3d0adaccbcedf678d69104c2fe8fb9aa13aaea00ee98611a2681623c389544959fce9536dc0c8cccd80bf2f086164fe661accc1a08cf1b46c60d0a18cb23bb0b76d4893ac6b478519073809a222cd698f69ff15bba0c78d47d4b4c1a5bc96765a957956d58554221402076d57fbf7f3fb0728321a72a0d43ac5e5f49d191f7f5499c73c95a7bf0f793da341b96b61d95f59da03a42d59a04dd2c853a6b983d56114aeff4ba10636a80b4b6a83e64e3e5a7ec5fbce027644a0efdb33749984d601674a5c780adcde5783a13c5bc5fa276cde7548bdcf04174ba038cb46d1b132a75bb73fbbb408e1aa883a350002fe7e3d13e9ea826acb273e4fa03696ce932c426a8de9ed393c540401f27543bb09b8b5da74812fcb1add7e339ca01cd4a458f997bbafa02aa60f30d527150ac9be4df5eaaa4a610e462c6b43ce90a00c2636471625282ed5fc47af9c8ca0cd17728a0b0b942e175159287df2d4da4da0a29328acf525b00ad3a9629cbda319cddb05473ec1a79a269604e1834aba9830a0a7f8de047d48cb0ecc34fc1ab4413067373e7cf5c37e1c2bf5839533d0b9e800a0adfd6d59773f47187af9978b0cfbb009569aa06feeaaac2df9361bbc15df68ec80",
6+
"0xf90211a0aa7b6dcb079370c11f8bb386289b201ffde27266bfa0bfe12410ebec3c905008a061e61769e2ca68d51c10ebf29034e9f405476ed3bade477c65ef306632045d35a0f9b1f2a332a3292ef52e8ab4f75990f92c4e1446beb8fbb2236bcdc826af9fe5a0abfe52b185165fa99248e183ca4eb5312b95cc6834766915bb0fa71799cf4a08a0fa6ba9243c18d11f794a95832c6de44a6415218e72a124b11c4246480cfa329ea0dc7b4066ca4506ea577c2f6c1d88fe8bb69679ed2233db8e0a43db1c6cb6ebe6a0db29fd6afe5396fb3b3259103cbf92af25e14bec346fac761755dc852f09337aa01c8a2b7f6f1fb726ca0c8090167623bb47c48d4cfc88c12557a62d6a45f33c48a0e4293314d444cc4d62fec0e2e4d3fda01e5c0265e87a2adf0d423c07e989c737a051ba25ed4085e6eb2acaaa663a390089ae71d20224609bd01f147c1de951cf86a06f7ecbb5b2d6c56853dc44d881de5539c27eafef4ff1ed1df9e17a6280da6f64a09cd618cb380ffd1a223d87cf1ae952dfbb88263b777f1c08afb4d11afb6a46c1a0dfa6c9e66f69c867f04fc2b5c416ae14b12d74e176e27be11303563778f91ec4a064b94a23bb2aa0b78f7c0431f0ccfc25efd4cf313d322837561b362964ab0346a0a16b4ae1b619220eef2116d8adeaded69e120db024a1c2df740a7f25740491c3a01e0436b5b70238465882bddbaf6653e86335586a083a1654705e05dba008860b80",
7+
"0xf90211a005990e4e1d8e927dc03b39dabd62a393ea7f669d434986c8c9c65f22b1ae589ca006cf837a31cb2eda99979641446136839a087209446bce0c901b5d450a70680ca071690030a882f8f557f4e0def82e3d5c0bf7c7bab13312beab30ec1544e2d9f7a07867948a8528b807441d9e66cb9ea85d55fb198375e21a55ab31788e3fd2c675a07ee31b7a47757901ca5cd21b177ace2adf4e420efadb510bff635aa42cdc830da09dd7b63788c817a7f50eb4379e50599077144fd6745ad4f6d8311f26fe66a277a02595b89a7c48dbe39c75710de104a8df2c5e196a6a73ac710adf7148dfe5a8fea0e2a5e5dbd1af179d0224642a48dc3f80bd2555534852a27a017fc165ee303b72a075a9351f3344c73643340d4ca50e3c66898abb81f536a5870d058dda64ec9234a049560b2723f541d7560e6df20085e836afbcd19b72b7f0c100c252364e4d393ea014fde6656b343dbc223b5eb747622e8e0541b9da4561352147a9ac5d6b013259a0fc5270b2fba6474dcda6f905a3af20f6362e1afd9c703238b56ed85a758a41e9a0ce12b74a9887b9f24313fd5923466fdeac287666f4e61e95ab1d09c44a0e0a50a09bb196ccbf6e6b6f7017d32572fbabe0f6a4d950a20fd89425786330627362c3a0bd430bc6adad67c05ffe15f2c221a443d41b4a732f47212235ff0c649f09cb60a08c6b9d3610092f7f64208716ebec9f272cffa8f11f3ad6a82b928a1556236c5d80",
8+
"0xf90211a0176b292e35623405517c50ece606408df96d7dd7c09688f4e689e1797527741aa0bd0b5d94fca645bc20367c913bc8742f7133ee4ea8cd24191443166480fe0875a0b32176c8c5f234d03b3c5f918ec0346c5bd8c0bc500a2aa3d84480cc51727f51a02da77f52e48723eea6ceff91380ccc3e03b5c7c7976c858f694ee7f9352e8a08a0e161275f69800b27041b0041606e446d807b42f2863390fb84db4441a349f567a039090fa2728d3e45ebd1b376b26ce1f49151393547e7e8d00c8f42629ecaec43a055932bd42da2b5e7df77138613d7c9ca9b0023bd18a67b0d50a8d0110708ad4fa080f769c07b13c7c62afaac6731b719a98b4a138d78d34b6491acca1ee77c5e67a00cae38b1221003d441812f30fafdc95728fecb59e97ada39b1eb2f2ef90ec12fa0e8aff7988e8ed086cb09bbc7fbc96f47f1854a83bedf20074f569696fd8e95efa0e8841aa9180877938896042870c3d12b13849a3994d4ecb8b5ce309de25e5182a000c7f9797de5ecaf1ca7c3fd02f7775756a5c84af013972b9079af51e85e1faea0912871e6c1dd3ad16a5f9ac4a0fd834709fd78122a7082b4e8303c90d2d731b7a04f5fa50689266f16e7358ffa901bfad4d50722da89cb813ce1bc1ef5d0c410aea0da48f0a5660dd7720e58497027ff81752387fbadd89f2435098489192d465bc9a0d1600182abe9be310b2834e1c6d4fef1a2e7f602aa1a2759104c21066240ac5380",
9+
"0xf90211a0b5bfed1ed116f36f84f867afa2f6c297700bdf57c578b8b115aafdb6ea5d7e5ca08825dfb5f7dae1017bed256311ee863a941bafba98da742797645f89fa560802a0d3d37e6f8de782100f2fc1ff9d44ebdc1f86d7d4226aa4514b594655a9ebef06a0ae05e4650b152e5fd03ba224b1f26016a68ade0d74b4d3850f1952a403d198b8a0d3063460980bc53531a41345303d042d2046ad2a69dd357e7a4e5baccdbd75b6a08a2a943346ce200d3a690518ee148743d1ef98becaec62346e876933c46ce4a1a01ed6075cd69618cbf4dc5191d17a9f67e2c8c19479636fd5338a4fea5a210d92a081be0a1b964cc1ee7df34d19fee296de1c36981a389f0d5c426730943bacce98a03e2723492eff9177db1faeeae2bddd8c91df26633ef86281cfee2c75e056d215a09e4603e9970eb86675b230dd30c09eac2b25da0d905b18ab2fa90a866b7f4ea5a0a1054494c6ac464a51c1d1dc78af197ada23ee94b86a29cdfdb09bcf766ff6d5a0b745c02498778e3d49232fdf1054c8e3d3709918b6d043089b1b6c0294f15148a05d9d4a067947c7c0855ece13a01e74f684e3e9c759d992e47503046c712145aea0c9a5ed07bd40e8bf4a19bb84982b64b3352d9312cd88b578d719eb861428c8dba06ede2d3ec562be3a92675294be39d00b37627306b250ac66775215750a2d5f5da09edbd12ce0f70da153ed38964d855587ff74d0d1af808030a521cb06b41e184580",
10+
"0xf90151a05a7573c3bdd29eb7fa657e8356533a11b0406599cebabca640d38bc0ade44708a0ce317b4f64a99999984d067a6ebe605fff3366d00c1235fda928db7cb3ccbaa88080a074ba03ca71ce8424884bb49414a8535f25c1f84cae34a88a719249666edb7281a061af9898563a41840fa84477ad2d1ba382099ba29db353d96da0c6050700e8ea80a05c3402435276854272f998c3b62186aefe5a89145e5a1f57d38f6553e83a1e7080a0c775b4dedb1b6d9f5d44e7554b714263dcfcc2f69cd596ac735f3b891d60524e80a0c3a5bdbff35fbd1d0e90b8c7a42155c18c11659d2d2755ff4e4aa156019657c980a013b76be1f3108deef65292101120fbf8d4619c7c225ecdc0a2eb70a7161bc38fa02560194c862372b75130cabc863989ec53f2a1e4e831c4e434d9d4484fb79787a0b6618582bdf180ae7613d9d18fb6cb37018f0e8781aa75e1ee082e53d4022da180",
11+
"0xf871a0420cb6edaf996ff106374fa4a45bdbadace4299b6b7de5ac2bfb70a3d11ec2e68080808080808080a0d2735126c0963fa92de7674c74c136f2751abd8e0d3334875f3bb01b51a4e5b380808080a0665ce24cdf85c169ff166216d271be57b90644f7bb5eb4c5011fa6688ed0b1748080",
12+
"0xf8719d20607a69edc048e55c909aa157278ce470726246407159b74e0df1a64cb851f84f8313e79e889305538e4df80dbaa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
13+
],
14+
"balance": "0x9305538e4df80dba",
15+
"codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
16+
"nonce": "0x13e79e",
17+
"storageHash": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
18+
"storageProof": []
19+
}

0 commit comments

Comments
 (0)