From 51aedf355e013c9d95f00b8b581aff0326256b10 Mon Sep 17 00:00:00 2001 From: Vladimir Motylenko Date: Mon, 13 Dec 2021 19:38:44 +0200 Subject: [PATCH] Fix(evm-archive): Fix archive changes storing. --- Cargo.lock | 2 +- core/src/evm_rpc_impl/mod.rs | 28 +++++++++++++++++++++++++- core/src/validator.rs | 3 +++ ledger-tool/src/main.rs | 1 + ledger/src/bank_forks_utils.rs | 6 ++++++ ledger/src/blockstore_processor.rs | 32 +++++++++++++++++++++++++++--- runtime/src/bank.rs | 4 ++-- 7 files changed, 69 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c3f6508e2..7d34415ef6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7715,7 +7715,7 @@ dependencies = [ [[package]] name = "triedb" version = "0.5.0" -source = "git+https://github.com/velas/triedb?branch=feat/gc-simple#aec902f9117b215c67ebb2beaa0ef70529950664" +source = "git+https://github.com/velas/triedb?branch=feat/gc-simple#9675443fe9b593b9dcf3e677c08ac0ce0d2f13c3" dependencies = [ "anyhow", "dashmap", diff --git a/core/src/evm_rpc_impl/mod.rs b/core/src/evm_rpc_impl/mod.rs index a38ff65f80..eb381a4e1e 100644 --- a/core/src/evm_rpc_impl/mod.rs +++ b/core/src/evm_rpc_impl/mod.rs @@ -9,7 +9,7 @@ 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, @@ -17,6 +17,7 @@ use evm_rpc::{ 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; @@ -274,6 +275,13 @@ impl BasicERPC for BasicErpcImpl { block: Option, ) -> Result, 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(); @@ -288,6 +296,12 @@ impl BasicERPC for BasicErpcImpl { block: Option, ) -> Result, 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(); @@ -301,6 +315,12 @@ impl BasicERPC for BasicErpcImpl { block: Option, ) -> Result, 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(); @@ -314,6 +334,12 @@ impl BasicERPC for BasicErpcImpl { block: Option, ) -> Result { 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(); diff --git a/core/src/validator.rs b/core/src/validator.rs index f971df8873..1fc41efb99 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -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(), diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index 0ce7676224..d365b6a11d 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -732,6 +732,7 @@ fn load_bank_forks( process_options, None, None, + None, verify_evm_state, None, ) diff --git a/ledger/src/bank_forks_utils.rs b/ledger/src/bank_forks_utils.rs index a8ad52fe54..1fb402f6b7 100644 --- a/ledger/src/bank_forks_utils.rs +++ b/ledger/src/bank_forks_utils.rs @@ -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)>, @@ -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, @@ -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), diff --git a/ledger/src/blockstore_processor.rs b/ledger/src/blockstore_processor.rs index 33ae216020..56b85b99a3 100644 --- a/ledger/src/blockstore_processor.rs +++ b/ledger/src/blockstore_processor.rs @@ -1,4 +1,5 @@ use crate::{ + bank_forks_utils::EvmStateRecorderSender, block_error::BlockError, blockstore::Blockstore, blockstore_db::BlockstoreError, @@ -418,6 +419,7 @@ pub fn process_blockstore( &opts, &recyclers, None, + None, cache_block_meta_sender, ) } @@ -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( @@ -437,6 +440,7 @@ pub(crate) fn process_blockstore_from_root( opts, recyclers, transaction_status_sender, + evm_state_recorder_sender, cache_block_meta_sender, ) } @@ -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()); @@ -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, )?; @@ -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>, BlockstoreProcessorError> { @@ -956,6 +963,7 @@ fn load_frozen_forks( recyclers, &mut progress, transaction_status_sender, + evm_state_recorder_sender, cache_block_meta_sender, None, timing, @@ -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, @@ -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(()) } @@ -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); diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 4ec1cebf76..cf183a8c0e 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -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() @@ -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(), @@ -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()