Skip to content

Commit

Permalink
Revert "Always record storage when stateless validation is enabled" (n…
Browse files Browse the repository at this point in the history
…ear#10900)

Revert near#10859 because it's causing trouble on statelessnet

This reverts commit c2f9695.
  • Loading branch information
jancionear authored Mar 28, 2024
1 parent 79b7fe6 commit c25d6ba
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 81 deletions.
31 changes: 9 additions & 22 deletions chain/chain/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1751,18 +1751,9 @@ impl Chain {
block_preprocess_info: BlockPreprocessInfo,
apply_results: Vec<(ShardId, Result<ShardUpdateResult, Error>)>,
) -> Result<Option<Tip>, Error> {
// Save state transition data to the database only if it might later be needed
// for generating a state witness. Storage space optimization.
let should_save_state_transition_data =
self.should_produce_state_witness_for_this_or_next_epoch(me, block.header())?;
let mut chain_update = self.chain_update();
let new_head = chain_update.postprocess_block(
me,
&block,
block_preprocess_info,
apply_results,
should_save_state_transition_data,
)?;
let new_head =
chain_update.postprocess_block(me, &block, block_preprocess_info, apply_results)?;
chain_update.commit()?;
Ok(new_head)
}
Expand Down Expand Up @@ -2978,17 +2969,9 @@ impl Chain {
results: Vec<Result<ShardUpdateResult, Error>>,
) -> Result<(), Error> {
let block = self.chain_store.get_block(block_hash)?;
// Save state transition data to the database only if it might later be needed
// for generating a state witness. Storage space optimization.
let should_save_state_transition_data =
self.should_produce_state_witness_for_this_or_next_epoch(me, block.header())?;
let mut chain_update = self.chain_update();
let results = results.into_iter().collect::<Result<Vec<_>, Error>>()?;
chain_update.apply_chunk_postprocessing(
&block,
results,
should_save_state_transition_data,
)?;
chain_update.apply_chunk_postprocessing(&block, results)?;
chain_update.commit()?;

let epoch_id = block.header().epoch_id();
Expand Down Expand Up @@ -3355,8 +3338,12 @@ impl Chain {
// only for a single shard. This so far has been enough.
let state_patch = state_patch.take();

let storage_context =
StorageContext { storage_data_source: StorageDataSource::Db, state_patch };
let storage_context = StorageContext {
storage_data_source: StorageDataSource::Db,
state_patch,
record_storage: self
.should_produce_state_witness_for_this_or_next_epoch(me, block.header())?,
};
let stateful_job = self.get_update_shard_job(
me,
block,
Expand Down
35 changes: 14 additions & 21 deletions chain/chain/src/chain_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,10 @@ impl<'a> ChainUpdate<'a> {
&mut self,
block: &Block,
apply_results: Vec<ShardUpdateResult>,
should_save_state_transition_data: bool,
) -> Result<(), Error> {
let _span = tracing::debug_span!(target: "chain", "apply_chunk_postprocessing").entered();
for result in apply_results {
self.process_apply_chunk_result(block, result, should_save_state_transition_data)?;
self.process_apply_chunk_result(block, result)?;
}
Ok(())
}
Expand Down Expand Up @@ -300,7 +299,6 @@ impl<'a> ChainUpdate<'a> {
&mut self,
block: &Block,
result: ShardUpdateResult,
should_save_state_transition_data: bool,
) -> Result<(), Error> {
let block_hash = block.hash();
let prev_hash = block.header().prev_hash();
Expand Down Expand Up @@ -353,14 +351,12 @@ impl<'a> ChainUpdate<'a> {
apply_result.outcomes,
outcome_paths,
);
if should_save_state_transition_data {
self.chain_store_update.save_state_transition_data(
*block_hash,
shard_id,
apply_result.proof,
apply_result.applied_receipts_hash,
);
}
self.chain_store_update.save_state_transition_data(
*block_hash,
shard_id,
apply_result.proof,
apply_result.applied_receipts_hash,
);
if let Some(resharding_results) = resharding_results {
self.process_resharding_results(block, &shard_uid, resharding_results)?;
}
Expand All @@ -387,14 +383,12 @@ impl<'a> ChainUpdate<'a> {

self.chain_store_update.save_chunk_extra(block_hash, &shard_uid, new_extra);
self.chain_store_update.save_trie_changes(apply_result.trie_changes);
if should_save_state_transition_data {
self.chain_store_update.save_state_transition_data(
*block_hash,
shard_uid.shard_id(),
apply_result.proof,
apply_result.applied_receipts_hash,
);
}
self.chain_store_update.save_state_transition_data(
*block_hash,
shard_uid.shard_id(),
apply_result.proof,
apply_result.applied_receipts_hash,
);

if let Some(resharding_config) = resharding_results {
self.process_resharding_results(block, &shard_uid, resharding_config)?;
Expand All @@ -419,7 +413,6 @@ impl<'a> ChainUpdate<'a> {
block: &Block,
block_preprocess_info: BlockPreprocessInfo,
apply_chunks_results: Vec<(ShardId, Result<ShardUpdateResult, Error>)>,
should_save_state_transition_data: bool,
) -> Result<Option<Tip>, Error> {
let shard_ids = self.epoch_manager.shard_ids(block.header().epoch_id())?;
let prev_hash = block.header().prev_hash();
Expand All @@ -429,7 +422,7 @@ impl<'a> ChainUpdate<'a> {
}
x
}).collect::<Result<Vec<_>, Error>>()?;
self.apply_chunk_postprocessing(block, results, should_save_state_transition_data)?;
self.apply_chunk_postprocessing(block, results)?;

let BlockPreprocessInfo {
is_caught_up,
Expand Down
11 changes: 3 additions & 8 deletions chain/chain/src/runtime/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ use near_epoch_manager::{EpochManagerAdapter, EpochManagerHandle};
use near_parameters::{ActionCosts, ExtCosts, RuntimeConfigStore};
use near_pool::types::TransactionGroupIterator;
use near_primitives::account::{AccessKey, Account};
use near_primitives::checked_feature;
use near_primitives::errors::{InvalidTxError, RuntimeError, StorageError};
use near_primitives::hash::{hash, CryptoHash};
use near_primitives::receipt::{DelayedReceiptIndices, Receipt};
Expand All @@ -31,7 +30,7 @@ use near_primitives::types::{
AccountId, Balance, BlockHeight, EpochHeight, EpochId, EpochInfoProvider, Gas, MerkleHash,
ShardId, StateChangeCause, StateChangesForResharding, StateRoot, StateRootNode,
};
use near_primitives::version::{ProtocolVersion, PROTOCOL_VERSION};
use near_primitives::version::ProtocolVersion;
use near_primitives::views::{
AccessKeyInfoView, CallResult, ContractCodeView, QueryRequest, QueryResponse,
QueryResponseKind, ViewApplyState, ViewStateResult,
Expand Down Expand Up @@ -710,9 +709,7 @@ impl RuntimeAdapter for NightshadeRuntime {
storage_config.use_flat_storage,
),
};
if checked_feature!("stable", StatelessValidationV0, PROTOCOL_VERSION)
|| cfg!(feature = "shadow_chunk_validation")
{
if storage_config.record_storage {
trie = trie.recording_reads();
}
let mut state_update = TrieUpdate::new(trie);
Expand Down Expand Up @@ -874,9 +871,7 @@ impl RuntimeAdapter for NightshadeRuntime {
storage_config.use_flat_storage,
),
};
if checked_feature!("stable", StatelessValidationV0, PROTOCOL_VERSION)
|| cfg!(feature = "shadow_chunk_validation")
{
if storage_config.record_storage {
trie = trie.recording_reads();
}

Expand Down
16 changes: 4 additions & 12 deletions chain/chain/src/runtime/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@ use near_epoch_manager::{EpochManager, RngSeed};
use near_pool::{
InsertTransactionResult, PoolIteratorWrapper, TransactionGroupIteratorWrapper, TransactionPool,
};
use near_primitives::checked_feature;
use near_primitives::test_utils::create_test_signer;
use near_primitives::types::validator_stake::{ValidatorStake, ValidatorStakeIter};
use near_primitives::version::PROTOCOL_VERSION;
use near_store::flat::{FlatStateChanges, FlatStateDelta, FlatStateDeltaMetadata};
use near_store::genesis::initialize_genesis_state;
use num_rational::Ratio;
Expand Down Expand Up @@ -1604,11 +1602,6 @@ fn prepare_transactions(
/// Check that transactions validation works the same when using recorded storage proof instead of db.
#[test]
fn test_prepare_transactions_storage_proof() {
if !checked_feature!("stable", StatelessValidationV0, PROTOCOL_VERSION) {
println!("Test not applicable without StatelessValidation enabled");
return;
}

let (env, chain, mut transaction_pool) = get_test_env_with_chain_and_pool();
let transactions_count = transaction_pool.len();

Expand All @@ -1617,6 +1610,7 @@ fn test_prepare_transactions_storage_proof() {
use_flat_storage: true,
source: StorageDataSource::Db,
state_patch: Default::default(),
record_storage: true,
};

let proposed_transactions = prepare_transactions(
Expand All @@ -1637,6 +1631,7 @@ fn test_prepare_transactions_storage_proof() {
nodes: proposed_transactions.storage_proof.unwrap(),
}),
state_patch: Default::default(),
record_storage: false,
};

let validated_transactions = prepare_transactions(
Expand All @@ -1653,11 +1648,6 @@ fn test_prepare_transactions_storage_proof() {
/// Check that transactions validation fails if provided empty storage proof.
#[test]
fn test_prepare_transactions_empty_storage_proof() {
if !checked_feature!("stable", StatelessValidationV0, PROTOCOL_VERSION) {
println!("Test not applicable without StatelessValidation enabled");
return;
}

let (env, chain, mut transaction_pool) = get_test_env_with_chain_and_pool();
let transactions_count = transaction_pool.len();

Expand All @@ -1666,6 +1656,7 @@ fn test_prepare_transactions_empty_storage_proof() {
use_flat_storage: true,
source: StorageDataSource::Db,
state_patch: Default::default(),
record_storage: true,
};

let proposed_transactions = prepare_transactions(
Expand All @@ -1686,6 +1677,7 @@ fn test_prepare_transactions_empty_storage_proof() {
nodes: PartialState::default(), // We use empty storage proof here.
}),
state_patch: Default::default(),
record_storage: false,
};

let validation_result = prepare_transactions(
Expand Down
27 changes: 9 additions & 18 deletions chain/chain/src/test_utils/kv_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use near_primitives::epoch_manager::ValidatorSelectionConfig;
use near_primitives::errors::{EpochError, InvalidTxError};
use near_primitives::hash::{hash, CryptoHash};
use near_primitives::receipt::{ActionReceipt, Receipt, ReceiptEnum};
use near_primitives::shard_layout;
use near_primitives::shard_layout::{ShardLayout, ShardUId};
use near_primitives::sharding::{ChunkHash, ShardChunkHeader};
use near_primitives::state_part::PartId;
Expand All @@ -44,7 +45,6 @@ use near_primitives::views::{
AccessKeyInfoView, AccessKeyList, CallResult, ContractCodeView, EpochValidatorInfo,
QueryRequest, QueryResponse, QueryResponseKind, ViewStateResult,
};
use near_primitives::{checked_feature, shard_layout};
use near_store::test_utils::TestTriesBuilder;
use near_store::{
set_genesis_hash, set_genesis_state_roots, DBCol, ShardTries, StorageError, Store, StoreUpdate,
Expand Down Expand Up @@ -1083,7 +1083,7 @@ impl RuntimeAdapter for KeyValueRuntime {

fn prepare_transactions(
&self,
_storage: RuntimeStorageConfig,
storage: RuntimeStorageConfig,
_chunk: PrepareTransactionsChunkContext,
_prev_block: PrepareTransactionsBlockContext,
transaction_groups: &mut dyn TransactionGroupIterator,
Expand All @@ -1094,14 +1094,11 @@ impl RuntimeAdapter for KeyValueRuntime {
while let Some(iter) = transaction_groups.next() {
res.push(iter.next().unwrap());
}
let storage_proof = if checked_feature!("stable", StatelessValidationV0, PROTOCOL_VERSION)
|| cfg!(feature = "shadow_chunk_validation")
{
Some(Default::default())
} else {
None
};
Ok(PreparedTransactions { transactions: res, limited_by: None, storage_proof })
Ok(PreparedTransactions {
transactions: res,
limited_by: None,
storage_proof: if storage.record_storage { Some(Default::default()) } else { None },
})
}

fn apply_chunk(
Expand Down Expand Up @@ -1245,13 +1242,7 @@ impl RuntimeAdapter for KeyValueRuntime {
let state_root = hash(&data);
self.state.write().unwrap().insert(state_root, state);
self.state_size.write().unwrap().insert(state_root, state_size);
let storage_proof = if checked_feature!("stable", StatelessValidationV0, PROTOCOL_VERSION)
|| cfg!(feature = "shadow_chunk_validation")
{
Some(Default::default())
} else {
None
};

Ok(ApplyChunkResult {
trie_changes: WrappedTrieChanges::new(
self.get_tries(),
Expand All @@ -1267,7 +1258,7 @@ impl RuntimeAdapter for KeyValueRuntime {
validator_proposals: vec![],
total_gas_burnt: 0,
total_balance_burnt: 0,
proof: storage_proof,
proof: if storage_config.record_storage { Some(Default::default()) } else { None },
processed_delayed_receipts: vec![],
applied_receipts_hash: hash(&borsh::to_vec(receipts).unwrap()),
})
Expand Down
2 changes: 2 additions & 0 deletions chain/chain/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ pub struct RuntimeStorageConfig {
pub use_flat_storage: bool,
pub source: StorageDataSource,
pub state_patch: SandboxStatePatch,
pub record_storage: bool,
}

impl RuntimeStorageConfig {
Expand All @@ -272,6 +273,7 @@ impl RuntimeStorageConfig {
use_flat_storage,
source: StorageDataSource::Db,
state_patch: Default::default(),
record_storage: false,
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions chain/chain/src/update_shard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ pub struct StorageContext {
/// Data source used for processing shard update.
pub storage_data_source: StorageDataSource,
pub state_patch: SandboxStatePatch,
pub record_storage: bool,
}

/// Processes shard update with given block and shard.
Expand Down Expand Up @@ -184,6 +185,7 @@ pub fn apply_new_chunk(
use_flat_storage: true,
source: storage_context.storage_data_source,
state_patch: storage_context.state_patch,
record_storage: storage_context.record_storage,
};
match runtime.apply_chunk(
storage_config,
Expand Down Expand Up @@ -245,6 +247,7 @@ pub fn apply_old_chunk(
use_flat_storage: true,
source: storage_context.storage_data_source,
state_patch: storage_context.state_patch,
record_storage: storage_context.record_storage,
};
match runtime.apply_chunk(
storage_config,
Expand Down
7 changes: 7 additions & 0 deletions chain/client/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1001,11 +1001,18 @@ impl Client {
let prepared_transactions = if let Some(mut iter) =
sharded_tx_pool.get_pool_iterator(shard_uid)
{
let me = self
.validator_signer
.as_ref()
.map(|validator_signer| validator_signer.validator_id().clone());
let record_storage = chain
.should_produce_state_witness_for_this_or_next_epoch(&me, &prev_block_header)?;
let storage_config = RuntimeStorageConfig {
state_root: *chunk_extra.state_root(),
use_flat_storage: true,
source: StorageDataSource::Db,
state_patch: Default::default(),
record_storage,
};
runtime.prepare_transactions(
storage_config,
Expand Down
3 changes: 3 additions & 0 deletions chain/client/src/stateless_validation/chunk_validator/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ pub(crate) fn pre_validate_chunk_state_witness(
nodes: state_witness.new_transactions_validation_state.clone(),
}),
state_patch: Default::default(),
record_storage: false,
};

match validate_prepared_transactions(
Expand Down Expand Up @@ -313,6 +314,7 @@ pub(crate) fn pre_validate_chunk_state_witness(
nodes: state_witness.main_state_transition.base_state.clone(),
}),
state_patch: Default::default(),
record_storage: false,
},
})
};
Expand Down Expand Up @@ -527,6 +529,7 @@ pub(crate) fn validate_chunk_state_witness(
nodes: transition.base_state,
}),
state_patch: Default::default(),
record_storage: false,
},
};
let OldChunkResult { apply_result, .. } = apply_old_chunk(
Expand Down
Loading

0 comments on commit c25d6ba

Please sign in to comment.