1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use crate::{block_executor::BlockExecutor, chunk_executor::ChunkExecutor};
use anyhow::Result;
use diem_crypto::{hash::SPARSE_MERKLE_PLACEHOLDER_HASH, HashValue};
use diem_state_view::StateView;
use diem_types::{
ledger_info::LedgerInfoWithSignatures,
transaction::{
Transaction, TransactionListWithProof, TransactionOutput, TransactionToCommit, Version,
},
vm_status::VMStatus,
};
use diem_vm::VMExecutor;
use executor_types::{BlockExecutorTrait, ChunkExecutorTrait};
use storage_interface::{DbReader, DbReaderWriter, DbWriter, StartupInfo};
fn create_test_executor() -> BlockExecutor<FakeVM> {
let fake_db = FakeDb {};
let db_reader_writer = DbReaderWriter::new(fake_db);
BlockExecutor::<FakeVM>::new(db_reader_writer)
}
pub fn fuzz_execute_and_commit_chunk(
txn_list_with_proof: TransactionListWithProof,
verified_target_li: LedgerInfoWithSignatures,
) {
let db = DbReaderWriter::new(FakeDb {});
let executor = ChunkExecutor::<FakeVM>::new(db).unwrap();
let _events = executor.execute_and_commit_chunk(txn_list_with_proof, &verified_target_li, None);
}
pub fn fuzz_execute_and_commit_blocks(
blocks: Vec<(HashValue, Vec<Transaction>)>,
ledger_info_with_sigs: LedgerInfoWithSignatures,
) {
let executor = create_test_executor();
let mut parent_block_id = *SPARSE_MERKLE_PLACEHOLDER_HASH;
let mut block_ids = vec![];
for block in blocks {
let block_id = block.0;
let _execution_results = executor.execute_block(block, parent_block_id);
parent_block_id = block_id;
block_ids.push(block_id);
}
let _res = executor.commit_blocks(block_ids, ledger_info_with_sigs);
}
pub struct FakeVM;
impl VMExecutor for FakeVM {
fn execute_block(
_transactions: Vec<Transaction>,
_state_view: &impl StateView,
) -> Result<Vec<TransactionOutput>, VMStatus> {
Ok(Vec::new())
}
}
pub struct FakeDb;
impl DbReader for FakeDb {
fn get_latest_version(&self) -> Result<Version> {
Ok(self.get_latest_ledger_info()?.ledger_info().version())
}
fn get_latest_commit_metadata(&self) -> Result<(Version, u64)> {
let ledger_info_with_sig = self.get_latest_ledger_info()?;
let ledger_info = ledger_info_with_sig.ledger_info();
Ok((ledger_info.version(), ledger_info.timestamp_usecs()))
}
fn get_startup_info(&self) -> Result<Option<StartupInfo>> {
Ok(Some(StartupInfo::new_for_testing()))
}
}
impl DbWriter for FakeDb {
fn save_transactions(
&self,
_txns_to_commit: &[TransactionToCommit],
_first_version: Version,
_ledger_info_with_sigs: Option<&LedgerInfoWithSignatures>,
) -> Result<()> {
Ok(())
}
}