From 27dd9421a36a706cba8d78bb734d1333ef61650d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Tue, 21 May 2024 14:03:23 +0300 Subject: [PATCH] refactor: replace u64 with usize internally MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- client/tests/integration/events/pipeline.rs | 9 ++- configs/swarm/executor.wasm | Bin 524647 -> 527202 bytes core/src/block.rs | 38 +++++++----- core/src/block_sync.rs | 18 ++++-- core/src/kura.rs | 51 ++++++---------- core/src/metrics.rs | 25 ++++---- core/src/smartcontracts/isi/query.rs | 5 ++ core/src/smartcontracts/wasm.rs | 8 +-- core/src/snapshot.rs | 7 ++- core/src/state.rs | 57 ++++++++++-------- core/src/sumeragi/main_loop.rs | 49 +++++++++------ core/src/sumeragi/mod.rs | 17 +++--- core/src/sumeragi/network_topology.rs | 19 ++---- core/src/sumeragi/view_change.rs | 18 +++--- core/test_network/src/lib.rs | 3 + data_model/src/block.rs | 4 +- data_model/src/events/pipeline.rs | 2 +- data_model/src/lib.rs | 26 ++------ docs/source/references/schema.json | 2 +- .../executor/derive/src/permission.rs | 10 ++- smart_contract/executor/src/lib.rs | 9 +-- telemetry/src/metrics.rs | 8 ++- torii/src/routing.rs | 2 +- 23 files changed, 206 insertions(+), 181 deletions(-) diff --git a/client/tests/integration/events/pipeline.rs b/client/tests/integration/events/pipeline.rs index 28afa87ac40..1e6a0f49317 100644 --- a/client/tests/integration/events/pipeline.rs +++ b/client/tests/integration/events/pipeline.rs @@ -1,4 +1,7 @@ -use std::thread::{self, JoinHandle}; +use std::{ + num::NonZeroUsize, + thread::{self, JoinHandle}, +}; use eyre::Result; use iroha::{ @@ -129,6 +132,8 @@ fn applied_block_must_be_available_in_kura() { .as_ref() .expect("Must be some") .kura() - .get_block_by_height(event.header().height()) + .get_block_by_height( + NonZeroUsize::new(event.header().height().try_into().unwrap()).unwrap(), + ) .expect("Block applied event was received earlier"); } diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index fc5dd07b00c8f9567b6972f6cb828beece79aee9..39c1b20536144e1f81e09df817325d660328df3b 100644 GIT binary patch delta 145065 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 delta 142397 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¥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 Jp0$`?_y-G7vK#;a diff --git a/core/src/block.rs b/core/src/block.rs index e4c1d30802d..1ef61a48373 100644 --- a/core/src/block.rs +++ b/core/src/block.rs @@ -48,9 +48,9 @@ pub enum BlockValidationError { /// Mismatch between the actual and expected height of the latest block. Expected: {expected}, actual: {actual} LatestBlockHeightMismatch { /// Expected value - expected: u64, + expected: usize, /// Actual value - actual: u64, + actual: usize, }, /// Mismatch between the actual and expected hashes of the current block. Expected: {expected:?}, actual: {actual:?} IncorrectHash { @@ -145,14 +145,18 @@ mod pending { } fn make_header( - previous_height: u64, + prev_height: usize, prev_block_hash: Option>, - view_change_index: u64, + view_change_index: usize, transactions: &[CommittedTransaction], ) -> BlockHeader { BlockHeader { - height: previous_height + 1, - previous_block_hash: prev_block_hash, + height: prev_height + .checked_add(1) + .expect("INTERNAL BUG: Blockchain height exceeds usize::MAX") + .try_into() + .expect("INTERNAL BUG: Number of blocks exceeds u64::MAX"), + prev_block_hash, transactions_hash: transactions .iter() .map(|value| value.as_ref().hash()) @@ -160,15 +164,17 @@ mod pending { .hash(), timestamp_ms: SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) - .expect("Failed to get the current system time") + .expect("INTERNAL BUG: Failed to get the current system time") .as_millis() .try_into() - .expect("Time should fit into u64"), - view_change_index, + .expect("INTERNAL BUG: Time should fit into u64"), + view_change_index: view_change_index + .try_into() + .expect("INTERNAL BUG: Number of view changes exceeds u32::MAX"), consensus_estimation_ms: DEFAULT_CONSENSUS_ESTIMATION .as_millis() .try_into() - .expect("Time should fit into u64"), + .expect("INTERNAL BUG: Time should fit into u64"), } } @@ -205,7 +211,7 @@ mod pending { /// Upon executing this method current timestamp is stored in the block header. pub fn chain( self, - view_change_index: u64, + view_change_index: usize, state: &mut StateBlock<'_>, ) -> BlockBuilder { let transactions = Self::categorize_transactions(self.0.transactions, state); @@ -273,7 +279,11 @@ mod valid { state_block: &mut StateBlock<'_>, ) -> WithEvents> { let expected_block_height = state_block.height() + 1; - let actual_height = block.header().height; + let actual_height = block + .header() + .height + .try_into() + .expect("INTERNAL BUG: Block height exceeds usize::MAX"); if expected_block_height != actual_height { return WithEvents::new(Err(( @@ -286,7 +296,7 @@ mod valid { } let expected_prev_block_hash = state_block.latest_block_hash(); - let actual_prev_block_hash = block.header().previous_block_hash; + let actual_prev_block_hash = block.header().prev_block_hash; if expected_prev_block_hash != actual_prev_block_hash { return WithEvents::new(Err(( @@ -486,7 +496,7 @@ mod valid { let mut payload = BlockPayload { header: BlockHeader { height: 2, - previous_block_hash: None, + prev_block_hash: None, transactions_hash: None, timestamp_ms: 0, view_change_index: 0, diff --git a/core/src/block_sync.rs b/core/src/block_sync.rs index ef7f5b8c10a..f478b9d6eb4 100644 --- a/core/src/block_sync.rs +++ b/core/src/block_sync.rs @@ -127,6 +127,8 @@ impl BlockSynchronizer { pub mod message { //! Module containing messages for [`BlockSynchronizer`](super::BlockSynchronizer). + use std::num::NonZeroUsize; + use super::*; /// Get blocks after some block @@ -204,14 +206,20 @@ pub mod message { error!(?prev_hash, "Block hash not found"); return; } - Some(height) => height + 1, // It's get blocks *after*, so we add 1. + // It's get blocks *after*, so we add 1. + Some(height) => height + .checked_add(1) + .expect("INTERNAL BUG: Block height exceeds usize::MAX"), }, - None => 1, + None => nonzero_ext::nonzero!(1_usize), }; - let blocks = (start_height..) - .take(1 + block_sync.gossip_max_size.get() as usize) - .map_while(|height| block_sync.kura.get_block_by_height(height)) + let blocks = (start_height.get()..) + .take(block_sync.gossip_max_size.get() as usize + 1) + .map_while(|height| { + NonZeroUsize::new(height) + .and_then(|height| block_sync.kura.get_block_by_height(height)) + }) .skip_while(|block| Some(block.hash()) == *latest_hash) .map(|block| (*block).clone()) .collect::>(); diff --git a/core/src/kura.rs b/core/src/kura.rs index b9d37c8d104..9977bcfa082 100644 --- a/core/src/kura.rs +++ b/core/src/kura.rs @@ -6,6 +6,7 @@ use std::{ fmt::Debug, fs, io::{BufWriter, Read, Seek, SeekFrom, Write}, + num::NonZeroUsize, path::{Path, PathBuf}, sync::Arc, }; @@ -165,7 +166,7 @@ impl Kura { match block_store.read_block_data(block.start, &mut block_data_buffer) { Ok(()) => match SignedBlock::decode_all_versioned(&block_data_buffer) { Ok(decoded_block) => { - if prev_block_hash != decoded_block.header().previous_block_hash { + if prev_block_hash != decoded_block.header().prev_block_hash { error!("Block has wrong previous block hash. Not reading any blocks beyond this height."); break; } @@ -273,45 +274,46 @@ impl Kura { } /// Get the hash of the block at the provided height. - pub fn get_block_hash(&self, block_height: u64) -> Option> { + pub fn get_block_hash(&self, block_height: NonZeroUsize) -> Option> { let hash_data_guard = self.block_data.lock(); - if block_height == 0 || block_height > hash_data_guard.len() as u64 { + + let block_height = block_height.get(); + if hash_data_guard.len() < block_height { return None; } - let index: usize = (block_height - 1) - .try_into() - .expect("block_height fits in 32 bits or we are running on a 64 bit machine"); - Some(hash_data_guard[index].0) + + let block_index = block_height - 1; + Some(hash_data_guard[block_index].0) } /// Search through blocks for the height of the block with the given hash. - pub fn get_block_height_by_hash(&self, hash: &HashOf) -> Option { + pub fn get_block_height_by_hash(&self, hash: &HashOf) -> Option { self.block_data .lock() .iter() .position(|(block_hash, _block_arc)| block_hash == hash) - .map(|index| index as u64 + 1) + .and_then(|idx| idx.checked_add(1)) + .and_then(NonZeroUsize::new) } /// Get a reference to block by height, loading it from disk if needed. // The below lint suggests changing the code into something that does not compile due // to the borrow checker. - pub fn get_block_by_height(&self, block_height: u64) -> Option> { + pub fn get_block_by_height(&self, block_height: NonZeroUsize) -> Option> { let mut data_array_guard = self.block_data.lock(); - if block_height == 0 || block_height > data_array_guard.len() as u64 { + + if data_array_guard.len() < block_height.get() { return None; } - let block_number: usize = (block_height - 1) - .try_into() - .expect("Failed to cast to u32."); - if let Some(block_arc) = data_array_guard[block_number].1.as_ref() { + let block_index = block_height.get() - 1; + if let Some(block_arc) = data_array_guard[block_index].1.as_ref() { return Some(Arc::clone(block_arc)); }; let block_store = self.block_store.lock(); let BlockIndex { start, length } = block_store - .read_block_index(block_number as u64) + .read_block_index(block_index as u64) .expect("Failed to read block index from disk."); let mut block_buf = @@ -322,25 +324,10 @@ impl Kura { let block = SignedBlock::decode_all_versioned(&block_buf).expect("Failed to decode block"); let block_arc = Arc::new(block); - data_array_guard[block_number].1 = Some(Arc::clone(&block_arc)); + data_array_guard[block_index].1 = Some(Arc::clone(&block_arc)); Some(block_arc) } - /// Get a reference to block by hash, loading it from disk if needed. - /// - /// Internally this function searches linearly for the block's height and - /// then calls `get_block_by_height`. If you know the height of the block, - /// call `get_block_by_height` directly. - pub fn get_block_by_hash(&self, block_hash: &HashOf) -> Option> { - let index = self - .block_data - .lock() - .iter() - .position(|(hash, _arc)| hash == block_hash); - - index.and_then(|index| self.get_block_by_height(index as u64 + 1)) - } - /// Put a block in kura's in memory block store. pub fn store_block(&self, block: CommittedBlock) { let block = Arc::new(SignedBlock::from(block)); diff --git a/core/src/metrics.rs b/core/src/metrics.rs index f5adbb9f6ed..f555e677ae4 100644 --- a/core/src/metrics.rs +++ b/core/src/metrics.rs @@ -1,6 +1,6 @@ //! Metrics and status reporting -use std::{sync::Arc, time::SystemTime}; +use std::{num::NonZeroUsize, sync::Arc, time::SystemTime}; use eyre::{Result, WrapErr as _}; use iroha_telemetry::metrics::Metrics; @@ -23,7 +23,7 @@ pub struct MetricsReporter { queue: Arc, metrics: Metrics, /// Latest observed and processed height by metrics reporter - latest_block_height: Arc>, + latest_block_height: Arc>, } impl MetricsReporter { @@ -53,14 +53,10 @@ impl MetricsReporter { /// - If either mutex is poisoned #[allow(clippy::cast_precision_loss)] pub fn update_metrics(&self) -> Result<()> { - let online_peers_count: u64 = self - .network - .online_peers( - #[allow(clippy::disallowed_types)] - std::collections::HashSet::len, - ) - .try_into() - .expect("casting usize to u64"); + let online_peers_count: usize = self.network.online_peers( + #[allow(clippy::disallowed_types)] + std::collections::HashSet::len, + ); let state_view = self.state.view(); @@ -70,7 +66,12 @@ impl MetricsReporter { { let mut block_index = start_index; while block_index < state_view.height() { - let Some(block) = self.kura.get_block_by_height(block_index + 1) else { + let Some(block) = NonZeroUsize::new( + block_index + .checked_add(1) + .expect("INTERNAL BUG: Blockchain height exceeds usize::MAX"), + ) + .and_then(|index| self.kura.get_block_by_height(index)) else { break; }; block_index += 1; @@ -126,7 +127,7 @@ impl MetricsReporter { ) }; - self.metrics.connected_peers.set(online_peers_count); + self.metrics.connected_peers.set(online_peers_count as u64); self.metrics .domains diff --git a/core/src/smartcontracts/isi/query.rs b/core/src/smartcontracts/isi/query.rs index 26b6d603808..c14c2119ad7 100644 --- a/core/src/smartcontracts/isi/query.rs +++ b/core/src/smartcontracts/isi/query.rs @@ -41,6 +41,11 @@ impl LazyQueryOutput<'_> { /// - sorting /// - pagination /// - batching + /// + /// # Errors + /// + /// - if fetch size is too big + /// - defined pagination parameter for a query that returns singular result pub fn apply_postprocessing( self, filter: &PredicateBox, diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index 1f6d2474193..641abd81895 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -1151,7 +1151,7 @@ impl<'wrld, 'block, 'state> ) -> Validate { Validate { authority: state.authority.clone(), - block_height: state.state.0.height(), + block_height: state.state.0.height() as u64, target: state.specific_state.to_validate.clone(), } } @@ -1238,7 +1238,7 @@ impl<'wrld, 'block, 'state> ) -> Validate { Validate { authority: state.authority.clone(), - block_height: state.state.0.height(), + block_height: state.state.0.height() as u64, target: state.specific_state.to_validate.clone(), } } @@ -1341,7 +1341,7 @@ impl<'wrld, S: StateReadOnly> ) -> Validate { Validate { authority: state.authority.clone(), - block_height: state.state.0.height(), + block_height: state.state.0.height() as u64, target: state.specific_state.to_validate.clone(), } } @@ -1419,7 +1419,7 @@ impl<'wrld, 'block, 'state> state: &state::executor::Migrate<'wrld, 'block, 'state>, ) -> payloads::Migrate { payloads::Migrate { - block_height: state.state.0.height(), + block_height: state.state.0.height() as u64, } } diff --git a/core/src/snapshot.rs b/core/src/snapshot.rs index 572d0810c9b..f7a6bbf0779 100644 --- a/core/src/snapshot.rs +++ b/core/src/snapshot.rs @@ -1,6 +1,7 @@ //! This module contains [`State`] snapshot actor service. use std::{ io::Read, + num::NonZeroUsize, path::{Path, PathBuf}, sync::Arc, time::Duration, @@ -169,8 +170,8 @@ pub fn try_read_snapshot( }); } for height in 1..snapshot_height { - let kura_block_hash = kura - .get_block_hash(height as u64) + let kura_block_hash = NonZeroUsize::new(height) + .and_then(|height| kura.get_block_hash(height)) .expect("Kura has height at least as large as state height"); let snapshot_block_hash = state_view.block_hashes[height - 1]; if kura_block_hash != snapshot_block_hash { @@ -286,7 +287,7 @@ mod tests { &store_dir, &Kura::blank_kura_for_testing(), LiveQueryStore::test().start(), - BlockCount(usize::try_from(state.view().height()).unwrap()), + BlockCount(state.view().height()), ) .unwrap(); } diff --git a/core/src/state.rs b/core/src/state.rs index 38a74462a71..4055b2b4b9f 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -1,5 +1,8 @@ //! This module provides the [`State`] — an in-memory representation of the current blockchain state. -use std::{borrow::Borrow, collections::BTreeSet, marker::PhantomData, sync::Arc, time::Duration}; +use std::{ + borrow::Borrow, collections::BTreeSet, marker::PhantomData, num::NonZeroUsize, sync::Arc, + time::Duration, +}; use eyre::Result; use iroha_config::parameters::actual::ChainWide as Config; @@ -171,7 +174,7 @@ pub struct State { // TODO: Cell is redundant here since block_hashes is very easy to rollback by just popping the last element pub block_hashes: Cell>>, /// Hashes of transactions mapped onto block height where they stored - pub transactions: Storage, u64>, + pub transactions: Storage, usize>, /// Engine for WASM [`Runtime`](wasm::Runtime) to execute triggers. #[serde(skip)] pub engine: wasmtime::Engine, @@ -197,7 +200,7 @@ pub struct StateBlock<'state> { /// Blockchain. pub block_hashes: CellBlock<'state, Vec>>, /// Hashes of transactions mapped onto block height where they stored - pub transactions: StorageBlock<'state, HashOf, u64>, + pub transactions: StorageBlock<'state, HashOf, usize>, /// Engine for WASM [`Runtime`](wasm::Runtime) to execute triggers. pub engine: &'state wasmtime::Engine, @@ -219,7 +222,7 @@ pub struct StateTransaction<'block, 'state> { /// Blockchain. pub block_hashes: CellTransaction<'block, 'state, Vec>>, /// Hashes of transactions mapped onto block height where they stored - pub transactions: StorageTransaction<'block, 'state, HashOf, u64>, + pub transactions: StorageTransaction<'block, 'state, HashOf, usize>, /// Engine for WASM [`Runtime`](wasm::Runtime) to execute triggers. pub engine: &'state wasmtime::Engine, @@ -241,7 +244,7 @@ pub struct StateView<'state> { /// Blockchain. pub block_hashes: CellView<'state, Vec>>, /// Hashes of transactions mapped onto block height where they stored - pub transactions: StorageView<'state, HashOf, u64>, + pub transactions: StorageView<'state, HashOf, usize>, /// Engine for WASM [`Runtime`](wasm::Runtime) to execute triggers. pub engine: &'state wasmtime::Engine, @@ -990,7 +993,7 @@ pub trait StateReadOnly { fn world(&self) -> &impl WorldReadOnly; fn config(&self) -> &Config; fn block_hashes(&self) -> &[HashOf]; - fn transactions(&self) -> &impl StorageReadOnly, u64>; + fn transactions(&self) -> &impl StorageReadOnly, usize>; fn engine(&self) -> &wasmtime::Engine; fn kura(&self) -> &Kura; fn query_handle(&self) -> &LiveQueryStoreHandle; @@ -1001,8 +1004,7 @@ pub trait StateReadOnly { /// Get a reference to the latest block. Returns none if genesis is not committed. #[inline] fn latest_block_ref(&self) -> Option> { - self.kura() - .get_block_by_height(self.block_hashes().len() as u64) + NonZeroUsize::new(self.height()).and_then(|height| self.kura().get_block_by_height(height)) } /// Return the hash of the latest block @@ -1011,10 +1013,10 @@ pub trait StateReadOnly { } /// Return the view change index of the latest block - fn latest_block_view_change_index(&self) -> u64 { - self.kura() - .get_block_by_height(self.height()) - .map_or(0, |block| block.header().view_change_index) + fn latest_block_view_change_index(&self) -> usize { + NonZeroUsize::new(self.height()) + .and_then(|height| self.kura().get_block_by_height(height)) + .map_or(0, |block| block.header().view_change_index as usize) } /// Return the hash of the block one before the latest block @@ -1024,10 +1026,9 @@ pub trait StateReadOnly { /// Load all blocks in the block chain from disc fn all_blocks(&self) -> impl DoubleEndedIterator> + '_ { - let block_count = self.block_hashes().len() as u64; - (1..=block_count).map(|height| { - self.kura() - .get_block_by_height(height) + (1..=self.height()).map(|height| { + NonZeroUsize::new(height) + .and_then(|height| self.kura().get_block_by_height(height)) .expect("Failed to load block.") }) } @@ -1061,14 +1062,16 @@ pub trait StateReadOnly { /// Height of blockchain #[inline] - fn height(&self) -> u64 { - self.block_hashes().len() as u64 + fn height(&self) -> usize { + self.block_hashes().len() } /// Find a [`SignedBlock`] by hash. fn block_with_tx(&self, hash: &HashOf) -> Option> { - let height = *self.transactions().get(hash)?; - self.kura().get_block_by_height(height) + self.transactions() + .get(hash) + .and_then(|&height| NonZeroUsize::new(height)) + .and_then(|height| self.kura().get_block_by_height(height)) } /// Returns [`Some`] milliseconds since the genesis block was @@ -1080,12 +1083,13 @@ pub trait StateReadOnly { } else { let opt = self .kura() - .get_block_by_height(1) + .get_block_by_height(nonzero_ext::nonzero!(1_usize)) .map(|genesis_block| genesis_block.header().timestamp()); if opt.is_none() { error!("Failed to get genesis block from Kura."); } + opt } } @@ -1114,7 +1118,7 @@ macro_rules! impl_state_ro { fn block_hashes(&self) -> &[HashOf] { &self.block_hashes } - fn transactions(&self) -> &impl StorageReadOnly, u64> { + fn transactions(&self) -> &impl StorageReadOnly, usize> { &self.transactions } fn engine(&self) -> &wasmtime::Engine { @@ -1216,7 +1220,12 @@ impl<'state> StateBlock<'state> { let time_event = self.create_time_event(block); self.world.events_buffer.push(time_event.into()); - let block_height = block.as_ref().header().height; + let block_height = block + .as_ref() + .header() + .height + .try_into() + .expect("INTERNAL BUG: Block height exceeds usize::MAX"); block .as_ref() .transactions() @@ -1782,7 +1791,7 @@ mod tests { for i in 1..=BLOCK_CNT { let block = new_dummy_block_with_payload(|payload| { payload.header.height = i as u64; - payload.header.previous_block_hash = block_hashes.last().copied(); + payload.header.prev_block_hash = block_hashes.last().copied(); }); block_hashes.push(block.as_ref().hash()); diff --git a/core/src/sumeragi/main_loop.rs b/core/src/sumeragi/main_loop.rs index 74a433c00dc..53fb6b6ca23 100644 --- a/core/src/sumeragi/main_loop.rs +++ b/core/src/sumeragi/main_loop.rs @@ -168,7 +168,7 @@ impl Sumeragi { &self.current_topology.ordered_peers, self.current_topology.max_faults(), state_view.latest_block_hash(), - ) as u64; + ); loop { let block_msg = self @@ -182,8 +182,10 @@ impl Sumeragi { }) .ok()?; - let block_vc_index: Option = match &block_msg { - BlockMessage::BlockCreated(bc) => Some(bc.block.header().view_change_index), + let block_vc_index: Option = match &block_msg { + BlockMessage::BlockCreated(bc) => { + Some(bc.block.header().view_change_index as usize) + } // Signed and Committed contain no block. // Block sync updates are exempt from early pruning. BlockMessage::BlockSigned(_) @@ -415,13 +417,13 @@ impl Sumeragi { &self, state_view: &StateView<'_>, view_change_proof_chain: &mut ProofChain, - ) -> u64 { + ) -> usize { view_change_proof_chain.prune(state_view.latest_block_hash()); view_change_proof_chain.verify_with_state( &self.current_topology.ordered_peers, self.current_topology.max_faults(), state_view.latest_block_hash(), - ) as u64 + ) } #[allow(clippy::too_many_lines)] @@ -430,7 +432,7 @@ impl Sumeragi { message: BlockMessage, state: &'state State, voting_block: &mut Option>, - current_view_change_index: u64, + current_view_change_index: usize, genesis_public_key: &PublicKey, voting_signatures: &mut Vec>, ) { @@ -653,7 +655,7 @@ impl Sumeragi { &mut self, state: &'state State, voting_block: &mut Option>, - current_view_change_index: u64, + current_view_change_index: usize, round_start_time: &Instant, #[cfg_attr(not(debug_assertions), allow(unused_variables))] is_genesis_peer: bool, ) { @@ -757,8 +759,8 @@ impl Sumeragi { fn reset_state( peer_id: &PeerId, pipeline_time: Duration, - current_view_change_index: u64, - old_view_change_index: &mut u64, + current_view_change_index: usize, + old_view_change_index: &mut usize, old_latest_block_hash: &mut HashOf, latest_block: &SignedBlock, // below is the state that gets reset. @@ -922,7 +924,9 @@ pub(crate) fn run( &mut last_view_change_time, &mut view_change_time, ); - sumeragi.view_changes_metric.set(old_view_change_index); + sumeragi + .view_changes_metric + .set(old_view_change_index as u64); if let Some(message) = { let (msg, sleep) = @@ -1003,7 +1007,9 @@ pub(crate) fn run( &mut last_view_change_time, &mut view_change_time, ); - sumeragi.view_changes_metric.set(old_view_change_index); + sumeragi + .view_changes_metric + .set(old_view_change_index as u64); sumeragi.process_message_independent( &state, @@ -1100,12 +1106,12 @@ enum BlockSyncError { BlockNotValid(BlockValidationError), SoftForkBlockNotValid(BlockValidationError), SoftForkBlockSmallViewChangeIndex { - peer_view_change_index: u64, - block_view_change_index: u64, + peer_view_change_index: usize, + block_view_change_index: usize, }, BlockNotProperHeight { - peer_height: u64, - block_height: u64, + peer_height: usize, + block_height: usize, }, } @@ -1116,7 +1122,12 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( state: &'state State, handle_events: &F, ) -> Result, (SignedBlock, BlockSyncError)> { - let block_height = block.header().height; + let block_height = block + .header() + .height + .try_into() + .expect("INTERNAL BUG: Block height exceeds usize::MAX"); + let state_height = state.view().height(); if state_height + 1 == block_height { // Normal branch for adding new block on top of current @@ -1126,7 +1137,7 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( .latest_block_ref() .expect("Not in genesis round so must have at least genesis block"); let new_peers = state_block.world.peers().cloned().collect(); - let view_change_index = block.header().view_change_index; + let view_change_index = block.header().view_change_index as usize; Topology::recreate_topology(&last_committed_block, view_change_index, new_peers) }; ValidBlock::validate( @@ -1150,7 +1161,7 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( // Soft fork branch for replacing current block with valid one let peer_view_change_index = state.view().latest_block_view_change_index(); - let block_view_change_index = block.header().view_change_index; + let block_view_change_index = block.header().view_change_index as usize; if peer_view_change_index >= block_view_change_index { return Err(( block, @@ -1167,7 +1178,7 @@ fn handle_block_sync<'state, F: Fn(PipelineEventBox)>( .latest_block_ref() .expect("Not in genesis round so must have at least genesis block"); let new_peers = state_block.world.peers().cloned().collect(); - let view_change_index = block.header().view_change_index; + let view_change_index = block.header().view_change_index as usize; Topology::recreate_topology(&last_committed_block, view_change_index, new_peers) }; ValidBlock::validate( diff --git a/core/src/sumeragi/mod.rs b/core/src/sumeragi/mod.rs index a5b7175a645..94bbf160333 100644 --- a/core/src/sumeragi/mod.rs +++ b/core/src/sumeragi/mod.rs @@ -3,6 +3,7 @@ //! `Consensus` trait is now implemented only by `Sumeragi` for now. use std::{ fmt::{self, Debug, Formatter}, + num::NonZeroUsize, sync::{mpsc, Arc}, time::{Duration, Instant}, }; @@ -75,7 +76,7 @@ impl SumeragiHandle { recreate_topology: RecreateTopologyByViewChangeIndex, ) -> RecreateTopologyByViewChangeIndex { // NOTE: topology need to be updated up to block's view_change_index - let current_topology = recreate_topology(block.header().view_change_index); + let current_topology = recreate_topology(block.header().view_change_index as usize); let block = ValidBlock::validate( block.clone(), @@ -144,7 +145,7 @@ impl SumeragiHandle { let state_view = state.view(); let skip_block_count = state_view.block_hashes.len(); blocks_iter = (skip_block_count + 1..=block_count).map(|block_height| { - kura.get_block_by_height(block_height as u64).expect( + NonZeroUsize::new(block_height).and_then(|height| kura.get_block_by_height(height)).expect( "Sumeragi should be able to load the block that was reported as presented. \ If not, the block storage was probably disconnected.", ) @@ -161,10 +162,12 @@ impl SumeragiHandle { Box::new(move |_view_change_index| Topology::new(peers)) } height => { - let block_ref = kura.get_block_by_height(height).expect( - "Sumeragi could not load block that was reported as present. \ - Please check that the block storage was not disconnected.", - ); + let block_ref = NonZeroUsize::new(height) + .and_then(|height| kura.get_block_by_height(height)) + .expect( + "Sumeragi could not load block that was reported as present. \ + Please check that the block storage was not disconnected.", + ); let peers = state_view.world.peers_ids().iter().cloned().collect(); Box::new(move |view_change_index| { Topology::recreate_topology(&block_ref, view_change_index, peers) @@ -247,7 +250,7 @@ impl SumeragiHandle { } /// Closure to get topology recreated at certain view change index -type RecreateTopologyByViewChangeIndex = Box Topology>; +type RecreateTopologyByViewChangeIndex = Box Topology>; /// The interval at which sumeragi checks if there are tx in the /// `queue`. And will create a block if is leader and the voting is diff --git a/core/src/sumeragi/network_topology.rs b/core/src/sumeragi/network_topology.rs index dfa22fd9cc5..2fdac11578f 100644 --- a/core/src/sumeragi/network_topology.rs +++ b/core/src/sumeragi/network_topology.rs @@ -138,17 +138,9 @@ impl Topology { } /// Rotate peers n times where n is a number of failed attempt to create a block. - pub fn rotate_all_n(&mut self, n: u64) { - let len = self - .ordered_peers - .len() - .try_into() - .expect("`usize` should fit into `u64`"); + pub fn rotate_all_n(&mut self, n: usize) { + let len = self.ordered_peers.len(); if let Some(rem) = n.checked_rem(len) { - let rem = rem.try_into().expect( - "`rem` is smaller than `usize::MAX`, because remainder is always smaller than divisor", - ); - self.modify_peers_directly(|peers| peers.rotate_left(rem)); } } @@ -178,7 +170,7 @@ impl Topology { /// Recreate topology for given block and view change index pub fn recreate_topology( block: &SignedBlock, - view_change_index: u64, + view_change_index: usize, new_peers: UniqueVec, ) -> Self { let mut topology = Topology::new(block.commit_topology().clone()); @@ -198,10 +190,7 @@ impl Topology { // FIXME: This is a hack to prevent consensus from running amock due to // a bug in the implementation by reverting to predictable ordering - let view_change_limit: usize = view_change_index - .saturating_sub(10) - .try_into() - .expect("u64 must fit into usize"); + let view_change_limit: usize = view_change_index.saturating_sub(10); if view_change_limit > 1 { iroha_logger::error!("Restarting consensus(internal bug). Report to developers"); diff --git a/core/src/sumeragi/view_change.rs b/core/src/sumeragi/view_change.rs index 9a24f0ece33..fca76fbee67 100644 --- a/core/src/sumeragi/view_change.rs +++ b/core/src/sumeragi/view_change.rs @@ -24,7 +24,7 @@ struct ProofPayload { /// Hash of the latest committed block. latest_block_hash: Option>, /// Within a round, what is the index of the view change this proof is trying to prove. - view_change_index: u64, + view_change_index: u32, } /// The proof of a view change. It needs to be signed by f+1 peers for proof to be valid and view change to happen. @@ -41,7 +41,11 @@ pub struct ProofBuilder(SignedProof); impl ProofBuilder { /// Constructor from index. - pub fn new(latest_block_hash: Option>, view_change_index: u64) -> Self { + pub fn new(latest_block_hash: Option>, view_change_index: usize) -> Self { + let view_change_index = view_change_index + .try_into() + .expect("View change index should fit into usize"); + let proof = SignedProof { payload: ProofPayload { latest_block_hash, @@ -106,9 +110,9 @@ impl ProofChain { ) -> usize { self.iter() .enumerate() - .take_while(|(i, proof)| { + .take_while(|&(i, proof)| { proof.payload.latest_block_hash == latest_block_hash - && proof.payload.view_change_index == (*i as u64) + && proof.payload.view_change_index as usize == i && proof.verify(peers, max_faults) }) .count() @@ -119,9 +123,9 @@ impl ProofChain { let valid_count = self .iter() .enumerate() - .take_while(|(i, proof)| { + .take_while(|&(i, proof)| { proof.payload.latest_block_hash == latest_block_hash - && proof.payload.view_change_index == (*i as u64) + && proof.payload.view_change_index as usize == i }) .count(); self.truncate(valid_count); @@ -144,7 +148,7 @@ impl ProofChain { } let next_unfinished_view_change = self.verify_with_state(peers, max_faults, latest_block_hash); - if new_proof.payload.view_change_index != (next_unfinished_view_change as u64) { + if new_proof.payload.view_change_index as usize != next_unfinished_view_change { return Err(Error::ViewChangeNotFound); // We only care about the current view change that may or may not happen. } diff --git a/core/test_network/src/lib.rs b/core/test_network/src/lib.rs index 66ae5bbfb82..14d58aee671 100644 --- a/core/test_network/src/lib.rs +++ b/core/test_network/src/lib.rs @@ -352,6 +352,7 @@ pub fn wait_for_genesis_committed_with_max_retries( let ready_peers = clients .iter() .map(|client| { + println!("KITA: {:?}", client.get_status().unwrap()); let is_ready = match client.get_status() { Ok(status) => status.blocks >= 1, Err(error) => { @@ -362,6 +363,8 @@ pub fn wait_for_genesis_committed_with_max_retries( is_ready as u32 }) .sum::(); + + println!("Ready peers: {ready_peers}"); let without_genesis_peers = clients.len() as u32 - ready_peers; if without_genesis_peers <= offline_peers { return; diff --git a/data_model/src/block.rs b/data_model/src/block.rs index 2655beeaca2..74a871fa55d 100644 --- a/data_model/src/block.rs +++ b/data_model/src/block.rs @@ -56,7 +56,7 @@ mod model { pub height: u64, /// Hash of the previous block in the chain. #[getset(get = "pub")] - pub previous_block_hash: Option>, + pub prev_block_hash: Option>, /// Hash of merkle tree root of transactions' hashes. #[getset(get = "pub")] pub transactions_hash: Option>>, @@ -65,7 +65,7 @@ mod model { pub timestamp_ms: u64, /// Value of view change index. Used to resolve soft forks. #[getset(skip)] - pub view_change_index: u64, + pub view_change_index: u32, /// Estimation of consensus duration (in milliseconds). pub consensus_estimation_ms: u64, } diff --git a/data_model/src/events/pipeline.rs b/data_model/src/events/pipeline.rs index 2b7bba7f745..9d1b5b5b260 100644 --- a/data_model/src/events/pipeline.rs +++ b/data_model/src/events/pipeline.rs @@ -353,7 +353,7 @@ mod tests { fn dummy(height: u64) -> Self { Self { height, - previous_block_hash: None, + prev_block_hash: None, transactions_hash: None, timestamp_ms: 0, view_change_index: 0, diff --git a/data_model/src/lib.rs b/data_model/src/lib.rs index 2e42a5d6aab..41a558118dd 100644 --- a/data_model/src/lib.rs +++ b/data_model/src/lib.rs @@ -878,26 +878,6 @@ mod model { } impl JsonString { - /// Deserialize JSON into something - /// # Errors - /// See [`serde_json::from_str`]. - pub fn deserialize<'a, T>(&'a self) -> serde_json::Result - where - T: Deserialize<'a>, - { - serde_json::from_str(&self.0) - } - - /// Serializes a value into [`JsonString`] - /// # Errors - /// See [`serde_json::to_string`]. - pub fn serialize(value: &T) -> serde_json::Result { - let serialized = serde_json::to_string(value)?; - // the string was obtained from serde_json serialization, - // so it should be a valid JSON string - Ok(Self(serialized)) - } - /// Create without checking whether the input is a valid JSON string. /// /// The caller must guarantee that the value is valid. @@ -918,6 +898,12 @@ impl From for JsonString { } } +impl AsRef for JsonString { + fn as_ref(&self) -> &str { + &self.0 + } +} + impl<'de> serde::de::Deserialize<'de> for JsonString { fn deserialize(deserializer: D) -> Result where diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 1f11b12abf7..cd36d2eff68 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -620,7 +620,7 @@ }, { "name": "view_change_index", - "type": "u64" + "type": "u32" }, { "name": "consensus_estimation_ms", diff --git a/smart_contract/executor/derive/src/permission.rs b/smart_contract/executor/derive/src/permission.rs index 422580e6316..0cb6f5c3a39 100644 --- a/smart_contract/executor/derive/src/permission.rs +++ b/smart_contract/executor/derive/src/permission.rs @@ -40,10 +40,8 @@ pub fn impl_derive_permission(input: &syn::DeriveInput) -> TokenStream { if *value.id() != ::id() { return Err(Self::Error::Id(value.id().name().clone())); } - value - .payload() - .deserialize() - .map_err(Self::Error::Deserialize) + + serde_json::from_str::(value.payload().as_ref()).map_err(Self::Error::Deserialize) } } @@ -51,8 +49,8 @@ pub fn impl_derive_permission(input: &syn::DeriveInput) -> TokenStream { fn from(value: #ident #ty_generics) -> Self { ::iroha_executor::data_model::permission::Permission::new( <#ident as ::iroha_executor::permission::Permission>::id(), - ::iroha_executor::data_model::JsonString::serialize(&value) - .expect("failed to serialize concrete data model entity; this is a bug"), + ::serde_json::to_value::<#ident #ty_generics>(value) + .expect("INTERNAL BUG: Failed to serialize Executor data model entity"), ) } } diff --git a/smart_contract/executor/src/lib.rs b/smart_contract/executor/src/lib.rs index 08281ae3b3d..64f9983133d 100644 --- a/smart_contract/executor/src/lib.rs +++ b/smart_contract/executor/src/lib.rs @@ -187,8 +187,8 @@ pub enum TryFromDataModelObjectError { /// A convenience to build [`ExecutorDataModel`] from within the executor #[derive(Debug, Clone)] pub struct DataModelBuilder { - schema: MetaMap, permissions: BTreeSet, + schema: MetaMap, } impl DataModelBuilder { @@ -197,8 +197,8 @@ impl DataModelBuilder { #[allow(clippy::new_without_default)] pub fn new() -> Self { Self { - schema: <_>::default(), permissions: <_>::default(), + schema: <_>::default(), } } @@ -240,8 +240,9 @@ impl DataModelBuilder { pub fn build_and_set(self) { set_data_model(&ExecutorDataModel::new( self.permissions, - data_model::JsonString::serialize(&self.schema) - .expect("schema serialization must not fail"), + serde_json::to_value(&self.schema) + .expect("INTERNAL BUG: Failed to serialize Executor data model entity") + .into(), )) } } diff --git a/telemetry/src/metrics.rs b/telemetry/src/metrics.rs index 5146b6016d2..432f70b1ff4 100644 --- a/telemetry/src/metrics.rs +++ b/telemetry/src/metrics.rs @@ -64,7 +64,7 @@ pub struct Status { pub uptime: Uptime, /// Number of view changes in the current round #[codec(compact)] - pub view_changes: u64, + pub view_changes: u32, /// Number of the transactions in the queue #[codec(compact)] pub queue_size: u64, @@ -79,7 +79,11 @@ impl> From<&T> for Status { txs_accepted: val.txs.with_label_values(&["accepted"]).get(), txs_rejected: val.txs.with_label_values(&["rejected"]).get(), uptime: Uptime(Duration::from_millis(val.uptime_since_genesis_ms.get())), - view_changes: val.view_changes.get(), + view_changes: val + .view_changes + .get() + .try_into() + .expect("INTERNAL BUG: Number of view changes exceeds u32::MAX"), queue_size: val.queue_size.get(), } } diff --git a/torii/src/routing.rs b/torii/src/routing.rs index 5ed4e40240e..3d1e380eff6 100644 --- a/torii/src/routing.rs +++ b/torii/src/routing.rs @@ -153,7 +153,7 @@ pub async fn handle_blocks_stream(kura: Arc, mut stream: WebSocket) -> eyr } // This branch sends blocks _ = interval.tick() => { - if let Some(block) = kura.get_block_by_height(from_height.get()) { + if let Some(block) = kura.get_block_by_height(from_height.try_into().expect("INTERNAL BUG: Number of blocks exceeds usize::MAX")) { stream // TODO: to avoid clone `BlockMessage` could be split into sending and receiving parts .send(BlockMessage(SignedBlock::clone(&block)))