From 1fbc566935d27d2995a898d9165d3b500513ad99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Thu, 22 Jun 2023 15:08:09 +0200 Subject: [PATCH] [feature] #3624: introduce general purpose permission tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- Cargo.lock | 2 + client/benches/tps/utils.rs | 7 +- client/tests/integration/asset.rs | 3 +- client/tests/integration/events/data.rs | 23 +- client/tests/integration/permissions.rs | 59 +- client/tests/integration/queries/role.rs | 15 +- client/tests/integration/roles.rs | 27 +- .../integration/smartcontracts/Cargo.toml | 3 + .../smartcontracts/mint_rose/src/lib.rs | 6 +- .../validator_with_admin/Cargo.toml | 2 + .../validator_with_admin/src/lib.rs | 10 +- .../validator_with_custom_token/Cargo.toml | 3 + .../validator_with_custom_token/src/lib.rs | 28 +- .../integration/triggers/by_call_trigger.rs | 27 +- client/tests/integration/upgrade.rs | 14 +- configs/peer/genesis.json | 56 +- configs/peer/validator.wasm | Bin 380365 -> 376893 bytes core/src/lib.rs | 4 - core/src/smartcontracts/isi/account.rs | 25 +- core/src/smartcontracts/isi/mod.rs | 8 +- core/src/smartcontracts/isi/permissions.rs | 69 --- core/src/smartcontracts/isi/world.rs | 148 +++-- core/src/smartcontracts/wasm.rs | 13 +- core/src/validator.rs | 8 +- core/src/wsv.rs | 7 +- core/test_network/Cargo.toml | 1 + core/test_network/src/lib.rs | 28 +- data_model/derive/src/lib.rs | 42 -- data_model/derive/src/variant_discriminant.rs | 107 ---- data_model/src/events/data/events.rs | 59 +- data_model/src/lib.rs | 193 +++---- data_model/src/permission.rs | 197 ++----- data_model/src/predicate.rs | 2 +- data_model/src/query.rs | 52 +- data_model/src/role.rs | 2 +- data_model/src/visit.rs | 2 +- default_validator/src/lib.rs | 6 +- docs/source/references/schema.json | 206 ++----- schema/gen/src/lib.rs | 9 +- schema/src/lib.rs | 14 +- tools/kagami/Cargo.toml | 1 + tools/kagami/src/main.rs | 28 +- .../parity_scale_decoder/samples/trigger.bin | Bin 80 -> 80 bytes tools/parity_scale_decoder/src/main.rs | 2 +- wasm/derive/src/lib.rs | 4 +- wasm/src/lib.rs | 11 +- wasm/validator/Cargo.toml | 4 + wasm/validator/derive/src/entrypoint.rs | 41 +- wasm/validator/derive/src/lib.rs | 6 +- wasm/validator/derive/src/token.rs | 181 +----- wasm/validator/derive/src/validate.rs | 5 +- wasm/validator/src/default.rs | 513 ++++++++++-------- wasm/validator/src/lib.rs | 41 +- wasm/validator/src/permission.rs | 49 +- 54 files changed, 904 insertions(+), 1469 deletions(-) delete mode 100644 core/src/smartcontracts/isi/permissions.rs delete mode 100644 data_model/derive/src/variant_discriminant.rs diff --git a/Cargo.lock b/Cargo.lock index a308139c430..c14dd867e8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3483,6 +3483,7 @@ dependencies = [ "iroha_schema_gen", "iroha_wasm_builder", "owo-colors", + "parity-scale-codec", "path-absolutize", "pathdiff", "serde", @@ -5333,6 +5334,7 @@ dependencies = [ "iroha_genesis", "iroha_logger", "iroha_primitives", + "parity-scale-codec", "rand 0.8.5", "tempfile", "tokio", diff --git a/client/benches/tps/utils.rs b/client/benches/tps/utils.rs index 06de22b9eb7..b5bf5343bd8 100644 --- a/client/benches/tps/utils.rs +++ b/client/benches/tps/utils.rs @@ -184,11 +184,10 @@ impl MeasurerUnit { )); self.client.submit_blocking(register_me)?; - let can_burn_my_asset = PermissionToken::new("can_burn_user_asset".parse()?) - .with_params([("asset_id".parse()?, asset_id.clone().into())]); + let can_burn_my_asset = PermissionToken::new("CanBurnUserAsset".to_owned(), &asset_id); let allow_alice_to_burn_my_asset = GrantBox::new(can_burn_my_asset, alice_id.clone()); - let can_transfer_my_asset = PermissionToken::new("can_transfer_user_asset".parse()?) - .with_params([("asset_id".parse()?, asset_id.clone().into())]); + let can_transfer_my_asset = + PermissionToken::new("CanTransferUserAsset".to_owned(), &asset_id); let allow_alice_to_transfer_my_asset = GrantBox::new(can_transfer_my_asset, alice_id); let grant_tx = TransactionBuilder::new(account_id) .with_instructions([ diff --git a/client/tests/integration/asset.rs b/client/tests/integration/asset.rs index 0e4f179eb49..770c5cef299 100644 --- a/client/tests/integration/asset.rs +++ b/client/tests/integration/asset.rs @@ -259,8 +259,7 @@ fn find_rate_and_make_exchange_isi_should_succeed() { let grant_alice_asset_transfer_permission = |asset_id: AssetId, owner_keypair: KeyPair| { let allow_alice_to_transfer_asset = GrantBox::new( - PermissionToken::new("can_transfer_user_asset".parse().expect("Valid")) - .with_params([("asset_id".parse().expect("Valid"), asset_id.clone().into())]), + PermissionToken::new("CanTransferUserAsset".to_owned(), &asset_id), alice_id.clone(), ); diff --git a/client/tests/integration/events/data.rs b/client/tests/integration/events/data.rs index 4796c614660..3512a27175b 100644 --- a/client/tests/integration/events/data.rs +++ b/client/tests/integration/events/data.rs @@ -3,7 +3,7 @@ use std::{fmt::Write as _, str::FromStr, sync::mpsc, thread}; use eyre::Result; use iroha_data_model::{prelude::*, transaction::WasmSmartContract}; -use parity_scale_codec::Encode; +use parity_scale_codec::Encode as _; use test_network::*; use crate::wasm::utils::wasm_template; @@ -163,17 +163,8 @@ fn produce_multiple_events() -> Result<()> { // Registering role let alice_id = ::Id::from_str("alice@wonderland")?; let role_id = ::Id::from_str("TEST_ROLE")?; - let token_1 = PermissionToken::new( - "can_remove_key_value_in_user_account" - .parse() - .expect("valid"), - ) - .with_params([( - "account_id".parse().expect("valid"), - alice_id.clone().into(), - )]); - let token_2 = PermissionToken::new("can_set_key_value_in_user_account".parse().expect("valid")) - .with_params([("account_id".parse().expect("valid"), alice_id.into())]); + let token_1 = PermissionToken::new("CanRemoveKeyValueInUserAccount".to_owned(), &alice_id); + let token_2 = PermissionToken::new("CanSetKeyValueInUserAccount".to_owned(), &alice_id); let role = iroha_data_model::role::Role::new(role_id.clone()) .add_permission(token_1.clone()) .add_permission(token_2.clone()); @@ -207,13 +198,13 @@ fn produce_multiple_events() -> Result<()> { WorldEvent::Domain(DomainEvent::Account(AccountEvent::PermissionAdded( AccountPermissionChanged { account_id: bob_id.clone(), - permission_id: token_1.definition_id().clone(), + permission_id: token_1.definition_id.clone(), }, ))), WorldEvent::Domain(DomainEvent::Account(AccountEvent::PermissionAdded( AccountPermissionChanged { account_id: bob_id.clone(), - permission_id: token_2.definition_id().clone(), + permission_id: token_2.definition_id.clone(), }, ))), WorldEvent::Domain(DomainEvent::Account(AccountEvent::RoleGranted( @@ -225,13 +216,13 @@ fn produce_multiple_events() -> Result<()> { WorldEvent::Domain(DomainEvent::Account(AccountEvent::PermissionRemoved( AccountPermissionChanged { account_id: bob_id.clone(), - permission_id: token_1.definition_id().clone(), + permission_id: token_1.definition_id, }, ))), WorldEvent::Domain(DomainEvent::Account(AccountEvent::PermissionRemoved( AccountPermissionChanged { account_id: bob_id.clone(), - permission_id: token_2.definition_id().clone(), + permission_id: token_2.definition_id, }, ))), WorldEvent::Domain(DomainEvent::Account(AccountEvent::RoleRevoked( diff --git a/client/tests/integration/permissions.rs b/client/tests/integration/permissions.rs index f38d880b9c8..de498f01ead 100644 --- a/client/tests/integration/permissions.rs +++ b/client/tests/integration/permissions.rs @@ -181,11 +181,7 @@ fn permissions_differ_not_only_by_names() { // Granting permission to Alice to modify metadata in Mouse's hats let mouse_hat_id = ::Id::new(hat_definition_id, mouse_id.clone()); let allow_alice_to_set_key_value_in_hats = GrantBox::new( - PermissionToken::new("can_set_key_value_in_user_asset".parse().expect("Valid")) - .with_params([( - "asset_id".parse().expect("Valid"), - mouse_hat_id.clone().into(), - )]), + PermissionToken::new("CanSetKeyValueInUserAsset".to_owned(), &mouse_hat_id), alice_id.clone(), ); @@ -219,8 +215,7 @@ fn permissions_differ_not_only_by_names() { // Granting permission to Alice to modify metadata in Mouse's shoes let allow_alice_to_set_key_value_in_shoes = GrantBox::new( - PermissionToken::new("can_set_key_value_in_user_asset".parse().expect("Valid")) - .with_params([("asset_id".parse().expect("Valid"), mouse_shoes_id.into())]), + PermissionToken::new("CanSetKeyValueInUserAsset".to_owned(), &mouse_shoes_id), alice_id, ); @@ -242,23 +237,13 @@ fn permissions_differ_not_only_by_names() { mod token_parameters { use super::*; - static TEST_TOKEN_DEFINITION_ID: once_cell::sync::Lazy< - ::Id, - > = once_cell::sync::Lazy::new(|| { - ::Id::new( - "test_permission_token_definition".parse().expect("Valid"), - ) - }); - - static NUMBER_PARAMETER_NAME: once_cell::sync::Lazy = - once_cell::sync::Lazy::new(|| "number".parse().expect("Valid")); - static STRING_PARAMETER_NAME: once_cell::sync::Lazy = - once_cell::sync::Lazy::new(|| "string".parse().expect("Valid")); + static TEST_TOKEN_DEFINITION_ID: once_cell::sync::Lazy = + once_cell::sync::Lazy::new(|| "TestPermissionTokenDefinition".parse().expect("Valid")); #[ignore = "ignore, more in #2851"] #[test] fn token_with_missing_parameters_is_not_accepted() { - let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone()); + let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone(), &()); let expect = "Expected to fail to grant permission token without parameters"; run_grant_token_error_test(token.clone(), expect); @@ -268,8 +253,7 @@ mod token_parameters { #[ignore = "ignore, more in #2851"] #[test] fn token_with_one_missing_parameter_is_not_accepted() { - let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone()) - .with_params([(NUMBER_PARAMETER_NAME.clone(), 1_u32.into())]); + let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone(), &1_u32); let expect = "Expected to fail to grant permission token with one missing parameter"; run_grant_token_error_test(token.clone(), expect); @@ -279,13 +263,7 @@ mod token_parameters { #[ignore = "ignore, more in #2851"] #[test] fn token_with_changed_parameter_name_is_not_accepted() { - let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone()).with_params([ - (NUMBER_PARAMETER_NAME.clone(), 1_u32.into()), - ( - "it's_a_trap".parse().expect("Valid"), - "test".to_owned().into(), - ), - ]); + let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone(), &(1_u32, "test")); let expect = "Expected to fail to grant permission token with one changed parameter"; run_grant_token_error_test(token.clone(), expect); @@ -295,14 +273,10 @@ mod token_parameters { #[ignore = "ignore, more in #2851"] #[test] fn token_with_extra_parameter_is_not_accepted() { - let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone()).with_params([ - (NUMBER_PARAMETER_NAME.clone(), 1_u32.into()), - (STRING_PARAMETER_NAME.clone(), "test".to_owned().into()), - ( - "extra_param".parse().expect("Valid"), - "extra_test".to_owned().into(), - ), - ]); + let token = PermissionToken::new( + TEST_TOKEN_DEFINITION_ID.clone(), + &(1_u32, "test", "extra_test"), + ); let expect = "Expected to fail to grant permission token with extra parameter"; run_grant_token_error_test(token.clone(), expect); @@ -312,13 +286,10 @@ mod token_parameters { #[ignore = "ignore, more in #2851"] #[test] fn token_with_wrong_parameter_type_is_not_accepted() { - let token = PermissionToken::new(TEST_TOKEN_DEFINITION_ID.clone()).with_params([ - (NUMBER_PARAMETER_NAME.clone(), 1_u32.into()), - ( - STRING_PARAMETER_NAME.clone(), - Value::Name("test".parse().expect("Valid")), - ), - ]); + let token = PermissionToken::new( + TEST_TOKEN_DEFINITION_ID.clone(), + &(91_u32, Value::Name("test".parse().expect("Valid"))), + ); let expect = "Expected to fail to grant permission token with wrong parameter type"; run_grant_token_error_test(token.clone(), expect); diff --git a/client/tests/integration/queries/role.rs b/client/tests/integration/queries/role.rs index d3d83bb663e..d848cf03336 100644 --- a/client/tests/integration/queries/role.rs +++ b/client/tests/integration/queries/role.rs @@ -124,17 +124,10 @@ fn find_roles_by_account_id() -> Result<()> { .iter() .cloned() .map(|role_id| { - RegisterBox::new( - Role::new(role_id).add_permission( - PermissionToken::new( - "can_set_key_value_in_user_account".parse().expect("Valid"), - ) - .with_params([( - "account_id".parse().expect("Valid"), - alice_id.clone().into(), - )]), - ), - ) + RegisterBox::new(Role::new(role_id).add_permission(PermissionToken::new( + "CanSetKeyValueInUserAccount".to_owned(), + &alice_id, + ))) }) .collect::>(); test_client.submit_all_blocking(register_roles)?; diff --git a/client/tests/integration/roles.rs b/client/tests/integration/roles.rs index b6be99ddb07..1d603ac12c6 100644 --- a/client/tests/integration/roles.rs +++ b/client/tests/integration/roles.rs @@ -25,7 +25,7 @@ fn register_role_with_empty_token_params() -> Result<()> { wait_for_genesis_committed(&vec![test_client.clone()], 0); let role_id = "root".parse().expect("Valid"); - let token = PermissionToken::new("token".parse().expect("Valid")); + let token = PermissionToken::new("token".to_owned(), &()); let role = Role::new(role_id).add_permission(token); test_client.submit(RegisterBox::new(role))?; @@ -61,14 +61,14 @@ fn register_and_grant_role_for_metadata_access() -> Result<()> { // Registering role let role_id = ::Id::from_str("ACCESS_TO_MOUSE_METADATA")?; let role = Role::new(role_id.clone()) - .add_permission( - PermissionToken::new("can_set_key_value_in_user_account".parse()?) - .with_params([("account_id".parse()?, mouse_id.clone().into())]), - ) - .add_permission( - PermissionToken::new("can_remove_key_value_in_user_account".parse()?) - .with_params([("account_id".parse()?, mouse_id.clone().into())]), - ); + .add_permission(PermissionToken::new( + "CanSetKeyValueInUserAccount".to_owned(), + &mouse_id, + )) + .add_permission(PermissionToken::new( + "CanRemoveKeyValueInUserAccount".to_owned(), + &mouse_id, + )); let register_role = RegisterBox::new(role); test_client.submit_blocking(register_role)?; @@ -108,12 +108,9 @@ fn unregistered_role_removed_from_account() -> Result<()> { test_client.submit_blocking(register_mouse)?; // Register root role - let register_role = RegisterBox::new( - Role::new(role_id.clone()).add_permission( - PermissionToken::new("can_set_key_value_in_user_account".parse()?) - .with_params([("account_id".parse()?, alice_id.into())]), - ), - ); + let register_role = RegisterBox::new(Role::new(role_id.clone()).add_permission( + PermissionToken::new("CanSetKeyValueInUserAccount".to_owned(), &alice_id), + )); test_client.submit_blocking(register_role)?; // Grant root role to Mouse diff --git a/client/tests/integration/smartcontracts/Cargo.toml b/client/tests/integration/smartcontracts/Cargo.toml index 2caf550b8e5..1e1426115c2 100644 --- a/client/tests/integration/smartcontracts/Cargo.toml +++ b/client/tests/integration/smartcontracts/Cargo.toml @@ -28,4 +28,7 @@ codegen-units = 1 # Further reduces binary size but increases compilation time [workspace.dependencies] iroha_validator = { version = "=2.0.0-pre-rc.16", path = "../../../../wasm/validator", features = ["default-validator"] } iroha_wasm = { version = "=2.0.0-pre-rc.16", path = "../../../../wasm", features = ["debug"]} +iroha_schema = { version = "=2.0.0-pre-rc.16", path = "../../../../schema" } + +parity-scale-codec = { version = "3.2.1", default-features = false } panic-halt = "0.2.0" diff --git a/client/tests/integration/smartcontracts/mint_rose/src/lib.rs b/client/tests/integration/smartcontracts/mint_rose/src/lib.rs index 990a448dcce..57de67375ab 100644 --- a/client/tests/integration/smartcontracts/mint_rose/src/lib.rs +++ b/client/tests/integration/smartcontracts/mint_rose/src/lib.rs @@ -13,10 +13,10 @@ use iroha_wasm::data_model::prelude::*; /// Mint 1 rose for authority #[iroha_wasm::main(params = "[authority]")] -fn main(authority: ::Id) { - let rose_definition_id = ::Id::from_str("rose#wonderland") +fn main(authority: AccountId) { + let rose_definition_id = AssetDefinitionId::from_str("rose#wonderland") .dbg_expect("Failed to parse `rose#wonderland` asset definition id"); - let rose_id = ::Id::new(rose_definition_id, authority); + let rose_id = AssetId::new(rose_definition_id, authority); MintBox::new(1_u32, rose_id) .execute() diff --git a/client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml b/client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml index 7f843fa2d94..1b465081974 100644 --- a/client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml +++ b/client/tests/integration/smartcontracts/validator_with_admin/Cargo.toml @@ -12,4 +12,6 @@ crate-type = ['cdylib'] [dependencies] iroha_validator.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/validator_with_admin/src/lib.rs index 38a350adea1..8662eb2434a 100644 --- a/client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs +++ b/client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs @@ -2,8 +2,6 @@ //! If authority is not `admin@admin` then [`DefaultValidator`] is used as a backup. #![no_std] -extern crate alloc; - use iroha_validator::{ data_model::evaluate::{EvaluationError, ExpressionEvaluator}, parse, @@ -92,8 +90,8 @@ impl Visit for CustomValidator { } impl Validate for CustomValidator { - fn permission_tokens() -> Vec { - DefaultValidator::permission_tokens() + fn permission_token_schema() -> PermissionTokenSchema { + DefaultValidator::permission_token_schema() } fn verdict(&self) -> &Result { @@ -116,8 +114,8 @@ impl ExpressionEvaluator for CustomValidator { /// Entrypoint to return permission token definitions defined in this validator. #[entrypoint] -pub fn permission_tokens() -> Vec { - CustomValidator::permission_tokens() +pub fn permission_token_schema() -> PermissionTokenSchema { + CustomValidator::permission_token_schema() } /// Allow operation if authority is `admin@admin` and if not, diff --git a/client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml b/client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml index b6a91ff9a35..b7a8a9e4129 100644 --- a/client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml +++ b/client/tests/integration/smartcontracts/validator_with_custom_token/Cargo.toml @@ -12,4 +12,7 @@ crate-type = ['cdylib'] [dependencies] iroha_validator.workspace = true +iroha_schema.workspace = true + +parity-scale-codec.workspace = true panic-halt.workspace = true diff --git a/client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs b/client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs index 1d22d367b81..ff6fe830bae 100644 --- a/client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs +++ b/client/tests/integration/smartcontracts/validator_with_custom_token/src/lib.rs @@ -7,11 +7,16 @@ extern crate alloc; +use alloc::{format, string::String}; + +use iroha_schema::IntoSchema; use iroha_validator::{ data_model::evaluate::{EvaluationError, ExpressionEvaluator}, + default::domain::tokens::CanUnregisterDomain, permission::Token as _, prelude::*, }; +use parity_scale_codec::{Decode, Encode}; #[cfg(not(test))] extern crate panic_halt; @@ -22,7 +27,7 @@ mod token { use super::*; /// Token to identify if user can (un-)register domains. - #[derive(Token, ValidateGrantRevoke)] + #[derive(Token, ValidateGrantRevoke, Decode, Encode, IntoSchema)] #[validate(iroha_validator::permission::OnlyGenesis)] pub struct CanControlDomainLives; } @@ -125,19 +130,12 @@ impl Visit for CustomValidator { } impl Validate for CustomValidator { - fn permission_tokens() -> Vec { - let mut tokens = DefaultValidator::permission_tokens(); - - // TODO: Not very convenient usage. - // We need to come up with a better way. - if let Some(pos) = tokens.iter().position(|definition| { - definition - == &iroha_validator::default::domain::tokens::CanUnregisterDomain::definition() - }) { - tokens.remove(pos); - } + fn permission_token_schema() -> PermissionTokenSchema { + let mut tokens = DefaultValidator::permission_token_schema(); + + tokens.remove::(); + tokens.insert::(); - tokens.push(token::CanControlDomainLives::definition()); tokens } @@ -161,8 +159,8 @@ impl ExpressionEvaluator for CustomValidator { /// Entrypoint to return permission token definitions defined in this validator. #[entrypoint] -pub fn permission_tokens() -> Vec { - CustomValidator::permission_tokens() +pub fn permission_token_schema() -> PermissionTokenSchema { + CustomValidator::permission_token_schema() } /// Validate operation diff --git a/client/tests/integration/triggers/by_call_trigger.rs b/client/tests/integration/triggers/by_call_trigger.rs index 5e725d3ae95..06995b32542 100644 --- a/client/tests/integration/triggers/by_call_trigger.rs +++ b/client/tests/integration/triggers/by_call_trigger.rs @@ -107,8 +107,7 @@ fn trigger_failure_should_not_cancel_other_triggers_execution() -> Result<()> { let asset_id = AssetId::new(asset_definition_id, account_id.clone()); // Registering trigger that should fail on execution - let bad_trigger_id = - as Identifiable>::Id::from_str("bad_trigger")?; + let bad_trigger_id = TriggerId::from_str("bad_trigger")?; // Invalid instruction let bad_trigger_instructions = vec![MintBox::new(1_u32, account_id.clone())]; let register_bad_trigger = RegisterBox::new(Trigger::new( @@ -126,7 +125,7 @@ fn trigger_failure_should_not_cancel_other_triggers_execution() -> Result<()> { test_client.submit(register_bad_trigger)?; // Registering normal trigger - let trigger_id = as Identifiable>::Id::from_str(TRIGGER_NAME)?; + let trigger_id = TriggerId::from_str(TRIGGER_NAME)?; let trigger_instructions = vec![MintBox::new(1_u32, asset_id.clone())]; let register_trigger = RegisterBox::new(Trigger::new( trigger_id, @@ -160,8 +159,7 @@ fn trigger_should_not_be_executed_with_zero_repeats_count() -> Result<()> { let asset_definition_id = "rose#wonderland".parse()?; let account_id = AccountId::from_str("alice@wonderland")?; let asset_id = AssetId::new(asset_definition_id, account_id.clone()); - let trigger_id = - as Identifiable>::Id::from_str("self_modifying_trigger")?; + let trigger_id = TriggerId::from_str("self_modifying_trigger")?; let trigger_instructions = vec![MintBox::new(1_u32, asset_id.clone())]; let register_trigger = RegisterBox::new(Trigger::new( @@ -220,8 +218,7 @@ fn trigger_should_be_able_to_modify_its_own_repeats_count() -> Result<()> { let asset_definition_id = "rose#wonderland".parse()?; let account_id = AccountId::from_str("alice@wonderland")?; let asset_id = AssetId::new(asset_definition_id, account_id.clone()); - let trigger_id = - as Identifiable>::Id::from_str("self_modifying_trigger")?; + let trigger_id = TriggerId::from_str("self_modifying_trigger")?; let trigger_instructions = vec![ MintBox::new(1_u32, trigger_id.clone()), @@ -266,8 +263,7 @@ fn unregister_trigger() -> Result<()> { let account_id = AccountId::from_str("alice@wonderland")?; // Registering trigger - let trigger_id = - as Identifiable>::Id::from_str("empty_trigger")?; + let trigger_id = TriggerId::from_str("empty_trigger")?; let trigger = Trigger::new( trigger_id.clone(), Action::new( @@ -338,9 +334,8 @@ fn trigger_in_genesis_using_base64() -> Result<()> { info!("WASM size is {} bytes", wasm.len()); let wasm_base64 = serde_json::json!(base64::encode(&wasm)).to_string(); - let account_id = ::Id::from_str("alice@wonderland")?; - let trigger_id = - as Identifiable>::Id::from_str("genesis_trigger")?; + let account_id = AccountId::from_str("alice@wonderland")?; + let trigger_id = TriggerId::from_str("genesis_trigger")?; let trigger = Trigger::new( trigger_id.clone(), @@ -395,12 +390,8 @@ fn trigger_should_be_able_to_modify_other_trigger() -> Result<()> { let asset_definition_id = "rose#wonderland".parse()?; let account_id = AccountId::from_str("alice@wonderland")?; let asset_id = AssetId::new(asset_definition_id, account_id.clone()); - let trigger_id_unregister = - as Identifiable>::Id::from_str("unregister_other_trigger")?; - let trigger_id_should_be_unregistered = - as Identifiable>::Id::from_str( - "should_be_unregistered_trigger", - )?; + let trigger_id_unregister = TriggerId::from_str("unregister_other_trigger")?; + let trigger_id_should_be_unregistered = TriggerId::from_str("should_be_unregistered_trigger")?; let trigger_unregister_instructions = vec![UnregisterBox::new( trigger_id_should_be_unregistered.clone(), diff --git a/client/tests/integration/upgrade.rs b/client/tests/integration/upgrade.rs index 278b6ca2c65..6d0aa0897ce 100644 --- a/client/tests/integration/upgrade.rs +++ b/client/tests/integration/upgrade.rs @@ -59,11 +59,11 @@ fn validator_upgrade_should_update_tokens() -> Result<()> { wait_for_genesis_committed(&vec![client.clone()], 0); // Check that `can_unregister_domain` exists - let can_unregister_domain_token_id: PermissionTokenId = "can_unregister_domain".parse()?; let definitions = client.request(FindAllPermissionTokenDefinitions)?; assert!(definitions - .into_iter() - .any(|definition| definition.id() == &can_unregister_domain_token_id)); + .token_ids() + .iter() + .any(|id| id == "CanUnregisterDomain")); upgrade_validator( &client, @@ -73,14 +73,14 @@ fn validator_upgrade_should_update_tokens() -> Result<()> { // Check that `can_unregister_domain` doesn't exist let definitions = client.request(FindAllPermissionTokenDefinitions)?; assert!(!definitions + .token_ids() .iter() - .any(|definition| definition.id() == &can_unregister_domain_token_id)); + .any(|id| id == "CanUnregisterDomain")); - // Check that `can_control_domain_lives` exists - let can_control_domain_lives: PermissionTokenId = "can_control_domain_lives".parse()?; assert!(definitions + .token_ids() .iter() - .any(|definition| definition.id() == &can_control_domain_lives)); + .any(|id| id == "CanControlDomainLives")); Ok(()) } diff --git a/configs/peer/genesis.json b/configs/peer/genesis.json index 71017467861..2dbdd3848b1 100644 --- a/configs/peer/genesis.json +++ b/configs/peer/genesis.json @@ -105,8 +105,8 @@ { "Grant": { "PermissionToken": { - "definition_id": "can_set_parameters", - "params": {} + "definition_id": "CanSetParameters", + "payload": [] }, "destination_id": { "AccountId": "alice@wonderland" @@ -178,20 +178,48 @@ "id": "ALICE_METADATA_ACCESS", "permissions": [ { - "definition_id": "can_remove_key_value_in_user_account", - "params": { - "account_id": { - "AccountId": "alice@wonderland" - } - } + "definition_id": "CanRemoveKeyValueInUserAccount", + "payload": [ + 20, + 97, + 108, + 105, + 99, + 101, + 40, + 119, + 111, + 110, + 100, + 101, + 114, + 108, + 97, + 110, + 100 + ] }, { - "definition_id": "can_set_key_value_in_user_account", - "params": { - "account_id": { - "AccountId": "alice@wonderland" - } - } + "definition_id": "CanSetKeyValueInUserAccount", + "payload": [ + 20, + 97, + 108, + 105, + 99, + 101, + 40, + 119, + 111, + 110, + 100, + 101, + 114, + 108, + 97, + 110, + 100 + ] } ] } diff --git a/configs/peer/validator.wasm b/configs/peer/validator.wasm index c2a93e4010be0182a09ffa1037ff27f754477943..d2a6efb1294f7a36d97cca21227dc0a791606623 100644 GIT binary patch literal 376893 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

E*L*5&dKR1>14Gl%H(Syp)6uDx2A*5evje7H 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%0DYp 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 diff --git a/core/src/lib.rs b/core/src/lib.rs index b647f344ae5..a6a5157d191 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -46,10 +46,6 @@ pub type RolesMap = HashMap<::Id, Role>; /// API to work with a collections of [`AccountId`] [`Permissions`] mappings. pub type PermissionTokensMap = HashMap<::Id, Permissions>; -/// API to work with a collections of [`PermissionTokenDefinitionId`] : [`PermissionTokenDefinition`] mappings. -pub type PermissionTokenDefinitionsMap = - HashMap<::Id, PermissionTokenDefinition>; - /// Type of `Sender` which should be used for channels of `Event` messages. pub type EventsSender = broadcast::Sender; diff --git a/core/src/smartcontracts/isi/account.rs b/core/src/smartcontracts/isi/account.rs index 0f5033eb5b3..71c01b0f9a1 100644 --- a/core/src/smartcontracts/isi/account.rs +++ b/core/src/smartcontracts/isi/account.rs @@ -36,7 +36,7 @@ pub mod isi { error::{MintabilityError, RepetitionError}, InstructionType, }, - query::error::{PermissionTokenFindError, QueryExecutionFail}, + query::error::QueryExecutionFail, }; use super::*; @@ -261,12 +261,13 @@ pub mod isi { // Check if account exists wsv.account_mut(&account_id)?; - let definition = wsv + if !wsv .permission_token_definitions() - .get(&permission_id) - .ok_or_else(|| FindError::PermissionTokenDefinition(permission_id.clone()))?; - - permissions::check_permission_token_parameters(&permission, definition)?; + .token_ids + .contains(&permission_id) + { + return Err(FindError::PermissionToken(permission_id).into()); + } if wsv.account_contains_inherent_permission(&account_id, &permission) { return Err(RepetitionError { @@ -298,18 +299,8 @@ pub mod isi { // Check if account exists wsv.account_mut(&account_id)?; - if !wsv - .permission_token_definitions() - .contains_key(&permission.definition_id) - { - return Err(FindError::PermissionTokenDefinition(permission.definition_id).into()); - } if !wsv.remove_account_permission(&account_id, &permission) { - return Err(FindError::PermissionToken(PermissionTokenFindError { - account_id: account_id.clone(), - permission_token_id: permission.definition_id, - }) - .into()); + return Err(FindError::PermissionToken(permission.definition_id).into()); } wsv.emit_events(Some(AccountEvent::PermissionRemoved( diff --git a/core/src/smartcontracts/isi/mod.rs b/core/src/smartcontracts/isi/mod.rs index 13da4987b1b..131d4a92d01 100644 --- a/core/src/smartcontracts/isi/mod.rs +++ b/core/src/smartcontracts/isi/mod.rs @@ -10,7 +10,6 @@ pub mod account; pub mod asset; pub mod block; pub mod domain; -pub mod permissions; pub mod query; pub mod triggers; pub mod tx; @@ -19,10 +18,7 @@ pub mod world; use eyre::Result; use iroha_data_model::{ evaluate::ExpressionEvaluator, - isi::{ - error::{InstructionEvaluationError, InstructionExecutionError as Error}, - *, - }, + isi::{error::InstructionExecutionError as Error, *}, prelude::*, }; use iroha_logger::prelude::{Span, *}; @@ -119,7 +115,7 @@ impl Execute for UnregisterBox { IdBox::TriggerId(object_id) => { Unregister::> { object_id }.execute(authority, wsv) } - IdBox::PermissionTokenDefinitionId(_) | IdBox::ParameterId(_) => { + IdBox::PermissionTokenId(_) | IdBox::ParameterId(_) => { Err(Error::Evaluate(InstructionType::Unregister.into())) } } diff --git a/core/src/smartcontracts/isi/permissions.rs b/core/src/smartcontracts/isi/permissions.rs deleted file mode 100644 index f8790b54e0e..00000000000 --- a/core/src/smartcontracts/isi/permissions.rs +++ /dev/null @@ -1,69 +0,0 @@ -//! Contains functions to check permission -#![allow( - clippy::arithmetic_side_effects, - clippy::std_instead_of_core, - clippy::std_instead_of_alloc -)] - -use super::*; - -/// Check if a permission `token` has the parameters from its `definition`. -/// -/// Takes `O(max(N, M))` time, where *N* is the number of parameters in `token` -/// and *M* is the number of parameters in `definition`. -/// -/// # Errors -/// Fails if there is a mismatch between a permissions `token` and its `definition`: -/// - If a `token` doesn't have all parameters from its `definition` -/// - If a `token` has parameters that are not in its `definition` -/// - If a `token` has a parameter of a different type than in its `definition` -pub fn check_permission_token_parameters( - token: &PermissionToken, - definition: &PermissionTokenDefinition, -) -> std::result::Result<(), InstructionEvaluationError> { - use iroha_data_model::ValueKind; - use itertools::{ - EitherOrBoth::{Both, Left, Right}, - Itertools, - }; - - for either_or_both in token - .params - .iter() - .map(|(key, value)| (key, ValueKind::from(value))) - .zip_longest(&definition.params) - { - match either_or_both { - Both((key, kind), (expected_key, expected_kind)) => { - // As keys are guaranteed to be in alphabetical order, that's an error if they are mismatched - if key != expected_key { - return Err(missing_parameter(expected_key)); - } - if kind != *expected_kind { - return Err(InstructionEvaluationError::PermissionParameter(format!( - "Permission token parameter `{key}` type mismatch: \ - expected `{expected_kind}`, got `{kind}`" - ))); - } - } - // No more parameters in the definition - Left((key, _)) => { - return Err(InstructionEvaluationError::PermissionParameter(format!( - "Undefined permission token parameter: `{key}`" - ))); - } - // No more parameters in the permission token - Right((expected_key, _)) => { - return Err(missing_parameter(expected_key)); - } - } - } - - Ok(()) -} - -fn missing_parameter(key: &Name) -> InstructionEvaluationError { - InstructionEvaluationError::PermissionParameter(format!( - "Permission parameter `{key}` is missing" - )) -} diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index a4909bd0e48..42ec2c5253e 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -112,17 +112,6 @@ pub mod isi { fn execute(self, authority: &AccountId, wsv: &mut WorldStateView) -> Result<(), Error> { let role = self.object.build(authority); - for permission in &role.permissions { - let definition = wsv - .permission_token_definitions() - .get(&permission.definition_id) - .ok_or_else(|| { - FindError::PermissionTokenDefinition(permission.definition_id.clone()) - })?; - - permissions::check_permission_token_parameters(permission, definition)?; - } - if wsv.roles().contains_key(role.id()) { return Err(RepetitionError { instruction_type: InstructionType::Register, @@ -131,6 +120,16 @@ pub mod isi { .into()); } + for permission in &role.permissions { + if !wsv + .permission_token_definitions() + .token_ids + .contains(&permission.definition_id) + { + return Err(FindError::PermissionToken(permission.definition_id.clone()).into()); + } + } + let world = wsv.world_mut(); let role_id = role.id().clone(); world.roles.insert(role_id, role.clone()); @@ -178,55 +177,34 @@ pub mod isi { } } - fn register_permission_token_definition( - definition: PermissionTokenDefinition, - wsv: &mut WorldStateView, - ) -> Result<(), Error> { - let definition_id = definition.id().clone(); + fn register_permission_token_definition(token_id: PermissionTokenId, wsv: &mut WorldStateView) { + let permission_token_ids = &mut wsv.world_mut().permission_token_definitions.token_ids; - let world = wsv.world_mut(); - if world - .permission_token_definitions - .contains_key(&definition_id) - { - return Err(RepetitionError { - instruction_type: InstructionType::Register, - id: IdBox::PermissionTokenDefinitionId(definition_id), - } - .into()); + // Keep permission tokens sorted + if let Err(pos) = permission_token_ids.binary_search(&token_id) { + permission_token_ids.insert(pos, token_id); } - - world - .permission_token_definitions - .insert(definition_id, definition.clone()); - - wsv.emit_events(Some(PermissionTokenEvent::DefinitionCreated(definition))); - - Ok(()) } fn unregister_permission_token_definition( - definition_id: PermissionTokenId, + token_id: &PermissionTokenId, wsv: &mut WorldStateView, ) -> Result<(), Error> { - remove_token_from_roles(wsv, &definition_id)?; - remove_token_from_accounts(wsv, &definition_id)?; + remove_token_from_roles(token_id, wsv)?; + remove_token_from_accounts(token_id, wsv)?; - let world = wsv.world_mut(); - let definition = world + wsv.world_mut() .permission_token_definitions - .remove(&definition_id) - .ok_or_else(|| FindError::PermissionTokenDefinition(definition_id))?; - - wsv.emit_events(Some(PermissionTokenEvent::DefinitionDeleted(definition))); + .token_ids + .retain(|id| id != token_id); Ok(()) } /// Remove all tokens with specified definition id from all registered roles fn remove_token_from_roles( + token_id: &PermissionTokenId, wsv: &mut WorldStateView, - target_definition_id: &::Id, ) -> Result<(), Error> { let mut roles_containing_token = Vec::new(); @@ -234,7 +212,7 @@ pub mod isi { if role .permissions .iter() - .any(|token| token.definition_id == *target_definition_id) + .any(|token| token.definition_id == *token_id) { roles_containing_token.push(role_id.clone()) } @@ -245,10 +223,10 @@ pub mod isi { for role_id in roles_containing_token { if let Some(role) = world.roles.get_mut(&role_id) { role.permissions - .retain(|token| token.definition_id != *target_definition_id); + .retain(|token| token.definition_id != *token_id); events.push(RoleEvent::PermissionRemoved(PermissionRemoved { role_id: role_id.clone(), - permission_definition_id: target_definition_id.clone(), + permission_token_id: token_id.clone(), })); } else { error!(%role_id, "role not found. This is a bug"); @@ -263,8 +241,8 @@ pub mod isi { /// Remove all tokens with specified definition id from all accounts in all domains fn remove_token_from_accounts( + token_id: &PermissionTokenId, wsv: &mut WorldStateView, - target_definition_id: &::Id, ) -> Result<(), Error> { let mut accounts_with_token = std::collections::HashMap::new(); @@ -273,7 +251,7 @@ pub mod isi { ( account.id().clone(), wsv.account_inherent_permission_tokens(account) - .filter(|token| token.definition_id == *target_definition_id) + .filter(|token| token.definition_id == *token_id) .collect::>(), ) }); @@ -286,9 +264,7 @@ pub mod isi { for token in tokens { if !wsv.remove_account_permission(&account_id, &token) { error!(%token, "token not found. This is a bug"); - return Err( - FindError::PermissionTokenDefinition(token.definition_id.clone()).into(), - ); + return Err(FindError::PermissionToken(token.definition_id.clone()).into()); } events.push(AccountEvent::PermissionRemoved(AccountPermissionChanged { account_id: account_id.clone(), @@ -352,13 +328,12 @@ pub mod isi { let raw_validator = self.object; let engine = wsv.engine.clone(); // Cloning engine is cheap - let (new_validator, new_permission_token_definitions) = + let (new_validator, new_token_schema) = || -> Result<_, crate::smartcontracts::wasm::error::Error> { { let new_validator = Validator::new(raw_validator, &engine)?; - let new_permission_token_definitions = - new_validator.permission_tokens(wsv)?; - Ok((new_validator, new_permission_token_definitions)) + let new_token_schema = new_validator.permission_tokens(wsv)?; + Ok((new_validator, new_token_schema)) } }() .map_err(|error| { @@ -368,36 +343,40 @@ pub mod isi { let world = wsv.world_mut(); let _ = world.upgraded_validator.insert(new_validator); - let old_permission_token_definitions = wsv - .permission_token_definitions() - .values() - .cloned() - .collect::>(); - let new_permission_token_definitions = { + { let mut tokens = HashSet::new(); - for token in new_permission_token_definitions { - let token_id = token.id().clone(); - let newly_inserted = tokens.insert(token); - if !newly_inserted { + + for token_id in &new_token_schema.token_ids { + if !tokens.insert(token_id.clone()) { return Err(InvalidParameterError::Wasm(format!( "Retrieved permission tokens definitions contain duplicate: `{token_id}`", )) .into()); } } - tokens - }; + } + + let old_token_schema = wsv.permission_token_definitions().clone(); + for token_id in &old_token_schema.token_ids { + if !new_token_schema.token_ids.contains(token_id) { + unregister_permission_token_definition(token_id, wsv)?; + } - old_permission_token_definitions - .difference(&new_permission_token_definitions) - .try_for_each(|definition| { - unregister_permission_token_definition(definition.id().clone(), wsv) - })?; + wsv.world_mut().permission_token_definitions.schema = + new_token_schema.schema.clone(); + } + for token_id in &new_token_schema.token_ids { + wsv.world_mut().permission_token_definitions.schema = + new_token_schema.schema.clone(); - new_permission_token_definitions - .difference(&old_permission_token_definitions) - .cloned() - .try_for_each(|definition| register_permission_token_definition(definition, wsv))?; + if !old_token_schema.token_ids.contains(token_id) { + register_permission_token_definition(token_id.clone(), wsv); + } + } + wsv.emit_events(Some(PermissionTokenSchemaUpdateEvent { + old_schema: old_token_schema, + new_schema: new_token_schema, + })); wsv.emit_events(Some(ValidatorEvent::Upgraded)); @@ -462,13 +441,9 @@ pub mod query { } impl ValidQuery for FindAllPermissionTokenDefinitions { - #[metrics("find_all_token_ids")] + #[metrics("find_all_permission_token_ids")] fn execute(&self, wsv: &WorldStateView) -> Result { - Ok(wsv - .permission_token_definitions() - .values() - .cloned() - .collect()) + Ok(wsv.permission_token_definitions().clone()) } } @@ -480,15 +455,18 @@ pub mod query { } impl ValidQuery for DoesAccountHavePermissionToken { - #[metrics("does_account_have_permission")] + #[metrics("does_account_have_permission_token")] fn execute(&self, wsv: &WorldStateView) -> Result { let authority = wsv .evaluate(&self.account_id) .map_err(|e| Error::Evaluate(e.to_string()))?; + let permission_token = wsv + .evaluate(&self.permission_token) + .map_err(|e| Error::Evaluate(e.to_string()))?; wsv.map_account(&authority, |account| { wsv.account_permission_tokens(account) - .contains(&self.permission_token) + .contains(&permission_token) }) } } diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index f65644f6e1a..0a4f0265899 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -11,7 +11,7 @@ use iroha_config::{ }; use iroha_data_model::{ account::AccountId, - permission::PermissionTokenDefinition, + permission::PermissionTokenSchema, prelude::*, validator::{self, NeedsValidationBox}, ValidationFail, @@ -43,8 +43,9 @@ pub mod export { pub const WASM_MAIN_FN_NAME: &str = "_iroha_wasm_main"; /// Name of the exported entry for validator to validate operation pub const VALIDATOR_VALIDATE_FN_NAME: &str = "_iroha_validator_validate"; - /// Name of the exported entry for validator to retrieve [`PermissionTokenDefinition`]s - pub const VALIDATOR_PERMISSION_TOKENS_FN_NAME: &str = "_iroha_validator_permission_tokens"; + /// Name of the exported entry for validator to retrieve [`PermissionTokenSchema`]s + pub const VALIDATOR_PERMISSION_TOKEN_SCHEMA_FN_NAME: &str = + "_iroha_validator_permission_token_schema"; } pub mod import { @@ -900,11 +901,11 @@ impl Runtime { /// - if failed to instantiate provided `module` /// - if failed to get export function for `permission_tokens()` /// - if failed to call export function - /// - if failed to decode `Vec` + /// - if failed to decode `Vec` pub fn execute_validator_permission_tokens( &self, module: &wasmtime::Module, - ) -> Result> { + ) -> Result { let log_span = wasm_log_span!("Retrieving permission tokens"); let state = state::ValidatorPermissionTokens { log_span, @@ -917,7 +918,7 @@ impl Runtime { let permission_tokens_fn = Self::get_typed_func( &instance, &mut store, - export::VALIDATOR_PERMISSION_TOKENS_FN_NAME, + export::VALIDATOR_PERMISSION_TOKEN_SCHEMA_FN_NAME, )?; let offset = permission_tokens_fn diff --git a/core/src/validator.rs b/core/src/validator.rs index 6202820dfab..a6ea00dbac8 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -2,7 +2,7 @@ use derive_more::DebugCustom; use iroha_data_model::{ - account::AccountId, permission::PermissionTokenDefinition, validator as data_model_validator, + account::AccountId, permission::PermissionTokenSchema, validator as data_model_validator, ValidationFail, }; #[cfg(test)] @@ -100,7 +100,7 @@ impl Validator { pub fn permission_tokens( &self, wsv: &WorldStateView, - ) -> Result, wasm::error::Error> { + ) -> Result { 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) @@ -183,8 +183,8 @@ impl MockValidator { pub fn permission_tokens( &self, _wsv: &WorldStateView, - ) -> Result, wasm::error::Error> { - Ok(Vec::default()) + ) -> Result { + Ok(PermissionTokenSchema::default()) } fn execute_instruction( diff --git a/core/src/wsv.rs b/core/src/wsv.rs index 4c26410f4bc..2d46b0e5f19 100644 --- a/core/src/wsv.rs +++ b/core/src/wsv.rs @@ -26,6 +26,7 @@ use iroha_data_model::{ block::{CommittedBlock, VersionedCommittedBlock}, isi::error::{InstructionExecutionError as Error, MathError}, parameter::Parameter, + permission::PermissionTokenSchema, prelude::*, query::error::{FindError, QueryExecutionFail}, trigger::action::ActionTrait, @@ -65,7 +66,7 @@ pub struct World { /// Permission tokens of an account. pub(crate) account_permission_tokens: crate::PermissionTokensMap, /// Registered permission token ids. - pub(crate) permission_token_definitions: crate::PermissionTokenDefinitionsMap, + pub(crate) permission_token_definitions: PermissionTokenSchema, /// Triggers pub(crate) triggers: TriggerSet, /// Runtime Validator @@ -619,9 +620,9 @@ impl WorldStateView { &self.world.roles } - /// Get all permission token ids + /// Get all permission token definitions #[inline] - pub fn permission_token_definitions(&self) -> &crate::PermissionTokenDefinitionsMap { + pub fn permission_token_definitions(&self) -> &crate::PermissionTokenSchema { &self.world.permission_token_definitions } diff --git a/core/test_network/Cargo.toml b/core/test_network/Cargo.toml index a2ebe97397c..8c61ff9956f 100644 --- a/core/test_network/Cargo.toml +++ b/core/test_network/Cargo.toml @@ -24,3 +24,4 @@ rand = "0.8.5" tempfile = "3.3.0" tokio = { version = "1.23.0", features = ["rt", "rt-multi-thread", "macros"] } unique_port = "0.2.1" +parity-scale-codec = { version = "3.1.5", default-features = false } diff --git a/core/test_network/src/lib.rs b/core/test_network/src/lib.rs index 00c61b24fdb..4df207f4c15 100644 --- a/core/test_network/src/lib.rs +++ b/core/test_network/src/lib.rs @@ -85,29 +85,19 @@ impl TestGenesis for GenesisNetwork { ::Id::from_str("alice@wonderland").expect("valid names"); let mint_rose_permission = PermissionToken::new( - "can_mint_assets_with_definition" - .parse() - .expect("valid names"), - ) - .with_params([( - "asset_definition_id".parse().expect("valid names"), - IdBox::from(rose_definition_id.clone()).into(), - )]); + "CanMintAssetsWithDefinition".to_owned(), + &rose_definition_id, + ); let burn_rose_permission = PermissionToken::new( - "can_burn_assets_with_definition" - .parse() - .expect("valid names"), - ) - .with_params([( - "asset_definition_id".parse().expect("valid names"), - IdBox::from(rose_definition_id).into(), - )]); + "CanBurnAssetsWithDefinition".to_owned(), + &rose_definition_id, + ); let unregister_any_peer_permission = - PermissionToken::new("can_unregister_any_peer".parse().expect("valid names")); + PermissionToken::new("CanUnregisterAnyPeer".to_owned(), &()); let unregister_any_role_permission = - PermissionToken::new("can_unregister_any_role".parse().expect("valid names")); + PermissionToken::new("CanUnregisterAnyRole".to_owned(), &()); let upgrade_validator_permission = - PermissionToken::new("can_upgrade_validator".parse().expect("valid names")); + PermissionToken::new("CanUpgradeValidator".to_owned(), &()); for permission in [ mint_rose_permission, diff --git a/data_model/derive/src/lib.rs b/data_model/derive/src/lib.rs index 1ebb20e5ccd..fc73e897dd0 100644 --- a/data_model/derive/src/lib.rs +++ b/data_model/derive/src/lib.rs @@ -6,7 +6,6 @@ mod has_origin; mod id; mod model; mod partially_tagged; -mod variant_discriminant; use proc_macro::TokenStream; use syn::parse_macro_input; @@ -485,44 +484,3 @@ pub fn partially_tagged_deserialize_derive(input: TokenStream) -> TokenStream { pub fn has_origin_derive(input: TokenStream) -> TokenStream { has_origin::impl_has_origin(&parse_macro_input!(input)) } -/// Derive macro implementing the [`AssociatedConstant`](iroha_data_model::AssociatedConstant) trait. -/// -/// # Notes -/// -/// You should import `AssociatedConstant`. -/// -/// # Attributes -/// -/// `#[variant_discriminant(name(DiscriminantType))]` attribute where `DiscriminantType` is the name of the `enum` that should serve as the discriminant enumeration. -/// -/// # Examples -/// -/// ``` -/// use iroha_data_model_derive::VariantDiscriminant; -/// use iroha_data_model::AssociatedConstant; -/// -/// #[derive(VariantDiscriminant)] -/// #[variant_discriminant(name(MyEnumKind))] -/// enum MyEnum { -/// Unsigned(u32), -/// String(String), -/// Boolean(bool), -/// } -/// -/// #[derive(Debug, PartialEq, Eq)] -/// enum MyEnumKind { -/// Unsigned, -/// String, -/// Boolean, -/// } -/// -/// assert_eq!(>::VALUE, MyEnumKind::Unsigned); -/// assert_eq!(>::VALUE, MyEnumKind::String); -/// assert_eq!(>::VALUE, MyEnumKind::Boolean); -/// ``` -#[proc_macro_error::proc_macro_error] -#[proc_macro_derive(VariantDiscriminant, attributes(variant_discriminant))] -pub fn variant_discriminant_derive(input: TokenStream) -> TokenStream { - let ast = syn::parse(input).expect("Failed to parse input Token Stream."); - variant_discriminant::impl_variant_discriminant(&ast) -} diff --git a/data_model/derive/src/variant_discriminant.rs b/data_model/derive/src/variant_discriminant.rs deleted file mode 100644 index d662b9f51f4..00000000000 --- a/data_model/derive/src/variant_discriminant.rs +++ /dev/null @@ -1,107 +0,0 @@ -use iroha_macro_utils::AttrParser; -use proc_macro::TokenStream; -use proc_macro_error::{abort, OptionExt as _}; -use quote::quote; -use syn::{ - parse::{Parse, ParseStream}, - punctuated::Punctuated, - Attribute, Generics, Ident, Token, Type, Visibility, -}; - -mod kw { - syn::custom_keyword!(name); -} - -pub struct VariantDiscriminantEnum { - variants: Punctuated, - discriminant_type: Type, -} - -impl Parse for VariantDiscriminantEnum { - fn parse(input: ParseStream) -> syn::Result { - let attrs = input.call(Attribute::parse_outer)?; - let _vis = input.parse::()?; - let _enum_token = input.parse::()?; - let _ident = input.parse::()?; - let generics = input.parse::()?; - if !generics.params.is_empty() { - abort!(generics, "Generics are not supported"); - } - let content; - let _brace_token = syn::braced!(content in input); - let variants = content.parse_terminated(Variant::parse)?; - let discriminant_type = attrs - .iter() - .find_map(|attr| VariantDiscriminantAttr::::parse(attr).ok()) - .map(|name_attr| name_attr.ty) - .expect_or_abort("Attribute `#[strum_discriminants(name(...))]` is required"); - Ok(Self { - variants, - discriminant_type, - }) - } -} - -pub struct Variant { - ty: Type, - discriminant_name: Ident, -} - -impl Parse for Variant { - fn parse(input: ParseStream) -> syn::Result { - let syn::Variant { ident, fields, .. } = input.parse::()?; - let unnamed = match fields { - syn::Fields::Unnamed(unnamed) if unnamed.unnamed.len() == 1 => unnamed, - fields => abort!(fields, "Only supports tuple variants with single field"), - }; - - let ty = unnamed.unnamed.first().expect("Checked above").ty.clone(); - Ok(Self { - ty, - discriminant_name: ident, - }) - } -} - -pub struct Name { - _kw: kw::name, - _paren: syn::token::Paren, - ty: Type, -} - -impl Parse for Name { - fn parse(input: ParseStream) -> syn::Result { - let kw = input.parse::()?; - let content; - let paren = syn::parenthesized!(content in input); - let ty = content.parse::()?; - Ok(Self { - _kw: kw, - _paren: paren, - ty, - }) - } -} - -struct VariantDiscriminantAttr(core::marker::PhantomData); - -impl AttrParser for VariantDiscriminantAttr { - const IDENT: &'static str = "variant_discriminant"; -} - -pub fn impl_variant_discriminant(enum_: &VariantDiscriminantEnum) -> TokenStream { - let discriminant_type = &enum_.discriminant_type; - let impls = enum_.variants.iter().map(|variant| { - let Variant { - ty, - discriminant_name, - } = variant; - // In order to make doc-tests work, we need to not to use full path to `AssociatedConstant` - quote! { - impl AssociatedConstant<#discriminant_type> for #ty { - const VALUE: #discriminant_type = #discriminant_type::#discriminant_name; - } - } - }); - quote! {#(#impls)*}.into() -} diff --git a/data_model/src/events/data/events.rs b/data_model/src/events/data/events.rs index 86bf013c1e8..4d788272ddc 100644 --- a/data_model/src/events/data/events.rs +++ b/data_model/src/events/data/events.rs @@ -58,7 +58,7 @@ pub mod model { Domain(domain::DomainEvent), Role(role::RoleEvent), Trigger(trigger::TriggerEvent), - PermissionToken(permission::PermissionTokenEvent), + PermissionToken(permission::PermissionTokenSchemaUpdateEvent), Configuration(config::ConfigurationEvent), Validator(validator::ValidatorEvent), } @@ -84,7 +84,7 @@ pub mod model { /// Role event Role(role::RoleEvent), /// Permission token event - PermissionToken(permission::PermissionTokenEvent), + PermissionToken(permission::PermissionTokenSchemaUpdateEvent), /// Configuration event Configuration(config::ConfigurationEvent), /// Validator event @@ -239,24 +239,48 @@ mod role { pub struct PermissionRemoved { /// Role id pub role_id: RoleId, - /// [`PermissionTokenDefinition`] id. All [`PermissionToken`]s with this definition id were removed. - pub permission_definition_id: PermissionTokenId, + // TODO: Skipped temporarily because of FFI + #[getset(skip)] + /// All [`PermissionToken`]s with this id were removed. + pub permission_token_id: PermissionTokenId, } } } mod permission { - //! This module contains [`PermissionTokenEvent`] + //! This module contains [`PermissionTokenSchemaUpdateEvent`] + pub use self::model::*; use super::*; + use crate::permission::PermissionTokenSchema; - data_event! { - #[has_origin(origin = PermissionTokenDefinition)] - pub enum PermissionTokenEvent { - #[has_origin(permission_token_definition => permission_token_definition.id())] - DefinitionCreated(PermissionTokenDefinition), - #[has_origin(permission_token_definition => permission_token_definition.id())] - DefinitionDeleted(PermissionTokenDefinition), + #[model] + pub mod model { + use super::*; + + /// Information about permission tokens update. + /// Only happens when registering new validator + #[derive( + Debug, + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Getters, + Decode, + Encode, + Deserialize, + Serialize, + IntoSchema, + )] + #[getset(get = "pub")] + #[ffi_type] + pub struct PermissionTokenSchemaUpdateEvent { + /// Previous set of permission tokens + pub old_schema: PermissionTokenSchema, + /// New set of permission tokens + pub new_schema: PermissionTokenSchema, } } } @@ -320,6 +344,8 @@ mod account { #[ffi_type] pub struct AccountPermissionChanged { pub account_id: AccountId, + // TODO: Skipped temporarily because of FFI + #[getset(skip)] pub permission_id: PermissionTokenId, } @@ -345,6 +371,13 @@ mod account { pub role_id: RoleId, } } + + impl AccountPermissionChanged { + /// Get permission id + pub fn permission_id(&self) -> &str { + &self.permission_id + } + } } mod domain { @@ -585,7 +618,7 @@ pub mod prelude { config::ConfigurationEvent, domain::{DomainEvent, DomainEventFilter, DomainFilter}, peer::{PeerEvent, PeerEventFilter, PeerFilter}, - permission::PermissionTokenEvent, + permission::PermissionTokenSchemaUpdateEvent, role::{PermissionRemoved, RoleEvent, RoleEventFilter, RoleFilter}, trigger::{ TriggerEvent, TriggerEventFilter, TriggerFilter, TriggerNumberOfExecutionsChanged, diff --git a/data_model/src/lib.rs b/data_model/src/lib.rs index 44b394065cd..b647c6428ac 100644 --- a/data_model/src/lib.rs +++ b/data_model/src/lib.rs @@ -39,7 +39,7 @@ use getset::Getters; use iroha_crypto::{HashOf, PublicKey}; pub use iroha_crypto::{SignatureOf, SignaturesOf}; use iroha_data_model_derive::{ - model, IdEqOrdHash, PartiallyTaggedDeserialize, PartiallyTaggedSerialize, VariantDiscriminant, + model, IdEqOrdHash, PartiallyTaggedDeserialize, PartiallyTaggedSerialize, }; use iroha_macro::{error::ErrorTryFromEnum, FromVariant}; use iroha_primitives::{ @@ -49,11 +49,9 @@ use iroha_primitives::{ use iroha_schema::IntoSchema; pub use numeric::model::NumericValue; use parity_scale_codec::{Decode, Encode}; -use prelude::{Executable, TransactionQueryResult}; +use prelude::{Executable, TransactionQueryResult, VersionedSignedTransaction}; use serde::{Deserialize, Serialize}; use serde_with::{DeserializeFromStr, SerializeDisplay}; -use strum::EnumDiscriminants; -use transaction::VersionedSignedTransaction; pub use self::model::*; use crate::{account::SignatureCheckCondition, name::Name}; @@ -85,34 +83,6 @@ pub mod trigger; pub mod validator; pub mod visit; -mod utils { - use core::fmt::*; - - /// Format `input` separating items with a comma, - /// wrapping the whole output into provided characters. - /// - /// # Errors - /// - /// - if cannot write to the `f` - pub fn format_comma_separated( - mut input: impl Iterator, - (open, close): (char, char), - f: &mut Formatter<'_>, - ) -> Result { - f.write_char(open)?; - - if let Some(item) = input.next() { - f.write_fmt(format_args!("{item}"))?; - } - - for item in input { - f.write_fmt(format_args!(", {item}"))?; - } - - f.write_char(close) - } -} - mod seal { use crate::{isi::prelude::*, query::prelude::*}; @@ -259,12 +229,6 @@ impl EnumTryAsError { #[cfg(feature = "std")] impl std::error::Error for EnumTryAsError {} -/// Trait to define associated constant of type `T` -pub trait AssociatedConstant { - /// Associated constant value - const VALUE: T; -} - pub mod parameter { //! Structures, traits and impls related to `Paramater`s. @@ -615,29 +579,29 @@ pub mod model { IntoSchema, )] #[allow(clippy::enum_variant_names)] - #[ffi_type] + #[ffi_type(local)] pub enum IdBox { /// [`DomainId`](`domain::DomainId`) variant. - DomainId(::Id), + DomainId(domain::DomainId), /// [`AccountId`](`account::AccountId`) variant. #[display(fmt = "{_0}")] - AccountId(::Id), + AccountId(account::AccountId), /// [`AssetDefinitionId`](`asset::AssetDefinitionId`) variant. #[display(fmt = "{_0}")] - AssetDefinitionId(::Id), + AssetDefinitionId(asset::AssetDefinitionId), /// [`AssetId`](`asset::AssetId`) variant. #[display(fmt = "{_0}")] - AssetId(::Id), + AssetId(asset::AssetId), /// [`PeerId`](`peer::PeerId`) variant. - PeerId(::Id), + PeerId(peer::PeerId), /// [`TriggerId`](trigger::TriggerId) variant. - TriggerId( as Identifiable>::Id), + TriggerId(trigger::TriggerId), /// [`RoleId`](`role::RoleId`) variant. - RoleId(::Id), - /// [`PermissionTokenId`](`permission::PermissionTokenId`) variant. - PermissionTokenDefinitionId(::Id), + RoleId(role::RoleId), + /// [`PermissionToken`](`permission::PermissionToken`) variant. + PermissionTokenId(permission::PermissionTokenId), /// [`ParameterId`](`parameter::ParameterId`) variant. - ParameterId(::Id), + ParameterId(parameter::ParameterId), } /// Sized container for constructors of all [`Identifiable`]s that can be registered via transaction @@ -721,8 +685,6 @@ pub mod model { Trigger(TriggerBox), /// [`Role`](`role::Role`) variant. Role(role::Role), - /// [`PermissionTokenDefinition`](`permission::PermissionTokenDefinition`) variant. - PermissionTokenDefinition(permission::PermissionTokenDefinition), /// [`Parameter`](`parameter::Parameter`) variant. Parameter(parameter::Parameter), } @@ -788,25 +750,12 @@ pub mod model { PartialOrd, Ord, FromVariant, - EnumDiscriminants, - VariantDiscriminant, Decode, Encode, PartiallyTaggedDeserialize, PartiallyTaggedSerialize, IntoSchema, )] - #[strum_discriminants( - name(ValueKind), - derive(Display, Decode, Encode, Deserialize, Serialize, IntoSchema), - cfg_attr( - any(feature = "ffi_import", feature = "ffi_export"), - derive(iroha_ffi::FfiType) - ), - allow(missing_docs), - repr(u8) - )] - #[variant_discriminant(name(ValueKind))] #[allow(clippy::enum_variant_names, missing_docs)] #[ffi_type(opaque)] pub enum Value { @@ -830,6 +779,7 @@ pub mod model { SignatureCheckCondition(SignatureCheckCondition), TransactionQueryResult(TransactionQueryResult), PermissionToken(permission::PermissionToken), + PermissionTokenSchema(permission::PermissionTokenSchema), Hash(HashValue), Block(VersionedCommittedBlockWrapper), BlockHeader(block::BlockHeader), @@ -1055,7 +1005,6 @@ impl IdentifiableBox { IdentifiableBox::Asset(a) => a.id().clone().into(), IdentifiableBox::Trigger(a) => a.id().clone().into(), IdentifiableBox::Role(a) => a.id().clone().into(), - IdentifiableBox::PermissionTokenDefinition(a) => a.id().clone().into(), IdentifiableBox::Parameter(a) => a.id().clone().into(), } } @@ -1119,6 +1068,7 @@ impl fmt::Display for Value { Value::SignatureCheckCondition(v) => fmt::Display::fmt(&v, f), Value::TransactionQueryResult(_) => write!(f, "TransactionQueryResult"), Value::PermissionToken(v) => fmt::Display::fmt(&v, f), + Value::PermissionTokenSchema(v) => fmt::Display::fmt(&v, f), Value::Hash(v) => fmt::Display::fmt(&v, f), Value::Block(v) => fmt::Display::fmt(&**v, f), Value::BlockHeader(v) => fmt::Display::fmt(&v, f), @@ -1148,6 +1098,7 @@ impl Value { | Name(_) | TransactionQueryResult(_) | PermissionToken(_) + | PermissionTokenSchema(_) | Hash(_) | Block(_) | Ipv4Addr(_) @@ -1186,30 +1137,24 @@ where // TODO: The following macros looks very similar. Try to generalize them under one macro macro_rules! from_and_try_from_value_idbox { - ( $($variant:ident( $ty:ty ),)+ $(,)? ) => { - $( - impl TryFrom for $ty { - type Error = ErrorTryFromEnum; - - fn try_from(value: Value) -> Result { - if let Value::Id(IdBox::$variant(id)) = value { - Ok(id) - } else { - Err(Self::Error::default()) - } - } - } + ( $($variant:ident( $ty:ty ),)+ $(,)? ) => { $( + impl TryFrom for $ty { + type Error = ErrorTryFromEnum; - impl From<$ty> for Value { - fn from(id: $ty) -> Self { - Value::Id(IdBox::$variant(id)) + fn try_from(value: Value) -> Result { + if let Value::Id(IdBox::$variant(id)) = value { + Ok(id) + } else { + Err(Self::Error::default()) } } + } - impl AssociatedConstant for $ty { - const VALUE: ValueKind = ValueKind::Id; + impl From<$ty> for Value { + fn from(id: $ty) -> Self { + Value::Id(IdBox::$variant(id)) } - )+ + })+ }; } @@ -1231,12 +1176,8 @@ macro_rules! from_and_try_from_value_identifiable { fn from(id: $ty) -> Self { Value::Identifiable(IdentifiableBox::$variant(id)) } - } - - impl AssociatedConstant for $ty { - const VALUE: ValueKind = ValueKind::Identifiable; - } - )+ }; + } )+ + }; } macro_rules! from_and_try_from_and_try_as_value_hash { @@ -1290,54 +1231,52 @@ macro_rules! from_and_try_from_and_try_as_value_hash { } macro_rules! from_and_try_from_and_try_as_value_numeric { - ( $( $variant:ident($ty:ty),)+ $(,)? ) => { - $( - impl TryFrom for $ty { - type Error = ErrorTryFromEnum; - - #[inline] - fn try_from(value: Value) -> Result { - if let Value::Numeric(NumericValue::$variant(value)) = value { - Ok(value) - } else { - Err(Self::Error::default()) - } + ( $( $variant:ident($ty:ty),)+ $(,)? ) => { $( + impl TryFrom for $ty { + type Error = ErrorTryFromEnum; + + #[inline] + fn try_from(value: Value) -> Result { + if let Value::Numeric(NumericValue::$variant(value)) = value { + Ok(value) + } else { + Err(Self::Error::default()) } } + } - impl From<$ty> for Value { - #[inline] - fn from(value: $ty) -> Self { - Value::Numeric(NumericValue::$variant(value)) - } + impl From<$ty> for Value { + #[inline] + fn from(value: $ty) -> Self { + Value::Numeric(NumericValue::$variant(value)) } + } - impl TryAsMut<$ty> for NumericValue { - type Error = crate::EnumTryAsError<$ty, NumericValue>; + impl TryAsMut<$ty> for NumericValue { + type Error = crate::EnumTryAsError<$ty, NumericValue>; - #[inline] - fn try_as_mut(&mut self) -> Result<&mut $ty, Self::Error> { - if let NumericValue:: $variant (value) = self { - Ok(value) - } else { - Err(crate::EnumTryAsError::got(*self)) - } + #[inline] + fn try_as_mut(&mut self) -> Result<&mut $ty, Self::Error> { + if let NumericValue:: $variant (value) = self { + Ok(value) + } else { + Err(crate::EnumTryAsError::got(*self)) } } + } - impl TryAsRef<$ty> for NumericValue { - type Error = crate::EnumTryAsError<$ty, NumericValue>; + impl TryAsRef<$ty> for NumericValue { + type Error = crate::EnumTryAsError<$ty, NumericValue>; - #[inline] - fn try_as_ref(&self) -> Result<& $ty, Self::Error> { - if let NumericValue:: $variant (value) = self { - Ok(value) - } else { - Err(crate::EnumTryAsError::got(*self)) - } + #[inline] + fn try_as_ref(&self) -> Result<& $ty, Self::Error> { + if let NumericValue:: $variant (value) = self { + Ok(value) + } else { + Err(crate::EnumTryAsError::got(*self)) } } - )+ + })+ }; } @@ -1366,7 +1305,6 @@ from_and_try_from_value_identifiable!( Asset(asset::Asset), Trigger(TriggerBox), Role(role::Role), - PermissionTokenDefinition(permission::PermissionTokenDefinition), Parameter(parameter::Parameter), ); @@ -1420,7 +1358,6 @@ impl TryFrom for RegistrableBox { Asset(asset) => Ok(RegistrableBox::Asset(asset)), Trigger(TriggerBox::Raw(trigger)) => Ok(RegistrableBox::Trigger(trigger)), Domain(_) - | PermissionTokenDefinition(_) | Account(_) | AssetDefinition(_) | Role(_) diff --git a/data_model/src/permission.rs b/data_model/src/permission.rs index db8c62c2a2d..9ad4bb94d6c 100644 --- a/data_model/src/permission.rs +++ b/data_model/src/permission.rs @@ -1,220 +1,117 @@ //! Permission Token and related impls #[cfg(not(feature = "std"))] -use alloc::{ - collections::{BTreeMap, BTreeSet}, - format, - string::String, - vec::Vec, -}; +use alloc::{collections::BTreeSet, format, string::String, vec::Vec}; #[cfg(feature = "std")] -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; -use derive_more::{Constructor, Display, FromStr}; -use getset::Getters; -use iroha_data_model_derive::{model, IdEqOrdHash}; +use iroha_data_model_derive::model; use iroha_schema::IntoSchema; use parity_scale_codec::{Decode, Encode}; use serde::{Deserialize, Serialize}; -use serde_with::{DeserializeFromStr, SerializeDisplay}; pub use self::model::*; -use crate::{IdBox, Identifiable, Name, Value, ValueKind}; /// Collection of [`Token`]s pub type Permissions = BTreeSet; -/// Trait to identify [`ValueKind`] of a type which can be used as a [`Token`] parameter. -/// -/// On a higher level, all permission token parameters have [`Value`] type, but for now we allow -/// to define builtin permission tokens with stronger types. -/// This trait is used to retrieve the [`kind`](`ValueKind`) of a [`Value`] which can be constructed -/// from given parameter. -/// -/// Will be removed as well as builtin permission tokens and validators -/// when *runtime validators* and *runtime permissions* will be properly implemented. -pub trait ValueTrait: Into { - /// The kind of the [`Value`] which the implementing type can be converted to. - const TYPE: ValueKind; -} +use super::*; + +/// Unique id of [`PermissionToken`] +pub type PermissionTokenId = String; #[model] pub mod model { use super::*; - /// Unique id of [`PermissionTokenDefinition`] + /// Stored proof of the account having a permission for a certain action. #[derive( - derive_more::DebugCustom, - Display, + Debug, Clone, PartialEq, Eq, PartialOrd, Ord, - Hash, - Constructor, - FromStr, - Getters, Decode, Encode, - DeserializeFromStr, - SerializeDisplay, + Deserialize, + Serialize, IntoSchema, )] - #[repr(transparent)] - #[ffi_type(opaque)] - #[debug(fmt = "PermissionTokenId: {name}")] - pub struct PermissionTokenId { - /// [`PermissionToken`] name - #[getset(get = "pub")] - pub name: Name, - } - - /// Defines a type of [`PermissionToken`] with given id - #[derive(Display, Clone, IdEqOrdHash, Decode, Encode, Deserialize, Serialize, IntoSchema)] - #[display(fmt = "{id}")] #[ffi_type] - pub struct PermissionTokenDefinition { - /// Definition Id - pub id: PermissionTokenId, - /// Parameters and their types that every [`Token`] with this definition should have - pub params: BTreeMap, + pub struct PermissionToken { + /// Token identifier + pub definition_id: PermissionTokenId, + /// SCALE encoded token payload + pub payload: Vec, } - /// Stored proof of the account having a permission for a certain action. + /// Description of tokens defined in the validator #[derive( Debug, + Display, Clone, PartialEq, Eq, PartialOrd, Ord, - Getters, + Default, Decode, Encode, Deserialize, Serialize, IntoSchema, )] + #[display(fmt = "{token_ids:#?}")] #[ffi_type] - pub struct PermissionToken { - /// Name of the permission rule given to account. - #[getset(get = "pub")] - pub definition_id: PermissionTokenId, - /// Params identifying how this rule applies. - pub params: BTreeMap, + pub struct PermissionTokenSchema { + /// Ids of all permission tokens + pub token_ids: Vec, + /// Type schema of permission tokens + /// + /// At the time of writing this doc a complete schema is returned but it's + /// possible that in the future this field will contain references to types + /// defined in the Iroha schema without defining them itself + pub schema: String, } } -impl core::fmt::Debug for PermissionTokenDefinition { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - let mut borrow_checker_happifier = f.debug_struct("PermissionTokenDefinition"); - let intermediate = borrow_checker_happifier.field("id", &self.id.name); - if self.params.is_empty() { - intermediate.finish() - } else { - intermediate.field("params", &self.params).finish() - } - } -} - -impl PermissionTokenDefinition { - /// Construct new [`PermissionTokenDefinition`] - #[inline] - pub const fn new(id: PermissionTokenId) -> Self { - Self { - id, - params: BTreeMap::new(), - } - } - - /// Add parameters to the [`PermissionTokenDefinition`] replacing any parameters previously defined - #[inline] - #[must_use] - pub fn with_params(mut self, params: impl IntoIterator) -> Self { - self.params = params.into_iter().collect(); - self - } - - /// Iterate over parameters of the [`PermissionTokenDefinition`] - /// - /// Values returned from the iterator are guaranteed to be in the alphabetical order. - #[inline] - pub fn params(&self) -> impl ExactSizeIterator { - self.params.iter() +// TODO: Use getset to derive this +impl PermissionTokenSchema { + /// Return id of this token + pub fn token_ids(&self) -> &[PermissionTokenId] { + &self.token_ids } } impl PermissionToken { - /// Construct a permission token. - #[inline] - pub fn new(definition_id: PermissionTokenId) -> Self { + /// Construct [`Self`] + pub fn new(definition_id: PermissionTokenId, payload: &T) -> Self { Self { definition_id, - params: BTreeMap::default(), + payload: payload.encode(), } } - /// Add parameters to the [`Token`] replacing any previously defined - #[inline] - #[must_use] - pub fn with_params(mut self, params: impl IntoIterator) -> Self { - self.params = params.into_iter().collect(); - self - } - - /// Return a reference to the parameter corresponding to the given name - #[inline] - pub fn param(&self, name: &Name) -> Option<&Value> { - self.params.get(name) + /// Return id of this token + // TODO: Use getset to derive this after fixes in FFI + pub fn definition_id(&self) -> &str { + &self.definition_id } - /// Get an iterator over [`Token`] parameters. - /// - /// Values returned from the iterator are guaranteed to be in the alphabetical order. - #[inline] - pub fn params(&self) -> impl ExactSizeIterator { - self.params.iter() + /// Payload of this token + // TODO: Use getset to derive this after fixes in FFI + pub fn payload(&self) -> &[u8] { + &self.payload } } impl core::fmt::Display for PermissionToken { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{}", self.definition_id)?; - - if !self.params.is_empty() { - write!(f, ": ")?; - - crate::utils::format_comma_separated( - self.params - .iter() - .map(|(name, value)| format!("`{name}`: `{value}`")), - ('[', ']'), - f, - )?; - } - - Ok(()) + write!(f, "{}", self.definition_id) } } -impl + Into> ValueTrait for I { - const TYPE: ValueKind = ValueKind::Id; -} - -macro_rules! impl_value_trait { - ( $($ty:ident: $kind:expr),+ $(,)? ) => {$( - impl ValueTrait for $ty { - const TYPE: ValueKind = $kind; - } - )+} -} - -impl_value_trait! { - u32: ValueKind::Numeric, - u128: ValueKind::Numeric -} - pub mod prelude { //! The prelude re-exports most commonly used traits, structs and macros from this crate. - pub use super::{PermissionToken, PermissionTokenDefinition, PermissionTokenId}; + pub use super::{PermissionToken, PermissionTokenId, PermissionTokenSchema}; } diff --git a/data_model/src/predicate.rs b/data_model/src/predicate.rs index 4c905f9e9dc..2a5e3efd370 100644 --- a/data_model/src/predicate.rs +++ b/data_model/src/predicate.rs @@ -368,7 +368,7 @@ pub mod string { IdBox::PeerId(id) => self.applies(&id.to_string()), IdBox::TriggerId(id) => self.applies(&id.to_string()), IdBox::RoleId(id) => self.applies(&id.to_string()), - IdBox::PermissionTokenDefinitionId(id) => self.applies(&id.to_string()), + IdBox::PermissionTokenId(id) => self.applies(&id.to_string()), IdBox::ParameterId(id) => self.applies(&id.to_string()), } } diff --git a/data_model/src/query.rs b/data_model/src/query.rs index ce73e7d88e8..9e717538d35 100644 --- a/data_model/src/query.rs +++ b/data_model/src/query.rs @@ -58,6 +58,7 @@ pub mod model { use iroha_crypto::HashOf; use super::*; + use crate::permission::PermissionTokenId; /// Sized container for all possible Queries. #[allow(clippy::enum_variant_names)] @@ -300,11 +301,13 @@ pub mod permission { use derive_more::Display; - use crate::{permission, prelude::*}; + use crate::{ + permission::{self, PermissionTokenSchema}, + prelude::*, + }; queries! { - /// [`FindAllPermissionTokenDefinitions`] Iroha Query finds all registered - /// [`PermissionTokenDefinition`][crate::permission::PermissionTokenDefinition]s + /// Finds all registered permission tokens #[derive(Copy, Display)] #[ffi_type] pub struct FindAllPermissionTokenDefinitions; @@ -329,12 +332,12 @@ pub mod permission { /// `Id` of an account to check. pub account_id: EvaluatesTo, /// `PermissionToken` to check for. - pub permission_token: permission::PermissionToken, + pub permission_token: EvaluatesTo, } } impl Query for FindAllPermissionTokenDefinitions { - type Output = Vec; + type Output = PermissionTokenSchema; } impl Query for FindPermissionTokensByAccountId { @@ -349,11 +352,11 @@ pub mod permission { /// Construct [`DoesAccountHavePermissionToken`]. pub fn new( account_id: impl Into>, - permission_token: permission::PermissionToken, + permission_token: impl Into>, ) -> Self { Self { account_id: account_id.into(), - permission_token, + permission_token: permission_token.into(), } } } @@ -1476,31 +1479,6 @@ pub mod error { Unauthorized, } - /// Type assertion error - #[derive( - Debug, - Display, - Clone, - PartialEq, - Eq, - PartialOrd, - Ord, - Deserialize, - Serialize, - Decode, - Encode, - IntoSchema, - )] - #[ffi_type] - #[display( - fmt = "Failed to find permission token `{permission_token_id}` for account `{account_id}`" - )] - #[cfg_attr(feature = "std", derive(thiserror::Error))] - pub struct PermissionTokenFindError { - pub account_id: AccountId, - pub permission_token_id: PermissionTokenId, - } - /// Type assertion error #[derive( Debug, @@ -1550,13 +1528,9 @@ pub mod error { /// Failed to find Role by id. #[display(fmt = "Failed to find role by id: `{_0}`")] Role(RoleId), - /// Failed to find [`PermissionTokenDefinition`] by id. - #[display(fmt = "Failed to find permission token definition by id: `{_0}`")] - PermissionTokenDefinition(PermissionTokenId), - /// Failed to find [`PermissionToken`] for [`AccountId`]. - #[cfg_attr(not(feature = "std"), display(fmt = "Failed to find permission token"))] - #[cfg_attr(feature = "std", error(transparent))] - PermissionToken(PermissionTokenFindError), + /// Failed to find [`PermissionToken`] by id. + #[display(fmt = "Failed to find permission token by id: `{_0}`")] + PermissionToken(PermissionTokenId), /// Failed to find specified [`Parameter`] variant. #[display(fmt = "Failed to find specified parameter variant: `{_0}`")] Parameter(ParameterId), diff --git a/data_model/src/role.rs b/data_model/src/role.rs index 22b8d364156..99185df6d4d 100644 --- a/data_model/src/role.rs +++ b/data_model/src/role.rs @@ -72,7 +72,7 @@ pub mod model { )] #[serde(transparent)] #[repr(transparent)] - #[ffi_type(opaque)] + #[ffi_type(unsafe {robust})] pub struct NewRole { #[allow(missing_docs)] #[id(transparent)] diff --git a/data_model/src/visit.rs b/data_model/src/visit.rs index 650379526c7..161573745ef 100644 --- a/data_model/src/visit.rs +++ b/data_model/src/visit.rs @@ -300,7 +300,7 @@ pub fn visit_instruction( pub fn visit_expression( visitor: &mut V, - authority: &::Id, + authority: &AccountId, expression: &EvaluatesTo, ) { macro_rules! visit_binary_math_expression { diff --git a/default_validator/src/lib.rs b/default_validator/src/lib.rs index f0c3516d04e..0d932260e23 100644 --- a/default_validator/src/lib.rs +++ b/default_validator/src/lib.rs @@ -1,8 +1,6 @@ //! Iroha default validator. #![no_std] -extern crate alloc; - #[cfg(not(test))] extern crate panic_halt; @@ -10,8 +8,8 @@ use iroha_validator::prelude::*; /// Entrypoint to return permission token definitions defined in this validator. #[entrypoint] -pub fn permission_tokens() -> Vec { - DefaultValidator::permission_tokens() +pub fn permission_token_schema() -> PermissionTokenSchema { + DefaultValidator::permission_token_schema() } /// Validation entrypoint diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index b35b4421063..3a9fe06d2f1 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -167,7 +167,7 @@ }, { "name": "permission_id", - "type": "PermissionTokenId" + "type": "String" } ] }, @@ -898,7 +898,7 @@ { "tag": "PermissionToken", "discriminant": 7, - "type": "PermissionTokenEvent" + "type": "PermissionTokenSchemaUpdateEvent" }, { "tag": "Configuration", @@ -932,7 +932,7 @@ }, { "name": "permission_token", - "type": "PermissionToken" + "type": "EvaluatesTo" } ] }, @@ -1146,6 +1146,14 @@ } ] }, + "EvaluatesTo": { + "Struct": [ + { + "name": "expression", + "type": "Expression" + } + ] + }, "EvaluatesTo": { "Struct": [ { @@ -1962,24 +1970,19 @@ "discriminant": 9, "type": "RoleId" }, - { - "tag": "PermissionTokenDefinition", - "discriminant": 10, - "type": "PermissionTokenId" - }, { "tag": "PermissionToken", - "discriminant": 11, - "type": "PermissionTokenFindError" + "discriminant": 10, + "type": "String" }, { "tag": "Parameter", - "discriminant": 12, + "discriminant": 11, "type": "ParameterId" }, { "tag": "PublicKey", - "discriminant": 13, + "discriminant": 12, "type": "PublicKey" } ] @@ -2173,9 +2176,9 @@ "type": "RoleId" }, { - "tag": "PermissionTokenDefinitionId", + "tag": "PermissionTokenId", "discriminant": 7, - "type": "PermissionTokenId" + "type": "String" }, { "tag": "ParameterId", @@ -2241,14 +2244,9 @@ "discriminant": 10, "type": "Role" }, - { - "tag": "PermissionTokenDefinition", - "discriminant": 11, - "type": "PermissionTokenDefinition" - }, { "tag": "Parameter", - "discriminant": 12, + "discriminant": 11, "type": "Parameter" } ] @@ -3175,8 +3173,8 @@ "type": "RoleId" }, { - "name": "permission_definition_id", - "type": "PermissionTokenId" + "name": "permission_token_id", + "type": "String" } ] }, @@ -3184,57 +3182,35 @@ "Struct": [ { "name": "definition_id", - "type": "PermissionTokenId" + "type": "String" }, { - "name": "params", - "type": "SortedMap" + "name": "payload", + "type": "Vec" } ] }, - "PermissionTokenDefinition": { + "PermissionTokenSchema": { "Struct": [ { - "name": "id", - "type": "PermissionTokenId" - }, - { - "name": "params", - "type": "SortedMap" - } - ] - }, - "PermissionTokenEvent": { - "Enum": [ - { - "tag": "DefinitionCreated", - "discriminant": 0, - "type": "PermissionTokenDefinition" + "name": "token_ids", + "type": "Vec" }, { - "tag": "DefinitionDeleted", - "discriminant": 1, - "type": "PermissionTokenDefinition" + "name": "schema", + "type": "String" } ] }, - "PermissionTokenFindError": { + "PermissionTokenSchemaUpdateEvent": { "Struct": [ { - "name": "account_id", - "type": "AccountId" + "name": "old_schema", + "type": "PermissionTokenSchema" }, { - "name": "permission_token_id", - "type": "PermissionTokenId" - } - ] - }, - "PermissionTokenId": { - "Struct": [ - { - "name": "name", - "type": "Name" + "name": "new_schema", + "type": "PermissionTokenSchema" } ] }, @@ -4049,12 +4025,6 @@ "value": "Value" } }, - "SortedMap": { - "Map": { - "key": "Name", - "value": "ValueKind" - } - }, "SortedVec": { "Vec": "PermissionToken" }, @@ -4557,130 +4527,47 @@ "type": "PermissionToken" }, { - "tag": "Hash", + "tag": "PermissionTokenSchema", "discriminant": 14, + "type": "PermissionTokenSchema" + }, + { + "tag": "Hash", + "discriminant": 15, "type": "HashValue" }, { "tag": "Block", - "discriminant": 15, + "discriminant": 16, "type": "VersionedCommittedBlock" }, { "tag": "BlockHeader", - "discriminant": 16, + "discriminant": 17, "type": "BlockHeader" }, { "tag": "Ipv4Addr", - "discriminant": 17, + "discriminant": 18, "type": "Ipv4Addr" }, { "tag": "Ipv6Addr", - "discriminant": 18, + "discriminant": 19, "type": "Ipv6Addr" }, { "tag": "Numeric", - "discriminant": 19, + "discriminant": 20, "type": "NumericValue" }, { "tag": "Validator", - "discriminant": 20, + "discriminant": 21, "type": "Validator" } ] }, - "ValueKind": { - "Enum": [ - { - "tag": "Bool", - "discriminant": 0 - }, - { - "tag": "String", - "discriminant": 1 - }, - { - "tag": "Name", - "discriminant": 2 - }, - { - "tag": "Vec", - "discriminant": 3 - }, - { - "tag": "LimitedMetadata", - "discriminant": 4 - }, - { - "tag": "MetadataLimits", - "discriminant": 5 - }, - { - "tag": "TransactionLimits", - "discriminant": 6 - }, - { - "tag": "LengthLimits", - "discriminant": 7 - }, - { - "tag": "Id", - "discriminant": 8 - }, - { - "tag": "Identifiable", - "discriminant": 9 - }, - { - "tag": "PublicKey", - "discriminant": 10 - }, - { - "tag": "SignatureCheckCondition", - "discriminant": 11 - }, - { - "tag": "TransactionQueryResult", - "discriminant": 12 - }, - { - "tag": "PermissionToken", - "discriminant": 13 - }, - { - "tag": "Hash", - "discriminant": 14 - }, - { - "tag": "Block", - "discriminant": 15 - }, - { - "tag": "BlockHeader", - "discriminant": 16 - }, - { - "tag": "Ipv4Addr", - "discriminant": 17 - }, - { - "tag": "Ipv6Addr", - "discriminant": 18 - }, - { - "tag": "Numeric", - "discriminant": 19 - }, - { - "tag": "Validator", - "discriminant": 20 - } - ] - }, "ValueOfKey": { "Struct": [ { @@ -4748,6 +4635,9 @@ "Vec": { "Vec": "PeerId" }, + "Vec": { + "Vec": "String" + }, "Vec": { "Vec": "TransactionValue" }, diff --git a/schema/gen/src/lib.rs b/schema/gen/src/lib.rs index 906bb6f60fd..c9cd6e05d05 100644 --- a/schema/gen/src/lib.rs +++ b/schema/gen/src/lib.rs @@ -94,7 +94,6 @@ types!( BTreeMap, BTreeMap>, BTreeMap, - BTreeMap, BTreeSet, BTreeSet, BTreeSet, @@ -294,9 +293,8 @@ types!( PeerId, PermissionRemoved, PermissionToken, - PermissionTokenDefinition, - PermissionTokenEvent, - PermissionTokenId, + PermissionTokenSchema, + PermissionTokenSchemaUpdateEvent, PipelineEntityKind, PipelineEvent, PipelineEventFilter, @@ -364,7 +362,6 @@ types!( Validator, ValidatorEvent, Value, - ValueKind, ValueOfKey, ValuePredicate, Vec, @@ -433,7 +430,7 @@ mod tests { query::error::{FindError, QueryExecutionFail}, transaction::{error::TransactionLimitError, SignedTransaction, TransactionLimits}, validator::Validator, - ValueKind, VersionedCommittedBlockWrapper, + VersionedCommittedBlockWrapper, }; use iroha_genesis::RawGenesisBlock; use iroha_primitives::{ diff --git a/schema/src/lib.rs b/schema/src/lib.rs index 081c131f2a2..9355bd3a366 100644 --- a/schema/src/lib.rs +++ b/schema/src/lib.rs @@ -25,7 +25,7 @@ pub use iroha_schema_derive::*; use serde::Serialize; /// Helper struct for building a full schema -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct MetaMap(pub(crate) btree_map::BTreeMap); impl PartialEq> for MetaMap { @@ -47,6 +47,10 @@ impl MetaMap { pub fn contains_key(&self) -> bool { self.0.contains_key(&Self::key::()) } + /// Remove a key-value pair from the map. + pub fn remove(&mut self) -> bool { + self.0.remove(&Self::key::()).is_some() + } /// Insert a key-value pair into the map. pub fn insert(&mut self, v: Metadata) -> bool { self.0 @@ -87,6 +91,14 @@ pub trait IntoSchema: TypeId { /// Insert descriptions of types referenced by [`Self`] fn update_schema_map(metamap: &mut MetaMap); + /// Remove description of types referenced by [`Self`] + fn remove_from_schema(metamap: &mut MetaMap) -> bool + where + Self: Sized, + { + metamap.remove::() + } + /// Return schema map of types referenced by [`Self`] fn schema() -> MetaMap { let mut map = MetaMap::new(); diff --git a/tools/kagami/Cargo.toml b/tools/kagami/Cargo.toml index 695f04d6e06..349bf56ea15 100644 --- a/tools/kagami/Cargo.toml +++ b/tools/kagami/Cargo.toml @@ -32,6 +32,7 @@ owo-colors = { version = "3.5.0", features = ["supports-colors"] } supports-color = "2.0.0" inquire = "0.6.2" duct = "0.13.6" +parity-scale-codec = { version = "3.2.1", default-features = false } [build-dependencies] eyre = "0.6.8" diff --git a/tools/kagami/src/main.rs b/tools/kagami/src/main.rs index db3cd713cee..62524acd840 100644 --- a/tools/kagami/src/main.rs +++ b/tools/kagami/src/main.rs @@ -342,26 +342,22 @@ mod genesis { ); let alice_id = ::Id::from_str("alice@wonderland")?; let grant_permission_to_set_parameters = GrantBox::new( - PermissionToken::new("can_set_parameters".parse()?), + PermissionToken { + definition_id: "CanSetParameters".to_owned(), + payload: Vec::new(), + }, alice_id, ); let register_user_metadata_access = RegisterBox::new( Role::new("ALICE_METADATA_ACCESS".parse()?) - .add_permission( - PermissionToken::new("can_set_key_value_in_user_account".parse()?).with_params( - [( - "account_id".parse()?, - IdBox::AccountId("alice@wonderland".parse()?).into(), - )], - ), - ) - .add_permission( - PermissionToken::new("can_remove_key_value_in_user_account".parse()?) - .with_params([( - "account_id".parse()?, - IdBox::AccountId("alice@wonderland".parse()?).into(), - )]), - ), + .add_permission(PermissionToken::new( + "CanSetKeyValueInUserAccount".to_owned(), + &"alice@wonderland".parse::()?, + )) + .add_permission(PermissionToken::new( + "CanRemoveKeyValueInUserAccount".to_owned(), + &"alice@wonderland".parse::()?, + )), ) .into(); diff --git a/tools/parity_scale_decoder/samples/trigger.bin b/tools/parity_scale_decoder/samples/trigger.bin index 895dafcfa03bd85ab086a742cf1eb9cba0af57de..99b44b464041e5d82e98cce35e3d10a5bc67e3b0 100644 GIT binary patch delta 22 dcmWFt5Kzg@%qxj6$}di3U|?b56`3gD002p#1+4%8 delta 22 dcmWFt5Kzg@%qxj6$}di3U|?b56`m;I002px1*`x7 diff --git a/tools/parity_scale_decoder/src/main.rs b/tools/parity_scale_decoder/src/main.rs index b80d6578fe4..cf9f57679ae 100644 --- a/tools/parity_scale_decoder/src/main.rs +++ b/tools/parity_scale_decoder/src/main.rs @@ -43,7 +43,7 @@ use iroha_data_model::{ query::error::{FindError, QueryExecutionFail}, transaction::{error::TransactionLimitError, SignedTransaction, TransactionLimits}, validator::Validator, - ValueKind, VersionedCommittedBlockWrapper, + VersionedCommittedBlockWrapper, }; use iroha_primitives::{ addr::{Ipv4Addr, Ipv6Addr}, diff --git a/wasm/derive/src/lib.rs b/wasm/derive/src/lib.rs index dc871b2144f..1578cba49d5 100644 --- a/wasm/derive/src/lib.rs +++ b/wasm/derive/src/lib.rs @@ -56,7 +56,7 @@ mod entrypoint; /// use iroha_wasm::{data_model::prelude::*, dbg}; /// /// #[iroha_wasm::main(params = "[authority]")] -/// fn main(authority: ::Id) { +/// fn main(authority: AccountId) { /// dbg(&format!("Trigger authority: {authority}")); /// } /// ``` @@ -66,7 +66,7 @@ mod entrypoint; /// use iroha_wasm::{data_model::prelude::*, dbg}; /// /// #[iroha_wasm::main(params = "[authority, triggering_event]")] -/// fn main(authority: ::Id, event: DataEvent) { +/// fn main(authority: AccountId, event: DataEvent) { /// dbg(&format!( /// "Trigger authority: {authority};\n\ /// Triggering event: {event:?}" diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index e478b27eac3..e812f443b2a 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -154,7 +154,7 @@ impl iroha_data_model::evaluate::Context for Context { } /// Query the authority of the smart contract -pub fn query_authority() -> ::Id { +pub fn query_authority() -> AccountId { #[cfg(not(test))] use host::query_authority as host_query_authority; #[cfg(test)] @@ -377,7 +377,7 @@ mod tests { let account_id: AccountId = "alice@wonderland".parse().expect("Valid"); FindAccountById::new(account_id).into() } - fn get_test_authority() -> ::Id { + fn get_test_authority() -> AccountId { "alice@wonderland".parse().expect("Valid") } fn get_test_expression() -> EvaluatesTo { @@ -390,10 +390,9 @@ mod tests { .into() } fn get_test_operation() -> NeedsValidationBox { - let alice_id: ::Id = "alice@wonderland".parse().expect("Valid"); - let rose_definition_id: ::Id = - "rose#wonderland".parse().expect("Valid"); - let alice_rose_id = ::Id::new(rose_definition_id, alice_id); + let alice_id: AccountId = "alice@wonderland".parse().expect("Valid"); + let rose_definition_id: AssetDefinitionId = "rose#wonderland".parse().expect("Valid"); + let alice_rose_id = AssetId::new(rose_definition_id, alice_id); NeedsValidationBox::Instruction(MintBox::new(1u32, alice_rose_id).into()) } diff --git a/wasm/validator/Cargo.toml b/wasm/validator/Cargo.toml index ab327c1a09b..bf408ccb9b0 100644 --- a/wasm/validator/Cargo.toml +++ b/wasm/validator/Cargo.toml @@ -15,7 +15,11 @@ default-validator = [] [dependencies] iroha_wasm = { version = "2.0.0-pre-rc.16", path = ".." } +iroha_schema = { path = "../../schema", version = "=2.0.0-pre-rc.16" } iroha_validator_derive = { version = "2.0.0-pre-rc.16", path = "derive" } +parity-scale-codec = { version = "3.1.5", default-features = false } +serde_json = { version = "1.0.91", default-features = false } + [dev-dependencies] webassembly-test.workspace = true diff --git a/wasm/validator/derive/src/entrypoint.rs b/wasm/validator/derive/src/entrypoint.rs index c35f6eb6525..32bcf5b4f61 100644 --- a/wasm/validator/derive/src/entrypoint.rs +++ b/wasm/validator/derive/src/entrypoint.rs @@ -66,10 +66,12 @@ pub fn impl_entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { match &fn_item.sig.ident { fn_name if fn_name == "validate" => impl_validate_entrypoint(attr, fn_item), - fn_name if fn_name == "permission_tokens" => { - impl_permission_tokens_entrypoint(&attr, fn_item) + fn_name if fn_name == "permission_token_schema" => { + impl_permission_token_schema_entrypoint(&attr, fn_item) } - _ => panic!("Validator entrypoint name should be either `validate` or `permission_tokens`"), + _ => panic!( + "Validator entrypoint name should be either `validate` or `permission_token_schema`" + ), } } @@ -117,10 +119,9 @@ fn impl_validate_entrypoint(attr: TokenStream, fn_item: syn::ItemFn) -> TokenStr #[no_mangle] #[doc(hidden)] unsafe extern "C" fn _iroha_validator_validate() -> *const u8 { - let verdict: ::iroha_validator::iroha_wasm::data_model::validator::Result = #fn_name(#args); - let bytes_box = ::core::mem::ManuallyDrop::new(::iroha_validator::iroha_wasm::encode_with_length_prefix(&verdict)); - - bytes_box.as_ptr() + let verdict: ::iroha_validator::data_model::validator::Result = #fn_name(#args); + let bytes = ::iroha_validator::iroha_wasm::encode_with_length_prefix(&verdict); + ::core::mem::ManuallyDrop::new(bytes).as_ptr() } // NOTE: Host objects are always passed by value to wasm @@ -132,7 +133,10 @@ fn impl_validate_entrypoint(attr: TokenStream, fn_item: syn::ItemFn) -> TokenStr .into() } -fn impl_permission_tokens_entrypoint(attr: &TokenStream, fn_item: syn::ItemFn) -> TokenStream { +fn impl_permission_token_schema_entrypoint( + attr: &TokenStream, + fn_item: syn::ItemFn, +) -> TokenStream { let syn::ItemFn { attrs, vis, @@ -143,28 +147,28 @@ fn impl_permission_tokens_entrypoint(attr: &TokenStream, fn_item: syn::ItemFn) - assert!( matches!(sig.output, syn::ReturnType::Type(_, _)), - "Validator `permission_tokens()` entrypoint must have `Vec` return type" + "Validator `permission_token_schema()` entrypoint must have `PermissionTokenSchema>` return type" ); assert!( attr.is_empty(), - "`#[entrypoint]` macro for Validator `permission_tokens` entrypoint accepts no attributes" + "`#[entrypoint]` macro for Validator `permission_token_schema` entrypoint accepts no attributes" ); quote! { - /// Validator `permission_tokens` entrypoint + /// Validator `permission_token_schema` entrypoint /// /// # Memory safety /// /// This function transfers the ownership of allocated [`Vec`](alloc::vec::Vec). #[no_mangle] #[doc(hidden)] - unsafe extern "C" fn _iroha_validator_permission_tokens() -> *const u8 { - let v: ::alloc::vec::Vec< - ::iroha_validator::data_model::permission::PermissionTokenDefinition - > = #fn_name(); - let bytes_box = ::core::mem::ManuallyDrop::new(::iroha_validator::iroha_wasm::encode_with_length_prefix(&v)); + unsafe extern "C" fn _iroha_validator_permission_token_schema() -> *const u8 { + let tokens: ::iroha_validator::PermissionTokenSchema = #fn_name(); + let bytes = ::iroha_validator::iroha_wasm::encode_with_length_prefix( + &tokens.serialize() + ); - bytes_box.as_ptr() + ::core::mem::ManuallyDrop::new(bytes).as_ptr() } // NOTE: Host objects are always passed by value to wasm @@ -172,5 +176,6 @@ fn impl_permission_tokens_entrypoint(attr: &TokenStream, fn_item: syn::ItemFn) - #(#attrs)* #vis #sig #block - }.into() + } + .into() } diff --git a/wasm/validator/derive/src/lib.rs b/wasm/validator/derive/src/lib.rs index 8e3baaf03a9..75f9c6f5a8d 100644 --- a/wasm/validator/derive/src/lib.rs +++ b/wasm/validator/derive/src/lib.rs @@ -100,11 +100,11 @@ pub fn entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { /// #[validate(permission::asset::Owner)] /// struct CanDoSomethingWithAsset { /// some_data: String, -/// asset_id: ::Id, +/// asset_id: AssetId, /// } /// /// #[entrypoint(params = "[authority, operation]")] -/// fn validate(authority: ::Id, operation: NeedsValidationBox) -> Result { +/// fn validate(authority: AccountId, operation: NeedsValidationBox) -> Result { /// let NeedsValidationBox::Instruction(instruction) = operation else { /// pass!(); /// }; @@ -113,7 +113,7 @@ pub fn entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { /// /// CanDoSomethingWithAsset { /// some_data: "some data".to_owned(), -/// asset_id: parse!("rose#wonderland" as ::Id), +/// asset_id: parse!("rose#wonderland" as AssetId), /// }.is_owned_by(&authority) /// } /// ``` diff --git a/wasm/validator/derive/src/token.rs b/wasm/validator/derive/src/token.rs index 9d2449f44d7..569303227dd 100644 --- a/wasm/validator/derive/src/token.rs +++ b/wasm/validator/derive/src/token.rs @@ -7,33 +7,11 @@ use super::*; /// [`derive_token`](crate::derive_token()) macro implementation pub fn impl_derive_token(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); - let ident = input.ident; + let generics = &input.generics; + let ident = &input.ident; - let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); - - let syn::Data::Struct(syn::DataStruct { fields, .. }) = input.data else { - panic!("`Token` can be derived only for structs"); - }; - let extracted_fields = match fields { - syn::Fields::Named(syn::FieldsNamed { named, .. }) => named, - syn::Fields::Unit => syn::punctuated::Punctuated::default(), - _ => panic!("`Token` can be derived only for structs with named fields or unit structs"), - }; - - let impl_token = impl_token( - &impl_generics, - &ty_generics, - where_clause, - &ident, - &extracted_fields, - ); - let impl_try_from_permission_token = impl_try_from_permission_token( - &impl_generics, - &ty_generics, - where_clause, - &ident, - &extracted_fields, - ); + let impl_token = impl_token(ident, generics); + let impl_try_from_permission_token = impl_try_from_permission_token(ident, generics); quote! { #impl_token @@ -42,39 +20,25 @@ pub fn impl_derive_token(input: TokenStream) -> TokenStream { .into() } -fn impl_token( - impl_generics: &syn::ImplGenerics<'_>, - ty_generics: &syn::TypeGenerics<'_>, - where_clause: Option<&syn::WhereClause>, - ident: &syn::Ident, - fields: &syn::punctuated::Punctuated, -) -> proc_macro2::TokenStream { - let definition = gen_definition(ident, fields); - let permission_token_conversion_code = permission_token_conversion(fields); +fn gen_token_definition_id() -> proc_macro2::TokenStream { + quote! { ::type_name() } +} - quote! { - impl #impl_generics ::iroha_validator::permission::Token for #ident #ty_generics - #where_clause - { - fn definition() -> ::iroha_validator::data_model::permission::PermissionTokenDefinition { - #definition - } +fn impl_token(ident: &syn::Ident, generics: &syn::Generics) -> proc_macro2::TokenStream { + let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + let token_definition_id = gen_token_definition_id(); - fn is_owned_by( - &self, - account_id: &< - ::iroha_validator::data_model::prelude::Account - as - ::iroha_validator::data_model::prelude::Identifiable - >::Id - ) -> bool { - let permission_token = #permission_token_conversion_code; + 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::prelude::AccountId) -> bool { + let permission_token = ::iroha_validator::data_model::permission::PermissionToken::new( + #token_definition_id, self + ); let value = ::iroha_validator::iroha_wasm::debug::DebugExpectExt::dbg_expect( ::iroha_validator::iroha_wasm::QueryHost::execute( &::iroha_validator::iroha_wasm::data_model::prelude::DoesAccountHavePermissionToken::new( - account_id.clone(), - permission_token, + account_id.clone(), permission_token, ) ), "Failed to execute `DoesAccountHavePermissionToken` query" @@ -88,121 +52,26 @@ fn impl_token( } } -fn gen_definition( - ident: &syn::Ident, - fields: &syn::punctuated::Punctuated, -) -> proc_macro2::TokenStream { - use heck::ToSnakeCase as _; - - let definition_id = proc_macro2::Literal::string(&ident.to_string().to_snake_case()); - - let params = fields.iter().map(|field| { - let ident = field.ident.as_ref().expect("Field must have an identifier"); - let name = proc_macro2::Literal::string(&ident.to_string().to_snake_case()); - let ty = &field.ty; - - quote! { - ( - ::iroha_validator::parse!(#name as ::iroha_validator::data_model::prelude::Name), - <#ty as ::iroha_validator::data_model::AssociatedConstant< - ::iroha_validator::data_model::ValueKind - >>::VALUE - ) - } - }); - - quote! { - ::iroha_validator::data_model::permission::PermissionTokenDefinition::new( - ::iroha_validator::parse!( - #definition_id as < - ::iroha_validator::data_model::permission::PermissionTokenDefinition - as - ::iroha_validator::data_model::prelude::Identifiable - >::Id - ) - ) - .with_params([#(#params),*]) - } -} - fn impl_try_from_permission_token( - impl_generics: &syn::ImplGenerics<'_>, - ty_generics: &syn::TypeGenerics<'_>, - where_clause: Option<&syn::WhereClause>, ident: &syn::Ident, - fields: &syn::punctuated::Punctuated, + generics: &syn::Generics, ) -> proc_macro2::TokenStream { - let field_initializers = fields.iter().map(|field| { - let field_ident = field.ident.as_ref().expect("Field must have an identifier"); - let field_literal = proc_macro2::Literal::string(&field_ident.to_string()); - let field_type = &field.ty; - - let code = quote! { - #field_ident: < - #field_type - as - ::core::convert::TryFrom<::iroha_validator::data_model::prelude::Value> - >::try_from(token - .param(&::iroha_validator::parse!(#field_literal as ::iroha_validator::data_model::prelude::Name)) - .ok_or( - ::iroha_validator::permission::PermissionTokenConversionError::Param(#field_literal) - )? - .clone() - ) - .map_err(|err| { - ::iroha_validator::permission::PermissionTokenConversionError::Value( - ::alloc::string::ToString::to_string(&err) - ) - })? - }; - code - }); + let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + let token_definition_id = gen_token_definition_id(); quote! { - impl #impl_generics ::core::convert::TryFrom<::iroha_validator::data_model::permission::PermissionToken> for #ident #ty_generics - #where_clause - { + impl #impl_generics ::core::convert::TryFrom<::iroha_validator::data_model::permission::PermissionToken> for #ident #ty_generics #where_clause { type Error = ::iroha_validator::permission::PermissionTokenConversionError; - #[allow(unused)] // `params` can be unused if token has none - fn try_from( - token: ::iroha_validator::data_model::permission::PermissionToken - ) -> ::core::result::Result { - if token.definition_id() != - ::definition().id() - { + fn try_from(token: ::iroha_validator::data_model::permission::PermissionToken) -> ::core::result::Result { + if #token_definition_id != *token.definition_id() { return Err(::iroha_validator::permission::PermissionTokenConversionError::Id( - token.definition_id().clone() + ::alloc::borrow::ToOwned::to_owned(token.definition_id()) )); } - Ok(Self { - #(#field_initializers),* - }) + Ok(::decode_all(&mut token.payload()).unwrap()) } } } } - -#[allow(clippy::arithmetic_side_effects)] // Triggers on quote! side -fn permission_token_conversion( - fields: &syn::punctuated::Punctuated, -) -> proc_macro2::TokenStream { - let params = fields.iter().cloned().map(|field| { - let field_ident = field.ident.as_ref().expect("Field must have an identifier"); - let field_literal = proc_macro2::Literal::string(&field_ident.to_string()); - quote! {( - ::iroha_validator::parse!(#field_literal as ::iroha_validator::data_model::prelude::Name), - self.#field_ident.clone().into(), - )} - }); - - quote! { - ::iroha_validator::data_model::permission::PermissionToken::new( - ::definition().id().clone() - ) - .with_params([ - #(#params),* - ]) - } -} diff --git a/wasm/validator/derive/src/validate.rs b/wasm/validator/derive/src/validate.rs index ae8f9ee74a2..72e37caa27a 100644 --- a/wasm/validator/derive/src/validate.rs +++ b/wasm/validator/derive/src/validate.rs @@ -194,10 +194,7 @@ 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::Account as ::iroha_validator::data_model::prelude::Identifiable>::Id - ) -> ::iroha_validator::data_model::validator::Result { + fn #fn_name(&self, authority: &::iroha_validator::data_model::account::AccountId) -> ::iroha_validator::data_model::validator::Result { let condition = <#pass_condition as ::core::convert::From<&Self>>::from(&self); < #pass_condition diff --git a/wasm/validator/src/default.rs b/wasm/validator/src/default.rs index 87e83bf4223..8978f1021b9 100644 --- a/wasm/validator/src/default.rs +++ b/wasm/validator/src/default.rs @@ -1,7 +1,7 @@ //! Definition of Iroha default validator and accompanying validation functions #![allow(missing_docs, clippy::missing_errors_doc)] -use alloc::{borrow::ToOwned as _, vec::Vec}; +use alloc::{borrow::ToOwned as _, format, string::String, vec::Vec}; use account::{ visit_burn_account_public_key, visit_mint_account_public_key, @@ -71,59 +71,31 @@ macro_rules! map_all_crate_tokens { }; } -macro_rules! tokens { - ( - pattern = { - $(#[$meta:meta])* - $vis:vis struct _ { - $( - $(#[$field_meta:meta])* - $field_vis:vis $field:ident: $field_type:ty - ),* $(,)? - } - }, - $module:ident :: tokens: [$($name:ident),+ $(,)?] - ) => { - declare_tokens!($( - crate::default::$module::tokens::$name - ),+); - - pub mod tokens { - use super::*; - - macro_rules! single_token { - ($name_internal:ident) => { - $(#[$meta])* - $vis struct $name_internal { - $( - $(#[$field_meta])* - $field_vis $field: $field_type - ),* - } - }; - } - - $(single_token!($name);)+ - } +macro_rules! token { + ($($meta:meta)* $item:item) => { + #[derive(parity_scale_codec::Decode, parity_scale_codec::Encode)] + #[derive(iroha_schema::IntoSchema)] + #[derive(Clone, Token)] + $($meta)* + $item }; } pub(crate) use map_all_crate_tokens; -pub(crate) use tokens; impl Validate for DefaultValidator { - fn permission_tokens() -> Vec { - let mut v = Vec::new(); + fn permission_token_schema() -> PermissionTokenSchema { + let mut schema = PermissionTokenSchema::default(); - macro_rules! add_to_vec { + macro_rules! add_to_schema { ($token_ty:ty) => { - v.push(<$token_ty as ::iroha_validator::permission::Token>::definition()); + schema.insert::<$token_ty>(); }; } - map_all_crate_tokens!(add_to_vec); + map_all_crate_tokens!(add_to_schema); - v + schema } fn verdict(&self) -> &Result { @@ -353,7 +325,7 @@ fn visit_unsupported( pub fn visit_expression( validator: &mut V, - authority: &::Id, + authority: &AccountId, expression: &EvaluatesTo, ) { macro_rules! visit_binary_expression { @@ -451,17 +423,19 @@ pub fn visit_sequence( pub mod peer { use super::*; - tokens!( - pattern = { - #[derive(Token, ValidateGrantRevoke)] + declare_tokens! { + crate::default::peer::tokens::CanUnregisterAnyPeer, + } + + pub mod tokens { + use super::*; + + token! { + #[derive(Copy, ValidateGrantRevoke)] #[validate(permission::OnlyGenesis)] - #[derive(Clone, Copy)] - pub struct _ {} - }, - peer::tokens: [ - CanUnregisterAnyPeer, - ] - ); + pub struct CanUnregisterAnyPeer; + } + } #[allow(clippy::needless_pass_by_value)] pub fn visit_unregister_peer( @@ -470,7 +444,7 @@ pub mod peer { _isi: Unregister, ) { const CAN_UNREGISTER_PEER_TOKEN: tokens::CanUnregisterAnyPeer = - tokens::CanUnregisterAnyPeer {}; + tokens::CanUnregisterAnyPeer; if CAN_UNREGISTER_PEER_TOKEN.is_owned_by(authority) { pass!(validator); @@ -483,21 +457,40 @@ pub mod peer { pub mod domain { use super::*; - // TODO: We probably need a better way to allow accounts to modify domains. - tokens!( - pattern = { - #[derive(Token, ValidateGrantRevoke)] + declare_tokens! { + crate::default::domain::tokens::CanUnregisterDomain, + crate::default::domain::tokens::CanSetKeyValueInDomain, + crate::default::domain::tokens::CanRemoveKeyValueInDomain, + } + + pub mod tokens { + // TODO: We probably need a better way to allow accounts to modify domains. + use super::*; + + token! { + #[derive(ValidateGrantRevoke)] #[validate(permission::OnlyGenesis)] - pub struct _ { - pub domain_id: ::Id, + pub struct CanUnregisterDomain { + pub domain_id: DomainId, } - }, - domain::tokens: [ - CanUnregisterDomain, - CanSetKeyValueInDomain, - CanRemoveKeyValueInDomain, - ] - ); + } + + token! { + #[derive(ValidateGrantRevoke)] + #[validate(permission::OnlyGenesis)] + pub struct CanSetKeyValueInDomain { + pub domain_id: DomainId, + } + } + + token! { + #[derive(ValidateGrantRevoke)] + #[validate(permission::OnlyGenesis)] + pub struct CanRemoveKeyValueInDomain { + pub domain_id: DomainId, + } + } + } pub fn visit_unregister_domain( validator: &mut V, @@ -548,23 +541,61 @@ pub mod domain { pub mod account { use super::*; - tokens!( - pattern = { - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::account::Owner)] + declare_tokens! { + crate::default::account::tokens::CanUnregisterAccount, + crate::default::account::tokens::CanMintUserPublicKeys, + crate::default::account::tokens::CanBurnUserPublicKeys, + crate::default::account::tokens::CanMintUserSignatureCheckConditions, + crate::default::account::tokens::CanSetKeyValueInUserAccount, + crate::default::account::tokens::CanRemoveKeyValueInUserAccount, + } + + pub mod tokens { + use super::*; + + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] - pub struct _ { + pub struct CanUnregisterAccount { pub account_id: AccountId, } - }, - account::tokens: [ - CanUnregisterAccount, - CanMintUserPublicKeys, - CanBurnUserPublicKeys, - CanMintUserSignatureCheckConditions, - CanSetKeyValueInUserAccount, - CanRemoveKeyValueInUserAccount, - ] - ); + } + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] + #[validate(permission::account::Owner)] + pub struct CanMintUserPublicKeys { + pub account_id: AccountId, + } + } + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] + #[validate(permission::account::Owner)] + pub struct CanBurnUserPublicKeys { + pub account_id: AccountId, + } + } + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] + #[validate(permission::account::Owner)] + pub struct CanMintUserSignatureCheckConditions { + pub account_id: AccountId, + } + } + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] + #[validate(permission::account::Owner)] + pub struct CanSetKeyValueInUserAccount { + pub account_id: AccountId, + } + } + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] + #[validate(permission::account::Owner)] + pub struct CanRemoveKeyValueInUserAccount { + pub account_id: AccountId, + } + } + } pub fn visit_unregister_account( validator: &mut V, @@ -690,24 +721,43 @@ pub mod account { pub mod asset_definition { use super::*; - tokens!( - pattern = { - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + declare_tokens! { + crate::default::asset_definition::tokens::CanUnregisterAssetDefinition, + crate::default::asset_definition::tokens::CanSetKeyValueInAssetDefinition, + crate::default::asset_definition::tokens::CanRemoveKeyValueInAssetDefinition, + } + + pub mod tokens { + use super::*; + + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] - pub struct _ { - pub asset_definition_id: ::Id, + pub struct CanUnregisterAssetDefinition { + pub asset_definition_id: AssetDefinitionId, } - }, - asset_definition::tokens: [ - CanUnregisterAssetDefinition, - CanSetKeyValueInAssetDefinition, - CanRemoveKeyValueInAssetDefinition, - ] - ); + } + + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanSetKeyValueInAssetDefinition { + pub asset_definition_id: AssetDefinitionId, + } + } + + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanRemoveKeyValueInAssetDefinition { + pub asset_definition_id: AssetDefinitionId, + } + } + } pub(super) fn is_asset_definition_owner( - asset_definition_id: &::Id, - authority: &::Id, + asset_definition_id: &AssetDefinitionId, + authority: &AccountId, ) -> Result { IsAssetDefinitionOwner::new(asset_definition_id.clone(), authority.clone()).execute() } @@ -815,7 +865,7 @@ pub mod asset_definition { pub mod asset { use super::*; - declare_tokens!( + declare_tokens! { crate::default::asset::tokens::CanRegisterAssetsWithDefinition, crate::default::asset::tokens::CanUnregisterAssetsWithDefinition, crate::default::asset::tokens::CanUnregisterUserAsset, @@ -826,89 +876,89 @@ pub mod asset { crate::default::asset::tokens::CanTransferUserAsset, crate::default::asset::tokens::CanSetKeyValueInUserAsset, crate::default::asset::tokens::CanRemoveKeyValueInUserAsset, - ); + } pub mod tokens { use super::*; - /// Strongly-typed representation of `can_register_assets_with_definition` permission token. - #[derive( - Token, ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner, - )] - #[validate(permission::asset_definition::Owner)] - pub struct CanRegisterAssetsWithDefinition { - pub asset_definition_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanRegisterAssetsWithDefinition { + pub asset_definition_id: AssetDefinitionId, + } } - /// Strongly-typed representation of `can_unregister_assets_with_definition` permission token. - #[derive( - Token, ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner, - )] - #[validate(permission::asset_definition::Owner)] - pub struct CanUnregisterAssetsWithDefinition { - pub asset_definition_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanUnregisterAssetsWithDefinition { + pub asset_definition_id: AssetDefinitionId, + } } - /// Strongly-typed representation of `can_unregister_user_asset` permission token. - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] - #[validate(permission::asset::Owner)] - pub struct CanUnregisterUserAsset { - pub asset_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] + #[validate(permission::asset::Owner)] + pub struct CanUnregisterUserAsset { + pub asset_id: AssetId, + } } - /// Strongly-typed representation of `can_burn_assets_with_definition` permission token. - #[derive( - Token, ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner, - )] - #[validate(permission::asset_definition::Owner)] - pub struct CanBurnAssetsWithDefinition { - pub asset_definition_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanBurnAssetsWithDefinition { + pub asset_definition_id: AssetDefinitionId, + } } - /// Strong-typed representation of `can_burn_user_asset` permission token. - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] - #[validate(permission::asset::Owner)] - pub struct CanBurnUserAsset { - pub asset_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] + #[validate(permission::asset::Owner)] + pub struct CanBurnUserAsset { + pub asset_id: AssetId, + } } - /// Strongly-typed representation of `can_mint_assets_with_definition` permission token. - #[derive( - Token, ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner, - )] - #[validate(permission::asset_definition::Owner)] - pub struct CanMintAssetsWithDefinition { - pub asset_definition_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanMintAssetsWithDefinition { + pub asset_definition_id: AssetDefinitionId, + } } - /// Strongly-typed representation of `can_transfer_assets_with_definition` permission token. - #[derive( - Token, ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner, - )] - #[validate(permission::asset_definition::Owner)] - pub struct CanTransferAssetsWithDefinition { - pub asset_definition_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] + #[validate(permission::asset_definition::Owner)] + pub struct CanTransferAssetsWithDefinition { + pub asset_definition_id: AssetDefinitionId, + } } - /// Strongly-typed representation of `can_transfer_user_asset` permission token. - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] - #[validate(permission::asset::Owner)] - pub struct CanTransferUserAsset { - pub asset_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] + #[validate(permission::asset::Owner)] + pub struct CanTransferUserAsset { + pub asset_id: AssetId, + } } - /// Strongly-typed representation of `can_set_key_value_in_user_asset` permission token. - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] - #[validate(permission::asset::Owner)] - pub struct CanSetKeyValueInUserAsset { - pub asset_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] + #[validate(permission::asset::Owner)] + pub struct CanSetKeyValueInUserAsset { + pub asset_id: AssetId, + } } - /// Strongly-typed representation of `can_remove_key_value_in_user_asset` permission token. - #[derive(Token, ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] - #[validate(permission::asset::Owner)] - pub struct CanRemoveKeyValueInUserAsset { - pub asset_id: ::Id, + token! { + #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] + #[validate(permission::asset::Owner)] + pub struct CanRemoveKeyValueInUserAsset { + pub asset_id: AssetId, + } } } @@ -1115,22 +1165,25 @@ pub mod parameter { pub mod tokens { use super::*; - /// Strongly-typed representation of `can_grant_permission_to_create_parameters` permission token. - #[derive(Token, ValidateGrantRevoke, Clone, Copy)] - #[validate(permission::OnlyGenesis)] - pub struct CanGrantPermissionToCreateParameters; + token! { + #[derive(Copy, ValidateGrantRevoke)] + #[validate(permission::OnlyGenesis)] + pub struct CanGrantPermissionToCreateParameters; + } - /// Strongly-typed representation of `can_revoke_permission_to_create_parameters` permission token. - #[derive(Token, ValidateGrantRevoke, Clone, Copy)] - #[validate(permission::OnlyGenesis)] - pub struct CanRevokePermissionToCreateParameters; + token! { + #[derive(Copy, ValidateGrantRevoke)] + #[validate(permission::OnlyGenesis)] + pub struct CanRevokePermissionToCreateParameters; + } - /// Strongly-typed representation of `can_create_parameters` permission token. - #[derive(Token, Clone, Copy)] - pub struct CanCreateParameters; + token! { + #[derive(Copy)] + pub struct CanCreateParameters; + } impl ValidateGrantRevoke for CanCreateParameters { - fn validate_grant(&self, authority: &::Id) -> Result { + fn validate_grant(&self, authority: &AccountId) -> Result { if !CanGrantPermissionToCreateParameters.is_owned_by(authority) { return Err(ValidationFail::NotPermitted( "Can't grant permission to create new configuration parameters without permission from genesis" @@ -1141,7 +1194,7 @@ pub mod parameter { Ok(()) } - fn validate_revoke(&self, authority: &::Id) -> Result { + fn validate_revoke(&self, authority: &AccountId) -> Result { if !CanRevokePermissionToCreateParameters.is_owned_by(authority) { return Err(ValidationFail::NotPermitted( "Can't revoke permission to create new configuration parameters without permission from genesis" @@ -1153,22 +1206,25 @@ pub mod parameter { } } - /// Strongly-typed representation of `can_grant_permission_to_set_parameters` permission token. - #[derive(Token, ValidateGrantRevoke, Clone, Copy)] - #[validate(permission::OnlyGenesis)] - pub struct CanGrantPermissionToSetParameters; + token! { + #[derive(Copy, ValidateGrantRevoke)] + #[validate(permission::OnlyGenesis)] + pub struct CanGrantPermissionToSetParameters; + } - /// Strongly-typed representation of `can_revoke_permission_to_set_parameters` permission token. - #[derive(Token, ValidateGrantRevoke, Clone, Copy)] - #[validate(permission::OnlyGenesis)] - pub struct CanRevokePermissionToSetParameters; + token! { + #[derive(Copy, ValidateGrantRevoke)] + #[validate(permission::OnlyGenesis)] + pub struct CanRevokePermissionToSetParameters; + } - /// Strongly-typed representation of `can_set_parameters` permission token. - #[derive(Token, Clone, Copy)] - pub struct CanSetParameters; + token! { + #[derive(Copy)] + pub struct CanSetParameters; + } impl ValidateGrantRevoke for CanSetParameters { - fn validate_grant(&self, authority: &::Id) -> Result { + fn validate_grant(&self, authority: &AccountId) -> Result { if !CanGrantPermissionToSetParameters.is_owned_by(authority) { return Err(ValidationFail::NotPermitted( "Can't grant permission to set configuration parameters without permission from genesis" @@ -1179,7 +1235,7 @@ pub mod parameter { Ok(()) } - fn validate_revoke(&self, authority: &::Id) -> Result { + fn validate_revoke(&self, authority: &AccountId) -> Result { if !CanRevokePermissionToSetParameters.is_owned_by(authority) { return Err(ValidationFail::NotPermitted( "Can't revoke permission to set configuration parameters without permission from genesis" @@ -1228,17 +1284,19 @@ pub mod parameter { pub mod role { use super::*; - tokens!( - pattern = { - #[derive(Token, ValidateGrantRevoke)] + declare_tokens! { + crate::default::role::tokens::CanUnregisterAnyRole, + } + + pub mod tokens { + use super::*; + + token! { + #[derive(Copy, ValidateGrantRevoke)] #[validate(permission::OnlyGenesis)] - #[derive(Clone, Copy)] - pub struct _ {} - }, - role::tokens: [ - CanUnregisterAnyRole, - ] - ); + pub struct CanUnregisterAnyRole; + } + } macro_rules! impl_validate { ($validator:ident, $self:ident, $authority:ident, $method:ident) => { @@ -1292,7 +1350,7 @@ pub mod role { _isi: Unregister, ) { const CAN_UNREGISTER_ROLE_TOKEN: tokens::CanUnregisterAnyRole = - tokens::CanUnregisterAnyRole {}; + tokens::CanUnregisterAnyRole; if CAN_UNREGISTER_ROLE_TOKEN.is_owned_by(authority) { pass!(validator); @@ -1335,20 +1393,39 @@ pub mod trigger { )+}; } - tokens!( - pattern = { - #[derive(Token, Clone, ValidateGrantRevoke)] + declare_tokens! { + crate::default::trigger::tokens::CanExecuteUserTrigger, + crate::default::trigger::tokens::CanUnregisterUserTrigger, + crate::default::trigger::tokens::CanMintUserTrigger, + } + + pub mod tokens { + use super::*; + + token! { + #[derive(ValidateGrantRevoke)] #[validate(permission::trigger::Owner)] - pub struct _ { - pub trigger_id: as Identifiable>::Id, + pub struct CanExecuteUserTrigger { + pub trigger_id: TriggerId, } - }, - trigger::tokens: [ - CanExecuteUserTrigger, - CanUnregisterUserTrigger, - CanMintUserTrigger, - ] - ); + } + + token! { + #[derive(ValidateGrantRevoke)] + #[validate(permission::trigger::Owner)] + pub struct CanUnregisterUserTrigger { + pub trigger_id: TriggerId, + } + } + + token! { + #[derive(ValidateGrantRevoke)] + #[validate(permission::trigger::Owner)] + pub struct CanMintUserTrigger { + pub trigger_id: TriggerId, + } + } + } impl_froms!( tokens::CanExecuteUserTrigger, @@ -1472,17 +1549,19 @@ pub mod permission_token { pub mod validator { use super::*; - tokens!( - pattern = { - #[derive(Token, ValidateGrantRevoke)] + declare_tokens! { + crate::default::validator::tokens::CanUpgradeValidator, + } + + pub mod tokens { + use super::*; + + token! { + #[derive(Copy, ValidateGrantRevoke)] #[validate(permission::OnlyGenesis)] - #[derive(Clone, Copy)] - pub struct _ {} - }, - validator::tokens: [ - CanUpgradeValidator, - ] - ); + pub struct CanUpgradeValidator; + } + } #[allow(clippy::needless_pass_by_value)] pub fn visit_upgrade_validator( @@ -1491,7 +1570,7 @@ pub mod validator { _isi: Upgrade, ) { const CAN_UPGRADE_VALIDATOR_TOKEN: tokens::CanUpgradeValidator = - tokens::CanUpgradeValidator {}; + tokens::CanUpgradeValidator; if CAN_UPGRADE_VALIDATOR_TOKEN.is_owned_by(authority) { pass!(validator); } diff --git a/wasm/validator/src/lib.rs b/wasm/validator/src/lib.rs index 77ccf24cb8d..320c46f58ad 100644 --- a/wasm/validator/src/lib.rs +++ b/wasm/validator/src/lib.rs @@ -9,8 +9,9 @@ extern crate self as iroha_validator; #[cfg(feature = "default-validator")] pub use default::DefaultValidator; +pub use iroha_schema::MetaMap; use iroha_wasm::data_model::{ - permission::PermissionTokenDefinition, validator::Result, visit::Visit, ValidationFail, + permission::PermissionTokenId, validator::Result, visit::Visit, ValidationFail, }; pub use iroha_wasm::{self, data_model}; @@ -110,10 +111,44 @@ macro_rules! declare_tokens { } } +/// Collection of all permission tokens defined by the validator +#[derive(Debug, Clone, Default)] +pub struct PermissionTokenSchema(Vec, MetaMap); + +impl PermissionTokenSchema { + /// Remove permission token from this collection + pub fn remove(&mut self) { + if let Some(pos) = self + .0 + .iter() + .position(|token_id| *token_id == ::type_name()) + { + self.0.remove(pos); + ::remove_from_schema(&mut self.1); + } + } + + /// Insert new permission token into this collection + pub fn insert(&mut self) { + ::update_schema_map(&mut self.1); + self.0.push(::type_name()); + } + + /// Serializes schema into a JSON string representation + pub fn serialize(mut self) -> (Vec, alloc::string::String) { + self.0.sort(); + + ( + self.0, + serde_json::to_string(&self.1).expect("schema serialization must not fail"), + ) + } +} + /// Validator of Iroha operations pub trait Validate: Visit { /// Get all [`PermissionTokenDefinition`]'s defined by validator. - fn permission_tokens() -> Vec; + fn permission_token_schema() -> PermissionTokenSchema; /// Validator verdict. fn verdict(&self) -> &Result; @@ -136,5 +171,5 @@ pub mod prelude { #[cfg(feature = "default-validator")] pub use super::DefaultValidator; - pub use super::{declare_tokens, deny, pass, Validate}; + pub use super::{declare_tokens, deny, pass, PermissionTokenSchema, Validate}; } diff --git a/wasm/validator/src/permission.rs b/wasm/validator/src/permission.rs index 3c0fcd9db27..0e13f61ab01 100644 --- a/wasm/validator/src/permission.rs +++ b/wasm/validator/src/permission.rs @@ -2,19 +2,23 @@ use alloc::borrow::ToOwned as _; +use iroha_schema::IntoSchema; +use parity_scale_codec::{Decode, Encode}; + use crate::{data_model::prelude::*, prelude::*}; /// [`Token`] trait is used to check if the token is owned by the account. pub trait Token: - TryFrom + ValidateGrantRevoke + Decode + + Encode + + IntoSchema + + TryFrom + + ValidateGrantRevoke { - /// Get definition of this token - fn definition() -> PermissionTokenDefinition; - /// Check if token is owned by the account using evaluation on host. /// /// Basically it's a wrapper around [`DoesAccountHavePermissionToken`] query. - fn is_owned_by(&self, account_id: &::Id) -> bool; + fn is_owned_by(&self, account_id: &AccountId) -> bool; } /// Trait that should be implemented for all permission tokens. @@ -22,16 +26,16 @@ pub trait Token: /// instructions containing implementing token. pub trait ValidateGrantRevoke { #[allow(missing_docs, clippy::missing_errors_doc)] - fn validate_grant(&self, authority: &::Id) -> Result; + fn validate_grant(&self, authority: &AccountId) -> Result; #[allow(missing_docs, clippy::missing_errors_doc)] - fn validate_revoke(&self, authority: &::Id) -> Result; + fn validate_revoke(&self, authority: &AccountId) -> Result; } /// Predicate-like trait used for pass conditions to identify if [`Grant`] or [`Revoke`] should be allowed. pub trait PassCondition { #[allow(missing_docs, clippy::missing_errors_doc)] - fn validate(&self, authority: &::Id) -> Result; + fn validate(&self, authority: &AccountId) -> Result; } /// Error type for `TryFrom` implementations. @@ -77,11 +81,11 @@ pub mod asset { /// Pass condition that checks if `authority` is the owner of `asset_id`. #[derive(Debug, Clone)] pub struct Owner<'asset> { - pub asset_id: &'asset ::Id, + pub asset_id: &'asset AssetId, } impl PassCondition for Owner<'_> { - fn validate(&self, authority: &::Id) -> Result { + fn validate(&self, authority: &AccountId) -> Result { if self.asset_id.account_id() != authority { return Err(ValidationFail::NotPermitted( "Can't access asset owned by another account".to_owned(), @@ -99,8 +103,8 @@ pub mod asset_definition { use super::*; fn is_asset_definition_owner( - asset_definition_id: &::Id, - authority: &::Id, + asset_definition_id: &AssetDefinitionId, + authority: &AccountId, ) -> Result { IsAssetDefinitionOwner::new(asset_definition_id.clone(), authority.clone()).execute() } @@ -108,11 +112,11 @@ pub mod asset_definition { /// Pass condition that checks if `authority` is the owner of `asset_definition_id`. #[derive(Debug, Clone)] pub struct Owner<'asset_definition> { - pub asset_definition_id: &'asset_definition ::Id, + pub asset_definition_id: &'asset_definition AssetDefinitionId, } impl PassCondition for Owner<'_> { - fn validate(&self, authority: &::Id) -> Result { + fn validate(&self, authority: &AccountId) -> Result { if !is_asset_definition_owner(self.asset_definition_id, authority)? { return Err(ValidationFail::NotPermitted( "Can't access asset definition owned by another account".to_owned(), @@ -132,11 +136,11 @@ pub mod account { /// Pass condition that checks if `authority` is the owner of `account_id`. #[derive(Debug, Clone)] pub struct Owner<'asset> { - pub account_id: &'asset ::Id, + pub account_id: &'asset AccountId, } impl PassCondition for Owner<'_> { - fn validate(&self, authority: &::Id) -> Result { + fn validate(&self, authority: &AccountId) -> Result { if self.account_id != authority { return Err(ValidationFail::NotPermitted( "Can't access another account".to_owned(), @@ -159,10 +163,7 @@ pub mod trigger { /// # Errors /// /// Fails if query fails - pub fn is_trigger_owner( - trigger_id: as Identifiable>::Id, - authority: &::Id, - ) -> Result { + pub fn is_trigger_owner(trigger_id: TriggerId, authority: &AccountId) -> Result { FindTriggerById::new(trigger_id) .execute() .map(|trigger| trigger.action().authority() == authority) @@ -171,11 +172,11 @@ pub mod trigger { /// Pass condition that checks if `authority` is the owner of `trigger_id`. #[derive(Debug, Clone)] pub struct Owner<'trigger> { - pub trigger_id: &'trigger as Identifiable>::Id, + pub trigger_id: &'trigger TriggerId, } impl PassCondition for Owner<'_> { - fn validate(&self, authority: &::Id) -> Result { + fn validate(&self, authority: &AccountId) -> Result { if !is_trigger_owner(self.trigger_id.clone(), authority)? { return Err(ValidationFail::NotPermitted( "Can't give permission to access trigger owned by another account".to_owned(), @@ -192,7 +193,7 @@ pub mod trigger { pub struct AlwaysPass; impl PassCondition for AlwaysPass { - fn validate(&self, _: &::Id) -> Result { + fn validate(&self, _: &AccountId) -> Result { Ok(()) } } @@ -211,7 +212,7 @@ impl From<&T> for AlwaysPass { pub struct OnlyGenesis; impl PassCondition for OnlyGenesis { - fn validate(&self, _: &::Id) -> Result { + fn validate(&self, _: &AccountId) -> Result { Err(ValidationFail::NotPermitted( "This operation is always denied and only allowed inside the genesis block".to_owned(), ))