From 659f969e1c1bf3069034b6d96298c7d90ca40032 Mon Sep 17 00:00:00 2001 From: Dmitry Murzin Date: Thu, 26 Sep 2024 03:36:23 +0300 Subject: [PATCH] refactor: Use `ConstVec` for instructions in `Executable` (#5096) Signed-off-by: Dmitry Murzin --- .../src/smartcontracts/isi/triggers/set.rs | 3 ++- crates/iroha_data_model/src/block.rs | 2 +- crates/iroha_data_model/src/transaction.rs | 3 ++- crates/iroha_primitives/src/const_vec.rs | 17 +++++++++++++++++ crates/iroha_schema_gen/src/lib.rs | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/crates/iroha_core/src/smartcontracts/isi/triggers/set.rs b/crates/iroha_core/src/smartcontracts/isi/triggers/set.rs index f270a9fbd34..43eb9efe721 100644 --- a/crates/iroha_core/src/smartcontracts/isi/triggers/set.rs +++ b/crates/iroha_core/src/smartcontracts/isi/triggers/set.rs @@ -19,6 +19,7 @@ use iroha_data_model::{ query::error::FindError, transaction::WasmSmartContract, }; +use iroha_primitives::const_vec::ConstVec; use mv::{ cell::{Block as CellBlock, Cell, Transaction as CellTransaction, View as CellView}, storage::{ @@ -1012,7 +1013,7 @@ pub enum ExecutableRef { /// Loaded WASM Wasm(HashOf), /// Vector of ISI - Instructions(Vec), + Instructions(ConstVec), } impl core::fmt::Debug for ExecutableRef { diff --git a/crates/iroha_data_model/src/block.rs b/crates/iroha_data_model/src/block.rs index d7cc1003822..1ffa33ff268 100644 --- a/crates/iroha_data_model/src/block.rs +++ b/crates/iroha_data_model/src/block.rs @@ -454,7 +454,7 @@ mod candidate { else { return Err("Genesis transaction must contain instructions"); }; - let [InstructionBox::Upgrade(_)] = instructions_executor.as_slice() else { + let [InstructionBox::Upgrade(_)] = instructions_executor.as_ref() else { return Err( "First transaction must contain single `Upgrade` instruction to set executor", ); diff --git a/crates/iroha_data_model/src/transaction.rs b/crates/iroha_data_model/src/transaction.rs index 5b5a3cfc968..6bd5efb4cc5 100644 --- a/crates/iroha_data_model/src/transaction.rs +++ b/crates/iroha_data_model/src/transaction.rs @@ -30,6 +30,7 @@ use crate::{ #[model] mod model { use getset::Getters; + use iroha_primitives::const_vec::ConstVec; use super::*; use crate::account::AccountId; @@ -53,7 +54,7 @@ mod model { pub enum Executable { /// Ordered set of instructions. #[debug(fmt = "{_0:?}")] - Instructions(Vec), + Instructions(ConstVec), /// WebAssembly smartcontract Wasm(WasmSmartContract), } diff --git a/crates/iroha_primitives/src/const_vec.rs b/crates/iroha_primitives/src/const_vec.rs index acba77ac1a7..54f7c628b28 100644 --- a/crates/iroha_primitives/src/const_vec.rs +++ b/crates/iroha_primitives/src/const_vec.rs @@ -92,6 +92,16 @@ impl IntoSchema for ConstVec { } } +impl<'a, T> IntoIterator for &'a ConstVec { + type Item = &'a T; + + type IntoIter = <&'a [T] as IntoIterator>::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + impl IntoIterator for ConstVec { type Item = T; @@ -102,6 +112,13 @@ impl IntoIterator for ConstVec { } } +impl FromIterator for ConstVec { + fn from_iter>(iter: I) -> Self { + let vec: Vec = iter.into_iter().collect(); + Self::new(vec) + } +} + /// Trait to extend `[T]` with a method to convert it to `ConstVec` by analogy with `[T]::to_vec()`. pub trait ToConstVec { /// The type of the items in the slice. diff --git a/crates/iroha_schema_gen/src/lib.rs b/crates/iroha_schema_gen/src/lib.rs index 79a80583ed1..f4c0de08ea0 100644 --- a/crates/iroha_schema_gen/src/lib.rs +++ b/crates/iroha_schema_gen/src/lib.rs @@ -192,6 +192,7 @@ types!( ConfigurationEventSet, ConstString, ConstVec, + ConstVec, CustomInstruction, CustomParameter, CustomParameterId,