From 7aea1140f24a820c634e07e1e339a68c2c8d7518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Tue, 9 May 2023 12:34:25 +0300 Subject: [PATCH] [refactor]: Add ExpressionEvaluator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- .../validator_with_admin/src/lib.rs | 15 +- configs/peer/validator.wasm | Bin 462406 -> 475401 bytes core/src/smartcontracts/isi/account.rs | 48 +++-- core/src/smartcontracts/isi/asset.rs | 70 +++---- core/src/smartcontracts/isi/block.rs | 14 +- core/src/smartcontracts/isi/domain.rs | 25 +-- core/src/smartcontracts/isi/mod.rs | 65 +++---- core/src/smartcontracts/isi/triggers/mod.rs | 31 ++- core/src/smartcontracts/isi/tx.rs | 11 +- core/src/smartcontracts/isi/world.rs | 10 +- core/src/smartcontracts/mod.rs | 15 +- core/src/tx.rs | 6 +- data_model/src/evaluate.rs | 10 + default_validator/lints.toml | 1 - default_validator/src/lib.rs | 2 +- lints.toml | 178 ++++++++++++++++++ wasm/lints.toml | 1 + wasm/src/lib.rs | 12 ++ wasm/validator/src/default.rs | 23 ++- wasm/validator/src/visitor.rs | 21 ++- 20 files changed, 376 insertions(+), 182 deletions(-) delete mode 120000 default_validator/lints.toml create mode 100644 lints.toml create mode 120000 wasm/lints.toml 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 0f292e60a30..9933eb647f6 100644 --- a/client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs +++ b/client/tests/integration/smartcontracts/validator_with_admin/src/lib.rs @@ -2,7 +2,12 @@ //! If authority is not `admin@admin` then [`DefaultValidator`] is used as a backup. #![no_std] -use iroha_validator::{parse, prelude::*, DefaultValidator}; +use iroha_validator::{ + data_model::evaluate::{Error, ExpressionEvaluator}, + parse, + prelude::*, + DefaultValidator, +}; #[cfg(not(test))] extern crate panic_halt; @@ -19,11 +24,17 @@ impl Validate for Validator { } } +impl ExpressionEvaluator for Validator { + fn evaluate(&self, expression: &E) -> Result { + self.0.evaluate(expression) + } +} + /// Allow operation if authority is `admin@admin` and if not, /// fallback to [`DefaultValidator::validate()`]. #[entrypoint(params = "[authority, operation]")] pub fn validate(authority: AccountId, operation: NeedsValidationBox) -> Verdict { - let mut validator = Validator(DefaultValidator); + let mut validator = Validator(DefaultValidator::new()); match operation { // NOTE: Invoked from Iroha diff --git a/configs/peer/validator.wasm b/configs/peer/validator.wasm index 9cfe6cb4b0cff76c1bb21d44d8915e6e55e18684..54c2ebcdcb556285b499d1a8f70e4e35358ed4bc 100644 GIT binary patch delta 143105 zcmeFa3!GI|**|{PKKq=xoEg}_00RtgW*Br(P*fZcG1(fLnR&^#EW5y)m5sh;mSwMR z?qLAMM8J-@u`nqwkRliHLWwyV<*2A=n3$-eVp8fGh9#Nl@B4k$+Lv>i8PIzFpZ`bv zIA`y5eb#ed&${g2EN!^7V`NQY);Io3B@zksgvwq~^Q8*wB2RfUE3R04aysSl-xbd; zO8zbVM($j7s8^M$N~Nl*Qpr>*ol+@2tE#k>N~e_Q5FEo-EGxZ)usETQi;^yA-R{Vqt(#dxa6_@hNe=r=u4&Sv`W?G zE=nG7a=m#^rE0>bI>Li89B7IK_@eUOOb$?mQba;34SeC>u$;1+a*l2H8=guHk|g{Y zVdXw-AChiR08-^<+ov8ma%5GNrIIRXjT$|ARAMy$fkOOer_{OX;Db|1l^Bp7mh_a{ z-rkwWcnNpoW%tVO=F4(}QjJ5FS_8iD)$_h~=BzJ#8wCEsth3Ml+7}bQ_Xku|47L(a z=VqlwdS6xvS7itX8=Yku;X^h@a% z(l4f~7rs{aM*5+PDw3Xck%j-2m%OOf8?$a$`q2vYr`#WFThyO(1N+Uu^J)Da+4oNu zx3?#Y8_)a!LkA5G>Myg}vi*ZLbB7H*cU+Lut=h6_o4UY?)yQ)}hy+`L1lS{vu(?mhH&WPQ7J4jcQ&X3#w<+I5?pcT3fxk^t4;*I749pGy%$wEOZP`lxpk&+BQA15` z(%o6p7H{R+sZ&sY>(rI_JMZwYl>u2B1C~~#F|_jV;iFLI)x!_N-+iV{#ot-ehT-pp z)0lGmv~l?R+_VqlZ}Slx{wIz&5JQ=B#2O4`-J~PeT9q1x8YlP8(KB)fAGHDLe?F>$ zBYpGeZ{hDbAKr++hs-!HzV+$jX4Gtq{J7=(~irdMhB zeskQ|Sc7jIw`$Nkv%y>aGueb|w`CRnIREs&@T}Um?%kq{_Kw`nk6z>bGt2-=6!7BA z?g-lGC1pnKKy*~kYW1b6brdxuoz19qP{V0!u@a5RT+PQCCl|xerxbtuHOc?7=5+WI z?@SJ{<`(=0=^Z9LcrPqBufsq6$H}n`7YER`Se0%&(5%dZb8$fnXlc`rlcUgcuKDAK zdBr$?E5vC)g-e3Q-DaYzxy_N38MT!$QvJ55+CRb+!UNhnQJH`^*8Gm#vmf8zy0jyg zIdOmMdmXtcC+!>q|wS`txSji z=&WQ@&O7NqFy`u$>eV)XR#w&Lx=$LRe&=6GYK-_f`M-KiPwFHK$~n))F{ip{~uj z)jVd~oOR}LN}F?=-`S*w@1HjakUr6ra30hxf>)i}O@)Rw=Z@S(r!-EyQxaIv-3V!O zda92~x8)u^WpI;jP%2F;sKXwW^H47RiKaL7Jxwqsdf3l3qzvq)*-p@2FHIjMSy-B%Oi>Pik=I6vujUHl( zE0|0ch7zE;%FX@MnJ^o#eQL@+_X$T>*>u)A3x&>ce#Hd0(oL8rJUjR0jz6tEfVMq_ zRsii&r|o0Cd2vpCTA)4j)5phb$)%tEY~8OlPBpP?q1Ao|O!LQCU7(Oa7*|Pg* z5{b-gJ2&|=YXfhOm3lg`fx zdM29$e6*15pQ}4jkDmr@$karoX6^1I+y0{^Mo>FbmWxDpGSi8u$fR2|m^$}SA`Wc= zgdcpa34hmrZl=0BH|+BtS3CU9|4NR?&H4O|>WJI;)qmxr})~tym{;I)&sKUEzwJQ5(oS#$aCNjVA8(&TC zm;3gtL28%Zevv&KKeJy=Hs>CkH3YCcKWjAps{j0wx;*!l|J(wPaoQJ8s|!Y-LVIgc zZLSPq#TUnq(HS*X1{k#5tw2b%^P4&7h+2a0&cfWAUmSxbN1V~P&mz(*YqeNe{u!^w z!I~2iQ{17%eYJDhyxf1DarH1W02MfCDq8`Jp6&cKSNElZ8Z_AkWEI%W_=45UZmI)n zXMJfb`n%*ylV)h>Ku4+^b~5IUl{}ARdMFQYGH2b znd6cBl{1?RPP3`Tq~@lHZO-GlYtC%6Hgx1V&up@8ZqIE$bF8{QSN+vSJ>cOOukHMp zbR_;9{;6}e<&OR8_>oVOB^oW15H)(8kw(fZP_p=|qpdZw*RB2Pbfq5m4?5f)rhcER zIg4OTJnKel;q2Vjv-SZOy?a&z{x+Q5U_ITQn|k($QO^kHS+3n`)z{e6=k;x_eI5h@ zI`uh!^kREBYcD#x89)B4#WsI)PoGVSzkBv4)U&ynUmIGt(6oZOz^tN8cp`Vvf1RnG z%em(asoSi9Wz(2s(Is=ba|6z4?62wPCV`?%#(AEF)n zqf~Xqc>$#cS~XgwDSFt>lerVl-FNgKCB@dL z?o4PV%cfhc={4z$^Cz}FLbt6BR4t9rw?tgfp5SF{qv<@GK3q-5Oh<}LGyGbU$~dnO z8zAzXk6vjvsUr=dt1$+fqHNbDoL31)BkS(QG!=TM5{7{${y9Ug9ZV*%Uh^kjWw#Cv z2D}4`FF@P><|cmggj~ZnK6IFoMFUHy7+v_@=(C63{3CsPoO(QW_cw-PV!ibnN0;qr zezsgE3Y{eLc;it2ktKG8dVzQtlE)QIRQurWow-k)KV7|!0z;^Jpvh+EZa<%l{nYt~ z4t-3hlyIx3CK6yyRDs9wECI2q30Ov)Nbp-=Iqq`;I?L4oXDp-xM<4naxLL8=o&R4+g)C%=O++Mfbz;FLxtOvbT;SC|Ly^bg-7M?`|d~8%emT%z7tlcKm|r10=3;#i3&fx z=t!8P7cOd2i*qUOcj#lAce%Q2U0eINm3mV~@aDSXJN~XJenm{x*tsj_)aSl9cg7dG z_zvX2e!2~T&zt#iQXvF1J^0U+$wECC{rt8jD+_gc{0KzxtfZ+4+-e6z99;T#&i5z{ z{WJd8=O#xuk|_kBnck*7Rm=RsW95A1`->_)$lQcPqF)9r+o|g6bVX$qdJrDEneEk7 znYV}Jtb#~TV;|a&@yP7R*;)`NvD~#%gDNL14602fUTZb@1m9 zc?b}}Zzbx2-{B~vS}ij=go<_p-lIq-XL1tL1`T^nn`@yE-fqLN&0{-!XJpK7_t2is z9o1@GNo1O^(_%g^Tiwa*6_6SizreqRI#OjW^HFChe;>X?$}Pb&-q3ifwT6-=PI{{~ zU#Bl-dOOSSgg?D;9_nOI6d;`&*=Vf=1Ojb4lanomE(C46lbjq7#01FT_QR8_8o}9# zEXPi|f(4heJ|36l?wJ3%qM$;}@0cyKHoMKA-i#S$$oo|BcT*dhY-eTog1Kk(k~jBU z46S{asL+Jy{X5JvHU4epnY#WL<~e`nh}xC9dggHdiot4#CsQ4c2=nR7^iaYfIc?2I zfttGniwl8BcBV>*Bn6GUoG+3T#~msX$4;5xP`K22MvOc}jEyideMY0Y@^PFFDs9IdRgz}

KpA|o)@Gk-#>wSm9e$o#F=dOYLp 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 Z4*RV9wD?9MKWn&0pL|NO;d=e<6v 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

Y3g2_=*e+_XOIpz=XJ&`3gAO&#JDm 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 Result { - let account_id = self - .id - .evaluate(&Context::new(wsv)) + let account_id = wsv + .evaluate(&self.id) .wrap_err("Failed to evaluate account id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%account_id, roles=?wsv.world.roles); @@ -496,9 +497,8 @@ pub mod query { impl ValidQuery for FindPermissionTokensByAccountId { #[metrics(+"find_permission_tokens_by_account_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let account_id = self - .id - .evaluate(&Context::new(wsv)) + let account_id = wsv + .evaluate(&self.id) .wrap_err("Failed to evaluate account id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%account_id, accounts=?wsv.world.domains); @@ -525,9 +525,8 @@ pub mod query { impl ValidQuery for FindAccountById { #[metrics(+"find_account_by_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -538,9 +537,8 @@ pub mod query { impl ValidQuery for FindAccountsByName { #[metrics(+"find_account_by_name")] fn execute(&self, wsv: &WorldStateView) -> Result { - let name = self - .name - .evaluate(&Context::new(wsv)) + let name = wsv + .evaluate(&self.name) .wrap_err("Failed to get account name") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%name); @@ -559,9 +557,8 @@ pub mod query { impl ValidQuery for FindAccountsByDomainId { #[metrics(+"find_accounts_by_domain_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .domain_id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.domain_id) .wrap_err("Failed to get domain id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -572,14 +569,12 @@ pub mod query { impl ValidQuery for FindAccountKeyValueByIdAndKey { #[metrics(+"find_account_key_value_by_id_and_key")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get account id") .map_err(|e| Error::Evaluate(e.to_string()))?; - let key = self - .key - .evaluate(&Context::new(wsv)) + let key = wsv + .evaluate(&self.key) .wrap_err("Failed to get key") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id, %key); @@ -591,9 +586,8 @@ pub mod query { impl ValidQuery for FindAccountsWithAsset { #[metrics(+"find_accounts_with_asset")] fn execute(&self, wsv: &WorldStateView) -> Result { - let asset_definition_id = self - .asset_definition_id - .evaluate(&Context::new(wsv)) + let asset_definition_id = wsv + .evaluate(&self.asset_definition_id) .wrap_err("Failed to get asset id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%asset_definition_id); diff --git a/core/src/smartcontracts/isi/asset.rs b/core/src/smartcontracts/isi/asset.rs index 7ac1d09d08d..852b5fdd82b 100644 --- a/core/src/smartcontracts/isi/asset.rs +++ b/core/src/smartcontracts/isi/asset.rs @@ -462,9 +462,8 @@ pub mod query { impl ValidQuery for FindAssetById { #[metrics(+"find_asset_by_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get asset id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -481,9 +480,8 @@ pub mod query { impl ValidQuery for FindAssetDefinitionById { #[metrics(+"find_asset_defintion_by_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get asset definition id") .map_err(|e| Error::Evaluate(e.to_string()))?; @@ -496,9 +494,8 @@ pub mod query { impl ValidQuery for FindAssetsByName { #[metrics(+"find_assets_by_name")] fn execute(&self, wsv: &WorldStateView) -> Result { - let name = self - .name - .evaluate(&Context::new(wsv)) + let name = wsv + .evaluate(&self.name) .wrap_err("Failed to get asset name") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%name); @@ -519,9 +516,8 @@ pub mod query { impl ValidQuery for FindAssetsByAccountId { #[metrics(+"find_assets_by_account_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .account_id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.account_id) .wrap_err("Failed to get account id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -532,9 +528,8 @@ pub mod query { impl ValidQuery for FindAssetsByAssetDefinitionId { #[metrics(+"find_assets_by_asset_definition_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .asset_definition_id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.asset_definition_id) .wrap_err("Failed to get asset definition id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -555,9 +550,8 @@ pub mod query { impl ValidQuery for FindAssetsByDomainId { #[metrics(+"find_assets_by_domain_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .domain_id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.domain_id) .wrap_err("Failed to get domain id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -574,14 +568,12 @@ pub mod query { impl ValidQuery for FindAssetsByDomainIdAndAssetDefinitionId { #[metrics(+"find_assets_by_domain_id_and_asset_definition_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let domain_id = self - .domain_id - .evaluate(&Context::new(wsv)) + let domain_id = wsv + .evaluate(&self.domain_id) .wrap_err("Failed to get domain id") .map_err(|e| Error::Evaluate(e.to_string()))?; - let asset_definition_id = self - .asset_definition_id - .evaluate(&Context::new(wsv)) + let asset_definition_id = wsv + .evaluate(&self.asset_definition_id) .wrap_err("Failed to get asset definition id") .map_err(|e| Error::Evaluate(e.to_string()))?; let domain = wsv.domain(&domain_id)?; @@ -607,9 +599,8 @@ pub mod query { impl ValidQuery for FindAssetQuantityById { #[metrics(+"find_asset_quantity_by_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get asset id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -632,9 +623,8 @@ pub mod query { impl ValidQuery for FindTotalAssetQuantityByAssetDefinitionId { #[metrics(+"find_total_asset_quantity_by_asset_definition_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get asset definition id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -646,14 +636,12 @@ pub mod query { impl ValidQuery for FindAssetKeyValueByIdAndKey { #[metrics(+"find_asset_key_value_by_id_and_key")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get asset id") .map_err(|e| Error::Evaluate(e.to_string()))?; - let key = self - .key - .evaluate(&Context::new(wsv)) + let key = wsv + .evaluate(&self.key) .wrap_err("Failed to get key") .map_err(|e| Error::Evaluate(e.to_string()))?; let asset = wsv.asset(&id).map_err(|asset_err| { @@ -679,14 +667,12 @@ pub mod query { impl ValidQuery for IsAssetDefinitionOwner { #[metrics("is_asset_definition_owner")] fn execute(&self, wsv: &WorldStateView) -> Result { - let asset_definition_id = self - .asset_definition_id - .evaluate(&Context::new(wsv)) + let asset_definition_id = wsv + .evaluate(&self.asset_definition_id) .wrap_err("Failed to get asset definition id") .map_err(|e| Error::Evaluate(e.to_string()))?; - let account_id = self - .account_id - .evaluate(&Context::new(wsv)) + let account_id = wsv + .evaluate(&self.account_id) .wrap_err("Failed to get account id") .map_err(|e| Error::Evaluate(e.to_string()))?; diff --git a/core/src/smartcontracts/isi/block.rs b/core/src/smartcontracts/isi/block.rs index 49301e4bed1..8181ab836f7 100644 --- a/core/src/smartcontracts/isi/block.rs +++ b/core/src/smartcontracts/isi/block.rs @@ -1,8 +1,11 @@ //! This module contains trait implementations related to block queries use eyre::{Result, WrapErr}; -use iroha_data_model::query::{ - block::FindBlockHeaderByHash, - error::{FindError, QueryExecutionFailure}, +use iroha_data_model::{ + evaluate::ExpressionEvaluator, + query::{ + block::FindBlockHeaderByHash, + error::{FindError, QueryExecutionFailure}, + }, }; use iroha_telemetry::metrics; @@ -31,9 +34,8 @@ impl ValidQuery for FindAllBlockHeaders { impl ValidQuery for FindBlockHeaderByHash { #[metrics(+"find_block_header")] fn execute(&self, wsv: &WorldStateView) -> Result { - let hash = self - .hash - .evaluate(&Context::new(wsv)) + let hash = wsv + .evaluate(&self.hash) .wrap_err("Failed to evaluate hash") .map_err(|e| QueryExecutionFailure::Evaluate(e.to_string()))? .typed(); diff --git a/core/src/smartcontracts/isi/domain.rs b/core/src/smartcontracts/isi/domain.rs index b216048895f..d3494fa615d 100644 --- a/core/src/smartcontracts/isi/domain.rs +++ b/core/src/smartcontracts/isi/domain.rs @@ -328,9 +328,8 @@ pub mod query { impl ValidQuery for FindDomainById { #[metrics(+"find_domain_by_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get domain id") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -341,14 +340,12 @@ pub mod query { impl ValidQuery for FindDomainKeyValueByIdAndKey { #[metrics(+"find_domain_key_value_by_id_and_key")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get domain id") .map_err(|e| Error::Evaluate(e.to_string()))?; - let key = self - .key - .evaluate(&Context::new(wsv)) + let key = wsv + .evaluate(&self.key) .wrap_err("Failed to get key") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id, %key); @@ -362,14 +359,12 @@ pub mod query { impl ValidQuery for FindAssetDefinitionKeyValueByIdAndKey { #[metrics(+"find_asset_definition_key_value_by_id_and_key")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .wrap_err("Failed to get asset definition id") .map_err(|e| Error::Evaluate(e.to_string()))?; - let key = self - .key - .evaluate(&Context::new(wsv)) + let key = wsv + .evaluate(&self.key) .wrap_err("Failed to get key") .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%id, %key); diff --git a/core/src/smartcontracts/isi/mod.rs b/core/src/smartcontracts/isi/mod.rs index f1520774b7d..87b407935f1 100644 --- a/core/src/smartcontracts/isi/mod.rs +++ b/core/src/smartcontracts/isi/mod.rs @@ -18,6 +18,7 @@ pub mod world; use eyre::Result; use iroha_data_model::{ + evaluate::ExpressionEvaluator, isi::{ error::{EvaluationError, InstructionExecutionFailure as Error}, *, @@ -27,7 +28,7 @@ use iroha_data_model::{ use iroha_logger::prelude::{Span, *}; use iroha_primitives::fixed::Fixed; -use super::{Context, Evaluate, Execute}; +use super::Execute; use crate::{prelude::*, wsv::WorldStateView}; /// Trait for proxy objects used for registration. @@ -75,8 +76,7 @@ impl Execute for RegisterBox { #[iroha_logger::log(name = "register", skip_all, fields(id))] fn execute(self, authority: AccountId, wsv: &WorldStateView) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let object_id = self.object.evaluate(&context)?; + let object_id = wsv.evaluate(&self.object)?; Span::current().record("id", &object_id.to_string()); iroha_logger::trace!(%authority, "Executing"); match object_id { @@ -114,8 +114,7 @@ impl Execute for UnregisterBox { #[iroha_logger::log(name = "unregister", skip_all, fields(id))] fn execute(self, authority: AccountId, wsv: &WorldStateView) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let object_id = self.object_id.evaluate(&context)?; + let object_id = wsv.evaluate(&self.object_id)?; Span::current().record("id", &object_id.to_string()); iroha_logger::trace!(%authority, "Executing"); match object_id { @@ -151,9 +150,8 @@ impl Execute for MintBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let destination_id = self.destination_id.evaluate(&context)?; - let object = self.object.evaluate(&context)?; + let destination_id = wsv.evaluate(&self.destination_id)?; + let object = wsv.evaluate(&self.object)?; Span::current().record("destination", &destination_id.to_string()); iroha_logger::trace!(?object, %authority); match (destination_id, object) { @@ -213,15 +211,11 @@ impl Execute for BurnBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let destination_id = self.destination_id.evaluate(&context)?; - let object = self.object.evaluate(&context)?; + let destination_id = wsv.evaluate(&self.destination_id)?; + let object = wsv.evaluate(&self.object)?; Span::current().record("destination", &destination_id.to_string()); iroha_logger::trace!(?object, %authority); - match ( - self.destination_id.evaluate(&context)?, - self.object.evaluate(&context)?, - ) { + match (destination_id, object) { (IdBox::AssetId(destination_id), Value::Numeric(NumericValue::U32(object))) => { Burn:: { object, @@ -262,15 +256,14 @@ impl Execute for TransferBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); let (IdBox::AssetId(source_id), IdBox::AccountId(destination_id)) = ( - self.source_id.evaluate(&context)?, - self.destination_id.evaluate(&context)?, + wsv.evaluate(&self.source_id)?, + wsv.evaluate(&self.destination_id)?, ) else { return Err(Error::Evaluate(InstructionType::Transfer.into())); }; - let value = self.object.evaluate(&context)?; + let value = wsv.evaluate(&self.object)?; Span::current().record("from", source_id.to_string()); Span::current().record("to", destination_id.to_string()); iroha_logger::trace!(%value, %authority); @@ -307,11 +300,10 @@ impl Execute for SetKeyValueBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let key = self.key.evaluate(&context)?; - let value = self.value.evaluate(&context)?; + let key = wsv.evaluate(&self.key)?; + let value = wsv.evaluate(&self.value)?; iroha_logger::trace!(?key, ?value, %authority); - match self.object_id.evaluate(&context)? { + match wsv.evaluate(&self.object_id)? { IdBox::AssetId(object_id) => SetKeyValue:: { object_id, key, @@ -349,10 +341,9 @@ impl Execute for RemoveKeyValueBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let key = self.key.evaluate(&context)?; + let key = wsv.evaluate(&self.key)?; iroha_logger::trace!(?key, %authority); - match self.object_id.evaluate(&context)? { + match wsv.evaluate(&self.object_id)? { IdBox::AssetId(object_id) => { RemoveKeyValue:: { object_id, key }.execute(authority, wsv) } @@ -375,9 +366,8 @@ impl Execute for Conditional { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); iroha_logger::trace!(?self); - if self.condition.evaluate(&context)? { + if wsv.evaluate(&self.condition)? { self.then.execute(authority, wsv)?; } else if let Some(otherwise) = self.otherwise { otherwise.execute(authority, wsv)?; @@ -443,9 +433,8 @@ impl Execute for GrantBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let destination_id = self.destination_id.evaluate(&context)?; - let object = self.object.evaluate(&context)?; + let destination_id = wsv.evaluate(&self.destination_id)?; + let object = wsv.evaluate(&self.object)?; Span::current().record("object", &object.to_string()); iroha_logger::trace!(%destination_id, %authority); match (destination_id, object) { @@ -477,9 +466,8 @@ impl Execute for RevokeBox { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let destination_id = self.destination_id.evaluate(&context)?; - let object = self.object.evaluate(&context)?; + let destination_id = wsv.evaluate(&self.destination_id)?; + let object = wsv.evaluate(&self.object)?; Span::current().record("object", &object.to_string()); iroha_logger::trace!(?destination_id, ?object, %authority); match (destination_id, object) { @@ -506,8 +494,7 @@ impl Execute for SetParameterBox { type Error = Error; fn execute(self, authority: AccountId, wsv: &WorldStateView) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let parameter = self.parameter.evaluate(&context)?; + let parameter = wsv.evaluate(&self.parameter)?; SetParameter:: { parameter }.execute(authority, wsv) } } @@ -516,8 +503,7 @@ impl Execute for NewParameterBox { type Error = Error; fn execute(self, authority: AccountId, wsv: &WorldStateView) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let parameter = self.parameter.evaluate(&context)?; + let parameter = wsv.evaluate(&self.parameter)?; NewParameter:: { parameter }.execute(authority, wsv) } } @@ -526,8 +512,7 @@ impl Execute for UpgradeBox { type Error = Error; fn execute(self, authority: AccountId, wsv: &WorldStateView) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let object = self.object.evaluate(&context)?; + let object = wsv.evaluate(&self.object)?; match object { UpgradableBox::Validator(object) => { Upgrade:: { object }.execute(authority, wsv) diff --git a/core/src/smartcontracts/isi/triggers/mod.rs b/core/src/smartcontracts/isi/triggers/mod.rs index 76559d029b2..c7636e9bb94 100644 --- a/core/src/smartcontracts/isi/triggers/mod.rs +++ b/core/src/smartcontracts/isi/triggers/mod.rs @@ -1,7 +1,9 @@ //! This module contains implementations of smart-contract traits and //! instructions for triggers in Iroha. -use iroha_data_model::{isi::error::MathError, prelude::*, query::error::FindError}; +use iroha_data_model::{ + evaluate::ExpressionEvaluator, isi::error::MathError, prelude::*, query::error::FindError, +}; use iroha_telemetry::metrics; pub(crate) mod set; @@ -168,8 +170,7 @@ pub mod isi { authority: ::Id, wsv: &WorldStateView, ) -> Result<(), Self::Error> { - let context = Context::new(wsv); - let id = self.trigger_id.evaluate(&context)?; + let id = wsv.evaluate(&self.trigger_id)?; wsv.triggers() .inspect_by_id(&id, |action| -> Result<(), Self::Error> { @@ -203,7 +204,7 @@ pub mod query { }; use super::*; - use crate::{prelude::*, smartcontracts::Context}; + use crate::prelude::*; impl ValidQuery for FindAllActiveTriggerIds { #[metrics(+"find_all_active_triggers")] @@ -215,9 +216,8 @@ pub mod query { impl ValidQuery for FindTriggerById { #[metrics(+"find_trigger_by_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .map_err(|e| Error::Evaluate(format!("Failed to evaluate trigger id. {e}")))?; iroha_logger::trace!(%id); // Can't use just `ActionTrait::clone_and_box` cause this will trigger lifetime mismatch @@ -249,13 +249,11 @@ pub mod query { impl ValidQuery for FindTriggerKeyValueByIdAndKey { #[metrics(+"find_trigger_key_value_by_id_and_key")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.id) .map_err(|e| Error::Evaluate(format!("Failed to evaluate trigger id. {e}")))?; - let key = self - .key - .evaluate(&Context::new(wsv)) + let key = wsv + .evaluate(&self.key) .map_err(|e| Error::Evaluate(format!("Failed to evaluate key. {e}")))?; iroha_logger::trace!(%id, %key); wsv.triggers() @@ -273,14 +271,13 @@ pub mod query { impl ValidQuery for FindTriggersByDomainId { #[metrics(+"find_triggers_by_domain_id")] fn execute(&self, wsv: &WorldStateView) -> eyre::Result { - let domain_id = &self - .domain_id - .evaluate(&Context::new(wsv)) + let domain_id = wsv + .evaluate(&self.domain_id) .map_err(|e| Error::Evaluate(format!("Failed to evaluate domain id. {e}")))?; let triggers = wsv .triggers() - .inspect_by_domain_id(domain_id, |trigger_id, action| { + .inspect_by_domain_id(&domain_id, |trigger_id, action| { let Action { executable: loaded_executable, repeats, diff --git a/core/src/smartcontracts/isi/tx.rs b/core/src/smartcontracts/isi/tx.rs index 3e89bcd94d6..fc8f4a09d30 100644 --- a/core/src/smartcontracts/isi/tx.rs +++ b/core/src/smartcontracts/isi/tx.rs @@ -2,6 +2,7 @@ use eyre::{Result, WrapErr}; use iroha_data_model::{ + evaluate::ExpressionEvaluator, prelude::*, query::error::{FindError, QueryExecutionFailure}, }; @@ -21,9 +22,8 @@ impl ValidQuery for FindAllTransactions { impl ValidQuery for FindTransactionsByAccountId { #[metrics(+"find_transactions_by_account_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let id = self - .account_id - .evaluate(&Context::new(wsv)) + let id = wsv + .evaluate(&self.account_id) .wrap_err("Failed to get account id") .map_err(|e| QueryExecutionFailure::Evaluate(e.to_string()))?; iroha_logger::trace!(%id); @@ -34,9 +34,8 @@ impl ValidQuery for FindTransactionsByAccountId { impl ValidQuery for FindTransactionByHash { #[metrics(+"find_transaction_by_hash")] fn execute(&self, wsv: &WorldStateView) -> Result { - let hash = self - .hash - .evaluate(&Context::new(wsv)) + let hash = wsv + .evaluate(&self.hash) .wrap_err("Failed to get hash") .map_err(|e| QueryExecutionFailure::Evaluate(e.to_string()))?; iroha_logger::trace!(%hash); diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index 658ea1df723..de75927c577 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -447,9 +447,8 @@ pub mod query { impl ValidQuery for FindRoleByRoleId { #[metrics(+"find_role_by_role_id")] fn execute(&self, wsv: &WorldStateView) -> Result { - let role_id = self - .id - .evaluate(&Context::new(wsv)) + let role_id = wsv + .evaluate(&self.id) .map_err(|e| Error::Evaluate(e.to_string()))?; iroha_logger::trace!(%role_id); @@ -490,9 +489,8 @@ pub mod query { impl ValidQuery for DoesAccountHavePermissionToken { #[metrics("does_account_have_permission")] fn execute(&self, wsv: &WorldStateView) -> Result { - let account_id = self - .account_id - .evaluate(&Context::new(wsv)) + let account_id = wsv + .evaluate(&self.account_id) .map_err(|e| Error::Evaluate(e.to_string()))?; wsv.map_account(&account_id, |account| { diff --git a/core/src/smartcontracts/mod.rs b/core/src/smartcontracts/mod.rs index 661fb96fa97..291105d16a9 100644 --- a/core/src/smartcontracts/mod.rs +++ b/core/src/smartcontracts/mod.rs @@ -9,7 +9,9 @@ pub mod wasm; use std::collections::BTreeMap; -use iroha_data_model::{prelude::*, query::error::QueryExecutionFailure}; +use iroha_data_model::{ + evaluate::ExpressionEvaluator, prelude::*, query::error::QueryExecutionFailure, +}; pub use isi::*; use crate::wsv::WorldStateView; @@ -46,9 +48,18 @@ pub trait ValidQuery: Query { } } +impl ExpressionEvaluator for WorldStateView { + fn evaluate( + &self, + expression: &E, + ) -> Result { + expression.evaluate(&Context::new(self)) + } +} + /// Context of expression evaluation #[derive(Clone)] -pub struct Context<'wsv> { +struct Context<'wsv> { values: BTreeMap, wsv: &'wsv WorldStateView, } diff --git a/core/src/tx.rs b/core/src/tx.rs index 14cc59a889a..5f56efa2d64 100644 --- a/core/src/tx.rs +++ b/core/src/tx.rs @@ -17,13 +17,14 @@ use std::str::FromStr; use eyre::Result; +use iroha_data_model::evaluate::ExpressionEvaluator; pub use iroha_data_model::prelude::*; use iroha_logger::debug; use iroha_primitives::must_use::MustUse; use crate::{ prelude::*, - smartcontracts::{wasm, Context, Execute as _}, + smartcontracts::{wasm, Execute as _}, }; /// Used to validate transaction and thus move transaction lifecycle forward @@ -244,8 +245,7 @@ impl CheckSignatureCondition for AcceptedTransaction { .cloned(); wsv.map_account(account_id, |account| { - check_signature_condition(account, signatories) - .evaluate(&Context::new(wsv)) + wsv.evaluate(&check_signature_condition(account, signatories)) .map(MustUse::new) .map_err(Into::into) })? diff --git a/data_model/src/evaluate.rs b/data_model/src/evaluate.rs index c3ac350d694..4250b860d67 100644 --- a/data_model/src/evaluate.rs +++ b/data_model/src/evaluate.rs @@ -20,6 +20,16 @@ use crate::{ query::error::QueryExecutionFailure, }; +/// Expression evaluator +pub trait ExpressionEvaluator { + /// Evaluates expression against current state of the underlying system + /// + /// # Errors + /// + /// - if expression is malformed + fn evaluate(&self, expression: &E) -> Result; +} + /// Context of expression evaluation, holding (name, value) pairs for resolving identifiers. /// Context comes into play because of [`Where`] and [`Query`] expressions. /// diff --git a/default_validator/lints.toml b/default_validator/lints.toml deleted file mode 120000 index a034f1bbf09..00000000000 --- a/default_validator/lints.toml +++ /dev/null @@ -1 +0,0 @@ -../../lints.toml \ No newline at end of file diff --git a/default_validator/src/lib.rs b/default_validator/src/lib.rs index 27c4510d3df..12a2505cb64 100644 --- a/default_validator/src/lib.rs +++ b/default_validator/src/lib.rs @@ -10,7 +10,7 @@ use iroha_validator::prelude::*; /// Entrypoint for smart contract #[entrypoint(params = "[authority, operation]")] pub fn validate(authority: AccountId, operation: NeedsValidationBox) -> Verdict { - let mut validator = DefaultValidator; + let mut validator = DefaultValidator::new(); match operation { // NOTE: Invoked from Iroha diff --git a/lints.toml b/lints.toml new file mode 100644 index 00000000000..5daf19f2945 --- /dev/null +++ b/lints.toml @@ -0,0 +1,178 @@ +# For all clippy lints please visit: https://rust-lang.github.io/rust-clippy/master/ +deny = [ + 'anonymous_parameters', + 'clippy::all', + 'clippy::dbg_macro', + + # 'clippy::nursery', + 'clippy::debug_assert_with_mut_call', + 'clippy::derive_partial_eq_without_eq', + 'clippy::empty_line_after_outer_attr', + 'clippy::fallible_impl_from', + 'clippy::future_not_send', + 'clippy::iter_with_drain', + 'clippy::mutex_integer', + 'clippy::needless_collect', + 'clippy::path_buf_push_overwrite', + 'clippy::suboptimal_flops', + 'clippy::trailing_empty_array', + 'clippy::transmute_undefined_repr', + 'clippy::trivial_regex', + 'clippy::unused_peekable', + 'clippy::unused_rounding', + + 'clippy::pedantic', + 'future_incompatible', + 'missing_copy_implementations', + 'missing_docs', + 'nonstandard_style', + 'private_doc_tests', + 'rust_2018_idioms', + 'trivial_casts', + 'trivial_numeric_casts', + 'unconditional_recursion', + 'unsafe_code', + 'unused', + 'unused_import_braces', + 'variant_size_differences', + 'unused_tuple_struct_fields', + 'explicit_outlives_requirements', + 'non_ascii_idents', + # TODO: reenable + # 'unreachable_pub', + # 'unsafe_op_in_unsafe_fn', +] + +allow = [ + # These are up to personal taste. We don't want these to be enabled ever. + 'clippy::string_add', + 'unknown_lints', + 'clippy::as_conversions', + 'clippy::else_if_without_else', + 'clippy::enum_glob_use', + 'clippy::exhaustive_enums', + 'clippy::exhaustive_structs', + 'clippy::implicit_return', + 'clippy::inconsistent_struct_constructor', + 'clippy::indexing_slicing', + 'clippy::integer_arithmetic', + 'clippy::let_underscore_must_use', + 'clippy::match_wildcard_for_single_variants', + 'clippy::missing_docs_in_private_items', + # Not all public items should be inline. We only inline **trivial** functions. + 'clippy::missing_inline_in_public_items', + 'clippy::module_name_repetitions', + 'clippy::must_use_candidate', + 'clippy::pattern_type_mismatch', + 'clippy::semicolon_if_nothing_returned', + 'clippy::non-ascii-literal', + 'clippy::wildcard_enum_match_arm', + 'clippy::wildcard_imports', + 'clippy::pub_use', + 'clippy::shadow_reuse', + 'clippy::shadow_same', + + # These are normally decisions, which need to be audited by a human. + 'clippy::unwrap_in_result', + 'clippy::expect_used', + 'clippy::unreachable', + 'clippy::use_self', + 'clippy::wildcard_enum_match_arm', + 'clippy::wildcard_imports', + 'elided_lifetimes_in_paths', + # Our preferred style. + 'clippy::non-ascii-literal', + 'clippy::std_instead_of_core', + 'clippy::uninlined_format_args', + + # This lint could be useful in theory. The trade-off of making + # refactoring away from references difficult isn't worth it in all + # cases, so if it is enabled, it should be enabled locally. + 'clippy::pattern_type_mismatch', + + # Style guide. + 'clippy::mod-module-files', + 'clippy::separated-literal-suffix', + # Most trybuild code triggers a false-positive. + + # Not all public items should be inline. We only inline **trivial** functions. + 'clippy::missing_inline_in_public_items', + + 'unknown_lints', + + # --- Re-enable candidates ----- + + # Lots of false-positives. + 'clippy::self-named-module-files', + 'clippy::manual_let_else', + + # We often need to shadow the name of the method to specialise. + # As soon as trait specialisation is stable we need to remove it. + 'clippy::same_name_method', + 'clippy::pub_use', + + # Style guide candidate. Explicitly converting the return value to + # () is good for refactoring, and if there is necessary + # processing of the data returned by a function, it should + # **really** be marked as #[must_use] + 'clippy::semicolon_if_nothing_returned', + + # This lint has way too many false-positives, so even enabling it + # as a warning is too much. Instead prefer adding explicit + # `#[deny]` directives + 'clippy::must_use_candidate', + + # Unstable and many false-positives + ## https://rust-lang.github.io/rust-clippy/master/index.html#missing_const_for_fn + 'clippy::missing_const_for_fn', + + # Too much affected code. Often impossible to apply suggestion on stable rust. + 'elided_lifetimes_in_paths', + + # This lint produces a lot of false positives. Recommend local #[deny] directives + 'clippy::use_self', + + # We don't want to manually deny every `clippy::restriction::*` lint. + 'clippy::blanket-clippy-restriction-lints', + + # A lot of false-positive. + 'clippy::partial_pub_fields', + + # Should be enabled per trait impl rather than globally. + 'clippy::missing_trait_methods', + + # We allow this and deny `clippy::semicolon_inside_block`. + 'clippy::semicolon_outside_block', + + # It is debatable whether it's actually easier to read, + # additionally, not all patterns are covered by the inlined syntax + 'clippy::uninlined_format_args', +] + +warn = [ + # These are lints which should really be conveyed to the author, + # but not necessarily fixed. + + 'unknown_lints', + 'clippy::inconsistent_struct_constructor', + 'clippy::match_wildcard_for_single_variants', + 'clippy::arithmetic_side_effects', + 'clippy::option_if_let_else', + 'clippy::or_fun_call', + 'clippy::redundant_pub_crate', + 'clippy::string_lit_as_bytes', + 'clippy::suspicious_operation_groupings', + 'clippy::useless_let_if_seq', + + # unstable + # 'non_exhaustive_omitted_patterns', + + 'single_use_lifetimes', + 'unused_lifetimes', + + # A couple of false positives. + # 'unused_qualifications', + + # Lots of false-positives. + # 'unused_crate_dependencies', +] diff --git a/wasm/lints.toml b/wasm/lints.toml new file mode 120000 index 00000000000..883d2da34b1 --- /dev/null +++ b/wasm/lints.toml @@ -0,0 +1 @@ +../lints.toml \ No newline at end of file diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 679838c8037..807e9e9ca99 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -85,6 +85,18 @@ impl ExecuteOnHost for data_model::query::QueryBox { } } +#[derive(Debug, Clone, Copy)] +pub struct Host; + +impl iroha_data_model::evaluate::ExpressionEvaluator for Host { + fn evaluate( + &self, + expression: &E, + ) -> Result { + expression.evaluate(&Context::new()) + } +} + /// Context of expression evaluation #[derive(Clone, Default)] #[repr(transparent)] diff --git a/wasm/validator/src/default.rs b/wasm/validator/src/default.rs index 7aa42190a25..e8e817f0c1d 100644 --- a/wasm/validator/src/default.rs +++ b/wasm/validator/src/default.rs @@ -16,6 +16,7 @@ use domain::{ validate_remove_domain_key_value, validate_set_domain_key_value, validate_unregister_domain, }; use iroha_validator::{data_model::prelude::*, permission, permission::Token as _, prelude::*}; +use iroha_wasm::data_model::evaluate::ExpressionEvaluator; use parameter::{validate_new_parameter, validate_set_parameter}; use peer::validate_unregister_peer; use permission_token::{ @@ -109,13 +110,25 @@ pub(crate) use tokens; /// /// The defaults are not guaranteed to be stable. #[derive(Debug, Clone, Copy)] -pub struct DefaultValidator; +pub struct DefaultValidator(iroha_wasm::Host); -impl Validate for DefaultValidator { - //fn evaluator(&mut self) -> E { - // self.0 - //} +impl DefaultValidator { + /// Construct [`Self`] + pub fn new() -> Self { + DefaultValidator(iroha_wasm::Host) + } +} +impl ExpressionEvaluator for DefaultValidator { + fn evaluate( + &self, + expression: &E, + ) -> Result { + self.0.evaluate(expression) + } +} + +impl Validate for DefaultValidator { custom_impls! { // Peer validation validate_unregister_peer(Unregister), diff --git a/wasm/validator/src/visitor.rs b/wasm/validator/src/visitor.rs index dbab43d7097..5e781b72bb9 100644 --- a/wasm/validator/src/visitor.rs +++ b/wasm/validator/src/visitor.rs @@ -1,6 +1,8 @@ use alloc::borrow::ToOwned as _; -use iroha_wasm::data_model::{transaction::TransactionPayload, NumericValue, SignaturesOf}; +use iroha_wasm::data_model::{ + evaluate::ExpressionEvaluator, transaction::TransactionPayload, NumericValue, SignaturesOf, +}; use super::prelude::*; use crate::data_model::prelude::*; @@ -23,19 +25,20 @@ macro_rules! evaluate_expr { ($validator:ident, $authority:ident, <$isi:ident as $isi_type:ty>::$field:ident()) => {{ $validator.validate_expression($authority, $isi.$field())?; - $isi.$field().evaluate(&iroha_wasm::Context::new()) - // TODO: Should evaluation always be successful by here? - .map_err(|error| alloc::format!( + $validator.evaluate($isi.$field()).map_err(|error| { + alloc::format!( "Failed to evaluate field '{}::{}': {error}", - stringify!($field), stringify!($isi_type) - )) + stringify!($field), + stringify!($isi_type) + ) + }) }}; } /// Trait to validate Iroha entities. Default implementations always passes /// /// This trait is based on the visitor pattern -pub trait Validate { +pub trait Validate: ExpressionEvaluator { fn validate_expression( &mut self, authority: &AccountId, @@ -327,10 +330,10 @@ pub fn validate_instruction( } } -pub fn validate_expression( +pub fn validate_expression( validator: &mut V, authority: &::Id, - expression: &EvaluatesTo, + expression: &EvaluatesTo, ) -> Verdict { macro_rules! validate_binary_math_expression { ($e:ident) => {{