From 38be57589942a1af7c8272e0e7ba40b02e05936a Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Fri, 27 Oct 2023 15:31:36 +0300 Subject: [PATCH] [refactor] #3982: Clear live queries after smart contract end Signed-off-by: Daniil Polyakov --- configs/peer/executor.wasm | Bin 497705 -> 497862 bytes core/src/query/store.rs | 30 +- core/src/smartcontracts/wasm.rs | 742 ++++++++++++++++---------------- data_model/src/query/cursor.rs | 9 +- data_model/src/query/mod.rs | 5 +- ffi/derive/src/convert.rs | 8 +- wasm_codec/derive/src/lib.rs | 4 +- 7 files changed, 407 insertions(+), 391 deletions(-) diff --git a/configs/peer/executor.wasm b/configs/peer/executor.wasm index a246bb87f48c82cab96d5fe03ad59f7181a1257a..b60c81790a2eed2a8a75651004e8a1d2fffec58b 100644 GIT binary patch delta 121011 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 db0N%S^4M{`uEB>; /// Clients can handle their queries using [`LiveQueryStoreHandle`] #[derive(Debug)] pub struct LiveQueryStore { - queries: HashMap, + queries: HashMap, query_idle_time: Duration, } @@ -96,7 +97,8 @@ impl LiveQueryStore { "All handler to LiveQueryStore are dropped. Shutting down..."; let (insert_sender, mut insert_receiver) = mpsc::channel(1); - let (remove_sender, mut remove_receiver) = mpsc::channel::<(String, oneshot::Sender<_>)>(1); + let (remove_sender, mut remove_receiver) = + mpsc::channel::<(QueryId, oneshot::Sender<_>)>(1); let mut idle_interval = tokio::time::interval(self.query_idle_time); @@ -134,7 +136,7 @@ impl LiveQueryStore { } } - fn insert(&mut self, query_id: String, live_query: LiveQuery) { + fn insert(&mut self, query_id: QueryId, live_query: LiveQuery) { self.queries.insert(query_id, (live_query, Instant::now())); } @@ -147,10 +149,10 @@ impl LiveQueryStore { #[derive(Clone)] pub struct LiveQueryStoreHandle { /// Sender to insert a new query with specified id. - insert_sender: mpsc::Sender<(String, LiveQuery)>, + insert_sender: mpsc::Sender<(QueryId, LiveQuery)>, /// Sender to send a tuple of query id and another sender, which will be /// used by [`LiveQueryStore`] to write a response with optional live query. - remove_sender: mpsc::Sender<(String, oneshot::Sender>)>, + remove_sender: mpsc::Sender<(QueryId, oneshot::Sender>)>, } impl LiveQueryStoreHandle { @@ -197,13 +199,25 @@ impl LiveQueryStoreHandle { self.construct_query_response(query_id, cursor.cursor.map(NonZeroU64::get), live_query) } - fn insert(&self, query_id: String, live_query: LiveQuery) -> Result<()> { + /// Remove query from the storage if there is any. + /// + /// Returns `true` if query was removed, `false` otherwise. + /// + /// # Errors + /// + /// - Returns [`Error::ConnectionClosed`] if [`QueryService`] is dropped, + /// - Otherwise throws up query output handling errors. + pub fn drop_query(&self, query_id: QueryId) -> Result { + self.remove(query_id).map(|query_opt| query_opt.is_some()) + } + + fn insert(&self, query_id: QueryId, live_query: LiveQuery) -> Result<()> { self.insert_sender .blocking_send((query_id, live_query)) .map_err(|_| Error::ConnectionClosed) } - fn remove(&self, query_id: String) -> Result> { + fn remove(&self, query_id: QueryId) -> Result> { let (sender, receiver) = oneshot::channel(); self.remove_sender @@ -215,7 +229,7 @@ impl LiveQueryStoreHandle { fn construct_query_response( &self, - query_id: String, + query_id: QueryId, curr_cursor: Option, mut live_query: Batched>, ) -> Result> { diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index 8a38a178b6d..69e9cca5db4 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -5,7 +5,7 @@ use std::num::NonZeroUsize; use error::*; -use import_traits::{ +use import::traits::{ ExecuteOperations as _, GetExecutorPayloads as _, SetPermissionTokenSchema as _, }; use iroha_config::{ @@ -18,7 +18,7 @@ use iroha_data_model::{ isi::InstructionExpr, permission::PermissionTokenSchema, prelude::*, - query::{QueryBox, QueryRequest, QueryWithParameters}, + query::{QueryBox, QueryId, QueryRequest, QueryWithParameters}, smart_contract::{ payloads::{self, Validate}, SmartContractQueryRequest, @@ -29,13 +29,16 @@ use iroha_logger::debug; // NOTE: Using error_span so that span info is logged on every event use iroha_logger::{error_span as wasm_log_span, prelude::tracing::Span}; use iroha_wasm_codec::{self as codec, WasmUsize}; -use state::{Wsv as _, WsvMut as _}; use wasmtime::{ Caller, Config, Engine, Linker, Module, Store, StoreLimits, StoreLimitsBuilder, TypedFunc, }; -use self::state::Authority; -use crate::{smartcontracts::Execute, wsv::WorldStateView, ValidQuery as _}; +use crate::{ + query::store::LiveQueryStoreHandle, + smartcontracts::{wasm::state::ValidateQueryOperation, Execute}, + wsv::WorldStateView, + ValidQuery as _, +}; /// Name of the exported memory const WASM_MEMORY: &str = "memory"; @@ -67,48 +70,48 @@ mod import { pub const EXECUTOR_VALIDATE_INSTRUCTION: &str = "_iroha_executor_validate_instruction"; pub const EXECUTOR_VALIDATE_QUERY: &str = "_iroha_executor_validate_query"; pub const EXECUTOR_MIGRATE: &str = "_iroha_executor_migrate"; -} -mod import_traits { - //! Traits which some [Runtime]s should implement to import functions from Iroha to WASM + pub mod traits { + //! Traits which some [Runtime]s should implement to import functions from Iroha to WASM - use iroha_data_model::{query::QueryBox, smart_contract::payloads::Validate}; + use iroha_data_model::{query::QueryBox, smart_contract::payloads::Validate}; - use super::*; + use super::super::*; - pub trait ExecuteOperations { - /// Execute `query` on host - #[codec::wrap_trait_fn] - fn execute_query( - query_request: SmartContractQueryRequest, - state: &S, - ) -> Result, ValidationFail>; - - /// Execute `instruction` on host - #[codec::wrap_trait_fn] - fn execute_instruction( - instruction: InstructionExpr, - state: &mut S, - ) -> Result<(), ValidationFail>; - } + pub trait ExecuteOperations { + /// Execute `query` on host + #[codec::wrap_trait_fn] + fn execute_query( + query_request: SmartContractQueryRequest, + state: &mut S, + ) -> Result, ValidationFail>; - pub trait GetExecutorPayloads { - #[codec::wrap_trait_fn] - fn get_migrate_payload(state: &S) -> payloads::Migrate; + /// Execute `instruction` on host + #[codec::wrap_trait_fn] + fn execute_instruction( + instruction: InstructionExpr, + state: &mut S, + ) -> Result<(), ValidationFail>; + } - #[codec::wrap_trait_fn] - fn get_validate_transaction_payload(state: &S) -> Validate; + pub trait GetExecutorPayloads { + #[codec::wrap_trait_fn] + fn get_migrate_payload(state: &S) -> payloads::Migrate; - #[codec::wrap_trait_fn] - fn get_validate_instruction_payload(state: &S) -> Validate; + #[codec::wrap_trait_fn] + fn get_validate_transaction_payload(state: &S) -> Validate; - #[codec::wrap_trait_fn] - fn get_validate_query_payload(state: &S) -> Validate; - } + #[codec::wrap_trait_fn] + fn get_validate_instruction_payload(state: &S) -> Validate; + + #[codec::wrap_trait_fn] + fn get_validate_query_payload(state: &S) -> Validate; + } - pub trait SetPermissionTokenSchema { - #[codec::wrap_trait_fn] - fn set_permission_token_schema(schema: PermissionTokenSchema, state: &mut S); + pub trait SetPermissionTokenSchema { + #[codec::wrap_trait_fn] + fn set_permission_token_schema(schema: PermissionTokenSchema, state: &mut S); + } } } @@ -119,9 +122,15 @@ pub mod error { /// `WebAssembly` execution error type #[derive(Debug, thiserror::Error, displaydoc::Display)] + #[ignore_extra_doc_attributes] pub enum Error { /// Runtime initialization failure Initialization(#[source] WasmtimeError), + /// Runtime finalization failure. + /// + /// Currently only [`crate::query::store::Error`] might fail in this case. + /// [`From`] is not implemented to force users to explicitly wrap this error. + Finalization(#[source] crate::query::store::Error), /// Failed to load module ModuleLoading(#[source] WasmtimeError), /// Module could not be instantiated @@ -270,6 +279,19 @@ fn create_config() -> Result { Ok(config) } +/// Remove all executed queries from the query storage. +fn forget_all_executed_queries( + query_handle: &LiveQueryStoreHandle, + executed_queries: impl IntoIterator, +) -> Result<()> { + for query_id in executed_queries { + let _ = query_handle + .drop_query(query_id) + .map_err(Error::Finalization)?; + } + Ok(()) +} + /// Limits checker for smartcontracts. #[derive(Copy, Clone)] struct LimitsExecutor { @@ -308,6 +330,10 @@ impl LimitsExecutor { pub mod state { //! All supported states for [`Runtime`](super::Runtime) + use std::collections::HashSet; + + use derive_more::Constructor; + use super::*; /// Construct [`StoreLimits`] from [`Configuration`] @@ -329,258 +355,211 @@ pub mod state { .build() } - /// Common data for states - pub struct Common<'wrld> { + /// State for most common operations. + /// Generic over concrete state kind and containing common data. + pub struct CommonState { pub(super) authority: AccountId, pub(super) store_limits: StoreLimits, - pub(super) wsv: &'wrld mut WorldStateView, /// Span inside of which all logs are recorded for this smart contract pub(super) log_span: Span, + pub(super) executed_queries: HashSet, + /// Concrete kind of state + pub(super) kind: K, } - impl<'wrld> Common<'wrld> { - /// Create new [`Common`] - pub fn new( - wsv: &'wrld mut WorldStateView, - authority: AccountId, - config: Configuration, - log_span: Span, - ) -> Self { + impl CommonState { + /// Create new [`OrdinaryState`] + pub fn new(authority: AccountId, config: Configuration, log_span: Span, kind: K) -> Self { Self { - wsv, authority, store_limits: store_limits_from_config(&config), log_span, + executed_queries: HashSet::new(), + kind, } } - } - - /// Trait to get span for logs. - /// - /// Used to implement [`log()`](Runtime::log) export. - pub trait LogSpan { - /// Get log span - fn log_span(&self) -> &Span; - } - - /// Trait to get mutable reference to limits - /// - /// Used to implement [`Runtime::create_store()`]. - pub trait LimitsMut { - /// Get mutable reference to store limits - fn limits_mut(&mut self) -> &mut StoreLimits; - } - - /// Trait to get authority account id - pub trait Authority { - /// Get authority account id - fn authority(&self) -> &AccountId; - } - - /// Trait to get an immutable reference to [`WorldStateView`] - pub trait Wsv { - /// Get immutable [`WorldStateView`] - fn wsv(&self) -> &WorldStateView; - } - - /// Trait to get mutable reference to [`WorldStateView`] - pub trait WsvMut { - /// Get mutable [`WorldStateView`] - fn wsv_mut(&mut self) -> &mut WorldStateView; - } - - /// Smart Contract execution state - pub struct SmartContract<'wrld> { - pub(super) common: Common<'wrld>, - /// Should be set for smart contract validation only. - pub(super) limits_executor: Option, - } - - impl LogSpan for SmartContract<'_> { - fn log_span(&self) -> &Span { - &self.common.log_span - } - } - - impl LimitsMut for SmartContract<'_> { - fn limits_mut(&mut self) -> &mut StoreLimits { - &mut self.common.store_limits - } - } - - impl Authority for SmartContract<'_> { - fn authority(&self) -> &AccountId { - &self.common.authority - } - } - - impl Wsv for SmartContract<'_> { - fn wsv(&self) -> &WorldStateView { - self.common.wsv - } - } - impl WsvMut for SmartContract<'_> { - fn wsv_mut(&mut self) -> &mut WorldStateView { - self.common.wsv + /// Take executed queries leaving an empty set + pub fn take_executed_queries(&mut self) -> HashSet { + std::mem::take(&mut self.executed_queries) } } - /// Trigger execution state - pub struct Trigger<'wrld> { - pub(super) common: Common<'wrld>, - /// Event which activated this trigger - pub(super) triggering_event: Event, - } - - impl LogSpan for Trigger<'_> { - fn log_span(&self) -> &Span { - &self.common.log_span - } + /// Trait to validate queries and instructions before execution. + pub trait ValidateQueryOperation { + /// Validate `query`. + /// + /// # Errors + /// + /// Returns error if query validation failed. + fn validate_query( + &self, + authority: &AccountId, + query: QueryBox, + ) -> Result<(), ValidationFail>; } - impl LimitsMut for Trigger<'_> { - fn limits_mut(&mut self) -> &mut StoreLimits { - &mut self.common.store_limits - } - } + pub mod kind { + //! Module with all kinds of state. - impl Authority for Trigger<'_> { - fn authority(&self) -> &AccountId { - &self.common.authority - } - } + use super::*; - impl Wsv for Trigger<'_> { - fn wsv(&self) -> &WorldStateView { - self.common.wsv + /// State kinds containing const reference to [`WorldStateView`] + #[derive(Constructor)] + pub struct WithWsv<'wrld, K> { + pub(in super::super) wsv: &'wrld WorldStateView, + pub(in super::super) sub_kind: K, } - } - impl WsvMut for Trigger<'_> { - fn wsv_mut(&mut self) -> &mut WorldStateView { - self.common.wsv + /// State kinds containing mutable reference to [`WorldStateView`] + #[derive(Constructor)] + pub struct WithMutWsv<'wrld, K> { + pub(in super::super) wsv: &'wrld mut WorldStateView, + pub(in super::super) sub_kind: K, } - } - - pub mod executor { - //! States related to *Executor* execution. - - use super::*; - /// Struct to encapsulate common state for `validate_transaction()` and - /// `validate_instruction()` entrypoints. + /// Trait to get immutable [`WorldStateView`] /// - /// *Mut* means that [`WorldStateView`] will be mutated. - pub struct ValidateMut<'wrld, T> { - pub(in super::super) common: Common<'wrld>, - pub(in super::super) to_validate: T, + /// Exists to write generic code for [`WithWsv`] and [`WithMutWsv`. + pub trait Wsv { + /// Get immutable [`WorldStateView`] + fn wsv(&self) -> &WorldStateView; } - impl LogSpan for ValidateMut<'_, T> { - fn log_span(&self) -> &Span { - &self.common.log_span + impl Wsv for WithWsv<'_, K> { + fn wsv(&self) -> &WorldStateView { + self.wsv } } - impl LimitsMut for ValidateMut<'_, T> { - fn limits_mut(&mut self) -> &mut StoreLimits { - &mut self.common.store_limits + impl Wsv for WithMutWsv<'_, K> { + fn wsv(&self) -> &WorldStateView { + self.wsv } } - impl Authority for ValidateMut<'_, T> { - fn authority(&self) -> &AccountId { - &self.common.authority + pub mod sub_kind { + //! Module with all real state kinds. + + use super::*; + + /// Smart Contract execution state kind + #[derive(Copy, Clone)] + pub struct SmartContract { + pub(in super::super::super) limits_executor: Option, } - } - impl Wsv for ValidateMut<'_, T> { - fn wsv(&self) -> &WorldStateView { - self.common.wsv + impl SmartContract { + /// Create new [`SmartContract`] + pub(in super::super::super) fn new( + limits_executor: Option, + ) -> Self { + Self { limits_executor } + } } - } - impl WsvMut for ValidateMut<'_, T> { - fn wsv_mut(&mut self) -> &mut WorldStateView { - self.common.wsv + /// Trigger execution state kind + #[derive(Constructor)] + pub struct Trigger { + /// Event which activated this trigger + pub(in super::super::super) triggering_event: Event, } - } - /// State for executing `validate_transaction()` entrypoint of executor - pub type ValidateTransaction<'wrld> = ValidateMut<'wrld, SignedTransaction>; + pub mod executor { + //! Stat kinds related to *Executor* execution. - /// State for executing `validate_instruction()` entrypoint of executor - pub type ValidateInstruction<'wrld> = ValidateMut<'wrld, InstructionExpr>; + use super::*; - /// State for executing `validate_query()` entrypoint of executor - /// - /// Does not implement [`WsvMut`] because it contains immutable reference to - /// [`WorldStateView`] since it shouldn't be changed during *query* validation. - pub struct ValidateQuery<'wrld> { - pub(in super::super) authority: AccountId, - pub(in super::super) store_limits: StoreLimits, - pub(in super::super) wsv: &'wrld WorldStateView, - pub(in super::super) log_span: Span, - pub(in super::super) query: QueryBox, - } + /// Struct to encapsulate common state kinds for `validate_*` entrypoints + #[derive(Constructor)] + pub struct Validate { + pub(in super::super::super::super) to_validate: T, + } - impl LogSpan for ValidateQuery<'_> { - fn log_span(&self) -> &Span { - &self.log_span - } - } + /// State kind for executing `validate_transaction()` entrypoint of executor + pub type ValidateTransaction = Validate; - impl LimitsMut for ValidateQuery<'_> { - fn limits_mut(&mut self) -> &mut StoreLimits { - &mut self.store_limits - } - } + /// State kind for executing `validate_query()` entrypoint of executor + pub type ValidateQuery = Validate; - impl Authority for ValidateQuery<'_> { - fn authority(&self) -> &AccountId { - &self.authority - } - } + /// State kind for executing `validate_instruction()` entrypoint of executor + pub type ValidateInstruction = Validate; - impl Wsv for ValidateQuery<'_> { - fn wsv(&self) -> &WorldStateView { - self.wsv + /// State kind for executing `migrate()` entrypoint of executor + #[derive(Copy, Clone)] + pub struct Migrate; } } + } - /// State for executing `migrate()` entrypoint of executor - pub struct Migrate<'wrld>(pub(in super::super) Common<'wrld>); + /// State for smart contract execution + pub type SmartContract<'wrld> = + CommonState>; - impl LimitsMut for Migrate<'_> { - fn limits_mut(&mut self) -> &mut StoreLimits { - &mut self.0.store_limits - } - } + /// state for trigger execution + pub type Trigger<'wrld> = CommonState>; - impl LogSpan for Migrate<'_> { - fn log_span(&self) -> &Span { - &self.0.log_span - } + impl ValidateQueryOperation for SmartContract<'_> { + fn validate_query( + &self, + authority: &AccountId, + query: QueryBox, + ) -> Result<(), ValidationFail> { + let wsv: &WorldStateView = self.kind.wsv; + wsv.executor().validate_query(wsv, authority, query) } + } - impl Authority for Migrate<'_> { - fn authority(&self) -> &AccountId { - &self.0.authority - } + impl ValidateQueryOperation for Trigger<'_> { + fn validate_query( + &self, + authority: &AccountId, + query: QueryBox, + ) -> Result<(), ValidationFail> { + let wsv: &WorldStateView = self.kind.wsv; + wsv.executor().validate_query(wsv, authority, query) } + } - impl Wsv for Migrate<'_> { - fn wsv(&self) -> &WorldStateView { - self.0.wsv - } - } + pub mod executor { + //! States for different executor entrypoints - impl WsvMut for Migrate<'_> { - fn wsv_mut(&mut self) -> &mut WorldStateView { - self.0.wsv - } + use super::*; + + /// State for executing `validate_transaction()` entrypoint + pub type ValidateTransaction<'wrld> = + CommonState>; + + /// State for executing `validate_query()` entrypoint + pub type ValidateQuery<'wrld> = + CommonState>; + + /// State for executing `validate_instruction()` entrypoint + pub type ValidateInstruction<'wrld> = + CommonState>; + + /// State for executing `migrate()` entrypoint + pub type Migrate<'wrld> = + CommonState>; + + macro_rules! blank_validate_operations { + (impl$(<$($generics_decl:tt),+>)? for $t:ident$(<$($generics:tt),+>)?) => { + impl$(<$($generics_decl),+>)? ValidateQueryOperation for $t$(<$($generics),+>)? { + fn validate_query( + &self, + _authority: &AccountId, + _query: QueryBox, + ) -> Result<(), ValidationFail> { + Ok(()) + } + } + }; } + + blank_validate_operations!(impl for ValidateTransaction<'_>); + blank_validate_operations!(impl for ValidateInstruction<'_>); + blank_validate_operations!(impl for ValidateQuery<'_>); + blank_validate_operations!(impl for Migrate<'_>); } } @@ -695,17 +674,20 @@ struct LogError(u8); /// It's required by `#[codec::wrap]` to parse well type WasmtimeError = wasmtime::Error; -impl Runtime { +impl Runtime> { /// Log the given string at the given log level /// /// # Errors /// /// If log level or string decoding fails #[codec::wrap] - pub fn log((log_level, msg): (u8, String), state: &S) -> Result<(), WasmtimeError> { + pub fn log( + (log_level, msg): (u8, String), + state: &state::CommonState, + ) -> Result<(), WasmtimeError> { const TARGET: &str = "WASM"; - let _span = state.log_span().enter(); + let _span = state.log_span.enter(); match LogLevel::from_repr(log_level) .ok_or(LogError(log_level)) .map_err(wasmtime::Error::from)? @@ -728,24 +710,24 @@ impl Runtime { } Ok(()) } -} -impl Runtime { - fn create_store(&self, state: S) -> Store { + fn create_store(&self, state: state::CommonState) -> Store> { let mut store = Store::new(&self.engine, state); - store.limiter(|s| s.limits_mut()); + store.limiter(|s| &mut s.store_limits); store .add_fuel(self.config.fuel_limit) .expect("Wasm Runtime config is malformed, this is a bug"); store } +} +impl Runtime> { fn execute_executor_validate_internal( &self, module: &wasmtime::Module, - state: S, + state: state::CommonState, validate_fn_name: &'static str, ) -> Result { let mut store = self.create_store(state); @@ -763,46 +745,71 @@ impl Runtime { let dealloc_fn = Self::get_typed_func(&instance, &mut store, import::SMART_CONTRACT_DEALLOC) .expect("Checked at instantiation step"); - codec::decode_with_length_prefix_from_memory(&memory, &dealloc_fn, &mut store, offset) - .map_err(Error::Decode) + let validation_res = + codec::decode_with_length_prefix_from_memory(&memory, &dealloc_fn, &mut store, offset) + .map_err(Error::Decode)?; + + let mut state = store.into_data(); + let executed_queries = state.take_executed_queries(); + forget_all_executed_queries(state.kind.wsv().query_handle(), executed_queries)?; + Ok(validation_res) } } -#[allow(clippy::needless_pass_by_value)] -impl Runtime { +impl Runtime> +where + state::CommonState: state::ValidateQueryOperation, +{ fn default_execute_query( query_request: SmartContractQueryRequest, - state: &S, + state: &mut state::CommonState, ) -> Result, ValidationFail> { iroha_logger::debug!(%query_request, "Executing"); - let wsv = state.wsv(); - match query_request.0 { QueryRequest::Query(QueryWithParameters { query, sorting, pagination, }) => { - wsv.executor() - .validate_query(wsv, state.authority(), query.clone())?; - let output = query.execute(wsv)?; - - wsv.query_handle().handle_query_output( - output, - NonZeroUsize::new(30_000).expect("30 000 is not zero"), - &sorting, - pagination, - ) + let batched = { + let wsv = &state.kind.wsv(); + state.validate_query(&state.authority, query.clone())?; + let output = query.execute(wsv)?; + + wsv.query_handle().handle_query_output( + output, + NonZeroUsize::new(30_000).expect("30 000 is not zero"), + &sorting, + pagination, + ) + }?; + match &batched { + BatchedResponse::V1(batched) => { + if let Some(query_id) = &batched.cursor.query_id { + state.executed_queries.insert(query_id.clone()); + } + } + } + Ok(batched) + } + QueryRequest::Cursor(cursor) => { + // In a normal situation we already have this `query_id` stored, + // so that's a protection from malicious smart contract + if let Some(query_id) = &cursor.query_id { + state.executed_queries.insert(query_id.clone()); + } + state.kind.wsv().query_handle().handle_query_cursor(cursor) } - QueryRequest::Cursor(cursor) => wsv.query_handle().handle_query_cursor(cursor), } .map_err(Into::into) } +} +impl<'wrld, K> Runtime>> { fn default_execute_instruction( instruction: InstructionExpr, - state: &mut S, + state: &mut state::CommonState>, ) -> Result<(), ValidationFail> { debug!(%instruction, "Executing"); @@ -810,8 +817,8 @@ impl Runtime { // There should be two steps validation and execution. First smart contract // is validated and then it's executed. Here it's validating in both steps. // Add a flag indicating whether smart contract is being validated or executed - let authority = state.authority().clone(); - let wsv = state.wsv_mut(); + let authority = state.authority.clone(); + let wsv: &mut WorldStateView = state.kind.wsv; wsv.executor() .clone() // Cloning executor is a cheap operation .validate_instruction(wsv, &authority, instruction) @@ -833,10 +840,12 @@ impl<'wrld> Runtime> { bytes: impl AsRef<[u8]>, ) -> Result<()> { let span = wasm_log_span!("Smart contract execution", %authority); - let state = state::SmartContract { - common: state::Common::new(wsv, authority, self.config, span), - limits_executor: None, - }; + let state = state::SmartContract::new( + authority, + self.config, + span, + state::kind::WithMutWsv::new(wsv, state::kind::sub_kind::SmartContract::new(None)), + ); self.execute_smart_contract_with_state(bytes, state) } @@ -856,10 +865,17 @@ impl<'wrld> Runtime> { max_instruction_count: u64, ) -> Result<()> { let span = wasm_log_span!("Smart contract validation", %authority); - let state = state::SmartContract { - common: state::Common::new(wsv, authority, self.config, span), - limits_executor: Some(LimitsExecutor::new(max_instruction_count)), - }; + let state = state::SmartContract::new( + authority, + self.config, + span, + state::kind::WithMutWsv::new( + wsv, + state::kind::sub_kind::SmartContract::new(Some(LimitsExecutor::new( + max_instruction_count, + ))), + ), + ); self.execute_smart_contract_with_state(bytes, state) } @@ -877,26 +893,28 @@ impl<'wrld> Runtime> { // NOTE: This function takes ownership of the pointer main_fn - .call(store, ()) - .map_err(ExportFnCallError::from) - .map_err(Into::into) + .call(&mut store, ()) + .map_err(ExportFnCallError::from)?; + let mut state = store.into_data(); + let executed_queries = state.take_executed_queries(); + forget_all_executed_queries(state.kind.wsv.query_handle(), executed_queries) } #[codec::wrap] fn get_smart_contract_payload(state: &state::SmartContract) -> payloads::SmartContract { payloads::SmartContract { - owner: state.authority().clone(), + owner: state.authority.clone(), } } } -impl<'wrld> import_traits::ExecuteOperations> +impl<'wrld> import::traits::ExecuteOperations> for Runtime> { #[codec::wrap] fn execute_query( query_request: SmartContractQueryRequest, - state: &state::SmartContract<'wrld>, + state: &mut state::SmartContract<'wrld>, ) -> Result, ValidationFail> { Self::default_execute_query(query_request, state) } @@ -906,7 +924,7 @@ impl<'wrld> import_traits::ExecuteOperations> instruction: InstructionExpr, state: &mut state::SmartContract<'wrld>, ) -> Result<(), ValidationFail> { - if let Some(limits_executor) = state.limits_executor.as_mut() { + if let Some(limits_executor) = state.kind.sub_kind.limits_executor.as_mut() { limits_executor.check_instruction_limits()?; } @@ -930,10 +948,12 @@ impl<'wrld> Runtime> { event: Event, ) -> Result<()> { let span = wasm_log_span!("Trigger execution", %id, %authority); - let state = state::Trigger { - common: state::Common::new(wsv, authority, self.config, span), - triggering_event: event, - }; + let state = state::Trigger::new( + authority, + self.config, + span, + state::kind::WithMutWsv::new(wsv, state::kind::sub_kind::Trigger::new(event)), + ); let mut store = self.create_store(state); let instance = self.instantiate_module(module, &mut store)?; @@ -942,27 +962,30 @@ impl<'wrld> Runtime> { // NOTE: This function takes ownership of the pointer main_fn - .call(store, ()) - .map_err(ExportFnCallError::from) - .map_err(Into::into) + .call(&mut store, ()) + .map_err(ExportFnCallError::from)?; + + let mut state = store.into_data(); + let executed_queries = state.take_executed_queries(); + forget_all_executed_queries(state.kind.wsv.query_handle(), executed_queries) } #[codec::wrap] fn get_trigger_payload(state: &state::Trigger) -> payloads::Trigger { payloads::Trigger { - owner: state.authority().clone(), - event: state.triggering_event.clone(), + owner: state.authority.clone(), + event: state.kind.sub_kind.triggering_event.clone(), } } } -impl<'wrld> import_traits::ExecuteOperations> +impl<'wrld> import::traits::ExecuteOperations> for Runtime> { #[codec::wrap] fn execute_query( query_request: SmartContractQueryRequest, - state: &state::Trigger<'wrld>, + state: &mut state::Trigger<'wrld>, ) -> Result, ValidationFail> { Self::default_execute_query(query_request, state) } @@ -982,49 +1005,31 @@ impl<'wrld> import_traits::ExecuteOperations> /// *Mut* means that [`WorldStateView`] will be mutated. trait ExecuteOperationsAsExecutorMut {} -impl import_traits::ExecuteOperations for R +impl<'wrld, R, K> + import::traits::ExecuteOperations>> for R where - R: ExecuteOperationsAsExecutorMut, - S: state::Wsv + state::WsvMut + state::Authority, + R: ExecuteOperationsAsExecutorMut>>, + state::CommonState>: state::ValidateQueryOperation, { #[codec::wrap] fn execute_query( query_request: SmartContractQueryRequest, - state: &S, + state: &mut state::CommonState>, ) -> Result, ValidationFail> { debug!(%query_request, "Executing as executor"); - let wsv = state.wsv(); - - match query_request.0 { - QueryRequest::Query(QueryWithParameters { - query, - sorting, - pagination, - }) => { - let output = query.execute(wsv)?; - - wsv.query_handle().handle_query_output( - output, - NonZeroUsize::new(30_000).expect("30 000 is not zero"), - &sorting, - pagination, - ) - } - QueryRequest::Cursor(cursor) => wsv.query_handle().handle_query_cursor(cursor), - } - .map_err(Into::into) + Runtime::default_execute_query(query_request, state) } #[codec::wrap] fn execute_instruction( instruction: InstructionExpr, - state: &mut S, + state: &mut state::CommonState>, ) -> Result<(), ValidationFail> { debug!(%instruction, "Executing as executor"); instruction - .execute(&state.authority().clone(), state.wsv_mut()) + .execute(&state.authority.clone(), state.kind.wsv) .map_err(Into::into) } } @@ -1038,7 +1043,7 @@ trait FakeSetPermissionTokenSchema { const ENTRYPOINT_FN_NAME: &'static str; } -impl import_traits::SetPermissionTokenSchema for R +impl import::traits::SetPermissionTokenSchema for R where R: FakeSetPermissionTokenSchema, { @@ -1071,10 +1076,15 @@ impl<'wrld> Runtime> { self.execute_executor_validate_internal( module, - state::executor::ValidateTransaction { - common: state::Common::new(wsv, authority.clone(), self.config, span), - to_validate: transaction, - }, + state::executor::ValidateTransaction::new( + authority.clone(), + self.config, + span, + state::kind::WithMutWsv::new( + wsv, + state::kind::sub_kind::executor::ValidateTransaction::new(transaction), + ), + ), import::EXECUTOR_VALIDATE_TRANSACTION, ) } @@ -1085,7 +1095,7 @@ impl<'wrld> ExecuteOperationsAsExecutorMut import_traits::GetExecutorPayloads> +impl<'wrld> import::traits::GetExecutorPayloads> for Runtime> { #[codec::wrap] @@ -1100,9 +1110,9 @@ impl<'wrld> import_traits::GetExecutorPayloads, ) -> Validate { Validate { - authority: state.authority().clone(), - block_height: state.wsv().height(), - to_validate: state.to_validate.clone(), + authority: state.authority.clone(), + block_height: state.kind.wsv.height(), + to_validate: state.kind.sub_kind.to_validate.clone(), } } @@ -1147,10 +1157,15 @@ impl<'wrld> Runtime> { self.execute_executor_validate_internal( module, - state::executor::ValidateInstruction { - common: state::Common::new(wsv, authority.clone(), self.config, span), - to_validate: instruction, - }, + state::executor::ValidateInstruction::new( + authority.clone(), + self.config, + span, + state::kind::WithMutWsv::new( + wsv, + state::kind::sub_kind::executor::ValidateInstruction::new(instruction), + ), + ), import::EXECUTOR_VALIDATE_INSTRUCTION, ) } @@ -1161,7 +1176,7 @@ impl<'wrld> ExecuteOperationsAsExecutorMut import_traits::GetExecutorPayloads> +impl<'wrld> import::traits::GetExecutorPayloads> for Runtime> { #[codec::wrap] @@ -1183,9 +1198,9 @@ impl<'wrld> import_traits::GetExecutorPayloads, ) -> Validate { Validate { - authority: state.authority().clone(), - block_height: state.wsv().height(), - to_validate: state.to_validate.clone(), + authority: state.authority.clone(), + block_height: state.kind.wsv.height(), + to_validate: state.kind.sub_kind.to_validate.clone(), } } @@ -1223,48 +1238,31 @@ impl<'wrld> Runtime> { self.execute_executor_validate_internal( module, - state::executor::ValidateQuery { - wsv, - authority: authority.clone(), - store_limits: state::store_limits_from_config(&self.config), - log_span: span, - query, - }, + state::executor::ValidateQuery::new( + authority.clone(), + self.config, + span, + state::kind::WithWsv::new( + wsv, + state::kind::sub_kind::executor::ValidateQuery::new(query), + ), + ), import::EXECUTOR_VALIDATE_QUERY, ) } } -impl<'wrld> import_traits::ExecuteOperations> +impl<'wrld> import::traits::ExecuteOperations> for Runtime> { #[codec::wrap] fn execute_query( query_request: SmartContractQueryRequest, - state: &state::executor::ValidateQuery<'wrld>, + state: &mut state::executor::ValidateQuery<'wrld>, ) -> Result, ValidationFail> { debug!(%query_request, "Executing as executor"); - let wsv = state.wsv(); - - match query_request.0 { - QueryRequest::Query(QueryWithParameters { - query, - sorting, - pagination, - }) => { - let output = query.execute(wsv)?; - - wsv.query_handle().handle_query_output( - output, - NonZeroUsize::new(30_000).expect("30 000 is not zero"), - &sorting, - pagination, - ) - } - QueryRequest::Cursor(cursor) => wsv.query_handle().handle_query_cursor(cursor), - } - .map_err(Into::into) + Runtime::default_execute_query(query_request, state) } #[codec::wrap] @@ -1276,7 +1274,7 @@ impl<'wrld> import_traits::ExecuteOperations import_traits::GetExecutorPayloads> +impl<'wrld> import::traits::GetExecutorPayloads> for Runtime> { #[codec::wrap] @@ -1303,9 +1301,9 @@ impl<'wrld> import_traits::GetExecutorPayloads, ) -> Validate { Validate { - authority: state.authority().clone(), - block_height: state.wsv().height(), - to_validate: state.query.clone(), + authority: state.authority.clone(), + block_height: state.kind.wsv.height(), + to_validate: state.kind.sub_kind.to_validate.clone(), } } } @@ -1332,12 +1330,12 @@ impl<'wrld> Runtime> { module: &wasmtime::Module, ) -> Result { let span = wasm_log_span!("Running migration"); - let state = state::executor::Migrate(state::Common::new( - wsv, + let state = state::executor::Migrate::new( authority.clone(), self.config, span, - )); + state::kind::WithMutWsv::new(wsv, state::kind::sub_kind::executor::Migrate), + ); let mut store = self.create_store(state); let instance = self.instantiate_module(module, &mut store)?; @@ -1372,13 +1370,13 @@ impl<'wrld> ExecuteOperationsAsExecutorMut> /// /// Panics with error message if called, because it should never be called from /// `migrate()` entrypoint. -impl<'wrld> import_traits::GetExecutorPayloads> +impl<'wrld> import::traits::GetExecutorPayloads> for Runtime> { #[codec::wrap] fn get_migrate_payload(state: &state::executor::Migrate<'wrld>) -> payloads::Migrate { payloads::Migrate { - block_height: state.wsv().height(), + block_height: state.kind.wsv.height(), } } @@ -1402,7 +1400,7 @@ impl<'wrld> import_traits::GetExecutorPayloads> } } -impl<'wrld> import_traits::SetPermissionTokenSchema> +impl<'wrld> import::traits::SetPermissionTokenSchema> for Runtime> { #[codec::wrap] @@ -1412,7 +1410,7 @@ impl<'wrld> import_traits::SetPermissionTokenSchema, + pub query_id: Option, /// Pointer to the next element in the result set pub cursor: Option, } impl ForwardCursor { /// Create a new cursor. - pub const fn new(query_id: Option, cursor: Option) -> Self { + pub const fn new(query_id: Option, cursor: Option) -> Self { Self { query_id, cursor } } } @@ -50,7 +51,7 @@ mod candidate { #[derive(Decode, Deserialize)] struct ForwardCursorCandidate { - query_id: Option, + query_id: Option, cursor: Option, } @@ -92,7 +93,7 @@ mod candidate { } } -impl From for Vec<(&'static str, String)> { +impl From for Vec<(&'static str, QueryId)> { fn from(cursor: ForwardCursor) -> Self { match (cursor.query_id, cursor.cursor) { (Some(query_id), Some(cursor)) => { diff --git a/data_model/src/query/mod.rs b/data_model/src/query/mod.rs index f9e8d266511..536f66f2c09 100644 --- a/data_model/src/query/mod.rs +++ b/data_model/src/query/mod.rs @@ -58,6 +58,9 @@ macro_rules! queries { }; } +/// Unique id of a query. +pub type QueryId = String; + /// Trait for typesafe query output pub trait Query: Into + seal::Sealed { /// Output type of query @@ -1568,6 +1571,6 @@ pub mod prelude { pub use super::{ account::prelude::*, asset::prelude::*, block::prelude::*, domain::prelude::*, peer::prelude::*, permission::prelude::*, role::prelude::*, transaction::*, - trigger::prelude::*, QueryBox, TransactionQueryOutput, + trigger::prelude::*, QueryBox, QueryId, TransactionQueryOutput, }; } diff --git a/ffi/derive/src/convert.rs b/ffi/derive/src/convert.rs index 4b2b0450e25..046c6cfd2a2 100644 --- a/ffi/derive/src/convert.rs +++ b/ffi/derive/src/convert.rs @@ -77,13 +77,13 @@ impl syn2::parse::Parse for SpannedFfiTypeToken { "non_owning" => Ok(((span, FfiTypeToken::UnsafeNonOwning), after_group)), other => Err(syn2::Error::new( token.span(), - format!("unknown unsafe ffi type kind: {}", other), + format!("unknown unsafe ffi type kind: {other}"), )), } } other => Err(syn2::Error::new( span, - format!("unknown unsafe ffi type kind: {}", other), + format!("unknown unsafe ffi type kind: {other}"), )), } })?; @@ -110,7 +110,7 @@ impl syn2::parse::Parse for FfiTypeKindAttribute { other => { return Err(syn2::Error::new( token.span, - format!("`{}` cannot be used on a type", other), + format!("`{other}` cannot be used on a type"), )) } }) @@ -132,7 +132,7 @@ impl syn2::parse::Parse for FfiTypeKindFieldAttribute { other => { return Err(syn2::Error::new( token.span, - format!("`{}` cannot be used on a field", other), + format!("`{other}` cannot be used on a field"), )) } }) diff --git a/wasm_codec/derive/src/lib.rs b/wasm_codec/derive/src/lib.rs index 2562c243ea4..2053fd0d8e3 100644 --- a/wasm_codec/derive/src/lib.rs +++ b/wasm_codec/derive/src/lib.rs @@ -68,7 +68,7 @@ pub fn wrap(attr: TokenStream, item: TokenStream) -> TokenStream { let ident = &fn_item.sig.ident; let mut inner_fn_item = fn_item.clone(); - let inner_fn_ident = syn::Ident::new(&format!("__{}_inner", ident), ident.span()); + let inner_fn_ident = syn::Ident::new(&format!("__{ident}_inner"), ident.span()); inner_fn_item.sig.ident = inner_fn_ident.clone(); let fn_class = classify_fn(&fn_item.sig); @@ -113,7 +113,7 @@ pub fn wrap_trait_fn(attr: TokenStream, item: TokenStream) -> TokenStream { let ident = &fn_item.sig.ident; let mut inner_fn_item = fn_item.clone(); - let inner_fn_ident = syn::Ident::new(&format!("__{}_inner", ident), ident.span()); + let inner_fn_ident = syn::Ident::new(&format!("__{ident}_inner"), ident.span()); inner_fn_item.sig.ident = inner_fn_ident; let fn_class = classify_fn(&fn_item.sig);