Skip to content

Commit

Permalink
test: add verify result verification to fuzzer
Browse files Browse the repository at this point in the history
  • Loading branch information
petscheit committed Apr 29, 2024
1 parent d052836 commit 6ccf957
Show file tree
Hide file tree
Showing 69 changed files with 25,267 additions and 35,555 deletions.
500 changes: 300 additions & 200 deletions tests/fuzzing/fixtures/mpt_proofs_0.json

Large diffs are not rendered by default.

500 changes: 300 additions & 200 deletions tests/fuzzing/fixtures/mpt_proofs_1.json

Large diffs are not rendered by default.

1,070 changes: 639 additions & 431 deletions tests/fuzzing/fixtures/mpt_proofs_10.json

Large diffs are not rendered by default.

1,365 changes: 868 additions & 497 deletions tests/fuzzing/fixtures/mpt_proofs_11.json

Large diffs are not rendered by default.

1,114 changes: 627 additions & 487 deletions tests/fuzzing/fixtures/mpt_proofs_12.json

Large diffs are not rendered by default.

1,113 changes: 641 additions & 472 deletions tests/fuzzing/fixtures/mpt_proofs_13.json

Large diffs are not rendered by default.

1,363 changes: 865 additions & 498 deletions tests/fuzzing/fixtures/mpt_proofs_14.json

Large diffs are not rendered by default.

1,360 changes: 863 additions & 497 deletions tests/fuzzing/fixtures/mpt_proofs_15.json

Large diffs are not rendered by default.

827 changes: 495 additions & 332 deletions tests/fuzzing/fixtures/mpt_proofs_16.json

Large diffs are not rendered by default.

700 changes: 400 additions & 300 deletions tests/fuzzing/fixtures/mpt_proofs_17.json

Large diffs are not rendered by default.

999 changes: 420 additions & 579 deletions tests/fuzzing/fixtures/mpt_proofs_18.json

Large diffs are not rendered by default.

1,000 changes: 418 additions & 582 deletions tests/fuzzing/fixtures/mpt_proofs_19.json

Large diffs are not rendered by default.

624 changes: 380 additions & 244 deletions tests/fuzzing/fixtures/mpt_proofs_2.json

Large diffs are not rendered by default.

992 changes: 400 additions & 592 deletions tests/fuzzing/fixtures/mpt_proofs_20.json

Large diffs are not rendered by default.

1,006 changes: 427 additions & 579 deletions tests/fuzzing/fixtures/mpt_proofs_21.json

Large diffs are not rendered by default.

1,020 changes: 659 additions & 361 deletions tests/fuzzing/fixtures/mpt_proofs_22.json

Large diffs are not rendered by default.

1,373 changes: 875 additions & 498 deletions tests/fuzzing/fixtures/mpt_proofs_23.json

Large diffs are not rendered by default.

1,396 changes: 878 additions & 518 deletions tests/fuzzing/fixtures/mpt_proofs_24.json

Large diffs are not rendered by default.

1,425 changes: 891 additions & 534 deletions tests/fuzzing/fixtures/mpt_proofs_25.json

Large diffs are not rendered by default.

1,372 changes: 874 additions & 498 deletions tests/fuzzing/fixtures/mpt_proofs_26.json

Large diffs are not rendered by default.

1,396 changes: 890 additions & 506 deletions tests/fuzzing/fixtures/mpt_proofs_27.json

Large diffs are not rendered by default.

887 changes: 398 additions & 489 deletions tests/fuzzing/fixtures/mpt_proofs_28.json

Large diffs are not rendered by default.

1,095 changes: 550 additions & 545 deletions tests/fuzzing/fixtures/mpt_proofs_29.json

Large diffs are not rendered by default.

800 changes: 500 additions & 300 deletions tests/fuzzing/fixtures/mpt_proofs_3.json

Large diffs are not rendered by default.

1,058 changes: 521 additions & 537 deletions tests/fuzzing/fixtures/mpt_proofs_30.json

Large diffs are not rendered by default.

992 changes: 405 additions & 587 deletions tests/fuzzing/fixtures/mpt_proofs_31.json

Large diffs are not rendered by default.

979 changes: 399 additions & 580 deletions tests/fuzzing/fixtures/mpt_proofs_32.json

Large diffs are not rendered by default.

980 changes: 400 additions & 580 deletions tests/fuzzing/fixtures/mpt_proofs_33.json

Large diffs are not rendered by default.

1,068 changes: 607 additions & 461 deletions tests/fuzzing/fixtures/mpt_proofs_34.json

Large diffs are not rendered by default.

1,368 changes: 870 additions & 498 deletions tests/fuzzing/fixtures/mpt_proofs_35.json

Large diffs are not rendered by default.

1,375 changes: 877 additions & 498 deletions tests/fuzzing/fixtures/mpt_proofs_36.json

Large diffs are not rendered by default.

1,148 changes: 676 additions & 472 deletions tests/fuzzing/fixtures/mpt_proofs_37.json

Large diffs are not rendered by default.

707 changes: 353 additions & 354 deletions tests/fuzzing/fixtures/mpt_proofs_38.json

Large diffs are not rendered by default.

808 changes: 400 additions & 408 deletions tests/fuzzing/fixtures/mpt_proofs_39.json

Large diffs are not rendered by default.

612 changes: 359 additions & 253 deletions tests/fuzzing/fixtures/mpt_proofs_4.json

Large diffs are not rendered by default.

1,362 changes: 762 additions & 600 deletions tests/fuzzing/fixtures/mpt_proofs_40.json

Large diffs are not rendered by default.

1,506 changes: 858 additions & 648 deletions tests/fuzzing/fixtures/mpt_proofs_41.json

Large diffs are not rendered by default.

1,057 changes: 547 additions & 510 deletions tests/fuzzing/fixtures/mpt_proofs_42.json

Large diffs are not rendered by default.

502 changes: 0 additions & 502 deletions tests/fuzzing/fixtures/mpt_proofs_43.json

This file was deleted.

538 changes: 0 additions & 538 deletions tests/fuzzing/fixtures/mpt_proofs_44.json

This file was deleted.

602 changes: 0 additions & 602 deletions tests/fuzzing/fixtures/mpt_proofs_45.json

This file was deleted.

602 changes: 0 additions & 602 deletions tests/fuzzing/fixtures/mpt_proofs_46.json

This file was deleted.

642 changes: 0 additions & 642 deletions tests/fuzzing/fixtures/mpt_proofs_47.json

This file was deleted.

652 changes: 0 additions & 652 deletions tests/fuzzing/fixtures/mpt_proofs_48.json

This file was deleted.

718 changes: 0 additions & 718 deletions tests/fuzzing/fixtures/mpt_proofs_49.json

This file was deleted.

885 changes: 388 additions & 497 deletions tests/fuzzing/fixtures/mpt_proofs_5.json

Large diffs are not rendered by default.

763 changes: 0 additions & 763 deletions tests/fuzzing/fixtures/mpt_proofs_50.json

This file was deleted.

765 changes: 0 additions & 765 deletions tests/fuzzing/fixtures/mpt_proofs_51.json

This file was deleted.

763 changes: 0 additions & 763 deletions tests/fuzzing/fixtures/mpt_proofs_52.json

This file was deleted.

762 changes: 0 additions & 762 deletions tests/fuzzing/fixtures/mpt_proofs_53.json

This file was deleted.

761 changes: 0 additions & 761 deletions tests/fuzzing/fixtures/mpt_proofs_54.json

This file was deleted.

765 changes: 0 additions & 765 deletions tests/fuzzing/fixtures/mpt_proofs_55.json

This file was deleted.

762 changes: 0 additions & 762 deletions tests/fuzzing/fixtures/mpt_proofs_56.json

This file was deleted.

776 changes: 0 additions & 776 deletions tests/fuzzing/fixtures/mpt_proofs_57.json

This file was deleted.

774 changes: 0 additions & 774 deletions tests/fuzzing/fixtures/mpt_proofs_58.json

This file was deleted.

767 changes: 0 additions & 767 deletions tests/fuzzing/fixtures/mpt_proofs_59.json

This file was deleted.

1,006 changes: 438 additions & 568 deletions tests/fuzzing/fixtures/mpt_proofs_6.json

Large diffs are not rendered by default.

780 changes: 0 additions & 780 deletions tests/fuzzing/fixtures/mpt_proofs_60.json

This file was deleted.

784 changes: 0 additions & 784 deletions tests/fuzzing/fixtures/mpt_proofs_61.json

This file was deleted.

767 changes: 0 additions & 767 deletions tests/fuzzing/fixtures/mpt_proofs_62.json

This file was deleted.

768 changes: 0 additions & 768 deletions tests/fuzzing/fixtures/mpt_proofs_63.json

This file was deleted.

123 changes: 0 additions & 123 deletions tests/fuzzing/fixtures/mpt_proofs_64.json

This file was deleted.

1,070 changes: 500 additions & 570 deletions tests/fuzzing/fixtures/mpt_proofs_7.json

Large diffs are not rendered by default.

1,126 changes: 603 additions & 523 deletions tests/fuzzing/fixtures/mpt_proofs_8.json

Large diffs are not rendered by default.

1,145 changes: 625 additions & 520 deletions tests/fuzzing/fixtures/mpt_proofs_9.json

Large diffs are not rendered by default.

18 changes: 17 additions & 1 deletion tests/fuzzing/mpt.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ func verify_n_mpt_proofs{
local proof_len: felt;
local key: Uint256;
local root: Uint256;
local expected_hash: Uint256;
local expected_bytes_len: felt;

%{
from tools.py.utils import bytes_to_8_bytes_chunks_little, split_128, reverse_endian_256
Expand Down Expand Up @@ -86,9 +88,17 @@ func verify_n_mpt_proofs{
(key_low, key_high) = reverse_key(batch["key"])
ids.key.low = key_low
ids.key.high = key_high
# handle root
reversed_hash = reverse_endian_256(int(batch["value_hash"], 16))
(hash_low, hash_high) = split_128(reversed_hash)
ids.expected_hash.low = hash_low
ids.expected_hash.high = hash_high
ids.expected_bytes_len = batch["value_len"]
%}

let (_, _) = verify_mpt_proof(
let (result, result_bytes_len) = verify_mpt_proof(
mpt_proof=proof,
mpt_proof_bytes_len=proof_bytes_len,
mpt_proof_len=proof_len,
Expand All @@ -99,5 +109,11 @@ func verify_n_mpt_proofs{
pow2_array=pow2_array,
);

assert result_bytes_len = expected_bytes_len;

let (local value_hash) = keccak(result, result_bytes_len);
assert expected_hash.low = value_hash.low;
assert expected_hash.high = value_hash.high;

return verify_n_mpt_proofs(batch_len, index + 1);
}
1 change: 1 addition & 0 deletions tests/rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion tests/rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ rand = "0.8.4"
tiny-keccak = "2.0.2"
eth_trie = "0.4.0"
ethereum-types = "0.14.1"
rlp = "0.5.2"

[dev-dependencies]
tokio = { version = "1", features = ["full", "test-util"] }
tokio = { version = "1", features = ["full", "test-util"] }
115 changes: 101 additions & 14 deletions tests/rust/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ use eth_trie_proofs::tx_receipt_trie::TxReceiptsMptHandler;
use eth_trie_proofs::tx_trie::TxsMptHandler;
use eth_trie_proofs::Error as TrieError;
use ethereum_types::H256;
use rand::Rng;
use rand::{Rng, RngCore};
use rlp::encode;
use reqwest::Client;
use serde::Serialize;
use serde_with::serde_as;
Expand Down Expand Up @@ -55,6 +56,9 @@ pub struct MptProof {
proof: Vec<Vec<u8>>,
#[serde_as(as = "serde_with::hex::Hex")]
key: Vec<u8>,
#[serde_as(as = "serde_with::hex::Hex")]
value_hash: Vec<u8>,
value_len: u16,
kind: ProofType,
}

Expand Down Expand Up @@ -84,13 +88,16 @@ impl Fetcher {
let root = self.tx.get_root().unwrap();

// ensure the proof is valid
self.tx.verify_proof(i, trie_proof.clone())?;
let result = self.tx.verify_proof(i, trie_proof.clone())?;
let (value_hash, value_len) = gen_payload_commitment(result);

proofs.push(MptProof {
proof: trie_proof,
key: generate_key_from_index(i),
root,
kind: ProofType::TxProof,
value_hash,
value_len,
});
}

Expand All @@ -111,13 +118,16 @@ impl Fetcher {
let root = self.receipt.get_root()?;

// ensure the proof is valid
self.receipt.verify_proof(i, trie_proof.clone())?;
let result = self.receipt.verify_proof(i, trie_proof.clone())?;
let (value_hash, value_len) = gen_payload_commitment(result);

proofs.push(MptProof {
proof: trie_proof,
key: generate_key_from_index(i),
root,
kind: ProofType::ReceiptProof,
value_hash,
value_len,
});
}

Expand Down Expand Up @@ -154,18 +164,26 @@ impl Fetcher {
.collect();

// ensure the proof is valid
trie.verify_proof(
let result = trie.verify_proof(
H256::from_slice(block.header.state_root.as_slice()),
generate_key_from_address(address.0.as_slice()).as_slice(),
proof.clone(),
)?;

proofs.push(MptProof {
proof,
key: generate_key_from_address(address.0.as_slice()),
root: block.header.state_root,
kind: ProofType::AccountProof,
});
match result {
Some(value) => {
let (value_hash, value_len) = gen_payload_commitment(value.to_vec());
proofs.push(MptProof {
proof,
key: generate_key_from_address(address.0.as_slice()),
root: block.header.state_root,
kind: ProofType::AccountProof,
value_hash,
value_len,
});
}
_ => panic!("Proof verification failed for address: {:?}", address),
}
}

Ok(proofs)
Expand Down Expand Up @@ -227,16 +245,85 @@ impl Fetcher {
}
}

fn gen_payload_commitment(value: Vec<u8>) -> (Vec<u8>, u16) {
let mut hasher = Keccak::v256();
hasher.update(value.as_ref());
let mut output = [0u8; 32];
hasher.finalize(&mut output);
(output.to_vec(), value.len() as u16)
}

fn generate_byte_key_tests() -> Vec<MptProof> {
let (mut trie, keys) = seed_test_trie();
let mut proofs = vec![];
let root = trie.root_hash().unwrap();
for (i, key) in keys.iter().enumerate() {
let proof = trie.get_proof(key.as_slice()).unwrap();
let res = trie.verify_proof(root.clone(), key.as_slice(), proof.clone());
match res {
Ok(Some(value)) => {
let (value_hash, value_len) = gen_payload_commitment(value.to_vec());
proofs.push(MptProof {
proof,
key: key.clone(),
root: B256::from_slice(root.as_bytes()),
kind: ProofType::TxProof,
value_hash,
value_len,
});
},
_ => panic!("Proof verification failed for key: {:?}", i),
}
}

proofs
}

fn seed_test_trie() -> (EthTrie<MemoryDB>, Vec<Vec<u8>>) {
let memdb = Arc::new(MemoryDB::new(true));
let mut trie = EthTrie::new(memdb.clone());
let mut keys = vec![];
let mut key_bytes_len = 1;
while key_bytes_len <= 32 {
let mut key = vec![0u8; key_bytes_len];
let mut value = vec![0u8; 32];
let mut i = 0;

// increase the permutations with a growing key size
let permutations: u64 = 100 + key_bytes_len.pow(4) as u64;

while i < permutations {
rand::thread_rng().fill_bytes(&mut key);
rand::thread_rng().fill_bytes(&mut value);
let rlp_value = encode(&value);
trie.insert(key.clone().as_slice(), rlp_value.as_ref()).unwrap();
i += 1;
}

// The value we use for the test is rlp encoded
rand::thread_rng().fill_bytes(&mut key);
rand::thread_rng().fill_bytes(&mut value);
let rlp_value = encode(&value);

trie.insert(key.clone().as_slice(), rlp_value.as_ref()).unwrap();

keys.push(key);
key_bytes_len += 1;
}

return (trie, keys);
}


#[tokio::main]
async fn main() -> Result<(), Error> {
// Create a new Fetcher instance
let mut fetcher =
Fetcher::new("")?;
let mut fetcher = Fetcher::new("")?;

// Generate random block proofs
let proofs = fetcher.generate_random_block_proofs(5).await?;
// let proofs = fetcher.get_account_proofs(19733390).await?;
// let proofs = fetcher.generate_random_block_proofs(5).await?;

let proofs = generate_byte_key_tests();
export_batch(proofs).unwrap();

Ok(())
Expand Down

0 comments on commit 6ccf957

Please sign in to comment.