From 8c2a3795f7bb9fd2fb02e7cf6957e8a9cf9c2d30 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 28 Sep 2022 13:18:29 +0100 Subject: [PATCH] refactor: move shard_layout_from_prev_block to EMA (#7673) Part of /~https://github.com/near/nearcore/issues/6910 --- chain/chain/src/test_utils.rs | 30 +++++++-------- chain/chain/src/types.rs | 12 ------ chain/epoch-manager/src/adapter.rs | 54 ++++++++++++++++++++++++++- nearcore/src/runtime/mod.rs | 36 ------------------ tools/state-viewer/src/apply_chunk.rs | 1 + 5 files changed, 69 insertions(+), 64 deletions(-) diff --git a/chain/chain/src/test_utils.rs b/chain/chain/src/test_utils.rs index c00fe12050b..d8f047e8f5a 100644 --- a/chain/chain/src/test_utils.rs +++ b/chain/chain/src/test_utils.rs @@ -454,6 +454,21 @@ impl EpochManagerAdapter for KeyValueRuntime { Ok(self.get_epoch_and_valset(*parent_hash)?.2) } + fn get_prev_shard_ids( + &self, + _prev_hash: &CryptoHash, + shard_ids: Vec, + ) -> Result, Error> { + Ok(shard_ids) + } + + fn get_shard_layout_from_prev_block( + &self, + _parent_hash: &CryptoHash, + ) -> Result { + Ok(ShardLayout::v0(self.num_shards, 0)) + } + fn get_epoch_id(&self, block_hash: &CryptoHash) -> Result { let (epoch_id, _, _) = self.get_epoch_and_valset(*block_hash)?; Ok(epoch_id) @@ -709,21 +724,6 @@ impl RuntimeAdapter for KeyValueRuntime { Ok(self.store.store_update()) } - fn get_prev_shard_ids( - &self, - _prev_hash: &CryptoHash, - shard_ids: Vec, - ) -> Result, Error> { - Ok(shard_ids) - } - - fn get_shard_layout_from_prev_block( - &self, - _parent_hash: &CryptoHash, - ) -> Result { - Ok(ShardLayout::v0(self.num_shards, 0)) - } - fn shard_id_to_uid(&self, shard_id: ShardId, _epoch_id: &EpochId) -> Result { Ok(ShardUId { version: 0, shard_id: shard_id as u32 }) } diff --git a/chain/chain/src/types.rs b/chain/chain/src/types.rs index c49dc5c5fdf..7c77c67e923 100644 --- a/chain/chain/src/types.rs +++ b/chain/chain/src/types.rs @@ -349,18 +349,6 @@ pub trait RuntimeAdapter: EpochManagerAdapter + Send + Sync { /// Returns `account_id` that suppose to have the `part_id`. fn get_part_owner(&self, epoch_id: &EpochId, part_id: u64) -> Result; - fn get_prev_shard_ids( - &self, - prev_hash: &CryptoHash, - shard_ids: Vec, - ) -> Result, Error>; - - /// Get shard layout given hash of previous block. - fn get_shard_layout_from_prev_block( - &self, - parent_hash: &CryptoHash, - ) -> Result; - fn shard_id_to_uid(&self, shard_id: ShardId, epoch_id: &EpochId) -> Result; /// Returns true if the shard layout will change in the next epoch diff --git a/chain/epoch-manager/src/adapter.rs b/chain/epoch-manager/src/adapter.rs index 75db20f4443..764935bf685 100644 --- a/chain/epoch-manager/src/adapter.rs +++ b/chain/epoch-manager/src/adapter.rs @@ -5,7 +5,7 @@ use near_primitives::{ epoch_manager::ShardConfig, errors::EpochError, hash::CryptoHash, - shard_layout::ShardLayout, + shard_layout::{ShardLayout, ShardLayoutError}, sharding::{ChunkHash, ShardChunkHeader}, types::{ validator_stake::ValidatorStake, AccountId, ApprovalStake, Balance, BlockHeight, @@ -50,6 +50,23 @@ pub trait EpochManagerAdapter: Send + Sync { fn get_next_epoch_id_from_prev_block(&self, parent_hash: &CryptoHash) -> Result; + /// For each `ShardId` in the current block, returns its parent `ShardId` + /// from previous block. + /// + /// Most of the times parent of the shard is the shard itself, unless a + /// resharding happened and some shards were split. + fn get_prev_shard_ids( + &self, + prev_hash: &CryptoHash, + shard_ids: Vec, + ) -> Result, Error>; + + /// Get shard layout given hash of previous block. + fn get_shard_layout_from_prev_block( + &self, + parent_hash: &CryptoHash, + ) -> Result; + /// Get [`EpochId`] from a block belonging to the epoch. fn get_epoch_id(&self, block_hash: &CryptoHash) -> Result; @@ -261,6 +278,41 @@ impl EpochManagerAdapter for T { epoch_manager.get_next_epoch_id_from_prev_block(parent_hash).map_err(Error::from) } + fn get_prev_shard_ids( + &self, + prev_hash: &CryptoHash, + shard_ids: Vec, + ) -> Result, Error> { + if self.is_next_block_epoch_start(prev_hash)? { + let shard_layout = self.get_shard_layout_from_prev_block(prev_hash)?; + let prev_shard_layout = self.get_shard_layout(&self.get_epoch_id(prev_hash)?)?; + if prev_shard_layout != shard_layout { + return Ok(shard_ids + .into_iter() + .map(|shard_id| { + shard_layout.get_parent_shard_id(shard_id).map(|parent_shard_id|{ + assert!(parent_shard_id < prev_shard_layout.num_shards(), + "invalid shard layout {:?}: parent shard {} does not exist in last shard layout", + shard_layout, + parent_shard_id + ); + parent_shard_id + }) + }) + .collect::>()?); + } + } + Ok(shard_ids) + } + + fn get_shard_layout_from_prev_block( + &self, + parent_hash: &CryptoHash, + ) -> Result { + let epoch_id = self.get_epoch_id_from_prev_block(parent_hash)?; + self.get_shard_layout(&epoch_id) + } + fn get_epoch_id(&self, block_hash: &CryptoHash) -> Result { let epoch_manager = self.read(); epoch_manager.get_epoch_id(block_hash).map_err(Error::from) diff --git a/nearcore/src/runtime/mod.rs b/nearcore/src/runtime/mod.rs index abffdc906a8..de01133c5d3 100644 --- a/nearcore/src/runtime/mod.rs +++ b/nearcore/src/runtime/mod.rs @@ -56,7 +56,6 @@ use near_store::{ use near_vm_runner::precompile_contract; use node_runtime::adapter::ViewRuntimeAdapter; use node_runtime::config::RuntimeConfig; -use node_runtime::near_primitives::shard_layout::ShardLayoutError; use node_runtime::state_viewer::TrieViewer; use node_runtime::{ validate_transaction, verify_and_charge_transaction, ApplyState, Runtime, @@ -856,41 +855,6 @@ impl RuntimeAdapter for NightshadeRuntime { Ok(transactions) } - fn get_prev_shard_ids( - &self, - prev_hash: &CryptoHash, - shard_ids: Vec, - ) -> Result, Error> { - if self.is_next_block_epoch_start(prev_hash)? { - let shard_layout = self.get_shard_layout_from_prev_block(prev_hash)?; - let prev_shard_layout = self.get_shard_layout(&self.get_epoch_id(prev_hash)?)?; - if prev_shard_layout != shard_layout { - return Ok(shard_ids - .into_iter() - .map(|shard_id| { - shard_layout.get_parent_shard_id(shard_id).map(|parent_shard_id|{ - assert!(parent_shard_id < prev_shard_layout.num_shards(), - "invalid shard layout {:?}: parent shard {} does not exist in last shard layout", - shard_layout, - parent_shard_id - ); - parent_shard_id - }) - }) - .collect::>()?); - } - } - Ok(shard_ids) - } - - fn get_shard_layout_from_prev_block( - &self, - parent_hash: &CryptoHash, - ) -> Result { - let epoch_id = self.get_epoch_id_from_prev_block(parent_hash)?; - self.get_shard_layout(&epoch_id) - } - fn shard_id_to_uid(&self, shard_id: ShardId, epoch_id: &EpochId) -> Result { let epoch_manager = self.epoch_manager.read(); let shard_layout = epoch_manager.get_shard_layout(epoch_id).map_err(Error::from)?; diff --git a/tools/state-viewer/src/apply_chunk.rs b/tools/state-viewer/src/apply_chunk.rs index 910ede41e9e..51f0ada8938 100644 --- a/tools/state-viewer/src/apply_chunk.rs +++ b/tools/state-viewer/src/apply_chunk.rs @@ -408,6 +408,7 @@ mod test { use near_chain_configs::Genesis; use near_client::test_utils::TestEnv; use near_crypto::{InMemorySigner, KeyType}; + use near_epoch_manager::EpochManagerAdapter; use near_network::types::NetworkClientResponses; use near_primitives::hash::CryptoHash; use near_primitives::runtime::config_store::RuntimeConfigStore;