From e4343cf15f5c55f1365240c96fbf48ea6f2acc35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Mon, 9 Oct 2023 16:01:53 +0300 Subject: [PATCH] [refactor] #3918: Rename validator to executor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- Cargo.lock | 44 +- Cargo.toml | 8 +- README.md | 2 +- cli/build.rs | 12 +- cli/src/samples.rs | 12 +- cli/src/torii/mod.rs | 2 +- client/benches/torii.rs | 10 +- client/examples/million_accounts_genesis.rs | 6 +- .../integration/smartcontracts/Cargo.toml | 8 +- .../Cargo.toml | 4 +- .../src/lib.rs | 42 +- .../Cargo.toml | 4 +- .../src/lib.rs | 66 +- .../Cargo.toml | 4 +- .../src/lib.rs | 42 +- client/tests/integration/upgrade.rs | 31 +- configs/peer/executor.wasm | Bin 0 -> 504891 bytes configs/peer/genesis.json | 2 +- configs/peer/stable/genesis.json | 2 +- configs/peer/validator.wasm | Bin 497224 -> 0 bytes core/benches/blocks/common.rs | 16 +- core/benches/kura.rs | 10 +- core/benches/validation.rs | 20 +- core/src/block.rs | 16 +- core/src/{validator.rs => executor.rs} | 143 ++-- core/src/lib.rs | 2 +- core/src/smartcontracts/isi/mod.rs | 4 +- core/src/smartcontracts/isi/query.rs | 4 +- core/src/smartcontracts/isi/triggers/mod.rs | 2 +- core/src/smartcontracts/isi/world.rs | 18 +- core/src/smartcontracts/mod.rs | 2 +- core/src/smartcontracts/wasm.rs | 280 ++++---- core/src/sumeragi/main_loop.rs | 6 +- core/src/tx.rs | 18 +- core/src/wsv.rs | 32 +- core/test_network/src/lib.rs | 6 +- data_model/src/events/data/events.rs | 28 +- data_model/src/{validator.rs => executor.rs} | 14 +- data_model/src/isi.rs | 6 +- data_model/src/lib.rs | 34 +- data_model/src/permission.rs | 2 +- data_model/src/query/mod.rs | 2 +- data_model/src/smart_contract.rs | 2 +- data_model/src/visit.rs | 10 +- .../.cargo/config.toml | 0 .../Cargo.toml | 4 +- .../LICENSE | 0 .../README.md | 4 +- .../src/lib.rs | 61 +- docs/source/iroha_2_whitepaper.md | 10 +- docs/source/lts_selection.org | 4 +- docs/source/references/schema.json | 76 +-- genesis/src/lib.rs | 84 +-- schema/gen/src/lib.rs | 6 +- scripts/test_env.py | 2 +- scripts/tests/consistency.sh | 4 +- scripts/update_configs.sh | 2 +- .../{validator => executor}/Cargo.toml | 4 +- .../{validator => executor}/derive/Cargo.toml | 2 +- .../derive/src/conversion.rs | 8 +- .../derive/src/entrypoint.rs | 49 +- .../{validator => executor}/derive/src/lib.rs | 12 +- .../derive/src/token.rs | 22 +- .../derive/src/validate.rs | 10 +- .../{validator => executor}/src/default.rs | 626 +++++++++--------- .../{validator => executor}/src/lib.rs | 56 +- .../{validator => executor}/src/permission.rs | 10 +- tools/kagami/src/genesis.rs | 73 +- tools/parity_scale_decoder/src/main.rs | 2 +- wasm_builder/src/lib.rs | 4 +- 70 files changed, 1054 insertions(+), 1059 deletions(-) rename client/tests/integration/smartcontracts/{validator_with_admin => executor_with_admin}/Cargo.toml (79%) rename client/tests/integration/smartcontracts/{validator_with_admin => executor_with_admin}/src/lib.rs (80%) rename client/tests/integration/smartcontracts/{validator_with_custom_token => executor_with_custom_token}/Cargo.toml (83%) rename client/tests/integration/smartcontracts/{validator_with_custom_token => executor_with_custom_token}/src/lib.rs (82%) rename client/tests/integration/smartcontracts/{validator_with_migration_fail => executor_with_migration_fail}/Cargo.toml (76%) rename client/tests/integration/smartcontracts/{validator_with_migration_fail => executor_with_migration_fail}/src/lib.rs (82%) create mode 100644 configs/peer/executor.wasm delete mode 100644 configs/peer/validator.wasm rename core/src/{validator.rs => executor.rs} (65%) rename data_model/src/{validator.rs => executor.rs} (81%) rename {default_validator => default_executor}/.cargo/config.toml (100%) rename {default_validator => default_executor}/Cargo.toml (84%) rename {default_validator => default_executor}/LICENSE (100%) rename {default_validator => default_executor}/README.md (55%) rename {default_validator => default_executor}/src/lib.rs (74%) rename smart_contract/{validator => executor}/Cargo.toml (87%) rename smart_contract/{validator => executor}/derive/Cargo.toml (88%) rename smart_contract/{validator => executor}/derive/src/conversion.rs (89%) rename smart_contract/{validator => executor}/derive/src/entrypoint.rs (67%) rename smart_contract/{validator => executor}/derive/src/lib.rs (95%) rename smart_contract/{validator => executor}/derive/src/token.rs (58%) rename smart_contract/{validator => executor}/derive/src/validate.rs (93%) rename smart_contract/{validator => executor}/src/default.rs (75%) rename smart_contract/{validator => executor}/src/lib.rs (84%) rename smart_contract/{validator => executor}/src/permission.rs (96%) diff --git a/Cargo.lock b/Cargo.lock index 02aba7e1cbd..0c25dea84be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3217,6 +3217,28 @@ dependencies = [ "serde_json", ] +[[package]] +name = "iroha_executor" +version = "2.0.0-pre-rc.19" +dependencies = [ + "iroha_data_model", + "iroha_executor_derive", + "iroha_schema", + "iroha_smart_contract", + "iroha_smart_contract_utils", + "serde", + "serde_json", +] + +[[package]] +name = "iroha_executor_derive" +version = "2.0.0-pre-rc.19" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "iroha_ffi" version = "2.0.0-pre-rc.19" @@ -3527,28 +3549,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "iroha_validator" -version = "2.0.0-pre-rc.19" -dependencies = [ - "iroha_data_model", - "iroha_schema", - "iroha_smart_contract", - "iroha_smart_contract_utils", - "iroha_validator_derive", - "serde", - "serde_json", -] - -[[package]] -name = "iroha_validator_derive" -version = "2.0.0-pre-rc.19" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "iroha_version" version = "2.0.0-pre-rc.19" diff --git a/Cargo.toml b/Cargo.toml index 69532e90459..cc3ebecb5fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,8 +50,8 @@ iroha_wasm_builder = { version = "=2.0.0-pre-rc.19", path = "wasm_builder" } iroha_smart_contract = { version = "=2.0.0-pre-rc.19", path = "smart_contract" } iroha_smart_contract_derive = { version = "=2.0.0-pre-rc.19", path = "smart_contract/derive" } iroha_smart_contract_utils = { version = "=2.0.0-pre-rc.19", path = "smart_contract/utils" } -iroha_validator = { version = "=2.0.0-pre-rc.19", path = "smart_contract/validator" } -iroha_validator_derive = { version = "=2.0.0-pre-rc.19", path = "smart_contract/validator/derive" } +iroha_executor = { version = "=2.0.0-pre-rc.19", path = "smart_contract/executor" } +iroha_executor_derive = { version = "=2.0.0-pre-rc.19", path = "smart_contract/executor/derive" } iroha_trigger = { version = "=2.0.0-pre-rc.19", path = "smart_contract/trigger" } iroha_trigger_derive = { version = "=2.0.0-pre-rc.19", path = "smart_contract/trigger/derive" } @@ -326,8 +326,8 @@ members = [ "smart_contract/trigger", "smart_contract/trigger/derive", "smart_contract/utils", - "smart_contract/validator", - "smart_contract/validator/derive", + "smart_contract/executor", + "smart_contract/executor/derive", "substrate", "telemetry", "tools/kagami", diff --git a/README.md b/README.md index 6e5a3f3512b..dcf33bf4aa5 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ Iroha project mainly consists of the following crates: * [`iroha_logger`](logger) uses `tracing` to provide logging facilities. * [`iroha_macro`](macro) provides the convenience macros. * [`iroha_p2p`](p2p) defines peer creation and handshake logic. -* [`iroha_default_validator`](default_validator) defines runtime validation logic. +* [`iroha_default_executor`](default_executor) defines runtime validation logic. * [`iroha_substrate`](substrate) is the bridge substrate `XClaim` external module. * [`iroha_telemetry`](telemetry) is used for monitoring and analysis of telemetry data. * [`iroha_version`](version) provides message versioning for non-simultaneous system updates. diff --git a/cli/build.rs b/cli/build.rs index 4cc489aa580..23ce6a29d23 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -1,12 +1,12 @@ -//! Build script to extract git hash of iroha build and to check runtime validator +//! Build script to extract git hash of iroha build and to check runtime executor use eyre::{eyre, Result, WrapErr}; -const DEFAULT_VALIDATOR_PATH: &str = "../default_validator"; +const DEFAULT_EXECUTOR_PATH: &str = "../default_executor"; fn main() -> Result<()> { println!("cargo:rerun-if-changed=build.rs"); - println!("cargo:rerun-if-changed={DEFAULT_VALIDATOR_PATH}"); + println!("cargo:rerun-if-changed={DEFAULT_EXECUTOR_PATH}"); extract_git_hash()?; @@ -14,7 +14,7 @@ fn main() -> Result<()> { // the checks are a process that's hard to accomodate // in Nix environment if std::option_env!("IROHA_SKIP_WASM_CHECKS").is_none() { - check_default_validator()?; + check_default_executor()?; } Ok(()) @@ -30,8 +30,8 @@ fn extract_git_hash() -> Result<()> { } /// Apply `cargo check` to the smartcontract. -fn check_default_validator() -> Result<()> { - iroha_wasm_builder::Builder::new(DEFAULT_VALIDATOR_PATH) +fn check_default_executor() -> Result<()> { + iroha_wasm_builder::Builder::new(DEFAULT_EXECUTOR_PATH) .format() .check() } diff --git a/cli/src/samples.rs b/cli/src/samples.rs index eabd3bf784b..1b46b2c0556 100644 --- a/cli/src/samples.rs +++ b/cli/src/samples.rs @@ -100,16 +100,16 @@ pub fn get_config(trusted_peers: UniqueVec, key_pair: Option) - .expect("Iroha config should build as all required fields were provided") } -/// Construct validator from path. +/// Construct executor from path. /// /// `relative_path` should be relative to `CARGO_MANIFEST_DIR`. /// /// # Errors /// -/// - Failed to create temp dir for validator output -/// - Failed to build validator -/// - Failed to optimize validator -pub fn construct_validator

(relative_path: &P) -> color_eyre::Result +/// - Failed to create temp dir for executor output +/// - Failed to build executor +/// - Failed to optimize executor +pub fn construct_executor

(relative_path: &P) -> color_eyre::Result where P: AsRef + ?Sized, { @@ -118,5 +118,5 @@ where .optimize()? .into_bytes()?; - Ok(Validator::new(WasmSmartContract::from_compiled(wasm_blob))) + Ok(Executor::new(WasmSmartContract::from_compiled(wasm_blob))) } diff --git a/cli/src/torii/mod.rs b/cli/src/torii/mod.rs index 5a2dc45bb9d..a478fe4f554 100644 --- a/cli/src/torii/mod.rs +++ b/cli/src/torii/mod.rs @@ -131,7 +131,7 @@ fn query_status_code(validation_error: &iroha_data_model::ValidationFail) -> Sta InstructionFailed(error) => { iroha_logger::error!( ?error, - "Query validation failed with unexpected error. This means a bug inside Runtime Validator", + "Query validation failed with unexpected error. This means a bug inside Runtime Executor", ); StatusCode::INTERNAL_SERVER_ERROR } diff --git a/client/benches/torii.rs b/client/benches/torii.rs index c4674134bc7..a59ee916570 100644 --- a/client/benches/torii.rs +++ b/client/benches/torii.rs @@ -3,7 +3,7 @@ use std::thread; use criterion::{criterion_group, criterion_main, Criterion, Throughput}; -use iroha::samples::{construct_validator, get_config}; +use iroha::samples::{construct_executor, get_config}; use iroha_client::client::{asset, Client}; use iroha_config::base::runtime_upgrades::Reload; use iroha_crypto::KeyPair; @@ -29,8 +29,8 @@ fn query_requests(criterion: &mut Criterion) { get_key_pair().public_key().clone(), ) .finish_domain() - .validator( - construct_validator("../default_validator").expect("Failed to construct validator"), + .executor( + construct_executor("../default_executor").expect("Failed to construct executor"), ) .build(), Some(&configuration.genesis), @@ -124,8 +124,8 @@ fn instruction_submits(criterion: &mut Criterion) { configuration.public_key.clone(), ) .finish_domain() - .validator( - construct_validator("../default_validator").expect("Failed to construct validator"), + .executor( + construct_executor("../default_executor").expect("Failed to construct executor"), ) .build(), Some(&configuration.genesis), diff --git a/client/examples/million_accounts_genesis.rs b/client/examples/million_accounts_genesis.rs index 1ee815fd1de..5cba2ca88a9 100644 --- a/client/examples/million_accounts_genesis.rs +++ b/client/examples/million_accounts_genesis.rs @@ -2,7 +2,7 @@ use std::{thread, time::Duration}; -use iroha::samples::{construct_validator, get_config}; +use iroha::samples::{construct_executor, get_config}; use iroha_data_model::prelude::*; use iroha_genesis::{GenesisNetwork, RawGenesisBlock, RawGenesisBlockBuilder}; use iroha_primitives::unique_vec; @@ -30,9 +30,7 @@ fn generate_genesis(num_domains: u32) -> RawGenesisBlock { } builder - .validator( - construct_validator("../default_validator").expect("Failed to construct validator"), - ) + .executor(construct_executor("../default_executor").expect("Failed to construct executor")) .build() } diff --git a/client/tests/integration/smartcontracts/Cargo.toml b/client/tests/integration/smartcontracts/Cargo.toml index 55420704b94..b193147bb9b 100644 --- a/client/tests/integration/smartcontracts/Cargo.toml +++ b/client/tests/integration/smartcontracts/Cargo.toml @@ -11,9 +11,9 @@ resolver = "2" members = [ "create_nft_for_every_user_trigger", "mint_rose_trigger", - "validator_with_admin", - "validator_with_custom_token", - "validator_with_migration_fail", + "executor_with_admin", + "executor_with_custom_token", + "executor_with_migration_fail", ] [profile.dev] @@ -28,7 +28,7 @@ codegen-units = 1 # Further reduces binary size but increases compilation time [workspace.dependencies] iroha_trigger = { version = "=2.0.0-pre-rc.19", path = "../../../../smart_contract/trigger", features = ["debug"]} -iroha_validator = { version = "=2.0.0-pre-rc.19", path = "../../../../smart_contract/validator" } +iroha_executor = { version = "=2.0.0-pre-rc.19", path = "../../../../smart_contract/executor" } iroha_schema = { version = "=2.0.0-pre-rc.19", path = "../../../../schema" } parity-scale-codec = { version = "3.2.1", default-features = false } diff --git a/client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml b/client/tests/integration/smartcontracts/executor_with_admin/Cargo.toml similarity index 79% rename from client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml rename to client/tests/integration/smartcontracts/executor_with_admin/Cargo.toml index eeb3d61804a..c48ea913d35 100644 --- a/client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml +++ b/client/tests/integration/smartcontracts/executor_with_admin/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "validator_with_admin" +name = "executor_with_admin" edition.workspace = true version.workspace = true @@ -11,7 +11,7 @@ license.workspace = true crate-type = ['cdylib'] [dependencies] -iroha_validator.workspace = true +iroha_executor.workspace = true iroha_schema.workspace = true panic-halt.workspace = true diff --git a/client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs b/client/tests/integration/smartcontracts/executor_with_admin/src/lib.rs similarity index 80% rename from client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs rename to client/tests/integration/smartcontracts/executor_with_admin/src/lib.rs index 1140d74e853..572742d85ec 100644 --- a/client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs +++ b/client/tests/integration/smartcontracts/executor_with_admin/src/lib.rs @@ -1,4 +1,4 @@ -//! Runtime Validator which allows any instruction executed by `admin@admin` account. +//! Runtime Executor which allows any instruction executed by `admin@admin` account. //! If authority is not `admin@admin` then default validation is used as a backup. #![no_std] @@ -7,7 +7,7 @@ #[cfg(not(test))] extern crate panic_halt; -use iroha_validator::{ +use iroha_executor::{ data_model::evaluate::{EvaluationError, ExpressionEvaluator}, parse, prelude::*, @@ -18,13 +18,13 @@ use lol_alloc::{FreeListAllocator, LockedAllocator}; #[global_allocator] static ALLOC: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); -struct Validator { +struct Executor { verdict: Result, block_height: u64, host: smart_contract::Host, } -impl Validator { +impl Executor { /// Construct [`Self`] pub fn new(block_height: u64) -> Self { Self { @@ -36,20 +36,20 @@ impl Validator { } macro_rules! defaults { - ( $($validator:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( - fn $validator $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { - iroha_validator::default::$validator(self, authority, operation) + ( $($executor:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( + fn $executor $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { + iroha_executor::default::$executor(self, authority, operation) } )+ }; } -impl Visit for Validator { +impl Visit for Executor { fn visit_instruction(&mut self, authority: &AccountId, isi: &InstructionExpr) { if parse!("admin@admin" as AccountId) == *authority { pass!(self); } - iroha_validator::default::visit_instruction(self, authority, isi); + iroha_executor::default::visit_instruction(self, authority, isi); } defaults! { @@ -114,11 +114,11 @@ impl Visit for Validator { visit_new_parameter(NewParameter), // Upgrade validation - visit_upgrade_validator(Upgrade), + visit_upgrade_executor(Upgrade), } } -impl Validate for Validator { +impl Validate for Executor { fn verdict(&self) -> &Result { &self.verdict } @@ -132,7 +132,7 @@ impl Validate for Validator { } } -impl ExpressionEvaluator for Validator { +impl ExpressionEvaluator for Executor { fn evaluate(&self, expression: &E) -> Result { self.host.evaluate(expression) } @@ -149,9 +149,9 @@ pub fn validate_transaction( transaction: SignedTransaction, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_transaction(&authority, &transaction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_transaction(&authority, &transaction); + executor.verdict } #[entrypoint] @@ -160,14 +160,14 @@ pub fn validate_instruction( instruction: InstructionExpr, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_instruction(&authority, &instruction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_instruction(&authority, &instruction); + executor.verdict } #[entrypoint] pub fn validate_query(authority: AccountId, query: QueryBox, block_height: u64) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_query(&authority, &query); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_query(&authority, &query); + executor.verdict } diff --git a/client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml b/client/tests/integration/smartcontracts/executor_with_custom_token/Cargo.toml similarity index 83% rename from client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml rename to client/tests/integration/smartcontracts/executor_with_custom_token/Cargo.toml index 8fd8e8f3cc7..1b305798354 100644 --- a/client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml +++ b/client/tests/integration/smartcontracts/executor_with_custom_token/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "validator_with_custom_token" +name = "executor_with_custom_token" edition.workspace = true version.workspace = true @@ -11,7 +11,7 @@ license.workspace = true crate-type = ['cdylib'] [dependencies] -iroha_validator.workspace = true +iroha_executor.workspace = true iroha_schema.workspace = true parity-scale-codec.workspace = true diff --git a/client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs b/client/tests/integration/smartcontracts/executor_with_custom_token/src/lib.rs similarity index 82% rename from client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs rename to client/tests/integration/smartcontracts/executor_with_custom_token/src/lib.rs index a543863d26b..bf54a6c8503 100644 --- a/client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs +++ b/client/tests/integration/smartcontracts/executor_with_custom_token/src/lib.rs @@ -1,11 +1,11 @@ -//! Runtime Validator which allows domain (un-)registration only for users who own +//! Runtime Executor which allows domain (un-)registration only for users who own //! [`token::CanControlDomainLives`] permission token. //! -//! This validator should be applied on top of the blockchain with default validation. +//! This executor should be applied on top of the blockchain with default validation. //! -//! It also doesn't have [`iroha_validator::default::domain::tokens::CanUnregisterDomain`]. +//! It also doesn't have [`iroha_executor::default::domain::tokens::CanUnregisterDomain`]. //! -//! In migration it replaces [`iroha_validator::default::domain::tokens::CanUnregisterDomain`] +//! In migration it replaces [`iroha_executor::default::domain::tokens::CanUnregisterDomain`] //! with [`token::CanControlDomainLives`] for all accounts. //! So it doesn't matter which domain user was able to unregister before migration, they will //! get access to control all domains. Remember that this is just a test example. @@ -20,14 +20,14 @@ extern crate panic_halt; use alloc::{borrow::ToOwned, string::String}; use anyhow::anyhow; -use iroha_schema::IntoSchema; -use iroha_validator::{ +use iroha_executor::{ data_model::evaluate::{EvaluationError, ExpressionEvaluator}, default::default_permission_token_schema, permission::Token as _, prelude::*, smart_contract, }; +use iroha_schema::IntoSchema; use lol_alloc::{FreeListAllocator, LockedAllocator}; use parity_scale_codec::{Decode, Encode}; use serde::{Deserialize, Serialize}; @@ -55,17 +55,17 @@ mod token { Serialize, Deserialize, )] - #[validate(iroha_validator::permission::OnlyGenesis)] + #[validate(iroha_executor::permission::OnlyGenesis)] pub struct CanControlDomainLives; } -struct Validator { +struct Executor { verdict: Result, block_height: u64, host: smart_contract::Host, } -impl Validator { +impl Executor { /// Construct [`Self`] pub fn new(block_height: u64) -> Self { Self { @@ -98,7 +98,7 @@ impl Validator { for token in permission_tokens { if let Ok(can_unregister_domain_token) = - iroha_validator::default::domain::tokens::CanUnregisterDomain::try_from(token) + iroha_executor::default::domain::tokens::CanUnregisterDomain::try_from(token) { found_accounts.push((account, can_unregister_domain_token.domain_id)); break; @@ -111,7 +111,7 @@ impl Validator { fn replace_token(accounts: &[(Account, DomainId)]) -> MigrationResult { let can_unregister_domain_definition_id = PermissionTokenId::try_from( - iroha_validator::default::domain::tokens::CanUnregisterDomain::type_name(), + iroha_executor::default::domain::tokens::CanUnregisterDomain::type_name(), ) .unwrap(); @@ -160,7 +160,7 @@ impl Validator { }) }) .map_err(|error| { - iroha_validator::log::error!(&error); + iroha_executor::log::error!(&error); format!( "{:?}", anyhow!(error).context(format!( @@ -173,14 +173,14 @@ impl Validator { } macro_rules! defaults { - ( $($validator:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( - fn $validator $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { - iroha_validator::default::$validator(self, authority, operation) + ( $($executor:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( + fn $executor $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { + iroha_executor::default::$executor(self, authority, operation) } )+ }; } -impl Visit for Validator { +impl Visit for Executor { fn visit_register_domain(&mut self, authority: &AccountId, _isi: Register) { if self.block_height() == 0 { pass!(self); @@ -265,11 +265,11 @@ impl Visit for Validator { visit_new_parameter(NewParameter), // Upgrade validation - visit_upgrade_validator(Upgrade), + visit_upgrade_executor(Upgrade), } } -impl Validate for Validator { +impl Validate for Executor { fn verdict(&self) -> &Result { &self.verdict } @@ -283,7 +283,7 @@ impl Validate for Validator { } } -impl ExpressionEvaluator for Validator { +impl ExpressionEvaluator for Executor { fn evaluate(&self, expression: &E) -> Result { self.host.evaluate(expression) } @@ -291,18 +291,18 @@ impl ExpressionEvaluator for Validator { #[entrypoint] pub fn migrate(_block_height: u64) -> MigrationResult { - let accounts = Validator::get_all_accounts_with_can_unregister_domain_permission()?; + let accounts = Executor::get_all_accounts_with_can_unregister_domain_permission()?; let mut schema = default_permission_token_schema(); - schema.remove::(); + schema.remove::(); schema.insert::(); let (token_ids, schema_str) = schema.serialize(); - iroha_validator::set_permission_token_schema( - &iroha_validator::data_model::permission::PermissionTokenSchema::new(token_ids, schema_str), + iroha_executor::set_permission_token_schema( + &iroha_executor::data_model::permission::PermissionTokenSchema::new(token_ids, schema_str), ); - Validator::replace_token(&accounts) + Executor::replace_token(&accounts) } #[entrypoint] @@ -311,9 +311,9 @@ pub fn validate_transaction( transaction: SignedTransaction, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_transaction(&authority, &transaction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_transaction(&authority, &transaction); + executor.verdict } #[entrypoint] @@ -322,14 +322,14 @@ pub fn validate_instruction( instruction: InstructionExpr, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_instruction(&authority, &instruction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_instruction(&authority, &instruction); + executor.verdict } #[entrypoint] pub fn validate_query(authority: AccountId, query: QueryBox, block_height: u64) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_query(&authority, &query); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_query(&authority, &query); + executor.verdict } diff --git a/client/tests/integration/smartcontracts/validator_with_migration_fail/Cargo.toml b/client/tests/integration/smartcontracts/executor_with_migration_fail/Cargo.toml similarity index 76% rename from client/tests/integration/smartcontracts/validator_with_migration_fail/Cargo.toml rename to client/tests/integration/smartcontracts/executor_with_migration_fail/Cargo.toml index fb8aa79e97c..813a5d74ef2 100644 --- a/client/tests/integration/smartcontracts/validator_with_migration_fail/Cargo.toml +++ b/client/tests/integration/smartcontracts/executor_with_migration_fail/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "validator_with_migration_fail" +name = "executor_with_migration_fail" edition.workspace = true version.workspace = true @@ -11,7 +11,7 @@ license.workspace = true crate-type = ['cdylib'] [dependencies] -iroha_validator.workspace = true +iroha_executor.workspace = true anyhow.workspace = true panic-halt.workspace = true diff --git a/client/tests/integration/smartcontracts/validator_with_migration_fail/src/lib.rs b/client/tests/integration/smartcontracts/executor_with_migration_fail/src/lib.rs similarity index 82% rename from client/tests/integration/smartcontracts/validator_with_migration_fail/src/lib.rs rename to client/tests/integration/smartcontracts/executor_with_migration_fail/src/lib.rs index bfde7231e38..23c5c957db8 100644 --- a/client/tests/integration/smartcontracts/validator_with_migration_fail/src/lib.rs +++ b/client/tests/integration/smartcontracts/executor_with_migration_fail/src/lib.rs @@ -1,4 +1,4 @@ -//! Runtime Validator which copies default validation logic but forbids any queries and fails to migrate. +//! Runtime Executor which copies default validation logic but forbids any queries and fails to migrate. #![no_std] #![allow(missing_docs, clippy::missing_errors_doc)] @@ -10,7 +10,7 @@ extern crate panic_halt; use alloc::{borrow::ToOwned as _, format}; use anyhow::anyhow; -use iroha_validator::{ +use iroha_executor::{ data_model::{ evaluate::{EvaluationError, ExpressionEvaluator}, ValidationFail, @@ -24,13 +24,13 @@ use lol_alloc::{FreeListAllocator, LockedAllocator}; #[global_allocator] static ALLOC: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); -struct Validator { +struct Executor { verdict: Result, block_height: u64, host: smart_contract::Host, } -impl Validator { +impl Executor { /// Construct [`Self`] pub fn new(block_height: u64) -> Self { Self { @@ -42,14 +42,14 @@ impl Validator { } macro_rules! defaults { - ( $($validator:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( - fn $validator $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { - iroha_validator::default::$validator(self, authority, operation) + ( $($executor:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( + fn $executor $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { + iroha_executor::default::$executor(self, authority, operation) } )+ }; } -impl Visit for Validator { +impl Visit for Executor { fn visit_query(&mut self, _authority: &AccountId, _query: &QueryBox) { self.deny(ValidationFail::NotPermitted( "All queries are forbidden".to_owned(), @@ -119,11 +119,11 @@ impl Visit for Validator { visit_new_parameter(NewParameter), // Upgrade validation - visit_upgrade_validator(Upgrade), + visit_upgrade_executor(Upgrade), } } -impl Validate for Validator { +impl Validate for Executor { fn verdict(&self) -> &Result { &self.verdict } @@ -137,7 +137,7 @@ impl Validate for Validator { } } -impl ExpressionEvaluator for Validator { +impl ExpressionEvaluator for Executor { fn evaluate(&self, expression: &E) -> Result { self.host.evaluate(expression) } @@ -158,7 +158,7 @@ pub fn migrate(_block_height: u64) -> MigrationResult { ) })?; - Err("This validator always fails to migrate".to_owned()) + Err("This executor always fails to migrate".to_owned()) } #[entrypoint] @@ -167,9 +167,9 @@ pub fn validate_transaction( transaction: SignedTransaction, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_transaction(&authority, &transaction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_transaction(&authority, &transaction); + executor.verdict } #[entrypoint] @@ -178,14 +178,14 @@ pub fn validate_instruction( instruction: InstructionExpr, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_instruction(&authority, &instruction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_instruction(&authority, &instruction); + executor.verdict } #[entrypoint] pub fn validate_query(authority: AccountId, query: QueryBox, block_height: u64) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_query(&authority, &query); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_query(&authority, &query); + executor.verdict } diff --git a/client/tests/integration/upgrade.rs b/client/tests/integration/upgrade.rs index f14c960a778..ba33272b403 100644 --- a/client/tests/integration/upgrade.rs +++ b/client/tests/integration/upgrade.rs @@ -11,7 +11,7 @@ use serde_json::json; use test_network::*; #[test] -fn validator_upgrade_should_work() -> Result<()> { +fn executor_upgrade_should_work() -> Result<()> { let (_rt, _peer, client) = ::new().with_port(10_795).start_with_runtime(); wait_for_genesis_committed(&vec![client.clone()], 0); @@ -37,9 +37,9 @@ fn validator_upgrade_should_work() -> Result<()> { .submit_transaction_blocking(&transfer_rose_tx) .expect_err("Should fail"); - upgrade_validator( + upgrade_executor( &client, - "tests/integration/smartcontracts/validator_with_admin", + "tests/integration/smartcontracts/executor_with_admin", )?; // Check that admin can transfer alice's rose now @@ -55,7 +55,7 @@ fn validator_upgrade_should_work() -> Result<()> { } #[test] -fn validator_upgrade_should_run_migration() -> Result<()> { +fn executor_upgrade_should_run_migration() -> Result<()> { let (_rt, _peer, client) = ::new().with_port(10_990).start_with_runtime(); wait_for_genesis_committed(&vec![client.clone()], 0); @@ -79,9 +79,9 @@ fn validator_upgrade_should_run_migration() -> Result<()> { &json!({ "domain_id": DomainId::from_str("wonderland").unwrap() }), ))); - upgrade_validator( + upgrade_executor( &client, - "tests/integration/smartcontracts/validator_with_custom_token", + "tests/integration/smartcontracts/executor_with_custom_token", )?; // Check that `CanUnregisterDomain` doesn't exist @@ -128,32 +128,31 @@ fn migration_fail_should_not_cause_any_effects() { "failed_migration_test_domain".parse().expect("Valid"); assert_domain_does_not_exist(&client, &domain_registered_in_migration); - let _err = upgrade_validator( + let _err = upgrade_executor( &client, - "tests/integration/smartcontracts/validator_with_migration_fail", + "tests/integration/smartcontracts/executor_with_migration_fail", ) .expect_err("Upgrade should fail due to migration failure"); // Checking that things registered in migration does not exist after failed migration assert_domain_does_not_exist(&client, &domain_registered_in_migration); - // The fact that query in previous assertion does not fail means that validator haven't - // been changed, because `validator_with_migration_fail` does not allow any queries + // The fact that query in previous assertion does not fail means that executor haven't + // been changed, because `executor_with_migration_fail` does not allow any queries } -fn upgrade_validator(client: &Client, validator: impl AsRef) -> Result<()> { - info!("Building validator"); +fn upgrade_executor(client: &Client, executor: impl AsRef) -> Result<()> { + info!("Building executor"); - let wasm = iroha_wasm_builder::Builder::new(validator.as_ref()) + let wasm = iroha_wasm_builder::Builder::new(executor.as_ref()) .build()? .optimize()? .into_bytes()?; info!("WASM size is {} bytes", wasm.len()); - let upgrade_validator = - UpgradeExpr::new(Validator::new(WasmSmartContract::from_compiled(wasm))); - client.submit_blocking(upgrade_validator)?; + let upgrade_executor = UpgradeExpr::new(Executor::new(WasmSmartContract::from_compiled(wasm))); + client.submit_blocking(upgrade_executor)?; Ok(()) } diff --git a/configs/peer/executor.wasm b/configs/peer/executor.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e02c0696fc1b0d391172cc8bfc1add8d2e8fe976 GIT binary patch literal 504891 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 P(G3jrCiB0+I8gI{MJk4g literal 0 HcmV?d00001 diff --git a/configs/peer/genesis.json b/configs/peer/genesis.json index fa69236b6d5..2ca5d0365ed 100644 --- a/configs/peer/genesis.json +++ b/configs/peer/genesis.json @@ -197,5 +197,5 @@ } ] ], - "validator": "./validator.wasm" + "executor": "./executor.wasm" } diff --git a/configs/peer/stable/genesis.json b/configs/peer/stable/genesis.json index cfc3b0f05b5..5e29ac3cb6e 100644 --- a/configs/peer/stable/genesis.json +++ b/configs/peer/stable/genesis.json @@ -195,5 +195,5 @@ } ] ], - "validator": "./validator.wasm" + "executor": "./executor.wasm" } diff --git a/configs/peer/validator.wasm b/configs/peer/validator.wasm deleted file mode 100644 index a88798ad1b6e04c4ae4f2edbf3f286c04c0f6886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497224 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%0DA>|?1*rh1bxUvRMP;-P}vF38G(AXWdf~ksC#h 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

E(1*V99NAm9| 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 diff --git a/core/benches/blocks/common.rs b/core/benches/blocks/common.rs index 8bdbef1a5e7..56f769b1778 100644 --- a/core/benches/blocks/common.rs +++ b/core/benches/blocks/common.rs @@ -32,7 +32,7 @@ pub fn create_block( .with_instructions(instructions) .sign(key_pair.clone()) .unwrap(); - let limits = wsv.transaction_validator().transaction_limits; + let limits = wsv.transaction_executor().transaction_limits; let topology = Topology::new(UniqueVec::new()); let block = BlockBuilder::new( @@ -192,14 +192,14 @@ pub fn build_wsv(account_id: &AccountId, key_pair: &KeyPair) -> WorldStateView { } { - let path_to_validator = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("../configs/peer/validator.wasm"); - let wasm = std::fs::read(&path_to_validator) - .unwrap_or_else(|_| panic!("Failed to read file: {}", path_to_validator.display())); - let validator = Validator::new(WasmSmartContract::from_compiled(wasm)); - UpgradeExpr::new(validator) + let path_to_executor = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../configs/peer/executor.wasm"); + let wasm = std::fs::read(&path_to_executor) + .unwrap_or_else(|_| panic!("Failed to read file: {}", path_to_executor.display())); + let executor = Executor::new(WasmSmartContract::from_compiled(wasm)); + UpgradeExpr::new(executor) .execute(account_id, &mut wsv) - .expect("Failed to load validator"); + .expect("Failed to load executor"); } wsv diff --git a/core/benches/kura.rs b/core/benches/kura.rs index eff64c3ba29..2f74c5ce1e4 100644 --- a/core/benches/kura.rs +++ b/core/benches/kura.rs @@ -16,7 +16,7 @@ use iroha_data_model::{prelude::*, transaction::TransactionLimits}; use iroha_primitives::unique_vec::UniqueVec; use tokio::{fs, runtime::Runtime}; -async fn measure_block_size_for_n_validators(n_validators: u32) { +async fn measure_block_size_for_n_executors(n_executors: u32) { let alice_id = AccountId::from_str("alice@test").expect("tested"); let bob_id = AccountId::from_str("bob@test").expect("tested"); let xor_id = AssetDefinitionId::from_str("xor#test").expect("tested"); @@ -49,7 +49,7 @@ async fn measure_block_size_for_n_validators(n_validators: u32) { .sign(KeyPair::generate().unwrap()) .unwrap(); - for _ in 1..n_validators { + for _ in 1..n_executors { block = block .sign(KeyPair::generate().expect("Failed to generate KeyPair.")) .unwrap(); @@ -60,14 +60,14 @@ async fn measure_block_size_for_n_validators(n_validators: u32) { let metadata = fs::metadata(dir.path().join("blocks.data")).await.unwrap(); let file_size = Byte::from_bytes(u128::from(metadata.len())).get_appropriate_unit(false); - println!("For {n_validators} validators: {file_size}"); + println!("For {n_executors} executors: {file_size}"); } async fn measure_block_size_async() { println!("File size of a block with 1 transaction with 1 Transfer instruction is:",); for max_faults in 0_u32..5_u32 { - let n_validators = 3 * max_faults + 1; - measure_block_size_for_n_validators(n_validators).await; + let n_executors = 3 * max_faults + 1; + measure_block_size_for_n_executors(n_executors).await; } } diff --git a/core/benches/validation.rs b/core/benches/validation.rs index 4e2af6e771e..d2617396271 100644 --- a/core/benches/validation.rs +++ b/core/benches/validation.rs @@ -8,7 +8,7 @@ use iroha_core::{ prelude::*, smartcontracts::{isi::Registrable as _, Execute}, sumeragi::network_topology::Topology, - tx::TransactionValidator, + tx::TransactionExecutor, wsv::World, }; use iroha_data_model::{prelude::*, transaction::TransactionLimits}; @@ -73,15 +73,15 @@ fn build_test_and_transient_wsv(keys: KeyPair) -> WorldStateView { ); { - let path_to_validator = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("../configs/peer/validator.wasm"); - let wasm = std::fs::read(&path_to_validator) - .unwrap_or_else(|_| panic!("Failed to read file: {}", path_to_validator.display())); - let validator = Validator::new(WasmSmartContract::from_compiled(wasm)); + let path_to_executor = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../configs/peer/executor.wasm"); + let wasm = std::fs::read(&path_to_executor) + .unwrap_or_else(|_| panic!("Failed to read file: {}", path_to_executor.display())); + let executor = Executor::new(WasmSmartContract::from_compiled(wasm)); let authority = "genesis@genesis".parse().expect("Valid"); - UpgradeExpr::new(validator) + UpgradeExpr::new(executor) .execute(&authority, &mut wsv) - .expect("Failed to load validator"); + .expect("Failed to load executor"); } wsv @@ -127,10 +127,10 @@ fn validate_transaction(criterion: &mut Criterion) { let mut failure_count = 0; let wsv = build_test_and_transient_wsv(keys); let _ = criterion.bench_function("validate", move |b| { - let transaction_validator = TransactionValidator::new(TRANSACTION_LIMITS); + let transaction_executor = TransactionExecutor::new(TRANSACTION_LIMITS); b.iter(|| { let mut wsv = wsv.clone(); - match transaction_validator.validate(transaction.clone(), &mut wsv) { + match transaction_executor.validate(transaction.clone(), &mut wsv) { Ok(_) => success_count += 1, Err(_) => failure_count += 1, } diff --git a/core/src/block.rs b/core/src/block.rs index b880f428c55..177d8e90118 100644 --- a/core/src/block.rs +++ b/core/src/block.rs @@ -169,7 +169,7 @@ mod pending { ) -> Vec { transactions .into_iter() - .map(|tx| match wsv.transaction_validator().validate(tx, wsv) { + .map(|tx| match wsv.transaction_executor().validate(tx, wsv) { Ok(tx) => TransactionValue { value: tx, error: None, @@ -358,8 +358,8 @@ mod valid { // TODO: Unnecessary clone? .cloned() .try_for_each(|TransactionValue{value, error}| { - let transaction_validator = wsv.transaction_validator(); - let limits = &transaction_validator.transaction_limits; + let transaction_executor = wsv.transaction_executor(); + let limits = &transaction_executor.transaction_limits; if error.is_none() { let tx = if is_genesis { @@ -368,7 +368,7 @@ mod valid { AcceptedTransaction::accept(value, limits)? }; - transaction_validator.validate(tx, wsv).map_err(|(_tx, error)| { + transaction_executor.validate(tx, wsv).map_err(|(_tx, error)| { TransactionValidationError::NotValid(error) })?; } else { @@ -378,7 +378,7 @@ mod valid { AcceptedTransaction::accept(value, limits)? }; - match transaction_validator.validate(tx, wsv) { + match transaction_executor.validate(tx, wsv) { Err(rejected_transaction) => Ok(rejected_transaction), Ok(_) => Err(TransactionValidationError::RejectedIsValid), }?; @@ -745,7 +745,7 @@ mod tests { RegisterExpr::new(AssetDefinition::quantity(asset_definition_id)); // Making two transactions that have the same instruction - let transaction_limits = &wsv.transaction_validator().transaction_limits; + let transaction_limits = &wsv.transaction_executor().transaction_limits; let tx = TransactionBuilder::new(alice_id) .with_instructions([create_asset_definition]) .sign(alice_keys.clone()) @@ -787,7 +787,7 @@ mod tests { RegisterExpr::new(AssetDefinition::quantity(asset_definition_id.clone())); // Making two transactions that have the same instruction - let transaction_limits = &wsv.transaction_validator().transaction_limits; + let transaction_limits = &wsv.transaction_executor().transaction_limits; let tx = TransactionBuilder::new(alice_id.clone()) .with_instructions([create_asset_definition]) .sign(alice_keys.clone()) @@ -850,7 +850,7 @@ mod tests { let world = World::with([domain], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let mut wsv = WorldStateView::new(world, kura); - let transaction_limits = &wsv.transaction_validator().transaction_limits; + let transaction_limits = &wsv.transaction_executor().transaction_limits; let domain_id = DomainId::from_str("domain").expect("Valid"); let create_domain = RegisterExpr::new(Domain::new(domain_id)); diff --git a/core/src/validator.rs b/core/src/executor.rs similarity index 65% rename from core/src/validator.rs rename to core/src/executor.rs index e6eef59580c..971f7dd7867 100644 --- a/core/src/validator.rs +++ b/core/src/executor.rs @@ -1,12 +1,13 @@ -//! Structures and impls related to *runtime* `Validator`s processing. +//! Structures and impls related to *runtime* `Executor`s processing. use derive_more::DebugCustom; use iroha_data_model::{ account::AccountId, + executor as data_model_executor, isi::InstructionExpr, query::QueryBox, transaction::{Executable, SignedTransaction}, - validator as data_model_validator, ValidationFail, + ValidationFail, }; use iroha_logger::trace; use serde::{ @@ -37,7 +38,7 @@ impl From for ValidationFail { } } -/// Error used in [`migrate()`](Validator::migrate). +/// Error used in [`migrate()`](Executor::migrate). #[derive(Debug, thiserror::Error)] pub enum MigrationError { /// Error during WASM blob loading or runtime preparation. @@ -45,40 +46,40 @@ pub enum MigrationError { Wasm(#[from] wasm::error::Error), /// Error returned by entrypoint during execution. #[error("Entrypoint returned error: {0}")] - EntrypointExecution(data_model_validator::MigrationError), + EntrypointExecution(data_model_executor::MigrationError), } -/// Validator that verifies that operation is valid and executes it. +/// Executor that verifies that operation is valid and executes it. /// /// Executing is done in order to verify dependent instructions in transaction. /// So in fact it's more like an **Executor**, and it probably will be renamed soon. /// /// Can be upgraded with [`Upgrade`](iroha_data_model::isi::Upgrade) instruction. #[derive(Debug, Default, Clone, Serialize)] -pub enum Validator { - /// Initial validator that allows all operations and performs no permission checking. +pub enum Executor { + /// Initial executor that allows all operations and performs no permission checking. #[default] Initial, - /// User-provided validator with arbitrary logic. - UserProvided(UserProvidedValidator), + /// User-provided executor with arbitrary logic. + UserProvided(UserProvidedExecutor), } -/// Validator provided by user. +/// Executor provided by user. /// /// Used to not to leak private data to the user. #[derive(Debug, Clone, Serialize)] #[serde(transparent)] -pub struct UserProvidedValidator(LoadedValidator); +pub struct UserProvidedExecutor(LoadedExecutor); -impl<'de> DeserializeSeed<'de> for WasmSeed<'_, Validator> { - type Value = Validator; +impl<'de> DeserializeSeed<'de> for WasmSeed<'_, Executor> { + type Value = Executor; fn deserialize(self, deserializer: D) -> Result where D: Deserializer<'de>, { - struct ValidatorVisitor<'l> { - loader: &'l WasmSeed<'l, Validator>, + struct ExecutorVisitor<'l> { + loader: &'l WasmSeed<'l, Executor>, } #[derive(Deserialize)] @@ -88,8 +89,8 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, Validator> { UserProvided, } - impl<'de> Visitor<'de> for ValidatorVisitor<'_> { - type Value = Validator; + impl<'de> Visitor<'de> for ExecutorVisitor<'_> { + type Value = Executor; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("an enum variant") @@ -102,12 +103,12 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, Validator> { match data.variant()? { ("Initial", variant) => { variant.unit_variant()?; - Ok(Validator::Initial) + Ok(Executor::Initial) } ("UserProvided", variant) => { let loaded = - variant.newtype_variant_seed(self.loader.cast::())?; - Ok(Validator::UserProvided(UserProvidedValidator(loaded))) + variant.newtype_variant_seed(self.loader.cast::())?; + Ok(Executor::UserProvided(UserProvidedExecutor(loaded))) } (other, _) => Err(serde::de::Error::unknown_variant( other, @@ -118,21 +119,21 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, Validator> { } deserializer.deserialize_enum( - "Validator", + "Executor", &["Initial", "UserProvided"], - ValidatorVisitor { loader: &self }, + ExecutorVisitor { loader: &self }, ) } } -impl Validator { +impl Executor { /// Validate [`SignedTransaction`]. /// /// # Errors /// /// - Failed to prepare runtime for WASM execution; /// - Failed to execute the entrypoint of the WASM blob; - /// - Validator denied the operation. + /// - Executor denied the operation. pub fn validate_transaction( &self, wsv: &mut WorldStateView, @@ -152,17 +153,17 @@ impl Validator { } Ok(()) } - Self::UserProvided(UserProvidedValidator(loaded_validator)) => { + Self::UserProvided(UserProvidedExecutor(loaded_executor)) => { let runtime = - wasm::RuntimeBuilder::::new() + wasm::RuntimeBuilder::::new() .with_engine(wsv.engine.clone()) // Cloning engine is cheap, see [`wasmtime::Engine`] docs .with_configuration(wsv.config.wasm_runtime_config) .build()?; - runtime.execute_validator_validate_transaction( + runtime.execute_executor_validate_transaction( wsv, authority, - &loaded_validator.module, + &loaded_executor.module, transaction, )? } @@ -175,7 +176,7 @@ impl Validator { /// /// - Failed to prepare runtime for WASM execution; /// - Failed to execute the entrypoint of the WASM blob; - /// - Validator denied the operation. + /// - Executor denied the operation. pub fn validate_instruction( &self, wsv: &mut WorldStateView, @@ -186,17 +187,17 @@ impl Validator { match self { Self::Initial => instruction.execute(authority, wsv).map_err(Into::into), - Self::UserProvided(UserProvidedValidator(loaded_validator)) => { + Self::UserProvided(UserProvidedExecutor(loaded_executor)) => { let runtime = - wasm::RuntimeBuilder::::new() + wasm::RuntimeBuilder::::new() .with_engine(wsv.engine.clone()) // Cloning engine is cheap, see [`wasmtime::Engine`] docs .with_configuration(wsv.config.wasm_runtime_config) .build()?; - runtime.execute_validator_validate_instruction( + runtime.execute_executor_validate_instruction( wsv, authority, - &loaded_validator.module, + &loaded_executor.module, instruction, )? } @@ -209,7 +210,7 @@ impl Validator { /// /// - Failed to prepare runtime for WASM execution; /// - Failed to execute the entrypoint of the WASM blob; - /// - Validator denied the operation. + /// - Executor denied the operation. pub fn validate_query( &self, wsv: &WorldStateView, @@ -220,96 +221,96 @@ impl Validator { match self { Self::Initial => Ok(()), - Self::UserProvided(UserProvidedValidator(loaded_validator)) => { - let runtime = wasm::RuntimeBuilder::::new() + Self::UserProvided(UserProvidedExecutor(loaded_executor)) => { + let runtime = wasm::RuntimeBuilder::::new() .with_engine(wsv.engine.clone()) // Cloning engine is cheap, see [`wasmtime::Engine`] docs .with_configuration(wsv.config.wasm_runtime_config) .build()?; - runtime.execute_validator_validate_query( + runtime.execute_executor_validate_query( wsv, authority, - &loaded_validator.module, + &loaded_executor.module, query, )? } } } - /// Migrate validator to a new user-provided one. + /// Migrate executor to a new user-provided one. /// - /// Execute `migrate()` entrypoint of the `raw_validator` and set `self` to - /// [`UserProvided`](Validator::UserProvided) with `raw_validator`. + /// Execute `migrate()` entrypoint of the `raw_executor` and set `self` to + /// [`UserProvided`](Executor::UserProvided) with `raw_executor`. /// /// # Errors /// - /// - Failed to load `raw_validator`; + /// - Failed to load `raw_executor`; /// - Failed to prepare runtime for WASM execution; /// - Failed to execute entrypoint of the WASM blob. pub fn migrate( &mut self, - raw_validator: data_model_validator::Validator, + raw_executor: data_model_executor::Executor, wsv: &mut WorldStateView, authority: &AccountId, ) -> Result<(), MigrationError> { - trace!("Running validator migration"); + trace!("Running executor migration"); - let loaded_validator = LoadedValidator::load(&wsv.engine, raw_validator)?; + let loaded_executor = LoadedExecutor::load(&wsv.engine, raw_executor)?; - let runtime = wasm::RuntimeBuilder::::new() + let runtime = wasm::RuntimeBuilder::::new() .with_engine(wsv.engine.clone()) // Cloning engine is cheap, see [`wasmtime::Engine`] docs .with_configuration(wsv.config.wasm_runtime_config) .build()?; runtime - .execute_validator_migration(wsv, authority, &loaded_validator.module)? + .execute_executor_migration(wsv, authority, &loaded_executor.module)? .map_err(MigrationError::EntrypointExecution)?; - *self = Self::UserProvided(UserProvidedValidator(loaded_validator)); + *self = Self::UserProvided(UserProvidedExecutor(loaded_executor)); Ok(()) } } -/// [`Validator`] with [`Module`](wasmtime::Module) for execution. +/// [`Executor`] with [`Module`](wasmtime::Module) for execution. /// -/// Creating a [`wasmtime::Module`] is expensive, so we do it once on [`migrate()`](Validator::migrate) +/// Creating a [`wasmtime::Module`] is expensive, so we do it once on [`migrate()`](Executor::migrate) /// step and reuse it later on validating steps. #[derive(DebugCustom, Clone, Serialize)] -#[debug(fmt = "LoadedValidator {{ module: }}")] -struct LoadedValidator { +#[debug(fmt = "LoadedExecutor {{ module: }}")] +struct LoadedExecutor { #[serde(skip)] module: wasmtime::Module, - raw_validator: data_model_validator::Validator, + raw_executor: data_model_executor::Executor, } -impl LoadedValidator { +impl LoadedExecutor { pub fn load( engine: &wasmtime::Engine, - raw_validator: data_model_validator::Validator, + raw_executor: data_model_executor::Executor, ) -> Result { Ok(Self { - module: wasm::load_module(engine, &raw_validator.wasm)?, - raw_validator, + module: wasm::load_module(engine, &raw_executor.wasm)?, + raw_executor, }) } } -impl<'de> DeserializeSeed<'de> for WasmSeed<'_, LoadedValidator> { - type Value = LoadedValidator; +impl<'de> DeserializeSeed<'de> for WasmSeed<'_, LoadedExecutor> { + type Value = LoadedExecutor; fn deserialize(self, deserializer: D) -> Result where D: serde::Deserializer<'de>, { - struct LoadedValidatorVisitor<'l> { - loader: &'l WasmSeed<'l, LoadedValidator>, + struct LoadedExecutorVisitor<'l> { + loader: &'l WasmSeed<'l, LoadedExecutor>, } - impl<'de> Visitor<'de> for LoadedValidatorVisitor<'_> { - type Value = LoadedValidator; + impl<'de> Visitor<'de> for LoadedExecutorVisitor<'_> { + type Value = LoadedExecutor; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("struct LoadedValidator") + formatter.write_str("struct LoadedExecutor") } fn visit_map(self, mut map: M) -> Result @@ -317,19 +318,19 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, LoadedValidator> { M: MapAccess<'de>, { while let Some(key) = map.next_key::()? { - if key.as_str() == "raw_validator" { - let validator: data_model_validator::Validator = map.next_value()?; - return Ok(LoadedValidator::load(self.loader.engine, validator).unwrap()); + if key.as_str() == "raw_executor" { + let executor: data_model_executor::Executor = map.next_value()?; + return Ok(LoadedExecutor::load(self.loader.engine, executor).unwrap()); } } - Err(serde::de::Error::missing_field("raw_validator")) + Err(serde::de::Error::missing_field("raw_executor")) } } deserializer.deserialize_struct( - "LoadedValidator", - &["raw_validator"], - LoadedValidatorVisitor { loader: &self }, + "LoadedExecutor", + &["raw_executor"], + LoadedExecutorVisitor { loader: &self }, ) } } diff --git a/core/src/lib.rs b/core/src/lib.rs index 80093250ece..7337b88851e 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -2,6 +2,7 @@ pub mod block; pub mod block_sync; +pub mod executor; pub mod gossiper; pub mod kura; pub mod modules; @@ -10,7 +11,6 @@ pub mod smartcontracts; pub mod snapshot; pub mod sumeragi; pub mod tx; -pub mod validator; pub mod wsv; use core::time::Duration; diff --git a/core/src/smartcontracts/isi/mod.rs b/core/src/smartcontracts/isi/mod.rs index f354b8eb8fc..c633adad28c 100644 --- a/core/src/smartcontracts/isi/mod.rs +++ b/core/src/smartcontracts/isi/mod.rs @@ -450,8 +450,8 @@ impl Execute for UpgradeExpr { fn execute(self, authority: &AccountId, wsv: &mut WorldStateView) -> Result<(), Error> { let object = wsv.evaluate(&self.object)?; match object { - UpgradableBox::Validator(object) => { - Upgrade:: { object }.execute(authority, wsv) + UpgradableBox::Executor(object) => { + Upgrade:: { object }.execute(authority, wsv) } } } diff --git a/core/src/smartcontracts/isi/query.rs b/core/src/smartcontracts/isi/query.rs index 988474ef6d7..a54c95e5e0a 100644 --- a/core/src/smartcontracts/isi/query.rs +++ b/core/src/smartcontracts/isi/query.rs @@ -79,7 +79,7 @@ impl ValidQueryRequest { )) .into()); } - wsv.validator() + wsv.executor() .validate_query(wsv, query.authority(), query.query().clone())?; Ok(Self(query)) } @@ -421,7 +421,7 @@ mod tests { .with_instructions(instructions) .sign(ALICE_KEYS.clone())?; - let tx_limits = &wsv.transaction_validator().transaction_limits; + let tx_limits = &wsv.transaction_executor().transaction_limits; let va_tx = AcceptedTransaction::accept(tx, tx_limits)?; let topology = Topology::new(UniqueVec::new()); diff --git a/core/src/smartcontracts/isi/triggers/mod.rs b/core/src/smartcontracts/isi/triggers/mod.rs index 2b35c7e1b0d..c0bf5e49721 100644 --- a/core/src/smartcontracts/isi/triggers/mod.rs +++ b/core/src/smartcontracts/isi/triggers/mod.rs @@ -177,7 +177,7 @@ pub mod isi { if allow_execute { Ok(()) } else { - // TODO: We should check authority on Runtime Validator level + // TODO: We should check authority on Runtime Executor level // so currently the error message is not exhaustive Err(Error::InvariantViolation(String::from( "Trigger can't be executed manually", diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index 089c3f2e778..64199fd9eb8 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -214,16 +214,16 @@ pub mod isi { } } - impl Execute for Upgrade { - #[metrics(+"upgrade_validator")] + impl Execute for Upgrade { + #[metrics(+"upgrade_executor")] fn execute(self, authority: &AccountId, wsv: &mut WorldStateView) -> Result<(), Error> { - let raw_validator = self.object; + let raw_executor = self.object; - // Cloning validator to avoid multiple mutable borrows of `wsv`. + // Cloning executor to avoid multiple mutable borrows of `wsv`. // Also it's a cheap operation. - let mut upgraded_validator = wsv.validator().clone(); - upgraded_validator - .migrate(raw_validator, wsv, authority) + let mut upgraded_executor = wsv.executor().clone(); + upgraded_executor + .migrate(raw_executor, wsv, authority) .map_err(|migration_error| { InvalidParameterError::Wasm(format!( "{:?}", @@ -231,9 +231,9 @@ pub mod isi { )) })?; - wsv.world_mut().validator = upgraded_validator; + wsv.world_mut().executor = upgraded_executor; - wsv.emit_events(std::iter::once(ValidatorEvent::Upgraded)); + wsv.emit_events(std::iter::once(ExecutorEvent::Upgraded)); Ok(()) } diff --git a/core/src/smartcontracts/mod.rs b/core/src/smartcontracts/mod.rs index 056dc8a6ab8..3a2dc4ab096 100644 --- a/core/src/smartcontracts/mod.rs +++ b/core/src/smartcontracts/mod.rs @@ -77,7 +77,7 @@ impl iroha_data_model::evaluate::Context for Context<'_> { .map(|value| match value { LazyValue::Value(value) => value, // NOTE: This will only be executed when evaluating an expression for an - // instruction, i.e. it will only be executed from the validator/executor. + // instruction, i.e. it will only be executed from the executor/executor. LazyValue::Iter(iter) => Value::Vec(iter.collect()), }) .map_err(Into::into) diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index af233d52446..252338a73f5 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -5,7 +5,7 @@ use error::*; use import_traits::{ - ExecuteOperations as _, GetValidatorPayloads as _, SetPermissionTokenSchema as _, + ExecuteOperations as _, GetExecutorPayloads as _, SetPermissionTokenSchema as _, }; use iroha_config::{ base::proxy::Builder, @@ -13,12 +13,12 @@ use iroha_config::{ }; use iroha_data_model::{ account::AccountId, + executor::{self, MigrationResult}, isi::InstructionExpr, permission::PermissionTokenSchema, prelude::*, query::QueryBox, smart_contract::payloads::{self, Validate}, - validator::{self, MigrationResult}, Level as LogLevel, ValidationFail, }; use iroha_logger::debug; @@ -63,10 +63,10 @@ mod import { pub const TRIGGER_MAIN: &str = "_iroha_trigger_main"; - pub const VALIDATOR_VALIDATE_TRANSACTION: &str = "_iroha_validator_validate_transaction"; - pub const VALIDATOR_VALIDATE_INSTRUCTION: &str = "_iroha_validator_validate_instruction"; - pub const VALIDATOR_VALIDATE_QUERY: &str = "_iroha_validator_validate_query"; - pub const VALIDATOR_MIGRATE: &str = "_iroha_validator_migrate"; + pub const EXECUTOR_VALIDATE_TRANSACTION: &str = "_iroha_executor_validate_transaction"; + pub const EXECUTOR_VALIDATE_INSTRUCTION: &str = "_iroha_executor_validate_instruction"; + pub const EXECUTOR_VALIDATE_QUERY: &str = "_iroha_executor_validate_query"; + pub const EXECUTOR_MIGRATE: &str = "_iroha_executor_migrate"; } mod import_traits { @@ -89,7 +89,7 @@ mod import_traits { ) -> Result<(), ValidationFail>; } - pub trait GetValidatorPayloads { + pub trait GetExecutorPayloads { #[codec::wrap_trait_fn] fn get_migrate_payload(state: &S) -> payloads::Migrate; @@ -269,15 +269,15 @@ fn create_config() -> Result { /// Limits checker for smartcontracts. #[derive(Copy, Clone)] -struct LimitsValidator { +struct LimitsExecutor { /// Number of instructions in the smartcontract instruction_count: u64, /// Max allowed number of instructions in the smartcontract max_instruction_count: u64, } -impl LimitsValidator { - /// Create new [`LimitsValidator`] +impl LimitsExecutor { + /// Create new [`LimitsExecutor`] pub fn new(max_instruction_count: u64) -> Self { Self { instruction_count: 0, @@ -390,7 +390,7 @@ pub mod state { pub struct SmartContract<'wrld> { pub(super) common: Common<'wrld>, /// Should be set for smart contract validation only. - pub(super) limits_validator: Option, + pub(super) limits_executor: Option, } impl LogSpan for SmartContract<'_> { @@ -460,8 +460,8 @@ pub mod state { } } - pub mod validator { - //! States related to *Validator* execution. + pub mod executor { + //! States related to *Executor* execution. use super::*; @@ -504,13 +504,13 @@ pub mod state { } } - /// State for executing `validate_transaction()` entrypoint of validator + /// State for executing `validate_transaction()` entrypoint of executor pub type ValidateTransaction<'wrld> = ValidateMut<'wrld, SignedTransaction>; - /// State for executing `validate_instruction()` entrypoint of validator + /// State for executing `validate_instruction()` entrypoint of executor pub type ValidateInstruction<'wrld> = ValidateMut<'wrld, InstructionExpr>; - /// State for executing `validate_query()` entrypoint of validator + /// State for executing `validate_query()` entrypoint of executor /// /// Does not implement [`WsvMut`] because it contains immutable reference to /// [`WorldStateView`] since it shouldn't be changed during *query* validation. @@ -546,7 +546,7 @@ pub mod state { } } - /// State for executing `migrate()` entrypoint of validator + /// State for executing `migrate()` entrypoint of executor pub struct Migrate<'wrld>(pub(in super::super) Common<'wrld>); impl LimitsMut for Migrate<'_> { @@ -739,12 +739,12 @@ impl Runtime { store } - fn execute_validator_validate_internal( + fn execute_executor_validate_internal( &self, module: &wasmtime::Module, state: S, validate_fn_name: &'static str, - ) -> Result { + ) -> Result { let mut store = self.create_store(state); let instance = self.instantiate_module(module, &mut store)?; @@ -772,12 +772,12 @@ impl Runtime { let wsv = state.wsv(); - // NOTE: Smart contract (not validator) is trying to execute the query, validate it first + // NOTE: Smart contract (not executor) is trying to execute the query, validate it first // TODO: Validation should be skipped when executing smart contract. // There should be two steps validation and execution. First smart contract // is validated and then it's executed. Here it's validating in both steps. // Add a flag indicating whether smart contract is being validated or executed - wsv.validator() + wsv.executor() .validate_query(wsv, state.authority(), query.clone())?; query @@ -801,8 +801,8 @@ impl Runtime { // Add a flag indicating whether smart contract is being validated or executed let authority = state.authority().clone(); let wsv = state.wsv_mut(); - wsv.validator() - .clone() // Cloning validator is a cheap operation + wsv.executor() + .clone() // Cloning executor is a cheap operation .validate_instruction(wsv, &authority, instruction) } } @@ -824,7 +824,7 @@ impl<'wrld> Runtime> { let span = wasm_log_span!("Smart contract execution", %authority); let state = state::SmartContract { common: state::Common::new(wsv, authority, self.config, span), - limits_validator: None, + limits_executor: None, }; self.execute_smart_contract_with_state(bytes, state) @@ -847,7 +847,7 @@ impl<'wrld> Runtime> { let span = wasm_log_span!("Smart contract validation", %authority); let state = state::SmartContract { common: state::Common::new(wsv, authority, self.config, span), - limits_validator: Some(LimitsValidator::new(max_instruction_count)), + limits_executor: Some(LimitsExecutor::new(max_instruction_count)), }; self.execute_smart_contract_with_state(bytes, state) @@ -895,8 +895,8 @@ impl<'wrld> import_traits::ExecuteOperations> instruction: InstructionExpr, state: &mut state::SmartContract<'wrld>, ) -> Result<(), ValidationFail> { - if let Some(limits_validator) = state.limits_validator.as_mut() { - limits_validator.check_instruction_limits()?; + if let Some(limits_executor) = state.limits_executor.as_mut() { + limits_executor.check_instruction_limits()?; } Self::default_execute_instruction(instruction, state) @@ -966,19 +966,19 @@ impl<'wrld> import_traits::ExecuteOperations> } /// Marker trait to auto-implement [`import_traits::ExecuteOperations`] for a concrete -/// *Validator* [`Runtime`]. +/// *Executor* [`Runtime`]. /// /// *Mut* means that [`WorldStateView`] will be mutated. -trait ExecuteOperationsAsValidatorMut {} +trait ExecuteOperationsAsExecutorMut {} impl import_traits::ExecuteOperations for R where - R: ExecuteOperationsAsValidatorMut, + R: ExecuteOperationsAsExecutorMut, S: state::Wsv + state::WsvMut + state::Authority, { #[codec::wrap] fn execute_query(query: QueryBox, state: &S) -> Result { - debug!(%query, "Executing as validator"); + debug!(%query, "Executing as executor"); query .execute(state.wsv()) @@ -994,7 +994,7 @@ where instruction: InstructionExpr, state: &mut S, ) -> Result<(), ValidationFail> { - debug!(%instruction, "Executing as validator"); + debug!(%instruction, "Executing as executor"); instruction .execute(&state.authority().clone(), state.wsv_mut()) @@ -1004,7 +1004,7 @@ where /// Marker trait to auto-implement [`import_traits::SetPermissionTokenSchema`] for a concrete [`Runtime`]. /// -/// Useful because in *Validator* exist more entrypoints than just `migrate()` which is the +/// Useful because in *Executor* exist more entrypoints than just `migrate()` which is the /// only entrypoint allowed to execute operations on permission tokens. trait FakeSetPermissionTokenSchema { /// Entrypoint function name for panic message @@ -1018,59 +1018,59 @@ where #[codec::wrap] fn set_permission_token_schema(_schema: PermissionTokenSchema, _state: &mut S) { panic!( - "Validator `{}()` entrypoint should not set permission token schema", + "Executor `{}()` entrypoint should not set permission token schema", Self::ENTRYPOINT_FN_NAME ) } } -impl<'wrld> Runtime> { - /// Execute `validate_transaction()` entrypoint of the given module of runtime validator +impl<'wrld> Runtime> { + /// Execute `validate_transaction()` entrypoint of the given module of runtime executor /// /// # Errors /// /// - if failed to instantiate provided `module` /// - if unable to find expected function export /// - if the execution of the smartcontract fails - /// - if unable to decode [`validator::Result`] - pub fn execute_validator_validate_transaction( + /// - if unable to decode [`executor::Result`] + pub fn execute_executor_validate_transaction( &self, wsv: &'wrld mut WorldStateView, authority: &AccountId, module: &wasmtime::Module, transaction: SignedTransaction, - ) -> Result { + ) -> Result { let span = wasm_log_span!("Running `validate_transaction()`"); - self.execute_validator_validate_internal( + self.execute_executor_validate_internal( module, - state::validator::ValidateTransaction { + state::executor::ValidateTransaction { common: state::Common::new(wsv, authority.clone(), self.config, span), to_validate: transaction, }, - import::VALIDATOR_VALIDATE_TRANSACTION, + import::EXECUTOR_VALIDATE_TRANSACTION, ) } } -impl<'wrld> ExecuteOperationsAsValidatorMut> - for Runtime> +impl<'wrld> ExecuteOperationsAsExecutorMut> + for Runtime> { } -impl<'wrld> import_traits::GetValidatorPayloads> - for Runtime> +impl<'wrld> import_traits::GetExecutorPayloads> + for Runtime> { #[codec::wrap] fn get_migrate_payload( - _state: &state::validator::ValidateTransaction<'wrld>, + _state: &state::executor::ValidateTransaction<'wrld>, ) -> payloads::Migrate { - panic!("Validator `validate_transaction()` entrypoint should not query payload for `migrate()` entrypoint") + panic!("Executor `validate_transaction()` entrypoint should not query payload for `migrate()` entrypoint") } #[codec::wrap] fn get_validate_transaction_payload( - state: &state::validator::ValidateTransaction<'wrld>, + state: &state::executor::ValidateTransaction<'wrld>, ) -> Validate { Validate { authority: state.authority().clone(), @@ -1081,79 +1081,79 @@ impl<'wrld> import_traits::GetValidatorPayloads, + _state: &state::executor::ValidateTransaction<'wrld>, ) -> Validate { - panic!("Validator `validate_transaction()` entrypoint should not query payload for `validate_instruction()` entrypoint") + panic!("Executor `validate_transaction()` entrypoint should not query payload for `validate_instruction()` entrypoint") } #[codec::wrap] fn get_validate_query_payload( - _state: &state::validator::ValidateTransaction<'wrld>, + _state: &state::executor::ValidateTransaction<'wrld>, ) -> Validate { - panic!("Validator `validate_transaction()` entrypoint should not query payload for `validate_query()` entrypoint") + panic!("Executor `validate_transaction()` entrypoint should not query payload for `validate_query()` entrypoint") } } -impl<'wrld> FakeSetPermissionTokenSchema> - for Runtime> +impl<'wrld> FakeSetPermissionTokenSchema> + for Runtime> { const ENTRYPOINT_FN_NAME: &'static str = "validate_transaction"; } -impl<'wrld> Runtime> { - /// Execute `validate_instruction()` entrypoint of the given module of runtime validator +impl<'wrld> Runtime> { + /// Execute `validate_instruction()` entrypoint of the given module of runtime executor /// /// # Errors /// /// - if failed to instantiate provided `module` /// - if unable to find expected function export /// - if the execution of the smartcontract fails - /// - if unable to decode [`validator::Result`] - pub fn execute_validator_validate_instruction( + /// - if unable to decode [`executor::Result`] + pub fn execute_executor_validate_instruction( &self, wsv: &'wrld mut WorldStateView, authority: &AccountId, module: &wasmtime::Module, instruction: InstructionExpr, - ) -> Result { + ) -> Result { let span = wasm_log_span!("Running `validate_instruction()`"); - self.execute_validator_validate_internal( + self.execute_executor_validate_internal( module, - state::validator::ValidateInstruction { + state::executor::ValidateInstruction { common: state::Common::new(wsv, authority.clone(), self.config, span), to_validate: instruction, }, - import::VALIDATOR_VALIDATE_INSTRUCTION, + import::EXECUTOR_VALIDATE_INSTRUCTION, ) } } -impl<'wrld> ExecuteOperationsAsValidatorMut> - for Runtime> +impl<'wrld> ExecuteOperationsAsExecutorMut> + for Runtime> { } -impl<'wrld> import_traits::GetValidatorPayloads> - for Runtime> +impl<'wrld> import_traits::GetExecutorPayloads> + for Runtime> { #[codec::wrap] fn get_migrate_payload( - _state: &state::validator::ValidateInstruction<'wrld>, + _state: &state::executor::ValidateInstruction<'wrld>, ) -> payloads::Migrate { - panic!("Validator `validate_instruction()` entrypoint should not query payload for `migrate()` entrypoint") + panic!("Executor `validate_instruction()` entrypoint should not query payload for `migrate()` entrypoint") } #[codec::wrap] fn get_validate_transaction_payload( - _state: &state::validator::ValidateInstruction<'wrld>, + _state: &state::executor::ValidateInstruction<'wrld>, ) -> Validate { - panic!("Validator `validate_instruction()` entrypoint should not query payload for `validate_transaction()` entrypoint") + panic!("Executor `validate_instruction()` entrypoint should not query payload for `validate_transaction()` entrypoint") } #[codec::wrap] fn get_validate_instruction_payload( - state: &state::validator::ValidateInstruction<'wrld>, + state: &state::executor::ValidateInstruction<'wrld>, ) -> Validate { Validate { authority: state.authority().clone(), @@ -1164,59 +1164,59 @@ impl<'wrld> import_traits::GetValidatorPayloads, + _state: &state::executor::ValidateInstruction<'wrld>, ) -> Validate { - panic!("Validator `validate_instruction()` entrypoint should not query payload for `validate_query()` entrypoint") + panic!("Executor `validate_instruction()` entrypoint should not query payload for `validate_query()` entrypoint") } } -impl<'wrld> FakeSetPermissionTokenSchema> - for Runtime> +impl<'wrld> FakeSetPermissionTokenSchema> + for Runtime> { const ENTRYPOINT_FN_NAME: &'static str = "validate_instruction"; } -impl<'wrld> Runtime> { - /// Execute `validate_query()` entrypoint of the given module of runtime validator +impl<'wrld> Runtime> { + /// Execute `validate_query()` entrypoint of the given module of runtime executor /// /// # Errors /// /// - if failed to instantiate provided `module` /// - if unable to find expected function export /// - if the execution of the smartcontract fails - /// - if unable to decode [`validator::Result`] - pub fn execute_validator_validate_query( + /// - if unable to decode [`executor::Result`] + pub fn execute_executor_validate_query( &self, wsv: &'wrld WorldStateView, authority: &AccountId, module: &wasmtime::Module, query: QueryBox, - ) -> Result { + ) -> Result { let span = wasm_log_span!("Running `validate_query()`"); - self.execute_validator_validate_internal( + self.execute_executor_validate_internal( module, - state::validator::ValidateQuery { + state::executor::ValidateQuery { wsv, authority: authority.clone(), store_limits: state::store_limits_from_config(&self.config), log_span: span, query, }, - import::VALIDATOR_VALIDATE_QUERY, + import::EXECUTOR_VALIDATE_QUERY, ) } } -impl<'wrld> import_traits::ExecuteOperations> - for Runtime> +impl<'wrld> import_traits::ExecuteOperations> + for Runtime> { #[codec::wrap] fn execute_query( query: QueryBox, - state: &state::validator::ValidateQuery<'wrld>, + state: &state::executor::ValidateQuery<'wrld>, ) -> Result { - debug!(%query, "Executing as validator"); + debug!(%query, "Executing as executor"); query .execute(state.wsv()) @@ -1230,37 +1230,37 @@ impl<'wrld> import_traits::ExecuteOperations, + _state: &mut state::executor::ValidateQuery<'wrld>, ) -> Result<(), ValidationFail> { - panic!("Validator `validate_query()` entrypoint should not execute instructions") + panic!("Executor `validate_query()` entrypoint should not execute instructions") } } -impl<'wrld> import_traits::GetValidatorPayloads> - for Runtime> +impl<'wrld> import_traits::GetExecutorPayloads> + for Runtime> { #[codec::wrap] - fn get_migrate_payload(_state: &state::validator::ValidateQuery<'wrld>) -> payloads::Migrate { - panic!("Validator `validate_query()` entrypoint should not query payload for `migrate()` entrypoint") + fn get_migrate_payload(_state: &state::executor::ValidateQuery<'wrld>) -> payloads::Migrate { + panic!("Executor `validate_query()` entrypoint should not query payload for `migrate()` entrypoint") } #[codec::wrap] fn get_validate_transaction_payload( - _state: &state::validator::ValidateQuery<'wrld>, + _state: &state::executor::ValidateQuery<'wrld>, ) -> Validate { - panic!("Validator `validate_query()` entrypoint should not query payload for `validate_transaction()` entrypoint") + panic!("Executor `validate_query()` entrypoint should not query payload for `validate_transaction()` entrypoint") } #[codec::wrap] fn get_validate_instruction_payload( - _state: &state::validator::ValidateQuery<'wrld>, + _state: &state::executor::ValidateQuery<'wrld>, ) -> Validate { - panic!("Validator `validate_query()` entrypoint should not query payload for `validate_instruction()` entrypoint") + panic!("Executor `validate_query()` entrypoint should not query payload for `validate_instruction()` entrypoint") } #[codec::wrap] fn get_validate_query_payload( - state: &state::validator::ValidateQuery<'wrld>, + state: &state::executor::ValidateQuery<'wrld>, ) -> Validate { Validate { authority: state.authority().clone(), @@ -1270,14 +1270,14 @@ impl<'wrld> import_traits::GetValidatorPayloads FakeSetPermissionTokenSchema> - for Runtime> +impl<'wrld> FakeSetPermissionTokenSchema> + for Runtime> { const ENTRYPOINT_FN_NAME: &'static str = "validate_query"; } -impl<'wrld> Runtime> { - /// Execute `migrate()` entrypoint of *Validator* +impl<'wrld> Runtime> { + /// Execute `migrate()` entrypoint of *Executor* /// /// # Errors /// @@ -1285,14 +1285,14 @@ impl<'wrld> Runtime> { /// - if failed to get export function for `migrate()` /// - if failed to call export function /// - if failed to decode [`MigrationResult`] - pub fn execute_validator_migration( + pub fn execute_executor_migration( &self, wsv: &'wrld mut WorldStateView, authority: &AccountId, module: &wasmtime::Module, ) -> Result { let span = wasm_log_span!("Running migration"); - let state = state::validator::Migrate(state::Common::new( + let state = state::executor::Migrate(state::Common::new( wsv, authority.clone(), self.config, @@ -1302,7 +1302,7 @@ impl<'wrld> Runtime> { let mut store = self.create_store(state); let instance = self.instantiate_module(module, &mut store)?; - let migrate_fn = Self::get_typed_func(&instance, &mut store, import::VALIDATOR_MIGRATE)?; + let migrate_fn = Self::get_typed_func(&instance, &mut store, import::EXECUTOR_MIGRATE)?; let offset = migrate_fn .call(&mut store, ()) @@ -1318,8 +1318,8 @@ impl<'wrld> Runtime> { } } -impl<'wrld> ExecuteOperationsAsValidatorMut> - for Runtime> +impl<'wrld> ExecuteOperationsAsExecutorMut> + for Runtime> { } @@ -1332,11 +1332,11 @@ impl<'wrld> ExecuteOperationsAsValidatorMut> /// /// Panics with error message if called, because it should never be called from /// `migrate()` entrypoint. -impl<'wrld> import_traits::GetValidatorPayloads> - for Runtime> +impl<'wrld> import_traits::GetExecutorPayloads> + for Runtime> { #[codec::wrap] - fn get_migrate_payload(state: &state::validator::Migrate<'wrld>) -> payloads::Migrate { + fn get_migrate_payload(state: &state::executor::Migrate<'wrld>) -> payloads::Migrate { payloads::Migrate { block_height: state.wsv().height(), } @@ -1344,31 +1344,31 @@ impl<'wrld> import_traits::GetValidatorPayloads #[codec::wrap] fn get_validate_transaction_payload( - _state: &state::validator::Migrate<'wrld>, + _state: &state::executor::Migrate<'wrld>, ) -> Validate { - panic!("Validator `migrate()` entrypoint should not query payload for `validate_transaction()` entrypoint") + panic!("Executor `migrate()` entrypoint should not query payload for `validate_transaction()` entrypoint") } #[codec::wrap] fn get_validate_instruction_payload( - _state: &state::validator::Migrate<'wrld>, + _state: &state::executor::Migrate<'wrld>, ) -> Validate { - panic!("Validator `migrate()` entrypoint should not query payload for `validate_instruction()` entrypoint") + panic!("Executor `migrate()` entrypoint should not query payload for `validate_instruction()` entrypoint") } #[codec::wrap] - fn get_validate_query_payload(_state: &state::validator::Migrate<'wrld>) -> Validate { - panic!("Validator `migrate()` entrypoint should not query payload for `validate_query()` entrypoint") + fn get_validate_query_payload(_state: &state::executor::Migrate<'wrld>) -> Validate { + panic!("Executor `migrate()` entrypoint should not query payload for `validate_query()` entrypoint") } } -impl<'wrld> import_traits::SetPermissionTokenSchema> - for Runtime> +impl<'wrld> import_traits::SetPermissionTokenSchema> + for Runtime> { #[codec::wrap] fn set_permission_token_schema( schema: PermissionTokenSchema, - state: &mut state::validator::Migrate<'wrld>, + state: &mut state::executor::Migrate<'wrld>, ) { debug!(%schema, "Setting permission token schema"); @@ -1499,19 +1499,19 @@ impl<'wrld> RuntimeBuilder> { } } -impl<'wrld> RuntimeBuilder> { - /// Builds the [`Runtime`] for *Validator* `validate_transaction()` execution +impl<'wrld> RuntimeBuilder> { + /// Builds the [`Runtime`] for *Executor* `validate_transaction()` execution /// /// # Errors /// /// Fails if failed to create default linker. - pub fn build(self) -> Result>> { + pub fn build(self) -> Result>> { self.finalize(|engine| { let mut linker = Linker::new(engine); create_imports!(linker, - export::EXECUTE_ISI => Runtime::>::execute_instruction, - export::EXECUTE_QUERY => Runtime::>::execute_query, + export::EXECUTE_ISI => Runtime::>::execute_instruction, + export::EXECUTE_QUERY => Runtime::>::execute_query, export::GET_MIGRATE_PAYLOAD => Runtime::get_migrate_payload, export::GET_VALIDATE_TRANSACTION_PAYLOAD => Runtime::get_validate_transaction_payload, export::GET_VALIDATE_INSTRUCTION_PAYLOAD => Runtime::get_validate_instruction_payload, @@ -1523,19 +1523,19 @@ impl<'wrld> RuntimeBuilder> { } } -impl<'wrld> RuntimeBuilder> { - /// Builds the [`Runtime`] for *Validator* `validate_instruction()` execution +impl<'wrld> RuntimeBuilder> { + /// Builds the [`Runtime`] for *Executor* `validate_instruction()` execution /// /// # Errors /// /// Fails if failed to create default linker. - pub fn build(self) -> Result>> { + pub fn build(self) -> Result>> { self.finalize(|engine| { let mut linker = Linker::new(engine); create_imports!(linker, - export::EXECUTE_ISI => Runtime::>::execute_instruction, - export::EXECUTE_QUERY => Runtime::>::execute_query, + export::EXECUTE_ISI => Runtime::>::execute_instruction, + export::EXECUTE_QUERY => Runtime::>::execute_query, export::GET_MIGRATE_PAYLOAD => Runtime::get_migrate_payload, export::GET_VALIDATE_TRANSACTION_PAYLOAD => Runtime::get_validate_transaction_payload, export::GET_VALIDATE_INSTRUCTION_PAYLOAD => Runtime::get_validate_instruction_payload, @@ -1547,19 +1547,19 @@ impl<'wrld> RuntimeBuilder> { } } -impl<'wrld> RuntimeBuilder> { - /// Builds the [`Runtime`] for *Validator* `validate_query()` execution +impl<'wrld> RuntimeBuilder> { + /// Builds the [`Runtime`] for *Executor* `validate_query()` execution /// /// # Errors /// /// Fails if failed to create default linker. - pub fn build(self) -> Result>> { + pub fn build(self) -> Result>> { self.finalize(|engine| { let mut linker = Linker::new(engine); create_imports!(linker, - export::EXECUTE_ISI => Runtime::>::execute_instruction, - export::EXECUTE_QUERY => Runtime::>::execute_query, + export::EXECUTE_ISI => Runtime::>::execute_instruction, + export::EXECUTE_QUERY => Runtime::>::execute_query, export::GET_MIGRATE_PAYLOAD => Runtime::get_migrate_payload, export::GET_VALIDATE_TRANSACTION_PAYLOAD => Runtime::get_validate_transaction_payload, export::GET_VALIDATE_INSTRUCTION_PAYLOAD => Runtime::get_validate_instruction_payload, @@ -1571,19 +1571,19 @@ impl<'wrld> RuntimeBuilder> { } } -impl<'wrld> RuntimeBuilder> { - /// Builds the [`Runtime`] to execute `permission_tokens()` entrypoint of *Validator* +impl<'wrld> RuntimeBuilder> { + /// Builds the [`Runtime`] to execute `permission_tokens()` entrypoint of *Executor* /// /// # Errors /// /// Fails if failed to create default linker. - pub fn build(self) -> Result>> { + pub fn build(self) -> Result>> { self.finalize(|engine| { let mut linker = Linker::new(engine); create_imports!(linker, - export::EXECUTE_ISI => Runtime::>::execute_instruction, - export::EXECUTE_QUERY => Runtime::>::execute_query, + export::EXECUTE_ISI => Runtime::>::execute_instruction, + export::EXECUTE_QUERY => Runtime::>::execute_query, export::GET_MIGRATE_PAYLOAD => Runtime::get_migrate_payload, export::GET_VALIDATE_TRANSACTION_PAYLOAD => Runtime::get_validate_transaction_payload, export::GET_VALIDATE_INSTRUCTION_PAYLOAD => Runtime::get_validate_instruction_payload, diff --git a/core/src/sumeragi/main_loop.rs b/core/src/sumeragi/main_loop.rs index 2866fdb7927..3a0aef20b68 100644 --- a/core/src/sumeragi/main_loop.rs +++ b/core/src/sumeragi/main_loop.rs @@ -1190,7 +1190,7 @@ mod tests { .with_instructions([fail_box]) .sign(alice_keys.clone()) .expect("Valid"); - let tx = AcceptedTransaction::accept(tx, &wsv.transaction_validator().transaction_limits) + let tx = AcceptedTransaction::accept(tx, &wsv.transaction_executor().transaction_limits) .expect("Valid"); // Creating a block of two identical transactions and validating it @@ -1215,14 +1215,14 @@ mod tests { .with_instructions([create_asset_definition1]) .sign(alice_keys.clone()) .expect("Valid"); - let tx1 = AcceptedTransaction::accept(tx1, &wsv.transaction_validator().transaction_limits) + let tx1 = AcceptedTransaction::accept(tx1, &wsv.transaction_executor().transaction_limits) .map(Into::into) .expect("Valid"); let tx2 = TransactionBuilder::new(alice_id) .with_instructions([create_asset_definition2]) .sign(alice_keys) .expect("Valid"); - let tx2 = AcceptedTransaction::accept(tx2, &wsv.transaction_validator().transaction_limits) + let tx2 = AcceptedTransaction::accept(tx2, &wsv.transaction_executor().transaction_limits) .map(Into::into) .expect("Valid"); diff --git a/core/src/tx.rs b/core/src/tx.rs index 199fe4ed258..18404d6bd4e 100644 --- a/core/src/tx.rs +++ b/core/src/tx.rs @@ -316,13 +316,13 @@ impl From for (AccountId, Executable) { /// /// Validation is skipped for genesis. #[derive(Clone, Copy)] -pub struct TransactionValidator { +pub struct TransactionExecutor { /// [`TransactionLimits`] field pub transaction_limits: TransactionLimits, } -impl TransactionValidator { - /// Construct [`TransactionValidator`] +impl TransactionExecutor { + /// Construct [`TransactionExecutor`] pub fn new(transaction_limits: TransactionLimits) -> Self { Self { transaction_limits } } @@ -372,7 +372,7 @@ impl TransactionValidator { let mut wsv_for_validation = wsv.clone(); debug!("Validating transaction: {:?}", tx); - Self::validate_with_runtime_validator(tx.clone(), &mut wsv_for_validation)?; + Self::validate_with_runtime_executor(tx.clone(), &mut wsv_for_validation)?; if let (authority, Executable::Wasm(bytes)) = tx.into() { self.validate_wasm(authority, &mut wsv_for_validation, bytes)? @@ -409,25 +409,25 @@ impl TransactionValidator { .map_err(TransactionRejectionReason::WasmExecution) } - /// Validate transaction with runtime validators. + /// Validate transaction with runtime executors. /// /// Note: transaction instructions will be executed on the given `wsv`. - fn validate_with_runtime_validator( + fn validate_with_runtime_executor( tx: AcceptedTransaction, wsv: &mut WorldStateView, ) -> Result<(), TransactionRejectionReason> { let tx: SignedTransaction = tx.into(); let authority = tx.payload().authority.clone(); - wsv.validator() - .clone() // Cloning validator is a cheap operation + wsv.executor() + .clone() // Cloning executor is a cheap operation .validate_transaction(wsv, &authority, tx) .map_err(|error| { if let ValidationFail::InternalError(msg) = &error { error!( error = msg, "Internal error occurred during transaction validation, \ - is Runtime Validator correct?" + is Runtime Executor correct?" ) } error.into() diff --git a/core/src/wsv.rs b/core/src/wsv.rs index 7a5c9073de3..049947db282 100644 --- a/core/src/wsv.rs +++ b/core/src/wsv.rs @@ -44,6 +44,7 @@ use serde::{ use crate::{ block::CommittedBlock, + executor::Executor, kura::Kura, smartcontracts::{ triggers::{ @@ -52,8 +53,7 @@ use crate::{ }, wasm, Execute, }, - tx::TransactionValidator, - validator::Validator, + tx::TransactionExecutor, DomainsMap, Parameters, PeersIds, }; @@ -77,8 +77,8 @@ pub struct World { pub(crate) permission_token_schema: PermissionTokenSchema, /// Triggers pub(crate) triggers: TriggerSet, - /// Runtime Validator - pub(crate) validator: Validator, + /// Runtime Executor + pub(crate) executor: Executor, } // Loader for [`Set`] @@ -175,7 +175,7 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, World> { let mut account_roles = None; let mut permission_token_schema = None; let mut triggers = None; - let mut validator = None; + let mut executor = None; while let Some(key) = map.next_key::()? { match key.as_str() { @@ -203,8 +203,8 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, World> { "triggers" => { triggers = Some(map.next_value_seed(self.loader.cast::())?); } - "validator" => { - validator = Some(map.next_value_seed(self.loader.cast::())?); + "executor" => { + executor = Some(map.next_value_seed(self.loader.cast::())?); } _ => { /* Skip unknown fields */ } } @@ -227,8 +227,8 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, World> { })?, triggers: triggers .ok_or_else(|| serde::de::Error::missing_field("triggers"))?, - validator: validator - .ok_or_else(|| serde::de::Error::missing_field("validator"))?, + executor: executor + .ok_or_else(|| serde::de::Error::missing_field("executor"))?, }) } } @@ -244,7 +244,7 @@ impl<'de> DeserializeSeed<'de> for WasmSeed<'_, World> { "account_roles", "permission_token_schema", "triggers", - "validator", + "executor", ], WorldVisitor { loader: &self }, ) @@ -701,9 +701,9 @@ impl WorldStateView { } } - /// Get transaction validator - pub fn transaction_validator(&self) -> TransactionValidator { - TransactionValidator::new(self.config.transaction_limits) + /// Get transaction executor + pub fn transaction_executor(&self) -> TransactionExecutor { + TransactionExecutor::new(self.config.transaction_limits) } /// Get a reference to the latest block. Returns none if genesis is not committed. @@ -1228,9 +1228,9 @@ impl WorldStateView { self.events_buffer.push(event.into()); } - /// Get [`Validator`]. - pub fn validator(&self) -> &Validator { - &self.world.validator + /// Get [`Executor`]. + pub fn executor(&self) -> &Executor { + &self.world.executor } /// The function puts events produced by iterator into `events_buffer`. diff --git a/core/test_network/src/lib.rs b/core/test_network/src/lib.rs index a8f8ad9f58f..b0e58df14d3 100644 --- a/core/test_network/src/lib.rs +++ b/core/test_network/src/lib.rs @@ -105,8 +105,8 @@ impl TestGenesis for GenesisNetwork { "CanUnregisterDomain".parse().unwrap(), &json!({ "domain_id": DomainId::from_str("wonderland").unwrap() } ), ); - let upgrade_validator_permission = - PermissionToken::new("CanUpgradeValidator".parse().unwrap(), &json!(null)); + let upgrade_executor_permission = + PermissionToken::new("CanUpgradeExecutor".parse().unwrap(), &json!(null)); let first_transaction = genesis .first_transaction_mut() @@ -117,7 +117,7 @@ impl TestGenesis for GenesisNetwork { unregister_any_peer_permission, unregister_any_role_permission, unregister_wonderland_domain, - upgrade_validator_permission, + upgrade_executor_permission, ] { first_transaction .append_instruction(GrantExpr::new(permission, alice_id.clone()).into()); diff --git a/data_model/src/events/data/events.rs b/data_model/src/events/data/events.rs index 145f7e6baa8..54536767a41 100644 --- a/data_model/src/events/data/events.rs +++ b/data_model/src/events/data/events.rs @@ -74,7 +74,7 @@ pub mod model { Trigger(trigger::TriggerEvent), PermissionTokenSchemaUpdate(permission::PermissionTokenSchemaUpdateEvent), Configuration(config::ConfigurationEvent), - Validator(validator::ValidatorEvent), + Executor(executor::ExecutorEvent), } /// Event @@ -112,8 +112,8 @@ pub mod model { PermissionToken(permission::PermissionTokenSchemaUpdateEvent), /// Configuration event Configuration(config::ConfigurationEvent), - /// Validator event - Validator(validator::ValidatorEvent), + /// Executor event + Executor(executor::ExecutorEvent), } } @@ -315,7 +315,7 @@ mod permission { use super::*; /// Information about permission tokens update. - /// Only happens when registering new validator + /// Only happens when registering new executor #[derive( Debug, Clone, @@ -554,7 +554,7 @@ mod config { } } -mod validator { +mod executor { use iroha_data_model_derive::model; pub use self::model::*; @@ -581,19 +581,19 @@ mod validator { #[ffi_type] #[serde(untagged)] // Unaffected by #3330, as single unit variant #[repr(transparent)] - pub enum ValidatorEvent { + pub enum ExecutorEvent { Upgraded, } - /// Filter for [`ValidatorEvent`]. - pub enum ValidatorFilter { + /// Filter for [`ExecutorEvent`]. + pub enum ExecutorFilter { Upgraded, } } #[cfg(feature = "transparent_api")] - impl super::Filter for ValidatorFilter { - type Event = ValidatorEvent; + impl super::Filter for ExecutorFilter { + type Event = ExecutorEvent; fn matches(&self, event: &Self::Event) -> bool { match (self, event) { @@ -648,8 +648,8 @@ impl WorldEvent { WorldEvent::Configuration(config_event) => { events.push(DataEvent::Configuration(config_event)); } - WorldEvent::Validator(validator_event) => { - events.push(DataEvent::Validator(validator_event)); + WorldEvent::Executor(executor_event) => { + events.push(DataEvent::Executor(executor_event)); } } @@ -688,7 +688,7 @@ impl DataEvent { | Self::Configuration(_) | Self::Role(_) | Self::PermissionToken(_) - | Self::Validator(_) => None, + | Self::Executor(_) => None, } } } @@ -706,13 +706,13 @@ pub mod prelude { }, config::ConfigurationEvent, domain::{DomainEvent, DomainEventFilter, DomainFilter, DomainOwnerChanged}, + executor::{ExecutorEvent, ExecutorFilter}, peer::{PeerEvent, PeerEventFilter, PeerFilter}, permission::PermissionTokenSchemaUpdateEvent, role::{PermissionRemoved, RoleEvent, RoleEventFilter, RoleFilter}, trigger::{ TriggerEvent, TriggerEventFilter, TriggerFilter, TriggerNumberOfExecutionsChanged, }, - validator::{ValidatorEvent, ValidatorFilter}, DataEvent, HasOrigin, MetadataChanged, WorldEvent, }; } diff --git a/data_model/src/validator.rs b/data_model/src/executor.rs similarity index 81% rename from data_model/src/validator.rs rename to data_model/src/executor.rs index 9167efa2033..8207dcb6250 100644 --- a/data_model/src/validator.rs +++ b/data_model/src/executor.rs @@ -1,4 +1,4 @@ -//! Structures, traits and impls related to *runtime* `Validator`s. +//! Structures, traits and impls related to *runtime* `Executor`s. #[cfg(not(feature = "std"))] use alloc::{format, string::String, vec::Vec}; @@ -17,7 +17,7 @@ use crate::transaction::WasmSmartContract; pub mod model { use super::*; - /// validator that checks if an operation satisfies some conditions. + /// executor that checks if an operation satisfies some conditions. /// /// Can be used with things like [`Transaction`]s, /// [`InstructionExpr`]s, etc. @@ -42,8 +42,8 @@ pub mod model { #[repr(transparent)] // TODO: Derive with getset once FFI impl is fixed //#[getset(get = "pub")] - pub struct Validator { - /// WASM code of the validator + pub struct Executor { + /// WASM code of the executor pub wasm: WasmSmartContract, } @@ -51,16 +51,16 @@ pub mod model { // implemented use: #[cfg(any(feature = "transparent_api", feature = "ffi_import"))] } -/// Result type that every validator should return. +/// Result type that every executor should return. pub type Result = core::result::Result; /// Migration error type. pub type MigrationError = String; -/// Result type for a validator's `migrate()` entrypoint. +/// Result type for a executor's `migrate()` entrypoint. pub type MigrationResult = Result<(), MigrationError>; pub mod prelude { //! The prelude re-exports most commonly used traits, structs and macros from this crate. - pub use super::Validator; + pub use super::Executor; } diff --git a/data_model/src/isi.rs b/data_model/src/isi.rs index 3424fa5bf41..e9541a3b0a3 100644 --- a/data_model/src/isi.rs +++ b/data_model/src/isi.rs @@ -147,7 +147,7 @@ mod transparent { // because they are never shared between client and server(http)/host(wasm) use super::*; - use crate::validator::Validator; + use crate::executor::Executor; /// Generic instruction to set key value at the object. #[derive(Debug, Clone)] @@ -337,8 +337,8 @@ mod transparent { } } - impl From> for UpgradeExpr { - fn from(source: Upgrade) -> Self { + impl From> for UpgradeExpr { + fn from(source: Upgrade) -> Self { Self::new(source.object) } } diff --git a/data_model/src/lib.rs b/data_model/src/lib.rs index 88713128a6a..2fb9660a738 100644 --- a/data_model/src/lib.rs +++ b/data_model/src/lib.rs @@ -64,6 +64,7 @@ pub mod block; pub mod domain; pub mod evaluate; pub mod events; +pub mod executor; pub mod expression; pub mod ipfs; pub mod isi; @@ -79,7 +80,6 @@ pub mod role; pub mod smart_contract; pub mod transaction; pub mod trigger; -pub mod validator; pub mod visit; mod seal { @@ -731,14 +731,14 @@ pub mod model { Serialize, IntoSchema, )] - // SAFETY: `UpgradableBox` has no trap representations in `validator::Validator` + // SAFETY: `UpgradableBox` has no trap representations in `executor::Executor` #[ffi_type(unsafe {robust})] #[serde(untagged)] // Unaffected by #3330, because stores binary data with no `u128` #[repr(transparent)] pub enum UpgradableBox { - /// [`Validator`](`validator::Validator`) variant. - #[display(fmt = "Validator")] - Validator(validator::Validator), + /// [`Executor`](`executor::Executor`) variant. + #[display(fmt = "Executor")] + Executor(executor::Executor), } /// Sized container for all possible values. @@ -788,7 +788,7 @@ pub mod model { #[serde_partially_tagged(untagged)] #[debug(fmt = "{_0:?}")] Numeric(NumericValue), - Validator(validator::Validator), + Executor(executor::Executor), LogLevel(Level), } @@ -902,10 +902,10 @@ pub mod model { /// # Note /// /// Keep in mind that *Validation* is not the right term - /// (because *Runtime Validator* actually does execution too) and other names + /// (because *Runtime Executor* actually does execution too) and other names /// (like *Verification* or *Execution*) are being discussed. /// - /// TODO: Move to `validator` module + /// TODO: Move to `executor` module #[derive( Debug, displaydoc::Display, @@ -942,11 +942,11 @@ pub mod model { /// For example it's a very big WASM binary. /// /// It's different from [`TransactionRejectionReason::LimitCheck`] because it depends on - /// validator. + /// executor. TooComplex, /// Internal error occurred, please contact the support or check the logs if you are the node owner /// - /// Usually means a bug inside **Runtime Validator** or **Iroha** implementation. + /// Usually means a bug inside **Runtime Executor** or **Iroha** implementation. InternalError( /// Contained error message if its used internally. Empty for external users. /// Never serialized to not to expose internal errors to the end user. @@ -1095,7 +1095,7 @@ impl fmt::Display for Value { Value::MetadataLimits(v) => fmt::Display::fmt(&v, f), Value::TransactionLimits(v) => fmt::Display::fmt(&v, f), Value::LengthLimits(v) => fmt::Display::fmt(&v, f), - Value::Validator(v) => write!(f, "Validator({} bytes)", v.wasm.as_ref().len()), + Value::Executor(v) => write!(f, "Executor({} bytes)", v.wasm.as_ref().len()), Value::LogLevel(v) => fmt::Display::fmt(&v, f), } } @@ -1126,7 +1126,7 @@ impl Value { | TransactionLimits(_) | LengthLimits(_) | Numeric(_) - | Validator(_) + | Executor(_) | LogLevel(_) | SignatureCheckCondition(_) => 1_usize, Vec(v) => v.iter().map(Self::len).sum::() + 1_usize, @@ -1511,7 +1511,7 @@ impl TryFrom for UpgradableBox { fn try_from(value: Value) -> Result { match value { - Value::Validator(validator) => Ok(Self::Validator(validator)), + Value::Executor(executor) => Ok(Self::Executor(executor)), _ => Err(Self::Error::default()), } } @@ -1945,10 +1945,10 @@ pub mod prelude { pub use super::current_time; pub use super::{ account::prelude::*, asset::prelude::*, domain::prelude::*, evaluate::prelude::*, - events::prelude::*, expression::prelude::*, isi::prelude::*, metadata::prelude::*, - name::prelude::*, parameter::prelude::*, peer::prelude::*, permission::prelude::*, - query::prelude::*, role::prelude::*, transaction::prelude::*, trigger::prelude::*, - validator::prelude::*, EnumTryAsError, HasMetadata, IdBox, Identifiable, IdentifiableBox, + events::prelude::*, executor::prelude::*, expression::prelude::*, isi::prelude::*, + metadata::prelude::*, name::prelude::*, parameter::prelude::*, peer::prelude::*, + permission::prelude::*, query::prelude::*, role::prelude::*, transaction::prelude::*, + trigger::prelude::*, EnumTryAsError, HasMetadata, IdBox, Identifiable, IdentifiableBox, LengthLimits, NumericValue, PredicateTrait, RegistrableBox, ToValue, TriggerBox, TryAsMut, TryAsRef, TryToValue, UpgradableBox, ValidationFail, Value, }; diff --git a/data_model/src/permission.rs b/data_model/src/permission.rs index 2e1fcd025b5..ce3fd423e28 100644 --- a/data_model/src/permission.rs +++ b/data_model/src/permission.rs @@ -46,7 +46,7 @@ pub mod model { pub payload: StringWithJson, } - /// Description of tokens defined in the validator + /// Description of tokens defined in the executor #[derive( Debug, Display, diff --git a/data_model/src/query/mod.rs b/data_model/src/query/mod.rs index fb0d78ad468..4efa9e85472 100644 --- a/data_model/src/query/mod.rs +++ b/data_model/src/query/mod.rs @@ -1437,7 +1437,7 @@ pub mod error { pub use self::model::*; use super::*; - use crate::{block::SignedBlock, permission, prelude::*, validator}; + use crate::{block::SignedBlock, executor, permission, prelude::*}; #[model] pub mod model { diff --git a/data_model/src/smart_contract.rs b/data_model/src/smart_contract.rs index 471d7bd777f..f159fa69531 100644 --- a/data_model/src/smart_contract.rs +++ b/data_model/src/smart_contract.rs @@ -30,7 +30,7 @@ pub mod payloads { pub block_height: u64, } - /// Generic payload for `validate_*()` entrypoints of validator. + /// Generic payload for `validate_*()` entrypoints of executor. #[derive(Debug, Clone, Encode, Decode)] pub struct Validate { /// Authority which executed the operation to be validated diff --git a/data_model/src/visit.rs b/data_model/src/visit.rs index 0853d8188a3..34f41c07e68 100644 --- a/data_model/src/visit.rs +++ b/data_model/src/visit.rs @@ -164,7 +164,7 @@ pub trait Visit: ExpressionEvaluator { visit_revoke_account_role(Revoke), // Visit UpgradeExpr - visit_upgrade_validator(Upgrade), + visit_upgrade_executor(Upgrade), } } @@ -655,8 +655,8 @@ pub fn visit_upgrade(visitor: &mut V, authority: &AccountId, let object = evaluate_expr!(visitor, authority, ::object()); match object { - UpgradableBox::Validator(object) => { - visitor.visit_upgrade_validator(authority, Upgrade { object }) + UpgradableBox::Executor(object) => { + visitor.visit_upgrade_executor(authority, Upgrade { object }) } } } @@ -664,7 +664,7 @@ pub fn visit_upgrade(visitor: &mut V, authority: &AccountId, pub fn visit_if(visitor: &mut V, authority: &AccountId, isi: &ConditionalExpr) { let condition = evaluate_expr!(visitor, authority, ::condition()); - // TODO: Should visit both by default or not? It will affect Validator behavior + // TODO: Should visit both by default or not? It will affect Executor behavior // because only one branch needs to be executed. IMO both should be validated if condition { visitor.visit_instruction(authority, isi.then()); @@ -734,7 +734,7 @@ leaf_visitors! { visit_unregister_trigger(Unregister>), visit_mint_trigger_repetitions(Mint>), visit_burn_trigger_repetitions(Burn>), - visit_upgrade_validator(Upgrade), + visit_upgrade_executor(Upgrade), visit_new_parameter(NewParameter), visit_set_parameter(SetParameter), visit_execute_trigger(ExecuteTrigger), diff --git a/default_validator/.cargo/config.toml b/default_executor/.cargo/config.toml similarity index 100% rename from default_validator/.cargo/config.toml rename to default_executor/.cargo/config.toml diff --git a/default_validator/Cargo.toml b/default_executor/Cargo.toml similarity index 84% rename from default_validator/Cargo.toml rename to default_executor/Cargo.toml index 31f69bf876f..d3aea570a32 100644 --- a/default_validator/Cargo.toml +++ b/default_executor/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "iroha_default_validator" +name = "iroha_default_executor" edition = "2021" version = "2.0.0-pre-rc.19" @@ -24,7 +24,7 @@ opt-level = "z" # Optimize for size vs speed with "s"/"z"(removes vectorizat codegen-units = 1 # Further reduces binary size but increases compilation time [dependencies] -iroha_validator = { version = "2.0.0-pre-rc.19", path = "../smart_contract/validator", features = ["debug"]} +iroha_executor = { version = "2.0.0-pre-rc.19", path = "../smart_contract/executor", features = ["debug"]} lol_alloc = "0.4.0" panic-halt = "0.2.0" diff --git a/default_validator/LICENSE b/default_executor/LICENSE similarity index 100% rename from default_validator/LICENSE rename to default_executor/LICENSE diff --git a/default_validator/README.md b/default_executor/README.md similarity index 55% rename from default_validator/README.md rename to default_executor/README.md index 98d12732107..a404dd83950 100644 --- a/default_validator/README.md +++ b/default_executor/README.md @@ -1,8 +1,8 @@ -# `iroha_default_validator` +# `iroha_default_executor` Use the [Wasm Builder CLI](../tools/wasm_builder_cli) in order to build it: ```bash cargo run --bin iroha_wasm_builder_cli -- \ - build ./default_validator --optimize --outfile ./configs/peer/validator.wasm + build ./default_executor --optimize --outfile ./configs/peer/executor.wasm ``` \ No newline at end of file diff --git a/default_validator/src/lib.rs b/default_executor/src/lib.rs similarity index 74% rename from default_validator/src/lib.rs rename to default_executor/src/lib.rs index 0925c89ed11..9bb8c2e77d4 100644 --- a/default_validator/src/lib.rs +++ b/default_executor/src/lib.rs @@ -1,4 +1,4 @@ -//! Iroha default validator. +//! Iroha default executor. #![no_std] #![allow(missing_docs, clippy::missing_errors_doc)] @@ -9,7 +9,7 @@ extern crate panic_halt; use alloc::borrow::ToOwned as _; -use iroha_validator::{ +use iroha_executor::{ data_model::evaluate::ExpressionEvaluator, default::default_permission_token_schema, prelude::*, smart_contract, }; @@ -18,19 +18,19 @@ use lol_alloc::{FreeListAllocator, LockedAllocator}; #[global_allocator] static ALLOC: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); -/// Validator that replaces some of [`Validate`]'s methods with sensible defaults +/// Executor that replaces some of [`Validate`]'s methods with sensible defaults /// /// # Warning /// /// The defaults are not guaranteed to be stable. #[derive(Debug, Clone)] -pub struct Validator { +pub struct Executor { verdict: Result, block_height: u64, host: smart_contract::Host, } -impl Validator { +impl Executor { /// Construct [`Self`] pub fn new(block_height: u64) -> Self { Self { @@ -42,8 +42,8 @@ impl Validator { fn ensure_genesis(block_height: u64) -> MigrationResult { if block_height != 0 { - return Err("Default Validator is intended to be used only in genesis. \ - Write your own validator if you need to upgrade validator on existing chain." + return Err("Default Executor is intended to be used only in genesis. \ + Write your own executor if you need to upgrade executor on existing chain." .to_owned()); } @@ -52,14 +52,14 @@ impl Validator { } macro_rules! defaults { - ( $($validator:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( - fn $validator $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { - iroha_validator::default::$validator(self, authority, operation) + ( $($executor:ident $(<$param:ident $(: $bound:path)?>)?($operation:ty)),+ $(,)? ) => { $( + fn $executor $(<$param $(: $bound)?>)?(&mut self, authority: &AccountId, operation: $operation) { + iroha_executor::default::$executor(self, authority, operation) } )+ }; } -impl Visit for Validator { +impl Visit for Executor { defaults! { visit_unsupported(T), @@ -122,11 +122,11 @@ impl Visit for Validator { visit_new_parameter(NewParameter), // Upgrade validation - visit_upgrade_validator(Upgrade), + visit_upgrade_executor(Upgrade), } } -impl Validate for Validator { +impl Validate for Executor { fn verdict(&self) -> &Result { &self.verdict } @@ -140,33 +140,32 @@ impl Validate for Validator { } } -impl ExpressionEvaluator for Validator { +impl ExpressionEvaluator for Executor { fn evaluate( &self, expression: &E, - ) -> core::result::Result - { + ) -> core::result::Result { self.host.evaluate(expression) } } -/// Migrate previous validator to the current version. -/// Called by Iroha once just before upgrading validator. +/// Migrate previous executor to the current version. +/// Called by Iroha once just before upgrading executor. /// /// # Errors /// /// Concrete errors are specific to the implementation. /// /// If `migrate()` entrypoint fails then the whole `Upgrade` instruction -/// will be denied and previous validator will stay unchanged. +/// will be denied and previous executor will stay unchanged. #[entrypoint] pub fn migrate(block_height: u64) -> MigrationResult { - Validator::ensure_genesis(block_height)?; + Executor::ensure_genesis(block_height)?; let schema = default_permission_token_schema(); let (token_ids, schema_str) = schema.serialize(); - iroha_validator::set_permission_token_schema( - &iroha_validator::data_model::permission::PermissionTokenSchema::new(token_ids, schema_str), + iroha_executor::set_permission_token_schema( + &iroha_executor::data_model::permission::PermissionTokenSchema::new(token_ids, schema_str), ); Ok(()) @@ -178,9 +177,9 @@ pub fn validate_transaction( transaction: SignedTransaction, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_transaction(&authority, &transaction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_transaction(&authority, &transaction); + executor.verdict } #[entrypoint] @@ -189,14 +188,14 @@ pub fn validate_instruction( instruction: InstructionExpr, block_height: u64, ) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_instruction(&authority, &instruction); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_instruction(&authority, &instruction); + executor.verdict } #[entrypoint] pub fn validate_query(authority: AccountId, query: QueryBox, block_height: u64) -> Result { - let mut validator = Validator::new(block_height); - validator.visit_query(&authority, &query); - validator.verdict + let mut executor = Executor::new(block_height); + executor.visit_query(&authority, &query); + executor.verdict } diff --git a/docs/source/iroha_2_whitepaper.md b/docs/source/iroha_2_whitepaper.md index 877e45a9e1f..b2da670e60e 100644 --- a/docs/source/iroha_2_whitepaper.md +++ b/docs/source/iroha_2_whitepaper.md @@ -173,13 +173,13 @@ The $2f+1$th peer is called the *proxy tail*. - no ordering service; instead, the leader of each round just uses the transactions they have at hand to create a block and the leader changes each round to prevent long-term censorship -- $3f+1$ validators that are split into two groups, $a$ and $b$, of $2f+1$ and $f$ validators each +- $3f+1$ executors that are split into two groups, $a$ and $b$, of $2f+1$ and $f$ executors each -- $2f+1$ validators must sign off on a block in order for it to be committed +- $2f+1$ executors must sign off on a block in order for it to be committed - the first node in set $a$ is called the *leader* (sumeragi) and the $2f+1$th node in set $a$ is called the *proxy tail* -- the basic idea is that up to $f$ validators can fail and the system should run, +- the basic idea is that up to $f$ executors can fail and the system should run, so if there are $f$ Byzantine faulty nodes, you want them to be in the $b$ set as much as possible - empty blocks are not produced, so to prevent an evil leader from censoring transactions @@ -209,7 +209,7 @@ this is because we want to just move on and not worry about assigning blame, whi ###### Network Topology A network of nodes is assumed, where each node knows the identity of all other nodes on the network. -These nodes are called *validators*. We also assume that there are $3f+1$ validators on the network, +These nodes are called *executors*. We also assume that there are $3f+1$ executors on the network, where $f$ is the number of simultaneous Byzantine faulty nodes that the network can contain and still properly function (albeit, performance will degrade in the presence of a Byzantine faulty node, but this is okay because Hyperledger Iroha is designed to operate in a permissioned environment). @@ -223,7 +223,7 @@ such that there is a deterministic and canonical order for each block. In this ordering, the first $2f+1$ nodes are grouped into a set called set $a$. Under normal (non-faulty) conditions, consensus for a block is performed by set $a$. The remaining $f$ nodes are grouped into a set called set $b$. Under normal conditions, -set $b$ acts as a passive set of validators to view and receive committed blocks, +set $b$ acts as a passive set of executors to view and receive committed blocks, but otherwise they do not participate in consensus. ###### Data Flow: Normal Case diff --git a/docs/source/lts_selection.org b/docs/source/lts_selection.org index 9ad06ad2f6d..4e2ee75c572 100644 --- a/docs/source/lts_selection.org +++ b/docs/source/lts_selection.org @@ -50,11 +50,11 @@ for selecting a particular version as an LTS candidate things" should be prioritised as an LTS candidate. For example, RC12 and RC13, were the last versions of Iroha that - still used a hard-coded permission validator. Them being labelled + still used a hard-coded permission executor. Them being labelled as an LTS candidate was precluded by the major known issues, particularly with stability, poor coverage, and because releasing an LTS after RC9 would have split the development resources off - from fixing the issue of rigid un-modifiable permission validators. + from fixing the issue of rigid un-modifiable permission executors. RC14 and RC15 on the other hand, were in the process of a slow migration of features. As such, the latter versions would be diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 4e875a7cfef..36ef9093fd5 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -933,9 +933,9 @@ "type": "ConfigurationEvent" }, { - "tag": "Validator", + "tag": "Executor", "discriminant": 9, - "type": "ValidatorEvent" + "type": "ExecutorEvent" } ] }, @@ -1372,6 +1372,36 @@ } ] }, + "Executor": { + "Struct": [ + { + "name": "wasm", + "type": "WasmSmartContract" + } + ] + }, + "ExecutorEvent": { + "Enum": [ + { + "tag": "Upgraded", + "discriminant": 0 + } + ] + }, + "ExecutorMode": { + "Enum": [ + { + "tag": "Path", + "discriminant": 0, + "type": "String" + }, + { + "tag": "Inline", + "discriminant": 1, + "type": "Executor" + } + ] + }, "Expression": { "Enum": [ { @@ -3688,8 +3718,8 @@ "type": "Vec>" }, { - "name": "validator", - "type": "ValidatorMode" + "name": "executor", + "type": "ExecutorMode" } ] }, @@ -4584,9 +4614,9 @@ "UpgradableBox": { "Enum": [ { - "tag": "Validator", + "tag": "Executor", "discriminant": 0, - "type": "Validator" + "type": "Executor" } ] }, @@ -4625,36 +4655,6 @@ } ] }, - "Validator": { - "Struct": [ - { - "name": "wasm", - "type": "WasmSmartContract" - } - ] - }, - "ValidatorEvent": { - "Enum": [ - { - "tag": "Upgraded", - "discriminant": 0 - } - ] - }, - "ValidatorMode": { - "Enum": [ - { - "tag": "Path", - "discriminant": 0, - "type": "String" - }, - { - "tag": "Inline", - "discriminant": 1, - "type": "Validator" - } - ] - }, "Value": { "Enum": [ { @@ -4763,9 +4763,9 @@ "type": "NumericValue" }, { - "tag": "Validator", + "tag": "Executor", "discriminant": 21, - "type": "Validator" + "type": "Executor" }, { "tag": "LogLevel", diff --git a/genesis/src/lib.rs b/genesis/src/lib.rs index 3fc8622663f..3ea5510a364 100644 --- a/genesis/src/lib.rs +++ b/genesis/src/lib.rs @@ -21,8 +21,8 @@ use iroha_config::genesis::Configuration; use iroha_crypto::{KeyPair, PublicKey}; use iroha_data_model::{ asset::AssetDefinition, + executor::Executor, prelude::{Metadata, *}, - validator::Validator, }; use iroha_schema::IntoSchema; use once_cell::sync::Lazy; @@ -66,10 +66,10 @@ impl GenesisNetwork { .ok_or_else(|| eyre!("Genesis account private key is empty."))?, )?; #[cfg(not(test))] - // First instruction should be Validator upgrade. + // First instruction should be Executor upgrade. // This makes possible to grant permissions to users in genesis. let transactions_iter = std::iter::once(GenesisTransactionBuilder { - isi: vec![UpgradeExpr::new(Validator::try_from(raw_block.validator)?).into()], + isi: vec![UpgradeExpr::new(Executor::try_from(raw_block.executor)?).into()], }) .chain(raw_block.transactions.into_iter()); @@ -101,8 +101,8 @@ impl GenesisNetwork { pub struct RawGenesisBlock { /// Transactions transactions: Vec, - /// Runtime Validator - validator: ValidatorMode, + /// Runtime Executor + executor: ExecutorMode, } impl RawGenesisBlock { @@ -127,7 +127,7 @@ impl RawGenesisBlock { "Failed to deserialize raw genesis block from {:?}", &path ))?; - raw_genesis_block.validator.set_genesis_path(path); + raw_genesis_block.executor.set_genesis_path(path); Ok(raw_genesis_block) } @@ -137,18 +137,18 @@ impl RawGenesisBlock { } } -/// Ways to provide validator either directly as base64 encoded string or as path to wasm file +/// Ways to provide executor either directly as base64 encoded string or as path to wasm file #[derive(Debug, Clone, From, Deserialize, Serialize, IntoSchema)] #[serde(untagged)] -pub enum ValidatorMode { - /// Path to validator wasm file +pub enum ExecutorMode { + /// Path to executor wasm file // In the first place to initially try to parse path - Path(ValidatorPath), - /// Validator encoded as base64 string - Inline(Validator), + Path(ExecutorPath), + /// Executor encoded as base64 string + Inline(Executor), } -impl ValidatorMode { +impl ExecutorMode { fn set_genesis_path(&mut self, genesis_path: impl AsRef) { if let Self::Path(path) = self { path.set_genesis_path(genesis_path); @@ -156,38 +156,38 @@ impl ValidatorMode { } } -impl TryFrom for Validator { +impl TryFrom for Executor { type Error = ErrReport; - fn try_from(value: ValidatorMode) -> Result { + fn try_from(value: ExecutorMode) -> Result { match value { - ValidatorMode::Inline(validator) => Ok(validator), - ValidatorMode::Path(ValidatorPath(relative_validator_path)) => { - let wasm = fs::read(&relative_validator_path) - .wrap_err(format!("Failed to open {:?}", &relative_validator_path))?; - Ok(Validator::new(WasmSmartContract::from_compiled(wasm))) + ExecutorMode::Inline(executor) => Ok(executor), + ExecutorMode::Path(ExecutorPath(relative_executor_path)) => { + let wasm = fs::read(&relative_executor_path) + .wrap_err(format!("Failed to open {:?}", &relative_executor_path))?; + Ok(Executor::new(WasmSmartContract::from_compiled(wasm))) } } } } -/// Path to the validator relative to genesis location +/// Path to the executor relative to genesis location /// /// If path is absolute it will be used directly otherwise it will be treated as relative to genesis location. #[derive(Debug, Clone, Deserialize, Serialize, IntoSchema)] #[schema(transparent = "String")] #[serde(transparent)] #[repr(transparent)] -pub struct ValidatorPath(pub PathBuf); +pub struct ExecutorPath(pub PathBuf); -impl ValidatorPath { +impl ExecutorPath { fn set_genesis_path(&mut self, genesis_path: impl AsRef) { - let path_to_validator = genesis_path + let path_to_executor = genesis_path .as_ref() .parent() .expect("Genesis must be in some directory") .join(&self.0); - self.0 = path_to_validator; + self.0 = path_to_executor; } } @@ -241,17 +241,17 @@ pub struct RawGenesisDomainBuilder { state: S, } -mod validator_state { - use super::ValidatorMode; +mod executor_state { + use super::ExecutorMode; #[cfg_attr(test, derive(Clone))] - pub struct Set(pub ValidatorMode); + pub struct Set(pub ExecutorMode); #[derive(Clone, Copy)] pub struct Unset; } -impl RawGenesisBlockBuilder { +impl RawGenesisBlockBuilder { /// Initiate the building process. pub fn new() -> Self { // Do not add `impl Default`. While it can technically be @@ -260,18 +260,18 @@ impl RawGenesisBlockBuilder { // be called. Self { transaction: GenesisTransactionBuilder { isi: Vec::new() }, - state: validator_state::Unset, + state: executor_state::Unset, } } - /// Set the validator. - pub fn validator( + /// Set the executor. + pub fn executor( self, - validator: impl Into, - ) -> RawGenesisBlockBuilder { + executor: impl Into, + ) -> RawGenesisBlockBuilder { RawGenesisBlockBuilder { transaction: self.transaction, - state: validator_state::Set(validator.into()), + state: executor_state::Set(executor.into()), } } } @@ -303,12 +303,12 @@ impl RawGenesisBlockBuilder { } } -impl RawGenesisBlockBuilder { +impl RawGenesisBlockBuilder { /// Finish building and produce a `RawGenesisBlock`. pub fn build(self) -> RawGenesisBlock { RawGenesisBlock { transactions: vec![self.transaction], - validator: self.state.0, + executor: self.state.0, } } } @@ -374,8 +374,8 @@ mod tests { use super::*; - fn dummy_validator() -> ValidatorMode { - ValidatorMode::Path(ValidatorPath("./validator.wasm".into())) + fn dummy_executor() -> ExecutorMode { + ExecutorMode::Path(ExecutorPath("./executor.wasm".into())) } #[test] @@ -388,7 +388,7 @@ mod tests { .domain("wonderland".parse()?) .account("alice".parse()?, alice_public_key) .finish_domain() - .validator(dummy_validator()) + .executor(dummy_executor()) .build(), Some( &ConfigurationProxy { @@ -421,8 +421,8 @@ mod tests { .asset("hats".parse().unwrap(), AssetValueType::BigQuantity) .finish_domain(); - // In real cases validator should be constructed from a wasm blob - let finished_genesis_block = genesis_builder.validator(dummy_validator()).build(); + // In real cases executor should be constructed from a wasm blob + let finished_genesis_block = genesis_builder.executor(dummy_executor()).build(); { let domain_id: DomainId = "wonderland".parse().unwrap(); assert_eq!( diff --git a/schema/gen/src/lib.rs b/schema/gen/src/lib.rs index c6f384f62a9..50aba8e8442 100644 --- a/schema/gen/src/lib.rs +++ b/schema/gen/src/lib.rs @@ -366,8 +366,8 @@ types!( UnregisterExpr, UpgradableBox, ValidationFail, - Validator, - ValidatorEvent, + Executor, + ExecutorEvent, Value, ValueOfKey, ValuePredicate, @@ -413,6 +413,7 @@ mod tests { BlockHeader, SignedBlock, SignedBlockV1, }, domain::NewDomain, + executor::Executor, http::{BatchedResponse, BatchedResponseV1}, ipfs::IpfsPath, predicate::{ @@ -428,7 +429,6 @@ mod tests { ForwardCursor, }, transaction::{error::TransactionLimitError, SignedTransactionV1, TransactionLimits}, - validator::Validator, SignedBlockWrapper, }; use iroha_genesis::RawGenesisBlock; diff --git a/scripts/test_env.py b/scripts/test_env.py index 7fe2007a4e0..66b0490ab06 100755 --- a/scripts/test_env.py +++ b/scripts/test_env.py @@ -30,7 +30,7 @@ def __init__(self, args: argparse.Namespace): try: shutil.copy2(f"{args.root_dir}/configs/peer/config.json", peers_dir) shutil.copy2(f"{args.root_dir}/configs/peer/genesis.json", peers_dir) - shutil.copy2(f"{args.root_dir}/configs/peer/validator.wasm", peers_dir) + shutil.copy2(f"{args.root_dir}/configs/peer/executor.wasm", peers_dir) except FileNotFoundError: logging.error(f"Some of the config files are missing. \ Please provide them in the `{args.root_dir}/configs/peer` directory") diff --git a/scripts/tests/consistency.sh b/scripts/tests/consistency.sh index 3e2a833e998..dd5a5291a5c 100755 --- a/scripts/tests/consistency.sh +++ b/scripts/tests/consistency.sh @@ -8,8 +8,8 @@ case $1 in exit 1 };; "genesis") - cargo run --release --bin kagami -- genesis --validator-path-in-genesis ./validator.wasm | diff - configs/peer/genesis.json || { - echo 'Please re-generate the genesis with `cargo run --release --bin kagami -- genesis --validator-path-in-genesis ./validator.wasm > configs/peer/genesis.json`' + cargo run --release --bin kagami -- genesis --executor-path-in-genesis ./executor.wasm | diff - configs/peer/genesis.json || { + echo 'Please re-generate the genesis with `cargo run --release --bin kagami -- genesis --executor-path-in-genesis ./executor.wasm > configs/peer/genesis.json`' exit 1 };; "client") diff --git a/scripts/update_configs.sh b/scripts/update_configs.sh index 876ad654ceb..1c4af8a9bc7 100755 --- a/scripts/update_configs.sh +++ b/scripts/update_configs.sh @@ -22,4 +22,4 @@ curl https://raw.githubusercontent.com/hyperledger/iroha/iroha2-lts/configs/peer curl https://raw.githubusercontent.com/hyperledger/iroha/iroha2-stable/configs/peer/config.json -o ./configs/peer/$1/config.json curl https://raw.githubusercontent.com/hyperledger/iroha/iroha2-stable/configs/peer/genesis.json -o ./configs/peer/$1/genesis.json -curl https://raw.githubusercontent.com/hyperledger/iroha/iroha2-stable/configs/peer/genesis.json -o ./configs/peer/$1/validator.wasm +curl https://raw.githubusercontent.com/hyperledger/iroha/iroha2-stable/configs/peer/genesis.json -o ./configs/peer/$1/executor.wasm diff --git a/smart_contract/validator/Cargo.toml b/smart_contract/executor/Cargo.toml similarity index 87% rename from smart_contract/validator/Cargo.toml rename to smart_contract/executor/Cargo.toml index 22cca4dd92a..6e0eb5bcda7 100644 --- a/smart_contract/validator/Cargo.toml +++ b/smart_contract/executor/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "iroha_validator" +name = "iroha_executor" version.workspace = true authors.workspace = true @@ -16,7 +16,7 @@ debug = ["iroha_smart_contract/debug"] [dependencies] iroha_smart_contract_utils.workspace = true iroha_smart_contract.workspace = true -iroha_validator_derive.workspace = true +iroha_executor_derive.workspace = true iroha_data_model.workspace = true iroha_schema.workspace = true diff --git a/smart_contract/validator/derive/Cargo.toml b/smart_contract/executor/derive/Cargo.toml similarity index 88% rename from smart_contract/validator/derive/Cargo.toml rename to smart_contract/executor/derive/Cargo.toml index a2c930c1eda..5c9503883c9 100644 --- a/smart_contract/validator/derive/Cargo.toml +++ b/smart_contract/executor/derive/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "iroha_validator_derive" +name = "iroha_executor_derive" version.workspace = true authors.workspace = true diff --git a/smart_contract/validator/derive/src/conversion.rs b/smart_contract/executor/derive/src/conversion.rs similarity index 89% rename from smart_contract/validator/derive/src/conversion.rs rename to smart_contract/executor/derive/src/conversion.rs index 2e743cddc6b..87b27becbb5 100644 --- a/smart_contract/validator/derive/src/conversion.rs +++ b/smart_contract/executor/derive/src/conversion.rs @@ -9,7 +9,7 @@ pub fn impl_derive_ref_into_asset_owner(input: TokenStream) -> TokenStream { impl_from( &input.ident, &input.generics, - &syn::parse_quote!(::iroha_validator::permission::asset::Owner), + &syn::parse_quote!(::iroha_executor::permission::asset::Owner), &syn::parse_quote!(asset_id), ) .into() @@ -23,7 +23,7 @@ pub fn impl_derive_ref_into_asset_definition_owner(input: TokenStream) -> TokenS impl_from( &input.ident, &input.generics, - &syn::parse_quote!(::iroha_validator::permission::asset_definition::Owner), + &syn::parse_quote!(::iroha_executor::permission::asset_definition::Owner), &syn::parse_quote!(asset_definition_id), ) .into() @@ -36,7 +36,7 @@ pub fn impl_derive_ref_into_account_owner(input: TokenStream) -> TokenStream { impl_from( &input.ident, &input.generics, - &syn::parse_quote!(::iroha_validator::permission::account::Owner), + &syn::parse_quote!(::iroha_executor::permission::account::Owner), &syn::parse_quote!(account_id), ) .into() @@ -49,7 +49,7 @@ pub fn impl_derive_ref_into_domain_owner(input: TokenStream) -> TokenStream { impl_from( &input.ident, &input.generics, - &syn::parse_quote!(::iroha_validator::permission::domain::Owner), + &syn::parse_quote!(::iroha_executor::permission::domain::Owner), &syn::parse_quote!(domain_id), ) .into() diff --git a/smart_contract/validator/derive/src/entrypoint.rs b/smart_contract/executor/derive/src/entrypoint.rs similarity index 67% rename from smart_contract/validator/derive/src/entrypoint.rs rename to smart_contract/executor/derive/src/entrypoint.rs index 0baa04cb8f2..d89414f4e23 100644 --- a/smart_contract/validator/derive/src/entrypoint.rs +++ b/smart_contract/executor/derive/src/entrypoint.rs @@ -1,12 +1,12 @@ -//! Module [`validator_entrypoint`](crate::validator_entrypoint) macro implementation +//! Module [`executor_entrypoint`](crate::executor_entrypoint) macro implementation use super::*; mod export { - pub const VALIDATOR_VALIDATE_TRANSACTION: &str = "_iroha_validator_validate_transaction"; - pub const VALIDATOR_VALIDATE_INSTRUCTION: &str = "_iroha_validator_validate_instruction"; - pub const VALIDATOR_VALIDATE_QUERY: &str = "_iroha_validator_validate_query"; - pub const VALIDATOR_MIGRATE: &str = "_iroha_validator_migrate"; + pub const EXECUTOR_VALIDATE_TRANSACTION: &str = "_iroha_executor_validate_transaction"; + pub const EXECUTOR_VALIDATE_INSTRUCTION: &str = "_iroha_executor_validate_instruction"; + pub const EXECUTOR_VALIDATE_QUERY: &str = "_iroha_executor_validate_query"; + pub const EXECUTOR_MIGRATE: &str = "_iroha_executor_migrate"; } mod import { @@ -15,14 +15,14 @@ mod import { pub const GET_VALIDATE_QUERY_PAYLOAD: &str = "get_validate_query_payload"; } -/// [`validator_entrypoint`](crate::validator_entrypoint()) macro implementation +/// [`executor_entrypoint`](crate::executor_entrypoint()) macro implementation #[allow(clippy::needless_pass_by_value)] pub fn impl_entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { let fn_item = parse_macro_input!(item as syn::ItemFn); assert!( attr.is_empty(), - "`#[entrypoint]` macro for Validator entrypoints accepts no attributes" + "`#[entrypoint]` macro for Executor entrypoints accepts no attributes" ); macro_rules! match_entrypoints { @@ -44,7 +44,7 @@ pub fn impl_entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { })* $(fn_name if fn_name == stringify!($other_user_entrypoint_name) => $branch),* _ => panic!( - "Validator entrypoint name must be one of: {:?}", + "Executor entrypoint name must be one of: {:?}", [ $(stringify!($user_entrypoint_name),)* $(stringify!($other_user_entrypoint_name),)* @@ -56,9 +56,9 @@ pub fn impl_entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { match_entrypoints! { validate: { - validate_transaction => VALIDATOR_VALIDATE_TRANSACTION(GET_VALIDATE_TRANSACTION_PAYLOAD), - validate_instruction => VALIDATOR_VALIDATE_INSTRUCTION(GET_VALIDATE_INSTRUCTION_PAYLOAD), - validate_query => VALIDATOR_VALIDATE_QUERY(GET_VALIDATE_QUERY_PAYLOAD), + validate_transaction => EXECUTOR_VALIDATE_TRANSACTION(GET_VALIDATE_TRANSACTION_PAYLOAD), + validate_instruction => EXECUTOR_VALIDATE_INSTRUCTION(GET_VALIDATE_INSTRUCTION_PAYLOAD), + validate_query => EXECUTOR_VALIDATE_QUERY(GET_VALIDATE_QUERY_PAYLOAD), } other: { migrate => { impl_migrate_entrypoint(fn_item) } @@ -82,13 +82,13 @@ fn impl_validate_entrypoint( assert!( matches!(sig.output, syn::ReturnType::Type(_, _)), - "Validator `{user_entrypoint_name}` entrypoint must have `Result` return type" + "Executor `{user_entrypoint_name}` entrypoint must have `Result` return type" ); block.stmts.insert( 0, parse_quote!( - use ::iroha_validator::smart_contract::{ExecuteOnHost as _, QueryHost as _}; + use ::iroha_executor::smart_contract::{ExecuteOnHost as _, QueryHost as _}; ), ); @@ -101,19 +101,19 @@ fn impl_validate_entrypoint( ); quote! { - /// Validator `validate` entrypoint + /// Executor `validate` entrypoint /// /// # Memory safety /// /// This function transfers the ownership of allocated - /// [`Result`](::iroha_validator::data_model::validator::Result) + /// [`Result`](::iroha_executor::data_model::executor::Result) #[no_mangle] #[doc(hidden)] unsafe extern "C" fn #generated_entrypoint_ident() -> *const u8 { - let payload = ::iroha_validator::#get_validation_payload_fn_ident(); - let verdict: ::iroha_validator::data_model::validator::Result = + let payload = ::iroha_executor::#get_validation_payload_fn_ident(); + let verdict: ::iroha_executor::data_model::executor::Result = #fn_name(payload.authority, payload.to_validate, payload.block_height); - let bytes_box = ::core::mem::ManuallyDrop::new(::iroha_validator::utils::encode_with_length_prefix(&verdict)); + let bytes_box = ::core::mem::ManuallyDrop::new(::iroha_executor::utils::encode_with_length_prefix(&verdict)); bytes_box.as_ptr() } @@ -138,14 +138,13 @@ fn impl_migrate_entrypoint(fn_item: syn::ItemFn) -> TokenStream { assert!( matches!(sig.output, syn::ReturnType::Type(_, _)), - "Validator `migrate()` entrypoint must have `MigrationResult` return type" + "Executor `migrate()` entrypoint must have `MigrationResult` return type" ); - let migrate_fn_name = - syn::Ident::new(export::VALIDATOR_MIGRATE, proc_macro2::Span::call_site()); + let migrate_fn_name = syn::Ident::new(export::EXECUTOR_MIGRATE, proc_macro2::Span::call_site()); quote! { - /// Validator `permission_token_schema` entrypoint + /// Executor `permission_token_schema` entrypoint /// /// # Memory safety /// @@ -153,9 +152,9 @@ fn impl_migrate_entrypoint(fn_item: syn::ItemFn) -> TokenStream { #[no_mangle] #[doc(hidden)] unsafe extern "C" fn #migrate_fn_name() -> *const u8 { - let payload = ::iroha_validator::get_migrate_payload(); - let res: ::iroha_validator::data_model::validator::MigrationResult = #fn_name(payload.block_height); - let bytes = ::core::mem::ManuallyDrop::new(::iroha_validator::utils::encode_with_length_prefix(&res)); + let payload = ::iroha_executor::get_migrate_payload(); + let res: ::iroha_executor::data_model::executor::MigrationResult = #fn_name(payload.block_height); + let bytes = ::core::mem::ManuallyDrop::new(::iroha_executor::utils::encode_with_length_prefix(&res)); ::core::mem::ManuallyDrop::new(bytes).as_ptr() } diff --git a/smart_contract/validator/derive/src/lib.rs b/smart_contract/executor/derive/src/lib.rs similarity index 95% rename from smart_contract/validator/derive/src/lib.rs rename to smart_contract/executor/derive/src/lib.rs index bf0ff4c00ab..186f01e7be8 100644 --- a/smart_contract/validator/derive/src/lib.rs +++ b/smart_contract/executor/derive/src/lib.rs @@ -1,4 +1,4 @@ -//! Crate with validator-related derive macros. +//! Crate with executor-related derive macros. #![allow(clippy::panic)] @@ -11,14 +11,14 @@ mod entrypoint; mod token; mod validate; -/// Annotate the user-defined function that starts the execution of a validator. +/// Annotate the user-defined function that starts the execution of a executor. /// /// There are 4 acceptable forms of this macro usage. See examples. /// /// # Examples /// /// ```ignore -/// use iroha_validator::prelude::*; +/// use iroha_executor::prelude::*; /// /// #[entrypoint] /// pub fn migrate(block_height: u64) -> MigrationResult { @@ -54,7 +54,7 @@ pub fn entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { /// # Example /// /// ```ignore -/// use iroha_validator::{permission, prelude::*}; +/// use iroha_executor::{permission, prelude::*}; /// /// #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] /// #[validate(permission::asset::Owner)] @@ -100,7 +100,7 @@ pub fn derive_token(input: TokenStream) -> TokenStream { /// /// # Pass conditions /// -/// You can pass any type implementing `iroha_validator::permission::PassCondition` +/// You can pass any type implementing `iroha_executor::permission::PassCondition` /// and `From<&YourToken>` traits. /// /// ## Builtin @@ -114,7 +114,7 @@ pub fn derive_token(input: TokenStream) -> TokenStream { /// - `OnlyGenesis` - checks that block height is 0. /// /// -/// Also check out `iroha_validator::permission::derive_conversion` module +/// Also check out `iroha_executor::permission::derive_conversion` module /// for conversion derive macros from your token to this *Pass Conditions*. /// /// ## Why *Pass Conditions*? diff --git a/smart_contract/validator/derive/src/token.rs b/smart_contract/executor/derive/src/token.rs similarity index 58% rename from smart_contract/validator/derive/src/token.rs rename to smart_contract/executor/derive/src/token.rs index 748797ee14f..97b1b3b4edb 100644 --- a/smart_contract/validator/derive/src/token.rs +++ b/smart_contract/executor/derive/src/token.rs @@ -24,11 +24,11 @@ fn impl_token(ident: &syn::Ident, generics: &syn::Generics) -> proc_macro2::Toke let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); quote! { - impl #impl_generics ::iroha_validator::permission::Token for #ident #ty_generics #where_clause { - fn is_owned_by(&self, account_id: &::iroha_validator::data_model::account::AccountId) -> bool { - let all_account_tokens: Vec = ::iroha_validator::smart_contract::debug::DebugExpectExt::dbg_expect( - ::iroha_validator::smart_contract::QueryHost::execute( - &::iroha_validator::data_model::query::permission::FindPermissionTokensByAccountId::new( + impl #impl_generics ::iroha_executor::permission::Token for #ident #ty_generics #where_clause { + fn is_owned_by(&self, account_id: &::iroha_executor::data_model::account::AccountId) -> bool { + let all_account_tokens: Vec = ::iroha_executor::smart_contract::debug::DebugExpectExt::dbg_expect( + ::iroha_executor::smart_contract::QueryHost::execute( + &::iroha_executor::data_model::query::permission::FindPermissionTokensByAccountId::new( account_id.clone(), ) ), @@ -49,20 +49,20 @@ fn impl_try_from_permission_token( generics: &syn::Generics, ) -> proc_macro2::TokenStream { let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); - let token_id = quote! { ::name() }; + let token_id = quote! { ::name() }; quote! { - impl #impl_generics ::core::convert::TryFrom<::iroha_validator::data_model::permission::PermissionToken> for #ident #ty_generics #where_clause { - type Error = ::iroha_validator::permission::PermissionTokenConversionError; + impl #impl_generics ::core::convert::TryFrom<::iroha_executor::data_model::permission::PermissionToken> for #ident #ty_generics #where_clause { + type Error = ::iroha_executor::permission::PermissionTokenConversionError; - fn try_from(token: ::iroha_validator::data_model::permission::PermissionToken) -> ::core::result::Result { + fn try_from(token: ::iroha_executor::data_model::permission::PermissionToken) -> ::core::result::Result { if #token_id != *token.definition_id() { - return Err(::iroha_validator::permission::PermissionTokenConversionError::Id( + return Err(::iroha_executor::permission::PermissionTokenConversionError::Id( ToOwned::to_owned(token.definition_id()) )); } ::serde_json::from_str::(token.payload()) - .map_err(::iroha_validator::permission::PermissionTokenConversionError::Deserialize) + .map_err(::iroha_executor::permission::PermissionTokenConversionError::Deserialize) } } } diff --git a/smart_contract/validator/derive/src/validate.rs b/smart_contract/executor/derive/src/validate.rs similarity index 93% rename from smart_contract/validator/derive/src/validate.rs rename to smart_contract/executor/derive/src/validate.rs index 0ffc97afad8..7f5e59276b9 100644 --- a/smart_contract/validator/derive/src/validate.rs +++ b/smart_contract/executor/derive/src/validate.rs @@ -15,7 +15,7 @@ pub fn impl_derive_validate(input: TokenStream) -> TokenStream { let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); quote! { - impl #impl_generics ::iroha_validator::permission::ValidateGrantRevoke for #ident #ty_generics + impl #impl_generics ::iroha_executor::permission::ValidateGrantRevoke for #ident #ty_generics #where_clause { #validate_grant_impl @@ -181,10 +181,10 @@ fn gen_validate_impl(isi_name: IsiName, pass_condition: &Type) -> proc_macro2::T let doc_intro = match isi_name { IsiName::Grant => { - "Validate [`Grant`](::iroha_validator::data_model::prelude::Grant) instruction.\n" + "Validate [`Grant`](::iroha_executor::data_model::prelude::Grant) instruction.\n" } IsiName::Revoke => { - "Validate [`Revoke`](::iroha_validator::data_model::prelude::Revoke) instruction.\n" + "Validate [`Revoke`](::iroha_executor::data_model::prelude::Revoke) instruction.\n" } }; @@ -196,12 +196,12 @@ fn gen_validate_impl(isi_name: IsiName, pass_condition: &Type) -> proc_macro2::T #[doc = #pass_condition_str] #[doc = "`]"] #[inline] - fn #fn_name(&self, authority: &::iroha_validator::data_model::account::AccountId, block_height: u64) -> ::iroha_validator::data_model::validator::Result { + fn #fn_name(&self, authority: &::iroha_executor::data_model::account::AccountId, block_height: u64) -> ::iroha_executor::data_model::executor::Result { let condition = <#pass_condition as ::core::convert::From<&Self>>::from(&self); < #pass_condition as - ::iroha_validator::permission::PassCondition + ::iroha_executor::permission::PassCondition >::validate(&condition, authority, block_height) } } diff --git a/smart_contract/validator/src/default.rs b/smart_contract/executor/src/default.rs similarity index 75% rename from smart_contract/validator/src/default.rs rename to smart_contract/executor/src/default.rs index 167ece90e14..816e9e58ab3 100644 --- a/smart_contract/validator/src/default.rs +++ b/smart_contract/executor/src/default.rs @@ -1,4 +1,4 @@ -//! Definition of Iroha default validator and accompanying validation functions +//! Definition of Iroha default executor and accompanying validation functions #![allow(missing_docs, clippy::missing_errors_doc)] use alloc::{borrow::ToOwned, format, string::String}; @@ -20,6 +20,7 @@ pub use domain::{ visit_remove_domain_key_value, visit_set_domain_key_value, visit_transfer_domain, visit_unregister_domain, }; +pub use executor::visit_upgrade_executor; pub use parameter::{visit_new_parameter, visit_set_parameter}; pub use peer::visit_unregister_peer; pub use permission_token::{visit_grant_account_permission, visit_revoke_account_permission}; @@ -30,7 +31,6 @@ pub use trigger::{ visit_burn_trigger_repetitions, visit_execute_trigger, visit_mint_trigger_repetitions, visit_unregister_trigger, }; -pub use validator::visit_upgrade_validator; use crate::{permission, permission::Token as _, prelude::*}; @@ -64,7 +64,7 @@ macro_rules! map_all_crate_tokens { $crate::default::peer::map_tokens!($callback); $crate::default::role::map_tokens!($callback); $crate::default::trigger::map_tokens!($callback); - $crate::default::validator::map_tokens!($callback); + $crate::default::executor::map_tokens!($callback); }; } @@ -81,7 +81,7 @@ macro_rules! token { pub(crate) use map_all_crate_tokens; pub fn default_permission_token_schema() -> PermissionTokenSchema { - let mut schema = iroha_validator::PermissionTokenSchema::default(); + let mut schema = iroha_executor::PermissionTokenSchema::default(); macro_rules! add_to_schema { ($token_ty:ty) => { @@ -89,7 +89,7 @@ pub fn default_permission_token_schema() -> PermissionTokenSchema { }; } - iroha_validator::default::map_all_crate_tokens!(add_to_schema); + iroha_executor::default::map_all_crate_tokens!(add_to_schema); schema } @@ -101,16 +101,16 @@ pub fn default_permission_token_schema() -> PermissionTokenSchema { /// Each instruction is executed in sequence following successful validation. /// [`Executable::Wasm`] is not executed because it is validated on the host side. pub fn visit_transaction( - validator: &mut V, + executor: &mut V, authority: &AccountId, transaction: &SignedTransaction, ) { match transaction.payload().instructions() { - Executable::Wasm(wasm) => validator.visit_wasm(authority, wasm), + Executable::Wasm(wasm) => executor.visit_wasm(authority, wasm), Executable::Instructions(instructions) => { for isi in instructions { - if validator.verdict().is_ok() { - validator.visit_instruction(authority, isi); + if executor.verdict().is_ok() { + executor.visit_instruction(authority, isi); } } } @@ -123,73 +123,73 @@ pub fn visit_transaction( /// /// Instruction is executed following successful validation pub fn visit_instruction( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: &InstructionExpr, ) { - macro_rules! isi_validators { + macro_rules! isi_executors { ( single {$( - $validator:ident($isi:ident) + $executor:ident($isi:ident) ),+ $(,)?} composite {$( - $composite_validator:ident($composite_isi:ident) + $composite_executor:ident($composite_isi:ident) ),+ $(,)?} ) => { match isi { InstructionExpr::NewParameter(isi) => { - let parameter = evaluate_expr!(validator, authority, ::parameter()); - validator.visit_new_parameter(authority, NewParameter{parameter}); + let parameter = evaluate_expr!(executor, authority, ::parameter()); + executor.visit_new_parameter(authority, NewParameter{parameter}); - if validator.verdict().is_ok() { - isi_validators!(@execute isi); + if executor.verdict().is_ok() { + isi_executors!(@execute isi); } } InstructionExpr::SetParameter(isi) => { - let parameter = evaluate_expr!(validator, authority, ::parameter()); - validator.visit_set_parameter(authority, SetParameter{parameter}); + let parameter = evaluate_expr!(executor, authority, ::parameter()); + executor.visit_set_parameter(authority, SetParameter{parameter}); - if validator.verdict().is_ok() { - isi_validators!(@execute isi); + if executor.verdict().is_ok() { + isi_executors!(@execute isi); } } InstructionExpr::ExecuteTrigger(isi) => { - let trigger_id = evaluate_expr!(validator, authority, ::trigger_id()); - validator.visit_execute_trigger(authority, ExecuteTrigger{trigger_id}); + let trigger_id = evaluate_expr!(executor, authority, ::trigger_id()); + executor.visit_execute_trigger(authority, ExecuteTrigger{trigger_id}); - if validator.verdict().is_ok() { - isi_validators!(@execute isi); + if executor.verdict().is_ok() { + isi_executors!(@execute isi); } } InstructionExpr::Log(isi) => { - let msg = evaluate_expr!(validator, authority, ::msg()); - let level = evaluate_expr!(validator, authority, ::level()); - validator.visit_log(authority, Log{level, msg}); + let msg = evaluate_expr!(executor, authority, ::msg()); + let level = evaluate_expr!(executor, authority, ::level()); + executor.visit_log(authority, Log{level, msg}); - if validator.verdict().is_ok() { - isi_validators!(@execute isi); + if executor.verdict().is_ok() { + isi_executors!(@execute isi); } } $( InstructionExpr::$isi(isi) => { - validator.$validator(authority, isi); + executor.$executor(authority, isi); - if validator.verdict().is_ok() { - isi_validators!(@execute isi); + if executor.verdict().is_ok() { + isi_executors!(@execute isi); } } )+ $( // NOTE: `visit_and_execute_instructions` is reentrant, so don't execute composite instructions - InstructionExpr::$composite_isi(isi) => validator.$composite_validator(authority, isi), )+ + InstructionExpr::$composite_isi(isi) => executor.$composite_executor(authority, isi), )+ } }; (@execute $isi:ident) => { // TODO: Execution should be infallible after successful validation if let Err(err) = isi.execute() { - validator.deny(err); + executor.deny(err); } } } - isi_validators! { + isi_executors! { single { visit_burn(Burn), visit_fail(Fail), @@ -213,24 +213,24 @@ pub fn visit_instruction( } pub fn visit_unsupported( - validator: &mut V, + executor: &mut V, _authority: &AccountId, isi: T, ) { - deny!(validator, "{isi:?}: Unsupported operation"); + deny!(executor, "{isi:?}: Unsupported operation"); } pub fn visit_expression( - validator: &mut V, + executor: &mut V, authority: &AccountId, expression: &EvaluatesTo, ) { macro_rules! visit_binary_expression { ($e:ident) => {{ - validator.visit_expression(authority, $e.left()); + executor.visit_expression(authority, $e.left()); - if validator.verdict().is_ok() { - validator.visit_expression(authority, $e.right()); + if executor.verdict().is_ok() { + executor.visit_expression(authority, $e.right()); } }}; } @@ -245,78 +245,78 @@ pub fn visit_expression( Expression::Greater(expr) => visit_binary_expression!(expr), Expression::Less(expr) => visit_binary_expression!(expr), Expression::Equal(expr) => visit_binary_expression!(expr), - Expression::Not(expr) => validator.visit_expression(authority, expr.expression()), + Expression::Not(expr) => executor.visit_expression(authority, expr.expression()), Expression::And(expr) => visit_binary_expression!(expr), Expression::Or(expr) => visit_binary_expression!(expr), Expression::If(expr) => { - validator.visit_expression(authority, expr.condition()); + executor.visit_expression(authority, expr.condition()); - if validator.verdict().is_ok() { - validator.visit_expression(authority, expr.then()); + if executor.verdict().is_ok() { + executor.visit_expression(authority, expr.then()); } - if validator.verdict().is_ok() { - validator.visit_expression(authority, expr.otherwise()); + if executor.verdict().is_ok() { + executor.visit_expression(authority, expr.otherwise()); } } Expression::Contains(expr) => { - validator.visit_expression(authority, expr.collection()); + executor.visit_expression(authority, expr.collection()); - if validator.verdict().is_ok() { - validator.visit_expression(authority, expr.element()); + if executor.verdict().is_ok() { + executor.visit_expression(authority, expr.element()); } } Expression::ContainsAll(expr) => { - validator.visit_expression(authority, expr.collection()); + executor.visit_expression(authority, expr.collection()); - if validator.verdict().is_ok() { - validator.visit_expression(authority, expr.elements()); + if executor.verdict().is_ok() { + executor.visit_expression(authority, expr.elements()); } } Expression::ContainsAny(expr) => { - validator.visit_expression(authority, expr.collection()); + executor.visit_expression(authority, expr.collection()); - if validator.verdict().is_ok() { - validator.visit_expression(authority, expr.elements()); + if executor.verdict().is_ok() { + executor.visit_expression(authority, expr.elements()); } } - Expression::Where(expr) => validator.visit_expression(authority, expr.expression()), - Expression::Query(query) => validator.visit_query(authority, query), + Expression::Where(expr) => executor.visit_expression(authority, expr.expression()), + Expression::Query(query) => executor.visit_query(authority, query), Expression::ContextValue(_) | Expression::Raw(_) => (), } } pub fn visit_if( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: &ConditionalExpr, ) { - let condition = evaluate_expr!(validator, authority, ::condition()); + let condition = evaluate_expr!(executor, authority, ::condition()); // TODO: Do we have to make sure both branches are syntactically valid? if condition { - validator.visit_instruction(authority, isi.then()); + executor.visit_instruction(authority, isi.then()); } else if let Some(otherwise) = isi.otherwise() { - validator.visit_instruction(authority, otherwise); + executor.visit_instruction(authority, otherwise); } } -pub fn visit_pair(validator: &mut V, authority: &AccountId, isi: &PairExpr) { - validator.visit_instruction(authority, isi.left_instruction()); +pub fn visit_pair(executor: &mut V, authority: &AccountId, isi: &PairExpr) { + executor.visit_instruction(authority, isi.left_instruction()); - if validator.verdict().is_ok() { - validator.visit_instruction(authority, isi.right_instruction()) + if executor.verdict().is_ok() { + executor.visit_instruction(authority, isi.right_instruction()) } } pub fn visit_sequence( - validator: &mut V, + executor: &mut V, authority: &AccountId, sequence: &SequenceExpr, ) { for isi in sequence.instructions() { - if validator.verdict().is_ok() { - validator.visit_instruction(authority, isi); + if executor.verdict().is_ok() { + executor.visit_instruction(authority, isi); } } } @@ -340,18 +340,18 @@ pub mod peer { #[allow(clippy::needless_pass_by_value)] pub fn visit_unregister_peer( - validator: &mut V, + executor: &mut V, authority: &AccountId, _isi: Unregister, ) { - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } if tokens::CanUnregisterAnyPeer.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't unregister peer"); + deny!(executor, "Can't unregister peer"); } } @@ -396,91 +396,91 @@ pub mod domain { } pub fn visit_unregister_domain( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Unregister, ) { let domain_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_domain_owner(&domain_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_unregister_domain_token = tokens::CanUnregisterDomain { domain_id }; if can_unregister_domain_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't unregister domain"); + deny!(executor, "Can't unregister domain"); } pub fn visit_transfer_domain( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Transfer, ) { let destination_id = isi.object; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_domain_owner(&destination_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } - deny!(validator, "Can't transfer domain of another account"); + deny!(executor, "Can't transfer domain of another account"); } pub fn visit_set_domain_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: SetKeyValue, ) { let domain_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_domain_owner(&domain_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_set_key_value_in_domain_token = tokens::CanSetKeyValueInDomain { domain_id }; if can_set_key_value_in_domain_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't set key value in domain metadata"); + deny!(executor, "Can't set key value in domain metadata"); } pub fn visit_remove_domain_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: RemoveKeyValue, ) { let domain_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_domain_owner(&domain_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_remove_key_value_in_domain_token = tokens::CanRemoveKeyValueInDomain { domain_id }; if can_remove_key_value_in_domain_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't remove key value in domain metadata"); + deny!(executor, "Can't remove key value in domain metadata"); } } @@ -546,151 +546,151 @@ pub mod account { } pub fn visit_unregister_account( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Unregister, ) { let account_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&account_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_unregister_user_account = tokens::CanUnregisterAccount { account_id }; if can_unregister_user_account.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't unregister another account"); + deny!(executor, "Can't unregister another account"); } pub fn visit_mint_account_public_key( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Mint, ) { let account_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&account_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_mint_user_public_keys = tokens::CanMintUserPublicKeys { account_id }; if can_mint_user_public_keys.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't mint public keys of another account"); + deny!(executor, "Can't mint public keys of another account"); } pub fn visit_burn_account_public_key( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Burn, ) { let account_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&account_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_burn_user_public_keys = tokens::CanBurnUserPublicKeys { account_id }; if can_burn_user_public_keys.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't burn public keys of another account"); + deny!(executor, "Can't burn public keys of another account"); } pub fn visit_mint_account_signature_check_condition( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Mint, ) { let account_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&account_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_mint_user_signature_check_conditions_token = tokens::CanMintUserSignatureCheckConditions { account_id }; if can_mint_user_signature_check_conditions_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't mint signature check conditions of another account" ); } pub fn visit_set_account_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: SetKeyValue, ) { let account_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&account_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_set_key_value_in_user_account_token = tokens::CanSetKeyValueInUserAccount { account_id }; if can_set_key_value_in_user_account_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't set value to the metadata of another account" ); } pub fn visit_remove_account_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: RemoveKeyValue, ) { let account_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&account_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_remove_key_value_in_user_account_token = tokens::CanRemoveKeyValueInUserAccount { account_id }; if can_remove_key_value_in_user_account_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't remove value from the metadata of another account" ); } @@ -736,102 +736,102 @@ pub mod asset_definition { } pub fn visit_unregister_asset_definition( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Unregister, ) { let asset_definition_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_definition_owner(&asset_definition_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_unregister_asset_definition_token = tokens::CanUnregisterAssetDefinition { asset_definition_id, }; if can_unregister_asset_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't unregister assets registered by other accounts" ); } pub fn visit_transfer_asset_definition( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Transfer, ) { let source_id = isi.source_id; let destination_id = isi.object; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_account_owner(&source_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } match is_asset_definition_owner(&destination_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } deny!( - validator, + executor, "Can't transfer asset definition of another account" ); } pub fn visit_set_asset_definition_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: SetKeyValue, ) { let asset_definition_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_definition_owner(&asset_definition_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_set_key_value_in_asset_definition_token = tokens::CanSetKeyValueInAssetDefinition { asset_definition_id, }; if can_set_key_value_in_asset_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't set value to the asset definition metadata created by another account" ); } pub fn visit_remove_asset_definition_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: RemoveKeyValue, ) { let asset_definition_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_definition_owner(&asset_definition_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_remove_key_value_in_asset_definition_token = @@ -839,11 +839,11 @@ pub mod asset_definition { asset_definition_id, }; if can_remove_key_value_in_asset_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't remove value from the asset definition metadata created by another account" ); } @@ -952,51 +952,51 @@ pub mod asset { } pub fn visit_register_asset( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Register, ) { let asset = isi.object; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_definition_owner(asset.id().definition_id(), authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_register_assets_with_definition_token = tokens::CanRegisterAssetsWithDefinition { asset_definition_id: asset.id().definition_id().clone(), }; if can_register_assets_with_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't register assets with definitions registered by other accounts" ); } pub fn visit_unregister_asset( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Unregister, ) { let asset_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_owner(&asset_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } match is_asset_definition_owner(asset_id.definition_id(), authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_unregister_assets_with_definition_token = @@ -1004,162 +1004,162 @@ pub mod asset { asset_definition_id: asset_id.definition_id().clone(), }; if can_unregister_assets_with_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } let can_unregister_user_asset_token = tokens::CanUnregisterUserAsset { asset_id }; if can_unregister_user_asset_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't unregister asset from another account"); + deny!(executor, "Can't unregister asset from another account"); } pub fn visit_mint_asset( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Mint, ) { let asset_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_definition_owner(asset_id.definition_id(), authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_mint_assets_with_definition_token = tokens::CanMintAssetsWithDefinition { asset_definition_id: asset_id.definition_id().clone(), }; if can_mint_assets_with_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't mint assets with definitions registered by other accounts" ); } pub fn visit_burn_asset( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Burn, ) { let asset_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_owner(&asset_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } match is_asset_definition_owner(asset_id.definition_id(), authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_burn_assets_with_definition_token = tokens::CanBurnAssetsWithDefinition { asset_definition_id: asset_id.definition_id().clone(), }; if can_burn_assets_with_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } let can_burn_user_asset_token = tokens::CanBurnUserAsset { asset_id }; if can_burn_user_asset_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't burn assets from another account"); + deny!(executor, "Can't burn assets from another account"); } pub fn visit_transfer_asset( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Transfer, ) { let asset_id = isi.source_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_owner(&asset_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } match is_asset_definition_owner(asset_id.definition_id(), authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_transfer_assets_with_definition_token = tokens::CanTransferAssetsWithDefinition { asset_definition_id: asset_id.definition_id().clone(), }; if can_transfer_assets_with_definition_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } let can_transfer_user_asset_token = tokens::CanTransferUserAsset { asset_id }; if can_transfer_user_asset_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't transfer assets of another account"); + deny!(executor, "Can't transfer assets of another account"); } pub fn visit_set_asset_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: SetKeyValue, ) { let asset_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_owner(&asset_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_set_key_value_in_user_asset_token = tokens::CanSetKeyValueInUserAsset { asset_id }; if can_set_key_value_in_user_asset_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't set value to the asset metadata of another account" ); } pub fn visit_remove_asset_key_value( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: RemoveKeyValue, ) { let asset_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_asset_owner(&asset_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_remove_key_value_in_user_asset_token = tokens::CanRemoveKeyValueInUserAsset { asset_id }; if can_remove_key_value_in_user_asset_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't remove value from the asset metadata of another account" ); } @@ -1267,38 +1267,38 @@ pub mod parameter { #[allow(clippy::needless_pass_by_value)] pub fn visit_new_parameter( - validator: &mut V, + executor: &mut V, authority: &AccountId, _isi: NewParameter, ) { - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } if tokens::CanCreateParameters.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't create new configuration parameters outside genesis without permission" ); } #[allow(clippy::needless_pass_by_value)] pub fn visit_set_parameter( - validator: &mut V, + executor: &mut V, authority: &AccountId, _isi: SetParameter, ) { - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } if tokens::CanSetParameters.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't set configuration parameters without permission" ); } @@ -1322,13 +1322,13 @@ pub mod role { } macro_rules! impl_validate { - ($validator:ident, $isi:ident, $authority:ident, $method:ident) => { + ($executor:ident, $isi:ident, $authority:ident, $method:ident) => { let role_id = $isi.object; let find_role_query_res = match FindRoleByRoleId::new(role_id).execute() { Ok(res) => res, Err(error) => { - deny!($validator, error); + deny!($executor, error); } }; let role = Role::try_from(find_role_query_res).unwrap(); @@ -1339,17 +1339,17 @@ pub mod role { if let Ok(concrete_token) = <$token_ty as TryFrom<_>>::try_from(token.clone()) { - if is_genesis($validator) { + if is_genesis($executor) { continue; } if let Err(error) = <$token_ty as permission::ValidateGrantRevoke>::$method( &concrete_token, $authority, - $validator.block_height(), + $executor.block_height(), ) { - deny!($validator, error); + deny!($executor, error); } // Continue because token can correspond to only one concrete token @@ -1360,18 +1360,18 @@ pub mod role { map_all_crate_tokens!(visit_internal); deny!( - $validator, - "Incorrect validator implementation: Role contains unknown permission tokens" + $executor, + "Incorrect executor implementation: Role contains unknown permission tokens" ) } - pass!($validator); + pass!($executor); }; } #[allow(clippy::needless_pass_by_value)] pub fn visit_register_role( - validator: &mut V, + executor: &mut V, _authority: &AccountId, isi: Register, ) { @@ -1397,46 +1397,46 @@ pub mod role { if !unknown_tokens.is_empty() { deny!( - validator, + executor, ValidationFail::NotPermitted(format!( "{unknown_tokens:?}: Unrecognised permission tokens" )) ); } - pass!(validator); + pass!(executor); } #[allow(clippy::needless_pass_by_value)] pub fn visit_unregister_role( - validator: &mut V, + executor: &mut V, authority: &AccountId, _isi: Unregister, ) { - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } if tokens::CanUnregisterAnyRole.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't unregister role"); + deny!(executor, "Can't unregister role"); } pub fn visit_grant_account_role( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Grant, ) { - impl_validate!(validator, isi, authority, validate_grant); + impl_validate!(executor, isi, authority, validate_grant); } pub fn visit_revoke_account_role( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Revoke, ) { - impl_validate!(validator, isi, authority, validate_revoke); + impl_validate!(executor, isi, authority, validate_revoke); } } @@ -1508,104 +1508,104 @@ pub mod trigger { ); pub fn visit_unregister_trigger( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Unregister>, ) { let trigger_id = isi.object_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_trigger_owner(&trigger_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_unregister_user_trigger_token = tokens::CanUnregisterUserTrigger { trigger_id }; if can_unregister_user_trigger_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't unregister trigger owned by another account" ); } pub fn visit_mint_trigger_repetitions( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Mint>, ) { let trigger_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_trigger_owner(&trigger_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_mint_user_trigger_token = tokens::CanMintUserTrigger { trigger_id }; if can_mint_user_trigger_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't mint execution count for trigger owned by another account" ); } pub fn visit_burn_trigger_repetitions( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Burn>, ) { let trigger_id = isi.destination_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_trigger_owner(&trigger_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_mint_user_trigger_token = tokens::CanMintUserTrigger { trigger_id }; if can_mint_user_trigger_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } deny!( - validator, + executor, "Can't burn execution count for trigger owned by another account" ); } pub fn visit_execute_trigger( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: ExecuteTrigger, ) { let trigger_id = isi.trigger_id; - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } match is_trigger_owner(&trigger_id, authority) { - Err(err) => deny!(validator, err), - Ok(true) => pass!(validator), + Err(err) => deny!(executor, err), + Ok(true) => pass!(executor), Ok(false) => {} } let can_execute_trigger_token = tokens::CanExecuteUserTrigger { trigger_id }; if can_execute_trigger_token.is_owned_by(authority) { - pass!(validator); + pass!(executor); } - deny!(validator, "Can't execute trigger owned by another account"); + deny!(executor, "Can't execute trigger owned by another account"); } } @@ -1613,24 +1613,24 @@ pub mod permission_token { use super::*; macro_rules! impl_validate { - ($validator:ident, $authority:ident, $self:ident, $method:ident) => { + ($executor:ident, $authority:ident, $self:ident, $method:ident) => { let token = $self.object; macro_rules! visit_internal { ($token_ty:ty) => { if let Ok(token) = <$token_ty as TryFrom<_>>::try_from(token.clone()) { - if is_genesis($validator) { - pass!($validator); + if is_genesis($executor) { + pass!($executor); } if let Err(error) = <$token_ty as permission::ValidateGrantRevoke>::$method( &token, $authority, - $validator.block_height(), + $executor.block_height(), ) { - deny!($validator, error); + deny!($executor, error); } - pass!($validator); + pass!($executor); } }; } @@ -1638,34 +1638,34 @@ pub mod permission_token { map_all_crate_tokens!(visit_internal); deny!( - $validator, + $executor, ValidationFail::NotPermitted(format!("{token:?}: Unknown permission token")) ); }; } pub fn visit_grant_account_permission( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Grant, ) { - impl_validate!(validator, authority, isi, validate_grant); + impl_validate!(executor, authority, isi, validate_grant); } pub fn visit_revoke_account_permission( - validator: &mut V, + executor: &mut V, authority: &AccountId, isi: Revoke, ) { - impl_validate!(validator, authority, isi, validate_revoke); + impl_validate!(executor, authority, isi, validate_revoke); } } -pub mod validator { +pub mod executor { use super::*; declare_tokens! { - crate::default::validator::tokens::CanUpgradeValidator, + crate::default::executor::tokens::CanUpgradeExecutor, } pub mod tokens { @@ -1674,27 +1674,27 @@ pub mod validator { token! { #[derive(Copy, ValidateGrantRevoke)] #[validate(permission::OnlyGenesis)] - pub struct CanUpgradeValidator; + pub struct CanUpgradeExecutor; } } #[allow(clippy::needless_pass_by_value)] - pub fn visit_upgrade_validator( - validator: &mut V, + pub fn visit_upgrade_executor( + executor: &mut V, authority: &AccountId, - _isi: Upgrade, + _isi: Upgrade, ) { - if is_genesis(validator) { - pass!(validator); + if is_genesis(executor) { + pass!(executor); } - if tokens::CanUpgradeValidator.is_owned_by(authority) { - pass!(validator); + if tokens::CanUpgradeExecutor.is_owned_by(authority) { + pass!(executor); } - deny!(validator, "Can't upgrade validator"); + deny!(executor, "Can't upgrade executor"); } } -fn is_genesis(validator: &V) -> bool { - validator.block_height() == 0 +fn is_genesis(executor: &V) -> bool { + executor.block_height() == 0 } diff --git a/smart_contract/validator/src/lib.rs b/smart_contract/executor/src/lib.rs similarity index 84% rename from smart_contract/validator/src/lib.rs rename to smart_contract/executor/src/lib.rs index e10a2d04465..f61e3643c0c 100644 --- a/smart_contract/validator/src/lib.rs +++ b/smart_contract/executor/src/lib.rs @@ -1,15 +1,15 @@ -//! API for *Runtime Validators*. +//! API for *Runtime Executors*. #![no_std] #![allow(unsafe_code)] extern crate alloc; -extern crate self as iroha_validator; +extern crate self as iroha_executor; use alloc::vec::Vec; pub use iroha_data_model as data_model; use iroha_data_model::{ - permission::PermissionTokenId, validator::Result, visit::Visit, ValidationFail, + executor::Result, permission::PermissionTokenId, visit::Visit, ValidationFail, }; #[cfg(not(test))] use iroha_data_model::{prelude::*, smart_contract::payloads}; @@ -37,7 +37,7 @@ pub mod log { /// # Traps /// /// Host side will generate a trap if this function was called not from a -/// validator `validate_transaction()` entrypoint. +/// executor `validate_transaction()` entrypoint. #[cfg(not(test))] pub fn get_validate_transaction_payload() -> payloads::Validate { // Safety: ownership of the returned result is transferred into `_decode_from_raw` @@ -49,7 +49,7 @@ pub fn get_validate_transaction_payload() -> payloads::Validate payloads::Validate { // Safety: ownership of the returned result is transferred into `_decode_from_raw` @@ -61,7 +61,7 @@ pub fn get_validate_instruction_payload() -> payloads::Validate /// # Traps /// /// Host side will generate a trap if this function was called not from a -/// validator `validate_query()` entrypoint. +/// executor `validate_query()` entrypoint. #[cfg(not(test))] pub fn get_validate_query_payload() -> payloads::Validate { // Safety: ownership of the returned result is transferred into `_decode_from_raw` @@ -73,7 +73,7 @@ pub fn get_validate_query_payload() -> payloads::Validate { /// # Traps /// /// Host side will generate a trap if this function was called not from a -/// validator `migrate()` entrypoint. +/// executor `migrate()` entrypoint. #[cfg(not(test))] pub fn get_migrate_payload() -> payloads::Migrate { // Safety: ownership of the returned result is transferred into `_decode_from_raw` @@ -89,7 +89,7 @@ pub fn get_migrate_payload() -> payloads::Migrate { /// # Traps /// /// Host side will generate a trap if this function was not called from a -/// validator's `migrate()` entrypoint. +/// executor's `migrate()` entrypoint. #[cfg(not(test))] pub fn set_permission_token_schema(schema: &data_model::permission::PermissionTokenSchema) { // Safety: - ownership of the returned result is transferred into `_decode_from_raw` @@ -136,10 +136,10 @@ mod host { /// Shortcut for `return Ok(())`. #[macro_export] macro_rules! pass { - ($validator:ident) => {{ + ($executor:ident) => {{ #[cfg(debug_assertions)] - if let Err(_error) = $validator.verdict() { - unreachable!("Validator already denied"); + if let Err(_error) = $executor.verdict() { + unreachable!("Executor already denied"); } return; @@ -151,22 +151,22 @@ macro_rules! pass { /// Supports [`format!`](alloc::fmt::format) syntax as well as any expression returning [`String`](alloc::string::String). #[macro_export] macro_rules! deny { - ($validator:ident, $l:literal $(,)?) => {{ + ($executor:ident, $l:literal $(,)?) => {{ #[cfg(debug_assertions)] - if let Err(_error) = $validator.verdict() { - unreachable!("Validator already denied"); + if let Err(_error) = $executor.verdict() { + unreachable!("Executor already denied"); } - $validator.deny($crate::data_model::ValidationFail::NotPermitted( + $executor.deny($crate::data_model::ValidationFail::NotPermitted( ::alloc::fmt::format(::core::format_args!($l)), )); return; }}; - ($validator:ident, $e:expr $(,)?) => {{ + ($executor:ident, $e:expr $(,)?) => {{ #[cfg(debug_assertions)] - if let Err(_error) = $validator.verdict() { - unreachable!("Validator already denied"); + if let Err(_error) = $executor.verdict() { + unreachable!("Executor already denied"); } - $validator.deny($e); + $executor.deny($e); return; }}; } @@ -176,7 +176,7 @@ macro_rules! deny { /// # Example /// /// ```no_run -/// use iroha_validator::parse; +/// use iroha_executor::parse; /// use iroha_data_model::prelude::*; /// /// let account_id = parse!("alice@wonderland" as AccountId); @@ -208,11 +208,11 @@ macro_rules! parse { /// use std::borrow::ToOwned; /// /// use iroha_schema::IntoSchema; -/// use iroha_validator_derive::{Token, ValidateGrantRevoke}; +/// use iroha_executor_derive::{Token, ValidateGrantRevoke}; /// use serde::{Deserialize, Serialize}; /// /// #[derive(Clone, PartialEq, Deserialize, Serialize, IntoSchema, Token, ValidateGrantRevoke)] -/// #[validate(iroha_validator::permission::OnlyGenesis)] +/// #[validate(iroha_executor::permission::OnlyGenesis)] /// pub struct MyToken; /// } /// ``` @@ -229,7 +229,7 @@ macro_rules! declare_tokens { } } -/// Collection of all permission tokens defined by the validator +/// Collection of all permission tokens defined by the executor #[derive(Debug, Clone, Default)] pub struct PermissionTokenSchema(Vec, MetaMap); @@ -261,15 +261,15 @@ impl PermissionTokenSchema { } } -/// Validator of Iroha operations +/// Executor of Iroha operations pub trait Validate: Visit { - /// Validator verdict. + /// Executor verdict. fn verdict(&self) -> &Result; /// Current block height. fn block_height(&self) -> u64; - /// Set validator verdict to deny + /// Set executor verdict to deny fn deny(&mut self, reason: ValidationFail); } @@ -279,13 +279,13 @@ pub mod prelude { pub use alloc::vec::Vec; pub use iroha_data_model::{ + executor::{MigrationError, MigrationResult, Result}, prelude::*, - validator::{MigrationError, MigrationResult, Result}, visit::Visit, ValidationFail, }; + pub use iroha_executor_derive::{entrypoint, Token, ValidateGrantRevoke}; pub use iroha_smart_contract::{prelude::*, Context}; - pub use iroha_validator_derive::{entrypoint, Token, ValidateGrantRevoke}; pub use super::{declare_tokens, deny, pass, PermissionTokenSchema, Validate}; } diff --git a/smart_contract/validator/src/permission.rs b/smart_contract/executor/src/permission.rs similarity index 96% rename from smart_contract/validator/src/permission.rs rename to smart_contract/executor/src/permission.rs index d3aeb1d4286..a0f60a6c35e 100644 --- a/smart_contract/validator/src/permission.rs +++ b/smart_contract/executor/src/permission.rs @@ -56,30 +56,30 @@ pub enum PermissionTokenConversionError { pub mod derive_conversions { //! Module with derive macros to generate conversion from custom strongly-typed token - //! to some pass condition to successfully derive [`ValidateGrantRevoke`](iroha_validator_derive::ValidateGrantRevoke) + //! to some pass condition to successfully derive [`ValidateGrantRevoke`](iroha_executor_derive::ValidateGrantRevoke) pub mod asset { //! Module with derives related to asset tokens - pub use iroha_validator_derive::RefIntoAssetOwner as Owner; + pub use iroha_executor_derive::RefIntoAssetOwner as Owner; } pub mod asset_definition { //! Module with derives related to asset definition tokens - pub use iroha_validator_derive::RefIntoAssetDefinitionOwner as Owner; + pub use iroha_executor_derive::RefIntoAssetDefinitionOwner as Owner; } pub mod account { //! Module with derives related to account tokens - pub use iroha_validator_derive::RefIntoAccountOwner as Owner; + pub use iroha_executor_derive::RefIntoAccountOwner as Owner; } pub mod domain { //! Module with derives related to domain tokens - pub use iroha_validator_derive::RefIntoDomainOwner as Owner; + pub use iroha_executor_derive::RefIntoDomainOwner as Owner; } } diff --git a/tools/kagami/src/genesis.rs b/tools/kagami/src/genesis.rs index 9caabb21eef..8f4424b1574 100644 --- a/tools/kagami/src/genesis.rs +++ b/tools/kagami/src/genesis.rs @@ -10,31 +10,31 @@ use iroha_data_model::{ prelude::AssetId, IdBox, }; -use iroha_genesis::{RawGenesisBlock, RawGenesisBlockBuilder, ValidatorMode, ValidatorPath}; +use iroha_genesis::{ExecutorMode, ExecutorPath, RawGenesisBlock, RawGenesisBlockBuilder}; use serde_json::json; use super::*; -const INLINED_VALIDATOR_WARNING: &str = r#"WARN: You're using genesis with inlined validator. -Consider specifying a separate validator file using `--validator-path-in-genesis` instead. +const INLINED_EXECUTOR_WARNING: &str = r#"WARN: You're using genesis with inlined executor. +Consider specifying a separate executor file using `--executor-path-in-genesis` instead. Use `--help` for more information."#; #[derive(Parser, Debug, Clone)] -#[clap(group = ArgGroup::new("validator").required(true))] +#[clap(group = ArgGroup::new("executor").required(true))] pub struct Args { - /// Reads the validator from the file at (relative to CWD) + /// Reads the executor from the file at (relative to CWD) /// and includes the content into the genesis. /// /// WARN: This approach can lead to reproducibility issues, as WASM builds are currently not - /// guaranteed to be reproducible. Additionally, inlining the validator bloats the genesis JSON - /// and makes it less readable. Consider specifying a separate validator file - /// using `--validator-path-in-genesis` instead. For more details, refer to + /// guaranteed to be reproducible. Additionally, inlining the executor bloats the genesis JSON + /// and makes it less readable. Consider specifying a separate executor file + /// using `--executor-path-in-genesis` instead. For more details, refer to /// the related PR: https://github.com/hyperledger/iroha/pull/3434 - #[clap(long, group = "validator", value_name = "PATH")] - inline_validator_from_file: Option, + #[clap(long, group = "executor", value_name = "PATH")] + inline_executor_from_file: Option, /// Specifies the that will be directly inserted into the genesis JSON as-is. - #[clap(long, group = "validator", value_name = "PATH")] - validator_path_in_genesis: Option, + #[clap(long, group = "executor", value_name = "PATH")] + executor_path_in_genesis: Option, #[clap(subcommand)] mode: Option, } @@ -67,53 +67,52 @@ pub enum Mode { impl RunArgs for Args { fn run(self, writer: &mut BufWriter) -> Outcome { let Self { - inline_validator_from_file, - validator_path_in_genesis, + inline_executor_from_file, + executor_path_in_genesis, mode, } = self; - let validator: ValidatorMode = - match (inline_validator_from_file, validator_path_in_genesis) { - (Some(path), None) => { - eprintln!("{INLINED_VALIDATOR_WARNING}"); - ParsedValidatorArgs::Inline(path) - } - (None, Some(path)) => ParsedValidatorArgs::Path(path), - _ => unreachable!("clap invariant"), + let executor: ExecutorMode = match (inline_executor_from_file, executor_path_in_genesis) { + (Some(path), None) => { + eprintln!("{INLINED_EXECUTOR_WARNING}"); + ParsedExecutorArgs::Inline(path) } - .try_into()?; + (None, Some(path)) => ParsedExecutorArgs::Path(path), + _ => unreachable!("clap invariant"), + } + .try_into()?; let genesis = match mode.unwrap_or_default() { - Mode::Default => generate_default(validator), + Mode::Default => generate_default(executor), Mode::Synthetic { domains, accounts_per_domain, assets_per_domain, - } => generate_synthetic(validator, domains, accounts_per_domain, assets_per_domain), + } => generate_synthetic(executor, domains, accounts_per_domain, assets_per_domain), }?; writeln!(writer, "{}", serde_json::to_string_pretty(&genesis)?) .wrap_err("Failed to write serialized genesis to the buffer.") } } -enum ParsedValidatorArgs { +enum ParsedExecutorArgs { Inline(PathBuf), Path(PathBuf), } -impl TryFrom for ValidatorMode { +impl TryFrom for ExecutorMode { type Error = color_eyre::Report; - fn try_from(value: ParsedValidatorArgs) -> Result { + fn try_from(value: ParsedExecutorArgs) -> Result { let mode = match value { - ParsedValidatorArgs::Path(path) => ValidatorMode::Path(ValidatorPath(path)), - ParsedValidatorArgs::Inline(path) => { - let validator = ValidatorMode::Path(ValidatorPath(path.clone())) + ParsedExecutorArgs::Path(path) => ExecutorMode::Path(ExecutorPath(path)), + ParsedExecutorArgs::Inline(path) => { + let executor = ExecutorMode::Path(ExecutorPath(path.clone())) .try_into() .wrap_err_with(|| { - format!("Failed to read the validator located at {}", path.display()) + format!("Failed to read the executor located at {}", path.display()) })?; - ValidatorMode::Inline(validator) + ExecutorMode::Inline(executor) } }; Ok(mode) @@ -121,7 +120,7 @@ impl TryFrom for ValidatorMode { } #[allow(clippy::too_many_lines)] -pub fn generate_default(validator: ValidatorMode) -> color_eyre::Result { +pub fn generate_default(executor: ExecutorMode) -> color_eyre::Result { let mut meta = Metadata::new(); meta.insert_with_limits( "key".parse()?, @@ -143,7 +142,7 @@ pub fn generate_default(validator: ValidatorMode) -> color_eyre::Result color_eyre::Result