Skip to content

Commit

Permalink
Fix(evm-archive): Fix archive changes storing.
Browse files Browse the repository at this point in the history
  • Loading branch information
vldm committed Dec 21, 2021
1 parent 894ef34 commit 51aedf3
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

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

28 changes: 27 additions & 1 deletion core/src/evm_rpc_impl/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@ use evm_rpc::error::EvmStateError;
use evm_rpc::{
basic::BasicERPC,
chain_mock::ChainMockERPC,
error::{into_native_error, Error},
error::{into_native_error, BlockNotFound, Error},
trace::TraceMeta,
BlockId, BlockRelId, Bytes, Either, Hex, RPCBlock, RPCLog, RPCLogFilter, RPCReceipt,
RPCTopicFilter, RPCTransaction,
};
use evm_state::{
AccountProvider, AccountState, Address, Gas, LogFilter, TransactionAction, H160, H256, U256,
};
use snafu::ensure;
use snafu::ResultExt;
use solana_runtime::bank::Bank;
use std::cell::RefCell;
Expand Down Expand Up @@ -274,6 +275,13 @@ impl BasicERPC for BasicErpcImpl {
block: Option<BlockId>,
) -> Result<Hex<U256>, Error> {
let state = block_to_state_root(block, &meta);
ensure!(
state.state_root.is_some(),
BlockNotFound {
block: block.unwrap_or_default()
}
);

let account = state
.get_account_state_at(&meta, address.0)?
.unwrap_or_default();
Expand All @@ -288,6 +296,12 @@ impl BasicERPC for BasicErpcImpl {
block: Option<BlockId>,
) -> Result<Hex<H256>, Error> {
let state = block_to_state_root(block, &meta);
ensure!(
state.state_root.is_some(),
BlockNotFound {
block: block.unwrap_or_default()
}
);
let storage = state
.get_storage_at(&meta, address.0, data.0)?
.unwrap_or_default();
Expand All @@ -301,6 +315,12 @@ impl BasicERPC for BasicErpcImpl {
block: Option<BlockId>,
) -> Result<Hex<U256>, Error> {
let state = block_to_state_root(block, &meta);
ensure!(
state.state_root.is_some(),
BlockNotFound {
block: block.unwrap_or_default()
}
);
let account = state
.get_account_state_at(&meta, address.0)?
.unwrap_or_default();
Expand All @@ -314,6 +334,12 @@ impl BasicERPC for BasicErpcImpl {
block: Option<BlockId>,
) -> Result<Bytes, Error> {
let state = block_to_state_root(block, &meta);
ensure!(
state.state_root.is_some(),
BlockNotFound {
block: block.unwrap_or_default()
}
);
let account = state
.get_account_state_at(&meta, address.0)?
.unwrap_or_default();
Expand Down
3 changes: 3 additions & 0 deletions core/src/validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1184,6 +1184,9 @@ fn new_banks_from_ledger(
transaction_history_services
.transaction_status_sender
.as_ref(),
transaction_history_services
.evm_state_recorder_sender
.as_ref(),
transaction_history_services
.cache_block_meta_sender
.as_ref(),
Expand Down
1 change: 1 addition & 0 deletions ledger-tool/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -732,6 +732,7 @@ fn load_bank_forks(
process_options,
None,
None,
None,
verify_evm_state,
None,
)
Expand Down
6 changes: 6 additions & 0 deletions ledger/src/bank_forks_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ pub type LoadResult = result::Result<
BlockstoreProcessorError,
>;

use evm_state::{ChangedState, H256};

pub type EvmStateRecorderSender = crossbeam_channel::Sender<(H256, ChangedState)>;

fn to_loadresult(
brp: BlockstoreProcessorResult,
snapshot_hash: Option<(Slot, Hash)>,
Expand All @@ -40,6 +44,7 @@ pub fn load(
snapshot_config: Option<&SnapshotConfig>,
process_options: ProcessOptions,
transaction_status_sender: Option<&TransactionStatusSender>,
evm_state_recorder_sender: Option<&EvmStateRecorderSender>,
cache_block_meta_sender: Option<&CacheBlockMetaSender>,
verify_evm_state: bool,
evm_archive: Option<evm_state::Storage>,
Expand Down Expand Up @@ -105,6 +110,7 @@ pub fn load(
&process_options,
&VerifyRecyclers::default(),
transaction_status_sender,
evm_state_recorder_sender,
cache_block_meta_sender,
),
Some(deserialized_snapshot_hash),
Expand Down
32 changes: 29 additions & 3 deletions ledger/src/blockstore_processor.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::{
bank_forks_utils::EvmStateRecorderSender,
block_error::BlockError,
blockstore::Blockstore,
blockstore_db::BlockstoreError,
Expand Down Expand Up @@ -418,6 +419,7 @@ pub fn process_blockstore(
&opts,
&recyclers,
None,
None,
cache_block_meta_sender,
)
}
Expand All @@ -429,6 +431,7 @@ pub(crate) fn process_blockstore_from_root(
opts: &ProcessOptions,
recyclers: &VerifyRecyclers,
transaction_status_sender: Option<&TransactionStatusSender>,
evm_state_recorder_sender: Option<&EvmStateRecorderSender>,
cache_block_meta_sender: Option<&CacheBlockMetaSender>,
) -> BlockstoreProcessorResult {
do_process_blockstore_from_root(
Expand All @@ -437,6 +440,7 @@ pub(crate) fn process_blockstore_from_root(
opts,
recyclers,
transaction_status_sender,
evm_state_recorder_sender,
cache_block_meta_sender,
)
}
Expand All @@ -447,6 +451,7 @@ fn do_process_blockstore_from_root(
opts: &ProcessOptions,
recyclers: &VerifyRecyclers,
transaction_status_sender: Option<&TransactionStatusSender>,
evm_state_recorder_sender: Option<&EvmStateRecorderSender>,
cache_block_meta_sender: Option<&CacheBlockMetaSender>,
) -> BlockstoreProcessorResult {
info!("processing ledger from slot {}...", bank.slot());
Expand Down Expand Up @@ -510,6 +515,7 @@ fn do_process_blockstore_from_root(
opts,
recyclers,
transaction_status_sender,
evm_state_recorder_sender,
cache_block_meta_sender,
&mut timing,
)?;
Expand Down Expand Up @@ -898,6 +904,7 @@ fn load_frozen_forks(
opts: &ProcessOptions,
recyclers: &VerifyRecyclers,
transaction_status_sender: Option<&TransactionStatusSender>,
evm_state_recorder_sender: Option<&EvmStateRecorderSender>,
cache_block_meta_sender: Option<&CacheBlockMetaSender>,
timing: &mut ExecuteTimings,
) -> result::Result<Vec<Arc<Bank>>, BlockstoreProcessorError> {
Expand Down Expand Up @@ -956,6 +963,7 @@ fn load_frozen_forks(
recyclers,
&mut progress,
transaction_status_sender,
evm_state_recorder_sender,
cache_block_meta_sender,
None,
timing,
Expand Down Expand Up @@ -1131,6 +1139,7 @@ fn process_single_slot(
recyclers: &VerifyRecyclers,
progress: &mut ConfirmationProgress,
transaction_status_sender: Option<&TransactionStatusSender>,
evm_state_recorder_sender: Option<&EvmStateRecorderSender>,
cache_block_meta_sender: Option<&CacheBlockMetaSender>,
replay_vote_sender: Option<&ReplayVoteSender>,
timing: &mut ExecuteTimings,
Expand All @@ -1151,8 +1160,18 @@ fn process_single_slot(
})?;

bank.freeze(); // all banks handled by this routine are created from complete slots

cache_block_meta(bank, cache_block_meta_sender);

if let Some(evm_state_recorder_sender) = evm_state_recorder_sender {
let state = bank.evm_state_change();
if let Some(state) = state {
evm_state_recorder_sender
.send(state)
.unwrap_or_else(|err| warn!("evm_state_recorder_sender failed: {:?}", err));
}
}

Ok(())
}

Expand Down Expand Up @@ -3121,9 +3140,16 @@ pub mod tests {
bank1.squash();

// Test process_blockstore_from_root() from slot 1 onwards
let (bank_forks, _leader_schedule) =
do_process_blockstore_from_root(&blockstore, bank1, &opts, &recyclers, None, None)
.unwrap();
let (bank_forks, _leader_schedule) = do_process_blockstore_from_root(
&blockstore,
bank1,
&opts,
&recyclers,
None,
None,
None,
)
.unwrap();

assert_eq!(frozen_bank_slots(&bank_forks), vec![5, 6]);
assert_eq!(bank_forks.working_bank().slot(), 6);
Expand Down
4 changes: 2 additions & 2 deletions runtime/src/bank.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2142,6 +2142,7 @@ impl Bank {
pub fn commit_evm(&self) {
let apply_start = std::time::Instant::now();

let old_root = self.evm_state.read().unwrap().last_root();
let hash = self
.evm_state
.write()
Expand All @@ -2153,7 +2154,6 @@ impl Bank {
apply_start.elapsed().as_micros()
);

let new_root = self.evm_state.read().unwrap().last_root();
debug!(
"Set evm state root to {:?} at block {}",
self.evm_state.read().unwrap().last_root(),
Expand All @@ -2169,7 +2169,7 @@ impl Bank {
*self
.evm_changed_list
.write()
.expect("change list was poisoned") = Some((new_root, changes));
.expect("change list was poisoned") = Some((old_root, changes));

self.evm_state
.write()
Expand Down

0 comments on commit 51aedf3

Please sign in to comment.