From 2438220ed45453c931420acfeedd3b547ff06f43 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 16:56:39 +0500 Subject: [PATCH 1/8] chore: update `wasm-dpp` package --- packages/wasm-dpp/lib/index.ts | 44 +++++++++------- .../wasm-dpp/src/dash_platform_protocol.rs | 26 ++++++++-- .../src/data_contract/data_contract_facade.rs | 8 ++- .../data_contract_create_transition/mod.rs | 32 ++++++++++++ .../execute_data_triggers_factory.rs | 14 ++--- .../wasm-dpp/src/decode_protocol_entity.rs | 2 +- .../src/document/extended_document.rs | 7 +-- packages/wasm-dpp/src/document/factory.rs | 4 +- .../document_batch_transition/mod.rs | 29 +++++++++-- .../state/fetch_extended_documents.rs | 6 +-- ...alidate_documents_uniqueness_by_indices.rs | 2 +- packages/wasm-dpp/src/entropy_generator.rs | 1 + .../wasm-dpp/src/identity/factory_utils.rs | 8 +-- .../wasm-dpp/src/identity/identity_facade.rs | 4 +- .../identity_create_transition.rs | 20 +++---- ...ntity_create_transition_state_validator.rs | 2 +- .../identity_public_key_transitions.rs | 24 ++++----- ...entity_topup_transition_state_validator.rs | 2 +- .../identity_update_public_keys_validator.rs | 4 +- .../identity_update_transition.rs | 16 +++--- .../validate_public_key_signatures.rs | 4 +- .../src/state_transition/conversion.rs | 36 ++++++++++++- .../wasm-dpp/src/state_transition/fee/mod.rs | 2 + .../operations/pre_calculated_operation.rs | 6 +++ .../fee/operations/read_operation.rs | 6 +++ .../signature_verification_operation.rs | 6 +++ packages/wasm-dpp/src/state_transition/mod.rs | 27 ++++++++++ .../src/validation/validation_result.rs | 12 ++++- .../dataContract/DataContractFacade.spec.js | 5 +- ...ntractCreateTransitionBasicFactory.spec.js | 1 + .../integration/document/Document.spec.js | 2 + .../document/DocumentFacade.spec.js | 8 ++- .../DocumentBatchTransition.spec.js | 1 + ...cumentsBatchTransitionBasicFactory.spec.js | 1 + .../identity/IdentityFacade.spec.js | 14 +++-- ...entityCreateTransitionBasicFactory.spec.js | 16 +++--- ...entityUpdateTransitionBasicFactory.spec.js | 12 ++--- ...validatePublicKeySignaturesFactory.spec.js | 10 ++-- .../StateTransitionFacade.spec.js | 8 ++- .../test/unit/DashPlatformProtocol.spec.js | 2 + .../basic/findDuplicatesById.spec.js | 2 + ...cumentsBatchTransitionStateFactory.spec.js | 31 ++++++----- .../unit/identity/IdentityFactory.spec.js | 6 +-- .../IdentityCreateTransition.spec.js | 16 +++--- .../IdentityUpdateTransition.spec.js | 8 +-- .../StateTransitionExecutionContext.spec.js | 52 +++++++++++++++++++ 46 files changed, 402 insertions(+), 147 deletions(-) create mode 100644 packages/wasm-dpp/test/unit/stateTransition/StateTransitionExecutionContext.spec.js diff --git a/packages/wasm-dpp/lib/index.ts b/packages/wasm-dpp/lib/index.ts index 396fcf87944..595f076112c 100644 --- a/packages/wasm-dpp/lib/index.ts +++ b/packages/wasm-dpp/lib/index.ts @@ -5,27 +5,35 @@ import wasmBase from '../wasm/wasm_dpp_bg.js'; import patchIdentifier from "./identifier/patchIdentifier"; let isInitialized = false; +let loadingPromise: Promise | null = null; export default async function loadDpp() { if (isInitialized) { - return dpp_module; - } else { - // @ts-ignore - let bytes = Buffer.from(wasmBase, 'base64'); - - if (typeof fetch !== 'undefined') { - let blob = new Blob([bytes], { type: "application/wasm" }); - let wasmUrl = URL.createObjectURL(blob); - await init(wasmUrl); - isInitialized = true; - } else { - dpp_module.initSync(bytes); - isInitialized = true; - } - - patchIdentifier(dpp_module); - - return dpp_module; + return dpp_module + } + + if (!loadingPromise) { + loadingPromise = loadDppModule() } + + await loadingPromise; + isInitialized = true; + loadingPromise = null; + return dpp_module; }; +const loadDppModule = async () => { + // @ts-ignore + let bytes = Buffer.from(wasmBase, 'base64'); + + if (typeof window !== 'undefined') { + let blob = new Blob([bytes], { type: "application/wasm" }); + let wasmUrl = URL.createObjectURL(blob); + await init(wasmUrl); + } else { + dpp_module.initSync(bytes); + } + + patchIdentifier(dpp_module); +} + diff --git a/packages/wasm-dpp/src/dash_platform_protocol.rs b/packages/wasm-dpp/src/dash_platform_protocol.rs index 24253c0ae33..c92ace32451 100644 --- a/packages/wasm-dpp/src/dash_platform_protocol.rs +++ b/packages/wasm-dpp/src/dash_platform_protocol.rs @@ -14,6 +14,7 @@ use dpp::identity::validation::PublicKeysValidator; use crate::state_transition_facade::StateTransitionFacadeWasm; use dpp::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}; +use crate::entropy_generator::ExternalEntropyGenerator; use serde::{Deserialize, Serialize}; #[wasm_bindgen(js_name=DashPlatformProtocol)] @@ -26,6 +27,7 @@ pub struct DashPlatformProtocol { state_repository: ExternalStateRepositoryLike, public_keys_validator: Arc>, bls: BlsAdapter, + entropy_generator: ExternalEntropyGenerator, } #[derive(Serialize, Deserialize)] @@ -40,6 +42,7 @@ impl DashPlatformProtocol { pub fn new( bls_adapter: JsBlsAdapter, state_repository: ExternalStateRepositoryLike, + entropy_generator: ExternalEntropyGenerator, maybe_protocol_version: Option, ) -> Result { let bls = BlsAdapter(bls_adapter); @@ -52,6 +55,7 @@ impl DashPlatformProtocol { protocol_version, state_repository.clone(), bls.clone(), + entropy_generator.clone(), )?; Ok(Self { @@ -63,6 +67,7 @@ impl DashPlatformProtocol { state_repository, public_keys_validator, bls, + entropy_generator, }) } @@ -102,6 +107,7 @@ impl DashPlatformProtocol { protocol_version, self.state_repository.clone(), self.bls.clone(), + self.entropy_generator.clone(), ) } @@ -110,7 +116,12 @@ impl DashPlatformProtocol { &mut self, state_repository: ExternalStateRepositoryLike, ) -> Result<(), JsValue> { - self.init(self.protocol_version, state_repository, self.bls.clone()) + self.init( + self.protocol_version, + state_repository, + self.bls.clone(), + self.entropy_generator.clone(), + ) } #[wasm_bindgen(js_name = getStateRepository)] @@ -123,6 +134,7 @@ impl DashPlatformProtocol { protocol_version: u32, state_repository: ExternalStateRepositoryLike, bls_adapter: BlsAdapter, + entropy_generator: ExternalEntropyGenerator, ) -> Result<(), JsValue> { let (identity_facade, document_facade, data_contract_facade, state_transition_facade) = create_facades( @@ -130,6 +142,7 @@ impl DashPlatformProtocol { protocol_version, state_repository.clone(), bls_adapter, + entropy_generator, )?; self.protocol_version = protocol_version; @@ -148,6 +161,7 @@ fn create_facades( protocol_version: u32, state_repository: ExternalStateRepositoryLike, bls_adapter: BlsAdapter, + entropy_generator: ExternalEntropyGenerator, ) -> Result< ( IdentityFacadeWasm, @@ -172,10 +186,14 @@ fn create_facades( protocol_version, protocol_version_validator.clone(), wrapped_state_repository, + entropy_generator.clone(), ); - let data_contract_facade = - DataContractFacadeWasm::new(protocol_version, protocol_version_validator.clone()); + let data_contract_facade = DataContractFacadeWasm::new( + protocol_version, + protocol_version_validator.clone(), + entropy_generator, + ); let state_transition_facade = StateTransitionFacadeWasm::new(state_repository, bls_adapter, protocol_version_validator)?; @@ -192,12 +210,14 @@ fn init_document_facade( protocol_version: u32, protocol_version_validator: Arc, state_repository: ExternalStateRepositoryLikeWrapper, + entropy_generator: ExternalEntropyGenerator, ) -> DocumentFacadeWasm { let document_validator = DocumentValidatorWasm::new_with_arc(protocol_version_validator); let document_factory = DocumentFactoryWASM::new_with_state_repository_wrapper( protocol_version, document_validator.clone(), + entropy_generator, state_repository.clone(), ); diff --git a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs index d15ab415d07..11227b95e86 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs @@ -8,6 +8,7 @@ use dpp::data_contract::DataContractFacade; use dpp::identifier::Identifier; use dpp::version::ProtocolVersionValidator; +use crate::entropy_generator::ExternalEntropyGenerator; use crate::utils::{get_bool_from_options, WithJsError, SKIP_VALIDATION_PROPERTY_NAME}; use crate::validation::ValidationResultWasm; use dpp::platform_value::Value; @@ -23,8 +24,13 @@ impl DataContractFacadeWasm { pub fn new( protocol_version: u32, protocol_version_validator: Arc, + entropy_generator: ExternalEntropyGenerator, ) -> Self { - let inner = DataContractFacade::new(protocol_version, protocol_version_validator); + let inner = DataContractFacade::new_with_entropy_generator( + protocol_version, + protocol_version_validator, + Box::new(entropy_generator), + ); Self(Arc::new(inner)) } diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index f2aa659507c..d737a9bd7f1 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -6,6 +6,8 @@ use std::collections::HashMap; pub use apply::*; pub use validation::*; +use dpp::consensus::signature::SignatureError; +use dpp::consensus::ConsensusError::SignatureError as ConsensusSignatureErrorVariant; use dpp::{ data_contract::state_transition::data_contract_create_transition::DataContractCreateTransition, platform_value, @@ -161,6 +163,7 @@ impl DataContractCreateTransitionWasm { bls: JsBlsAdapter, ) -> Result<(), JsValue> { let bls_adapter = BlsAdapter(bls); + self.0 .sign( &identity_public_key.to_owned().into(), @@ -169,4 +172,33 @@ impl DataContractCreateTransitionWasm { ) .with_js_error() } + + // TODO: add verify_signature to other identity signed state transitions + #[wasm_bindgen(js_name=verifySignature)] + pub fn verify_signature( + &self, + identity_public_key: &IdentityPublicKeyWasm, + bls: JsBlsAdapter, + ) -> Result { + let bls_adapter = BlsAdapter(bls); + + let verification_result = self + .0 + .verify_signature(&identity_public_key.to_owned().into(), &bls_adapter); + + match verification_result { + Ok(()) => Ok(true), + Err(protocol_error) => match &protocol_error { + ProtocolError::AbstractConsensusError(err) => match err.as_ref() { + ConsensusSignatureErrorVariant(err) => match err { + SignatureError::InvalidStateTransitionSignatureError => Ok(false), + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + } + .with_js_error() + } } diff --git a/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs b/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs index 4f918fa786f..eb92135596a 100644 --- a/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs +++ b/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs @@ -1,5 +1,5 @@ use dpp::document::validation::state::execute_data_triggers::execute_data_triggers_with_custom_list; -use dpp::prelude::{DataTrigger, DocumentTransition}; +use itertools::Itertools; use js_sys::Array; use wasm_bindgen::prelude::*; @@ -26,24 +26,24 @@ pub async fn execute_data_triggers_wasm( let st_wrapper = ExternalStateRepositoryLikeWrapper::new_with_arc(js_context.state_repository()); let context = data_trigger_context_from_wasm(&js_context, &st_wrapper); - let document_transitions = js_document_transitions + let document_transitions: Vec<_> = js_document_transitions .iter() .map(|v| { v.to_wasm::("DocumentTransition") - .map(|v| v.to_owned().into_inner()) + .map(|v| v.to_owned()) }) - .collect::, JsValue>>()?; + .try_collect()?; - let data_triggers = js_data_triggers + let data_triggers: Vec<_> = js_data_triggers .iter() .map(|v| { v.to_wasm::("DataTrigger") .map(|v| v.to_owned().into_inner()) }) - .collect::, JsValue>>()?; + .try_collect()?; let results = execute_data_triggers_with_custom_list( - document_transitions.iter().collect::>().as_slice(), + document_transitions.iter().map(|v| v.inner()), &context, data_triggers, ) diff --git a/packages/wasm-dpp/src/decode_protocol_entity.rs b/packages/wasm-dpp/src/decode_protocol_entity.rs index b78efff6a27..792a674e777 100644 --- a/packages/wasm-dpp/src/decode_protocol_entity.rs +++ b/packages/wasm-dpp/src/decode_protocol_entity.rs @@ -17,7 +17,7 @@ pub fn decode_protocol_entity(buffer: Vec) -> Result { .try_to_validating_json() .map_err(|e| from_protocol_error(ProtocolError::ValueError(e)))? .serialize(&serializer) - .map_err(|e| from_protocol_error(ProtocolError::EncodingError(e.to_string())))?; + .map_err(|e| from_protocol_error(ProtocolError::NonConsensusError(e.to_string())))?; Ok(Array::from_iter(vec![ JsValue::from(protocol_version), js_value, diff --git a/packages/wasm-dpp/src/document/extended_document.rs b/packages/wasm-dpp/src/document/extended_document.rs index 5ec98afa856..16f01e77904 100644 --- a/packages/wasm-dpp/src/document/extended_document.rs +++ b/packages/wasm-dpp/src/document/extended_document.rs @@ -18,7 +18,7 @@ use crate::errors::RustConversionError; use crate::identifier::{identifier_from_js_value, IdentifierWrapper}; use crate::lodash::lodash_set; use crate::utils::{with_serde_to_platform_value, Inner, ToSerdeJSONExt, WithJsError}; -use crate::{with_js_error, ConversionOptions, DocumentWasm}; +use crate::{with_js_error, ConversionOptions}; use crate::{DataContractWasm, MetadataWasm}; #[wasm_bindgen(js_name=ExtendedDocument)] @@ -102,11 +102,6 @@ impl ExtendedDocumentWasm { Ok(()) } - #[wasm_bindgen(js_name=getDocument)] - pub fn get_document(&self) -> DocumentWasm { - self.0.document.clone().into() - } - #[wasm_bindgen(js_name=setOwnerId)] pub fn set_owner_id(&mut self, owner_id: IdentifierWrapper) { self.0.document.owner_id = owner_id.into_inner(); diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index 3e94d4fe93b..bd4bf8993a0 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -67,12 +67,14 @@ impl DocumentFactoryWASM { pub(crate) fn new_with_state_repository_wrapper( protocol_version: u32, document_validator: DocumentValidatorWasm, + entropy_generator: ExternalEntropyGenerator, state_repository: ExternalStateRepositoryLikeWrapper, ) -> Self { - let factory = DocumentFactory::new( + let factory = DocumentFactory::new_with_entropy_generator( protocol_version, document_validator.into(), DataContractFetcherAndValidator::new(Arc::new(state_repository)), + Box::new(entropy_generator), ); DocumentFactoryWASM(factory) diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index 98ef0820ef9..48fccd3f041 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -1,6 +1,8 @@ use dpp::identity::KeyID; use dpp::state_transition::fee::calculate_state_transition_fee_factory::calculate_state_transition_fee; use dpp::{ + consensus::signature::SignatureError, + consensus::ConsensusError::SignatureError as ConsensusSignatureErrorVariant, document::{ document_transition::document_base_transition, state_transition::documents_batch_transition::property_names, DocumentsBatchTransition, @@ -296,12 +298,29 @@ impl DocumentsBatchTransitionWasm { #[wasm_bindgen(js_name=verifySignature)] pub fn verify_signature( &self, - public_key: &IdentityPublicKeyWasm, + identity_public_key: &IdentityPublicKeyWasm, bls: JsBlsAdapter, - ) -> Result<(), JsValue> { - self.0 - .verify_signature(public_key.inner(), &BlsAdapter(bls)) - .with_js_error() + ) -> Result { + let bls_adapter = BlsAdapter(bls); + + let verification_result = self + .0 + .verify_signature(&identity_public_key.to_owned().into(), &bls_adapter); + + match verification_result { + Ok(()) => Ok(true), + Err(protocol_error) => match &protocol_error { + ProtocolError::AbstractConsensusError(err) => match err.as_ref() { + ConsensusSignatureErrorVariant(err) => match err { + SignatureError::InvalidStateTransitionSignatureError => Ok(false), + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + } + .with_js_error() } #[wasm_bindgen(js_name=setSignaturePublicKey)] diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs index 6c570f83741..63a101f4ba6 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs @@ -1,5 +1,5 @@ use dpp::{ - document::validation::state::fetch_documents, prelude::DocumentTransition, + document::validation::state::fetch_extended_documents, prelude::DocumentTransition, state_transition::state_transition_execution_context::StateTransitionExecutionContext, }; use js_sys::Array; @@ -26,9 +26,9 @@ pub async fn fetch_extended_documents_wasm( } let execution_context: StateTransitionExecutionContext = js_execution_context.into(); - let documents = fetch_documents::fetch_extended_documents( + let documents = fetch_extended_documents::fetch_extended_documents( &wrapped_state_repository, - document_transitions.iter().collect::>().as_slice(), + document_transitions, &execution_context, ) .await diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs index ed4aff8cffc..2aeb530602c 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs @@ -36,7 +36,7 @@ pub async fn validate_uniqueness_by_indices_wasm( validate_documents_uniqueness_by_indices::validate_documents_uniqueness_by_indices( &wrapped_state_repository, &owner_id, - document_transitions.iter(), + document_transitions, js_data_contract.inner(), &execution_context, ) diff --git a/packages/wasm-dpp/src/entropy_generator.rs b/packages/wasm-dpp/src/entropy_generator.rs index 7e6d18d340c..21101d6b3a0 100644 --- a/packages/wasm-dpp/src/entropy_generator.rs +++ b/packages/wasm-dpp/src/entropy_generator.rs @@ -6,6 +6,7 @@ use wasm_bindgen::JsValue; #[wasm_bindgen] extern "C" { + #[derive(Clone)] pub type ExternalEntropyGenerator; #[wasm_bindgen(catch, structural, method)] diff --git a/packages/wasm-dpp/src/identity/factory_utils.rs b/packages/wasm-dpp/src/identity/factory_utils.rs index 8693a7a5387..50ee7267a8f 100644 --- a/packages/wasm-dpp/src/identity/factory_utils.rs +++ b/packages/wasm-dpp/src/identity/factory_utils.rs @@ -1,5 +1,5 @@ use crate::errors::RustConversionError; -use crate::identity::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; +use crate::identity::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm; use crate::utils::{generic_of_js_val, to_vec_of_platform_values}; use crate::{create_asset_lock_proof_from_wasm_instance, IdentityPublicKeyWasm}; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; @@ -47,10 +47,10 @@ pub fn parse_create_identity_update_transition_keys( let keys: Vec = add_public_keys_array .iter() .map(|key| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( &key, - "IdentityPublicKeyWithWitness", + "IdentityPublicKeyCreateTransition", )?; Ok(public_key.clone().into()) diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index d0f44847420..91b63f437f5 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -116,8 +116,8 @@ impl IdentityFacadeWasm { } #[wasm_bindgen] - pub fn validate(&self, identity: IdentityWasm) -> Result { - let identity: Identity = identity.into(); + pub fn validate(&self, identity: &IdentityWasm) -> Result { + let identity: Identity = identity.to_owned().into(); let identity_json = identity.to_cleaned_object().with_js_error()?; let validation_result = self diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 5a6ba58895d..3862895aa13 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -13,7 +13,7 @@ use crate::{ identity::state_transition::asset_lock_proof::{ ChainAssetLockProofWasm, InstantAssetLockProofWasm, }, - identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, + identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm, state_transition::StateTransitionExecutionContextWasm, with_js_error, }; @@ -97,10 +97,10 @@ impl IdentityCreateTransitionWasm { let public_keys = public_keys .iter() .map(|value| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( value, - "IdentityPublicKeyWithWitness", + "IdentityPublicKeyCreateTransition", )?; Ok(public_key.clone().into()) }) @@ -116,10 +116,10 @@ impl IdentityCreateTransitionWasm { let mut public_keys = public_keys .iter() .map(|value| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( value, - "IdentityPublicKeyWithWitness", + "IdentityPublicKeyCreateTransition", )?; Ok(public_key.clone().into()) }) @@ -136,7 +136,7 @@ impl IdentityCreateTransitionWasm { .get_public_keys() .iter() .map(IdentityPublicKeyWithWitness::to_owned) - .map(IdentityPublicKeyWithWitnessWasm::from) + .map(IdentityPublicKeyCreateTransitionWasm::from) .map(JsValue::from) .collect() } @@ -218,7 +218,7 @@ impl IdentityCreateTransitionWasm { let keys_objects = object .public_keys .into_iter() - .map(IdentityPublicKeyWithWitnessWasm::from) + .map(IdentityPublicKeyCreateTransitionWasm::from) .map(|key| key.to_object(options.clone())) .collect::>()?; @@ -288,7 +288,7 @@ impl IdentityCreateTransitionWasm { let keys_objects = object .public_keys .into_iter() - .map(IdentityPublicKeyWithWitnessWasm::from) + .map(IdentityPublicKeyCreateTransitionWasm::from) .map(|key| key.to_json()) .collect::>()?; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs index f6f5734ea34..e4f5f7abd7c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs @@ -30,7 +30,7 @@ impl IdentityCreateTransitionStateValidator { &state_transition.to_owned().into(), ) .await - .map_err(from_dpp_err)?; + .map_err(|e| from_dpp_err(e.into()))?; Ok(validation_result.map(|_| JsValue::undefined()).into()) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs index fa5ea7d3a95..3cc52cc1738 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs @@ -18,20 +18,20 @@ struct ToObjectOptions { pub skip_signature: Option, } -#[wasm_bindgen(js_name=IdentityPublicKeyWithWitness)] +#[wasm_bindgen(js_name=IdentityPublicKeyCreateTransition)] #[derive(Serialize, Deserialize, Debug, Clone)] -pub struct IdentityPublicKeyWithWitnessWasm(IdentityPublicKeyWithWitness); +pub struct IdentityPublicKeyCreateTransitionWasm(IdentityPublicKeyWithWitness); -#[wasm_bindgen(js_class = IdentityPublicKeyWithWitness)] -impl IdentityPublicKeyWithWitnessWasm { +#[wasm_bindgen(js_class = IdentityPublicKeyCreateTransition)] +impl IdentityPublicKeyCreateTransitionWasm { #[wasm_bindgen(constructor)] - pub fn new(raw_public_key: JsValue) -> Result { + pub fn new(raw_public_key: JsValue) -> Result { let data_string = utils::stringify(&raw_public_key)?; let value: JsonValue = serde_json::from_str(&data_string).map_err(|e| e.to_string())?; let pk = IdentityPublicKeyWithWitness::from_json_object(value).with_js_error()?; - Ok(IdentityPublicKeyWithWitnessWasm(pk)) + Ok(IdentityPublicKeyCreateTransitionWasm(pk)) } #[wasm_bindgen(js_name=getId)] @@ -173,7 +173,7 @@ impl IdentityPublicKeyWithWitnessWasm { } } -impl IdentityPublicKeyWithWitnessWasm { +impl IdentityPublicKeyCreateTransitionWasm { pub fn into_inner(self) -> IdentityPublicKeyWithWitness { self.0 } @@ -187,13 +187,13 @@ impl IdentityPublicKeyWithWitnessWasm { } } -impl From for IdentityPublicKeyWithWitnessWasm { +impl From for IdentityPublicKeyCreateTransitionWasm { fn from(v: IdentityPublicKeyWithWitness) -> Self { - IdentityPublicKeyWithWitnessWasm(v) + IdentityPublicKeyCreateTransitionWasm(v) } } -impl TryFrom for IdentityPublicKeyWithWitnessWasm { +impl TryFrom for IdentityPublicKeyCreateTransitionWasm { type Error = JsValue; fn try_from(value: JsValue) -> Result { @@ -205,8 +205,8 @@ impl TryFrom for IdentityPublicKeyWithWitnessWasm { } } -impl From for IdentityPublicKeyWithWitness { - fn from(pk: IdentityPublicKeyWithWitnessWasm) -> Self { +impl From for IdentityPublicKeyWithWitness { + fn from(pk: IdentityPublicKeyCreateTransitionWasm) -> Self { pk.0 } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs index 130acd6d2c5..b8e38429c99 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs @@ -26,8 +26,8 @@ impl IdentityTopUpTransitionStateValidator { state_transition: &IdentityTopUpTransitionWasm, ) -> Result { let validation_result = validate_identity_topup_transition_state( - &self.state_repository, &state_transition.to_owned().into(), + &self.state_repository, ) .await .map_err(|e| from_dpp_err(e.into()))?; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs index b97935fc454..94d4f8079d6 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs @@ -1,5 +1,5 @@ use crate::errors::from_dpp_err; -use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; +use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm; use crate::utils::WithJsError; use crate::validation::ValidationResultWasm; use dpp::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitness; @@ -32,7 +32,7 @@ impl IdentityUpdatePublicKeysValidatorWasm { .into_iter() .map(|raw_key| { let parsed_key: IdentityPublicKeyWithWitness = - IdentityPublicKeyWithWitnessWasm::new(raw_key)?.into(); + IdentityPublicKeyCreateTransitionWasm::new(raw_key)?.into(); parsed_key.to_raw_object(false).with_js_error() }) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 9cd16bd44d9..fa5ea9069a8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -9,7 +9,7 @@ use crate::identifier::IdentifierWrapper; use crate::{ buffer::Buffer, errors::RustConversionError, - identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, + identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm, identity::IdentityPublicKeyWasm, state_transition::StateTransitionExecutionContextWasm, with_js_error, }; @@ -94,10 +94,10 @@ impl IdentityUpdateTransitionWasm { keys_to_add = keys .iter() .map(|value| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( value, - "IdentityPublicKeyWithWitness", + "IdentityPublicKeyCreateTransition", )?; Ok(public_key.clone().into()) }) @@ -114,7 +114,7 @@ impl IdentityUpdateTransitionWasm { self.0 .get_public_keys_to_add() .iter() - .map(|key| IdentityPublicKeyWithWitnessWasm::from(key.to_owned()).into()) + .map(|key| IdentityPublicKeyCreateTransitionWasm::from(key.to_owned()).into()) .collect() } @@ -251,7 +251,9 @@ impl IdentityUpdateTransitionWasm { if let Some(public_keys_to_add) = object.public_keys_to_add { let keys_objects = public_keys_to_add .into_iter() - .map(|key| IdentityPublicKeyWithWitnessWasm::from(key).to_object(options.clone())) + .map(|key| { + IdentityPublicKeyCreateTransitionWasm::from(key).to_object(options.clone()) + }) .collect::>()?; js_sys::Reflect::set( @@ -357,7 +359,7 @@ impl IdentityUpdateTransitionWasm { if let Some(public_keys_to_add) = object.public_keys_to_add { let keys_objects = public_keys_to_add .into_iter() - .map(|key| IdentityPublicKeyWithWitnessWasm::from(key).to_json()) + .map(|key| IdentityPublicKeyCreateTransitionWasm::from(key).to_json()) .collect::>()?; js_sys::Reflect::set( diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs index 2674b03437b..2543c102843 100644 --- a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -4,7 +4,7 @@ use crate::utils::{ToSerdeJSONExt, WithJsError}; use crate::validation::ValidationResultWasm; -use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; +use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm; use dpp::identity::state_transition::validate_public_key_signatures::{ PublicKeysSignaturesValidator, TPublicKeysSignaturesValidator, @@ -45,7 +45,7 @@ impl PublicKeysSignaturesValidatorWasm { .into_iter() .map(|raw_key| { let parsed_key: IdentityPublicKeyWithWitness = - IdentityPublicKeyWithWitnessWasm::new(raw_key)?.into(); + IdentityPublicKeyCreateTransitionWasm::new(raw_key)?.into(); parsed_key.to_raw_object(false).with_js_error() }) .collect::, JsValue>>()?; diff --git a/packages/wasm-dpp/src/state_transition/conversion.rs b/packages/wasm-dpp/src/state_transition/conversion.rs index 8ad03a49e51..87cb3ff8a50 100644 --- a/packages/wasm-dpp/src/state_transition/conversion.rs +++ b/packages/wasm-dpp/src/state_transition/conversion.rs @@ -3,16 +3,50 @@ use crate::utils::generic_of_js_val; use crate::{ DataContractCreateTransitionWasm, DataContractUpdateTransitionWasm, DocumentsBatchTransitionWasm, IdentityCreateTransitionWasm, IdentityTopUpTransitionWasm, - IdentityUpdateTransitionWasm, + IdentityUpdateTransitionWasm, PreCalculatedOperationWasm, ReadOperationWasm, + SignatureVerificationOperationWasm, }; use dpp::consensus::basic::state_transition::InvalidStateTransitionTypeError; use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; +use dpp::state_transition::fee::operations::Operation; use dpp::state_transition::{StateTransition, StateTransitionType}; use std::convert::TryInto; use wasm_bindgen::__rt::Ref; use wasm_bindgen::{JsCast, JsError, JsValue}; +pub fn create_operation_from_wasm_instance(js_value: &JsValue) -> Result { + let maybe_signature_verification_operation: Result< + Ref, + JsValue, + > = generic_of_js_val::( + js_value, + "SignatureVerificationOperation", + ); + + if let Ok(operation) = maybe_signature_verification_operation { + return Ok(Operation::SignatureVerification( + operation.to_owned().into(), + )); + } + + let maybe_read_operation: Result, JsValue> = + generic_of_js_val::(js_value, "ReadOperation"); + + if let Ok(operation) = maybe_read_operation { + return Ok(Operation::Read(operation.to_owned().into())); + } + + let maybe_precalculated_operation: Result, JsValue> = + generic_of_js_val::(js_value, "PreCalculatedOperation"); + + if let Ok(operation) = maybe_precalculated_operation { + return Ok(Operation::PreCalculated(operation.to_owned().into())); + } + + Err(JsError::new("Unknown operation").into()) +} + pub fn create_state_transition_from_wasm_instance( js_value: &JsValue, ) -> Result { diff --git a/packages/wasm-dpp/src/state_transition/fee/mod.rs b/packages/wasm-dpp/src/state_transition/fee/mod.rs index 7f787f119d6..c87ea551280 100644 --- a/packages/wasm-dpp/src/state_transition/fee/mod.rs +++ b/packages/wasm-dpp/src/state_transition/fee/mod.rs @@ -9,6 +9,8 @@ mod fee_result; mod operations; mod refunds; +pub use operations::*; + #[wasm_bindgen(js_name=Operation)] #[derive(Clone)] pub struct OperationWasm(Operation); diff --git a/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs b/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs index 59bce03f0af..0ba6380d95d 100644 --- a/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs +++ b/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs @@ -21,6 +21,12 @@ impl From for PreCalculatedOperationWasm { } } +impl From for PreCalculatedOperation { + fn from(value: PreCalculatedOperationWasm) -> Self { + value.0 + } +} + #[wasm_bindgen(js_class=PreCalculatedOperation)] impl PreCalculatedOperationWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs b/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs index 6971d484b0a..abb657d07cd 100644 --- a/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs +++ b/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs @@ -17,6 +17,12 @@ impl From for ReadOperationWasm { } } +impl From for ReadOperation { + fn from(value: ReadOperationWasm) -> Self { + value.0 + } +} + #[wasm_bindgen(js_class=ReadOperation)] impl ReadOperationWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs b/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs index b09d6005000..ffa27dc4723 100644 --- a/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs +++ b/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs @@ -23,6 +23,12 @@ impl From for SignatureVerificationOperationWasm } } +impl From for SignatureVerificationOperation { + fn from(value: SignatureVerificationOperationWasm) -> Self { + value.0 + } +} + #[wasm_bindgen(js_class=SignatureVerificationOperation)] impl SignatureVerificationOperationWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/state_transition/mod.rs b/packages/wasm-dpp/src/state_transition/mod.rs index 2916d16696f..1dc022b9d63 100644 --- a/packages/wasm-dpp/src/state_transition/mod.rs +++ b/packages/wasm-dpp/src/state_transition/mod.rs @@ -1,5 +1,6 @@ use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; +use dpp::state_transition::fee::operations::Operation; use wasm_bindgen::prelude::*; pub mod errors; @@ -8,7 +9,9 @@ pub mod state_transition_factory; pub mod fee; pub mod validation; +use crate::state_transition::conversion::create_operation_from_wasm_instance; use crate::utils::Inner; +pub use fee::*; pub use validation::*; pub(crate) mod conversion; @@ -69,6 +72,30 @@ impl StateTransitionExecutionContextWasm { pub fn disable_dry_run(&self) { self.0.disable_dry_run(); } + + #[wasm_bindgen(js_name=addOperation)] + pub fn add_operation(&self, operation: JsValue) -> Result<(), JsValue> { + let operation = create_operation_from_wasm_instance(&operation)?; + self.0.add_operation(operation); + Ok(()) + } + + #[wasm_bindgen(js_name=getOperations)] + pub fn get_operation(&self) -> Vec { + let operations = self.0.get_operations(); + operations + .iter() + .map(|operation| match operation { + Operation::PreCalculated(operation) => { + PreCalculatedOperationWasm::from(operation.to_owned()).into() + } + Operation::Read(operation) => ReadOperationWasm::from(operation.to_owned()).into(), + Operation::SignatureVerification(operation) => { + SignatureVerificationOperationWasm::from(operation.to_owned()).into() + } + }) + .collect() + } } impl Inner for StateTransitionExecutionContextWasm { diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index 5e5fa73a8e7..51c4e867a1f 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -22,7 +22,11 @@ impl ValidationResultWasm { /// remove before shipping #[wasm_bindgen(js_name=errorsText)] pub fn errors_text(&self) -> Vec { - self.0.errors.iter().map(|e| e.to_string().into()).collect() + self.0 + .errors() + .iter() + .map(|e| e.to_string().into()) + .collect() } #[wasm_bindgen(js_name=isValid)] @@ -32,7 +36,11 @@ impl ValidationResultWasm { #[wasm_bindgen(js_name=getErrors)] pub fn errors(&self) -> Vec { - self.0.errors.iter().map(from_consensus_error_ref).collect() + self.0 + .errors() + .iter() + .map(from_consensus_error_ref) + .collect() } #[wasm_bindgen(js_name=getData)] diff --git a/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js b/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js index ac0a4d484d0..8124b8c688f 100644 --- a/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js +++ b/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js @@ -1,4 +1,5 @@ const getDataContractJSFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); +const crypto = require('crypto'); const getBlsAdapterMock = require('../../../lib/test/mocks/getBlsAdapterMock'); const { default: loadWasmDpp } = require('../../..'); @@ -24,7 +25,9 @@ describe('DataContractFacade', () => { beforeEach(async () => { blsAdapter = await getBlsAdapterMock(); - dpp = new DashPlatformProtocol(1, blsAdapter); + dpp = new DashPlatformProtocol( + blsAdapter, {}, { generate: () => crypto.randomBytes(32) }, 1, + ); dataContractJs = await getDataContractJSFixture(); rawDataContract = dataContractJs.toObject(); diff --git a/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js index b9af33a9662..6418baaf2bf 100644 --- a/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js @@ -127,6 +127,7 @@ describe('validateDataContractCreateTransitionBasicFactory', () => { it('should be valid', async () => { const result = await validateDataContractCreateTransitionBasic(rawStateTransition); + console.log(result.errorsText()); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); }); diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index a9d11a8c7be..f9dc489e2a1 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -53,6 +53,8 @@ describe('ExtendedDocument', () => { it('should return raw document - Rust', () => { const result = document.toObject(); + console.log(document.get('byteArrayField')); + expect(result).to.deep.equal({ $protocolVersion: document.getProtocolVersion(), $dataContractId: dataContract.getId().toBuffer(), diff --git a/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js b/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js index 860f8c20f29..a330bef2fd4 100644 --- a/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js +++ b/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js @@ -1,3 +1,4 @@ +const crypto = require('crypto'); const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); @@ -45,7 +46,12 @@ describe('DocumentFacade', () => { stateRepositoryMock.fetchDataContract.resolves(dataContract); blsAdapter = await getBlsAdapterMock(); - dpp = new DashPlatformProtocol(blsAdapter, stateRepositoryMock, 1); + dpp = new DashPlatformProtocol( + blsAdapter, + stateRepositoryMock, + { generate: () => crypto.randomBytes(32) }, + 1, + ); documentsJs = getDocumentsFixture(dataContractJs); documents = documentsJs.map((d) => { diff --git a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js index 4f4e96f96e5..b2ccef02df2 100644 --- a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +++ b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js @@ -31,6 +31,7 @@ describe('DocumentBatchTransition', () => { DocumentValidator, } = await loadWasmDpp()); + console.log(ExtendedDocument); const dataContractFixtureJs = getDataContractFixture(); dataContractFixtureJs.documents.niceDocument diff --git a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js index b71a98e929c..a0df164b1a6 100644 --- a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js @@ -637,6 +637,7 @@ describe('validateDocumentsBatchTransitionBasicFactory', () => { ); const [error] = result.getErrors(); + console.log(error.toString()); await expectValidationError(result, InvalidDocumentTransitionIdError); diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index 2b873a88062..07cfc552ab9 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -1,3 +1,4 @@ +const crypto = require('crypto'); const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); @@ -21,7 +22,7 @@ describe('IdentityFacade', () => { let IdentityCreateTransition; let IdentityTopUpTransition; let IdentityUpdateTransition; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; let ChainAssetLockProof; let DashPlatformProtocol; let ValidationResult; @@ -29,7 +30,7 @@ describe('IdentityFacade', () => { before(async () => { ({ Identity, InstantAssetLockProof, ChainAssetLockProof, IdentityUpdateTransition, - IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyWithWitness, + IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyCreateTransition, DashPlatformProtocol, ValidationResult, } = await loadWasmDpp()); }); @@ -43,7 +44,12 @@ describe('IdentityFacade', () => { height: 42, }); - dpp = new DashPlatformProtocol(getBlsAdapterMock(), stateRepositoryMock, 1); + dpp = new DashPlatformProtocol( + getBlsAdapterMock(), + stateRepositoryMock, + { generate: () => crypto.randomBytes(32) }, + 1, + ); const chainAssetLockProofJS = getChainAssetLockProofFixture(); const instantAssetLockProofJS = getInstantAssetLockProofFixture(); @@ -183,7 +189,7 @@ describe('IdentityFacade', () => { describe('#createIdentityUpdateTransition', () => { it('should create IdentityUpdateTransition from identity id and public keys', () => { const publicKeys = { - add: [new IdentityPublicKeyWithWitness({ + add: [new IdentityPublicKeyCreateTransition({ id: 3, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'), diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index 761e8fec658..261a2efa2b4 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -12,7 +12,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { let stateTransition; let stateRepositoryMock; - let mockIdentityPublicKeyWithWitness; + let mockIdentityPublicKeyCreateTransition; let executionContext; let validateIdentityCreateTransitionBasic; @@ -26,7 +26,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { let InvalidIdentityPublicKeyDataError; let InvalidIdentityKeySignatureError; let IdentityCreateTransitionBasicValidator; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; before(async () => { ({ @@ -37,13 +37,13 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { InvalidIdentityPublicKeySecurityLevelError, InvalidIdentityPublicKeyDataError, InvalidIdentityKeySignatureError, - IdentityPublicKeyWithWitness, + IdentityPublicKeyCreateTransition, IdentityCreateTransitionBasicValidator, IdentityPublicKey, } = await loadWasmDpp()); - mockIdentityPublicKeyWithWitness = (publicKey, opts = {}) => ( - new IdentityPublicKeyWithWitness({ + mockIdentityPublicKeyCreateTransition = (publicKey, opts = {}) => ( + new IdentityPublicKeyCreateTransition({ id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: publicKey, @@ -74,7 +74,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const privateKey = new PrivateKey('9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2'); const publicKey = privateKey.toPublicKey(); - const identityPublicKey = mockIdentityPublicKeyWithWitness(publicKey.toBuffer()); + const identityPublicKey = mockIdentityPublicKeyCreateTransition(publicKey.toBuffer()); stateTransition.setPublicKeys([identityPublicKey]); @@ -299,7 +299,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const privateKey = new PrivateKey(); // Mess up public key - const identityPublicKey = mockIdentityPublicKeyWithWitness(Buffer.alloc(33)); + const identityPublicKey = mockIdentityPublicKeyCreateTransition(Buffer.alloc(33)); stateTransition.setPublicKeys([identityPublicKey]); await stateTransition.signByPrivateKey( @@ -323,7 +323,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const privateKey = new PrivateKey(); // Mess up public key's purpose - const identityPublicKey = mockIdentityPublicKeyWithWitness( + const identityPublicKey = mockIdentityPublicKeyCreateTransition( privateKey.toPublicKey().toBuffer(), ); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js index c3305245f8d..8b711df8f36 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js @@ -12,7 +12,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { let publicKeyToAdd; let IdentityPublicKey; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; let UnsupportedProtocolVersionError; let InvalidIdentityKeySignatureError; let DuplicatedIdentityPublicKeyIdStateError; @@ -24,7 +24,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { InvalidIdentityKeySignatureError, DuplicatedIdentityPublicKeyIdStateError, IdentityPublicKey, - IdentityPublicKeyWithWitness, + IdentityPublicKeyCreateTransition, IdentityUpdateTransitionBasicValidator, } = await loadWasmDpp()); }); @@ -49,7 +49,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { readOnly: false, }); - let identityPublicKeyCreateTransition = new IdentityPublicKeyWithWitness({ + let identityPublicKeyCreateTransition = new IdentityPublicKeyCreateTransition({ ...identityPublicKey.toObject(), signature: Buffer.alloc(0), }); @@ -312,7 +312,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { const privateKey = new PrivateKey(); const publicKey = privateKey.toPublicKey(); - const identityPublicKeyCreateTransition = new IdentityPublicKeyWithWitness( + const identityPublicKeyCreateTransition = new IdentityPublicKeyCreateTransition( publicKeyToAdd, ); identityPublicKeyCreateTransition.setData(publicKey.toBuffer()); @@ -384,8 +384,8 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { const keyWithDupeId = { ...publicKeyToAdd, data: Buffer.alloc(33) }; stateTransition.setPublicKeysToAdd([ - new IdentityPublicKeyWithWitness(publicKeyToAdd), - new IdentityPublicKeyWithWitness(keyWithDupeId), + new IdentityPublicKeyCreateTransition(publicKeyToAdd), + new IdentityPublicKeyCreateTransition(keyWithDupeId), ]); rawStateTransition = stateTransition.toObject(); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js index b776d0610d6..7154af874d4 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js @@ -18,7 +18,7 @@ describe('validatePublicKeySignaturesFactory', () => { let IdentityCreateTransition; let IdentityPublicKey; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; let InvalidIdentityKeySignatureError; let ValidationResult; let PublicKeysSignaturesValidator; @@ -28,7 +28,7 @@ describe('validatePublicKeySignaturesFactory', () => { ({ IdentityCreateTransition, IdentityPublicKey, - IdentityPublicKeyWithWitness, + IdentityPublicKeyCreateTransition, InvalidIdentityKeySignatureError, PublicKeysSignaturesValidator, ValidationResult, @@ -43,7 +43,7 @@ describe('validatePublicKeySignaturesFactory', () => { const privateKey1 = new PrivateKey('17e0b1703e226204c557bce68b0871683ea409ae90c7a733b72a33f7c129c959'); const publicKey1 = privateKey1.toPublicKey(); - const identityPublicKey1 = new IdentityPublicKeyWithWitness({ + const identityPublicKey1 = new IdentityPublicKeyCreateTransition({ id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: publicKey1.toBuffer(), @@ -56,7 +56,7 @@ describe('validatePublicKeySignaturesFactory', () => { const privateKey2 = new PrivateKey('afc20afac882f676af5a268a2eca9c763996c36dbeb3660648df2108006820c7'); const publicKey2 = privateKey2.toPublicKey(); - const identityPublicKey2 = new IdentityPublicKeyWithWitness({ + const identityPublicKey2 = new IdentityPublicKeyCreateTransition({ id: 1, type: IdentityPublicKey.TYPES.ECDSA_HASH160, data: Hash.sha256ripemd160(publicKey2.toBuffer()), @@ -75,7 +75,7 @@ describe('validatePublicKeySignaturesFactory', () => { const privateKey3 = BasicSchemeMPL.keyGen(randomBytes); const publicKey3 = privateKey3.getG1(); - const identityPublicKey3 = new IdentityPublicKeyWithWitness({ + const identityPublicKey3 = new IdentityPublicKeyCreateTransition({ id: 2, type: IdentityPublicKey.TYPES.BLS12_381, data: Buffer.from(publicKey3.serialize()), diff --git a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js index 81936a835e6..e0af52de689 100644 --- a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js +++ b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js @@ -1,4 +1,5 @@ const { PrivateKey } = require('@dashevo/dashcore-lib'); +const crypto = require('crypto'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); @@ -108,7 +109,12 @@ describe('StateTransitionFacade', () => { const blsAdapter = await getBlsAdapterMock(); - dpp = new DashPlatformProtocol(blsAdapter, stateRepositoryMock, 1); + dpp = new DashPlatformProtocol( + blsAdapter, + stateRepositoryMock, + { generate: () => crypto.randomBytes(32) }, + 1, + ); }); describe('createFromObject', () => { diff --git a/packages/wasm-dpp/test/unit/DashPlatformProtocol.spec.js b/packages/wasm-dpp/test/unit/DashPlatformProtocol.spec.js index 4e84d029075..05e88638cdc 100644 --- a/packages/wasm-dpp/test/unit/DashPlatformProtocol.spec.js +++ b/packages/wasm-dpp/test/unit/DashPlatformProtocol.spec.js @@ -1,3 +1,4 @@ +const crypto = require('crypto'); const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); const createStateRepositoryMock = require('../../lib/test/mocks/createStateRepositoryMock'); @@ -16,6 +17,7 @@ describe('DashPlatformProtocol', () => { dpp = new DashPlatformProtocol( getBlsAdapterMock(), stateRepositoryMock, + { generate: () => crypto.randomBytes(32) }, protocolVersion.latestVersion, ); }); diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js index f9d85440046..b2b3849fd18 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js @@ -23,6 +23,8 @@ describe('findDuplicatesById', () => { it('should return duplicated Documents', () => { rawDocumentTransitions.push(rawDocumentTransitions[0]); + console.dir(rawDocumentTransitions[0]); + const result = findDuplicatesById(rawDocumentTransitions); expect(result).to.be.an('array'); diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js index 7f1182c6da0..f4e9da79b90 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js @@ -106,7 +106,6 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(blockTime); stateRepositoryMock.fetchExtendedDocuments.resolves([]); - stateRepositoryMock.fetchDocuments.resolves([]); executeDataTriggersMock = this.sinonSandbox.stub(); validateDocumentsUniquenessByIndicesMock = this.sinonSandbox.stub(); @@ -139,7 +138,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { }); it('should return invalid result if document transition with action "create" is already present - Rust', async () => { - stateRepositoryMock.fetchDocuments.resolves([documents[0].getDocument()]); + stateRepositoryMock.fetchExtendedDocuments.resolves([documents[0]]); const result = await validateDocumentsBatchTransitionState( stateRepositoryMock, stateTransition, @@ -183,7 +182,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchDocuments) + expect(stateRepositoryMock.fetchExtendedDocuments) .to.have.been.callCount(documentTransitionsJs.length); }); @@ -214,7 +213,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchDocuments).to.have.been + expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been .callCount(documentTransitionsJs.length); }); @@ -234,7 +233,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { }, [dataContract]); documents[0].setCreatedAt(replaceDocument.getCreatedAt().getMilliseconds()); - stateRepositoryMock.fetchDocuments.resolves([documents[0].getDocument()]); + stateRepositoryMock.fetchExtendedDocuments.resolves([documents[0]]); const result = await validateDocumentsBatchTransitionState( stateRepositoryMock, stateTransition, @@ -253,7 +252,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchDocuments).to.have.been + expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been .callCount(documentTransitionsJs.length); }); @@ -275,7 +274,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { transitions: documentTransitionsJs.map((t) => t.toObject()), }, [dataContract]); - stateRepositoryMock.fetchDocuments.resolves([fetchedDocument.getDocument()]); + stateRepositoryMock.fetchExtendedDocuments.resolves([fetchedDocument]); const result = await validateDocumentsBatchTransitionState( stateRepositoryMock, @@ -296,7 +295,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchDocuments).to.have.been + expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been .callCount(documentTransitionsJs.length); }); @@ -599,11 +598,11 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { it('should return valid result if document transitions are valid - Rust', async () => { const fetchedDocuments = [ - new ExtendedDocument(documentsJs[1].toObject(), dataContract).getDocument(), - new ExtendedDocument(documentsJs[2].toObject(), dataContract).getDocument(), + new ExtendedDocument(documentsJs[1].toObject(), dataContract), + new ExtendedDocument(documentsJs[2].toObject(), dataContract), ]; - stateRepositoryMock.fetchDocuments.resolves(fetchedDocuments); + stateRepositoryMock.fetchExtendedDocuments.resolves(fetchedDocuments); documentsJs[1].setRevision(1); documentsJs[2].setRevision(1); @@ -631,16 +630,16 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchDocuments).to.have.been.calledOnce(); + expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been.calledOnce(); }); it('should return valid result if document transitions are valid - Rust', async () => { const fetchedDocuments = [ - new ExtendedDocument(documentsJs[1].toObject(), dataContract).getDocument(), - new ExtendedDocument(documentsJs[2].toObject(), dataContract).getDocument(), + new ExtendedDocument(documentsJs[1].toObject(), dataContract), + new ExtendedDocument(documentsJs[2].toObject(), dataContract), ]; - stateRepositoryMock.fetchDocuments.resolves(fetchedDocuments); + stateRepositoryMock.fetchExtendedDocuments.resolves(fetchedDocuments); documentsJs[1].setRevision(1); documentsJs[2].setRevision(1); @@ -668,6 +667,6 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchDocuments).to.have.been.calledOnce(); + expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been.calledOnce(); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index 1c9ccfaa9a6..d50f8a1541e 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -19,7 +19,7 @@ describe('IdentityFactory', () => { let IdentityCreateTransition; let IdentityTopUpTransition; let IdentityUpdateTransition; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; let InvalidIdentityError; let PlatformValueError; let UnsupportedProtocolVersionError; @@ -29,7 +29,7 @@ describe('IdentityFactory', () => { ({ Identity, IdentityFactory, IdentityValidator, InstantAssetLockProof, ChainAssetLockProof, IdentityUpdateTransition, - IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyWithWitness, + IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyCreateTransition, InvalidIdentityError, UnsupportedProtocolVersionError, PlatformValueError, } = await loadWasmDpp()); }); @@ -235,7 +235,7 @@ describe('IdentityFactory', () => { it('should create IdentityUpdateTransition', () => { const revision = 1; const disablePublicKeys = [identity.getPublicKeyById(0)]; - const addPublicKeys = [new IdentityPublicKeyWithWitness({ + const addPublicKeys = [new IdentityPublicKeyCreateTransition({ id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'), diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 2172245c2e9..3566ea1dc98 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -15,7 +15,7 @@ describe('IdentityCreateTransition', () => { let KeyPurpose; let KeySecurityLevel; let Identifier; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -31,7 +31,7 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ IdentityCreateTransition, - IdentityPublicKeyWithWitness, + IdentityPublicKeyCreateTransition, KeyType, KeyPurpose, KeySecurityLevel, @@ -53,7 +53,7 @@ describe('IdentityCreateTransition', () => { ); expect(stateTransition.publicKeys.map((key) => key.toObject())).to.deep.equal([ - new IdentityPublicKeyWithWitness(rawStateTransition.publicKeys[0]).toObject(), + new IdentityPublicKeyCreateTransition(rawStateTransition.publicKeys[0]).toObject(), ]); }); @@ -104,8 +104,8 @@ describe('IdentityCreateTransition', () => { describe('#setPublicKeys', () => { it('should set public keys', () => { const publicKeys = [ - new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 0 })), - new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 1 })), + new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 0 })), + new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 1 })), ]; stateTransition.setPublicKeys(publicKeys); @@ -119,7 +119,7 @@ describe('IdentityCreateTransition', () => { it('should return set public keys', () => { expect(stateTransition.getPublicKeys().map((key) => key.toObject())).to.deep.equal( rawStateTransition.publicKeys - .map((rawPublicKey) => new IdentityPublicKeyWithWitness(rawPublicKey).toObject()), + .map((rawPublicKey) => new IdentityPublicKeyCreateTransition(rawPublicKey).toObject()), ); }); }); @@ -127,8 +127,8 @@ describe('IdentityCreateTransition', () => { describe('#addPublicKeys', () => { it('should add more public keys', () => { const publicKeys = [ - new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 0 })), - new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 1 })), + new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 0 })), + new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 1 })), ]; stateTransition.setPublicKeys([]); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js index a4638f662fb..c3210650134 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js @@ -15,13 +15,13 @@ describe('IdentityUpdateTransition', () => { let IdentityPublicKey; let Identifier; - let IdentityPublicKeyWithWitness; + let IdentityPublicKeyCreateTransition; before(async () => { ({ IdentityPublicKey, Identifier, - IdentityPublicKeyWithWitness, + IdentityPublicKeyCreateTransition, } = await loadWasmDpp()); }); @@ -81,14 +81,14 @@ describe('IdentityUpdateTransition', () => { expect(stateTransition.getPublicKeysToAdd().map((key) => key.toObject())) .to.deep.equal( rawStateTransition.addPublicKeys - .map((rawPublicKey) => new IdentityPublicKeyWithWitness(rawPublicKey).toObject()), + .map((rawPublicKey) => new IdentityPublicKeyCreateTransition(rawPublicKey).toObject()), ); }); }); describe('#setPublicKeysToAdd', () => { it('should set public keys to add', () => { - const publicKeys = [new IdentityPublicKeyWithWitness({ + const publicKeys = [new IdentityPublicKeyCreateTransition({ id: 0, type: IdentityPublicKey.TYPES.BLS12_381, purpose: 0, diff --git a/packages/wasm-dpp/test/unit/stateTransition/StateTransitionExecutionContext.spec.js b/packages/wasm-dpp/test/unit/stateTransition/StateTransitionExecutionContext.spec.js new file mode 100644 index 00000000000..7975bd4690c --- /dev/null +++ b/packages/wasm-dpp/test/unit/stateTransition/StateTransitionExecutionContext.spec.js @@ -0,0 +1,52 @@ +const { expect } = require('chai'); +const { default: loadWasmDpp } = require('../../../dist'); + +describe('StateTransitionExecutionContext', () => { + let ReadOperation; + let PreCalculatedOperation; + let SignatureVerificationOperation; + let StateTransitionExecutionContext; + + let executionContext; + + before(async () => { + ({ + ReadOperation, + PreCalculatedOperation, + SignatureVerificationOperation, + StateTransitionExecutionContext, + } = await loadWasmDpp()); + }); + + beforeEach(() => { + executionContext = new StateTransitionExecutionContext(); + }); + + describe('should add operation', () => { + it('should add ReadOperation', () => { + executionContext.addOperation(new ReadOperation(100)); + const operations = executionContext.getOperations(); + expect(operations[0]).to.be.instanceOf(ReadOperation); + }); + + it('should add SignatureVerificationOperation', () => { + executionContext.addOperation(new SignatureVerificationOperation(0)); + const operations = executionContext.getOperations(); + expect(operations[0]).to.be.instanceOf(SignatureVerificationOperation); + }); + + it('should add PreCalculatedOperation', () => { + executionContext.addOperation(new PreCalculatedOperation(1, 1, [])); + const operations = executionContext.getOperations(); + expect(operations[0]).to.be.instanceOf(PreCalculatedOperation); + }); + + it('should throw Error for unknown operation', () => { + try { + executionContext.addOperation({}); + } catch (e) { + expect(e.message).to.equal('Unknown operation'); + } + }); + }); +}); From 13c8d34637067c9ee7351b5089112284c57bb6f1 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 16:57:18 +0500 Subject: [PATCH 2/8] chore: update `rs-dpp` package --- .../src/contracts/withdrawals_contract.rs | 2 +- .../src/data_contract/data_contract_facade.rs | 22 +- .../document_type/document_type.rs | 10 - .../data_contract_create_transition/mod.rs | 4 - ...e_data_contract_create_transition_basic.rs | 4 +- ...e_data_contract_create_transition_state.rs | 33 +-- .../data_contract_update_transition/mod.rs | 4 - ...e_data_contract_update_transition_basic.rs | 4 +- ...alidate_indices_are_backward_compatible.rs | 6 +- ...e_data_contract_update_transition_state.rs | 19 +- .../validation/data_contract_validator.rs | 27 +- .../validation/multi_validator.rs | 20 +- .../validate_data_contract_max_depth.rs | 7 +- .../rs-dpp/src/document/document_facade.rs | 23 +- .../rs-dpp/src/document/document_factory.rs | 7 +- .../rs-dpp/src/document/document_validator.rs | 15 +- .../fetch_and_validate_data_contract.rs | 2 +- packages/rs-dpp/src/document/mod.rs | 1 - ...pply_documents_batch_transition_factory.rs | 13 +- .../document_transition/mod.rs | 12 - .../documents_batch_transition/mod.rs | 7 - ...lidate_documents_batch_transition_basic.rs | 19 +- .../validate_partial_compound_indices.rs | 10 +- .../validation/state/execute_data_triggers.rs | 4 +- .../state/fetch_documents_factory.rs | 0 .../state/fetch_extended_documents.rs | 76 +++++ .../validation/state/mod.rs | 2 +- ...lidate_documents_batch_transition_state.rs | 273 ++++++------------ ...alidate_documents_uniqueness_by_indices.rs | 20 +- packages/rs-dpp/src/errors/dpp_error.rs | 8 +- packages/rs-dpp/src/errors/errors.rs | 18 +- .../rs-dpp/src/errors/non_consensus_error.rs | 7 +- .../rs-dpp/src/identity/identity_facade.rs | 4 +- ...in_asset_lock_proof_structure_validator.rs | 24 +- ...nt_asset_lock_proof_structure_validator.rs | 8 +- .../state_transition/asset_lock_proof/mod.rs | 103 +------ .../identity_create_transition.rs | 6 + .../identity_create_transition/mod.rs | 2 - ...ntity_create_transition_basic_validator.rs | 4 +- .../validation/state/mod.rs | 30 +- .../mod.rs | 4 - ...tity_credit_withdrawal_transition_basic.rs | 5 +- ...tity_credit_withdrawal_transition_state.rs | 59 +--- .../identity_topup_transition/mod.rs | 2 - ...entity_topup_transition_basic_validator.rs | 4 +- .../validation/state/mod.rs | 29 +- .../identity_update_transition/mod.rs | 2 - ...lidate_identity_update_transition_state.rs | 22 +- .../identity/validation/identity_validator.rs | 4 +- .../validation/public_keys_validator.rs | 10 +- ...ed_purpose_and_security_level_validator.rs | 6 +- packages/rs-dpp/src/state_transition/mod.rs | 2 - .../state_transition_facade.rs | 36 +-- .../validate_state_transition_basic.rs | 6 +- .../validate_state_transition_by_type.rs | 5 +- .../validate_state_transition_fee.rs | 2 +- ...ate_state_transition_identity_signature.rs | 6 +- ...validate_state_transition_key_signature.rs | 7 +- .../validate_state_transition_state.rs | 56 ++-- ...te_indices_are_backward_compatible_spec.rs | 28 +- .../data_contract_validator_spec.rs | 14 +- ...e_documents_batch_transition_state_spec.rs | 37 +-- ..._documents_batch_transitions_basic_spec.rs | 12 +- ...te_documents_uniqueness_by_indices_spec.rs | 22 +- .../validate_partial_compound_indices_spec.rs | 9 +- .../fixtures/public_keys_validator_mock.rs | 14 +- .../asset_lock/instant/mod.rs | 13 +- ..._create_transition_basic_validator_spec.rs | 12 +- ...e_identity_credit_withdrawal_state_spec.rs | 21 +- ...e_identity_update_transition_basic_spec.rs | 4 +- ...e_identity_update_transition_state_spec.rs | 2 +- .../validation/public_keys_validator_spec.rs | 12 +- ...rpose_and_security_level_validator_spec.rs | 4 +- .../rs-dpp/src/tests/utils/error_helpers.rs | 10 +- packages/rs-dpp/src/tests/utils/utils.rs | 8 +- .../src/validation/json_schema_validator.rs | 20 +- packages/rs-dpp/src/validation/mod.rs | 7 +- .../src/validation/validation_result.rs | 71 ++--- .../src/version/protocol_version_validator.rs | 7 +- 79 files changed, 556 insertions(+), 898 deletions(-) create mode 100644 packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_documents_factory.rs create mode 100644 packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs diff --git a/packages/rs-dpp/src/contracts/withdrawals_contract.rs b/packages/rs-dpp/src/contracts/withdrawals_contract.rs index c8ab1dcb4bd..c397debfa9b 100644 --- a/packages/rs-dpp/src/contracts/withdrawals_contract.rs +++ b/packages/rs-dpp/src/contracts/withdrawals_contract.rs @@ -17,7 +17,7 @@ pub mod property_names { pub const POOLING: &str = "pooling"; pub const OUTPUT_SCRIPT: &str = "outputScript"; pub const STATUS: &str = "status"; - pub const CREATED_AT: &str = "$createdAt"; + pub const CREATE_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; pub const OWNER_ID: &str = "$ownerId"; } diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index eb72e61f607..a6450c9c6d2 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -2,8 +2,8 @@ use crate::data_contract::contract_config::ContractConfig; use crate::data_contract::validation::data_contract_validator::DataContractValidator; use crate::data_contract::{DataContract, DataContractFactory}; -use crate::prelude::Identifier; -use crate::validation::SimpleValidationResult; +use crate::prelude::{Identifier, ValidationResult}; +use crate::util::entropy_generator::EntropyGenerator; use crate::version::ProtocolVersionValidator; use crate::ProtocolError; use platform_value::Value; @@ -29,6 +29,22 @@ impl DataContractFacade { } } + pub fn new_with_entropy_generator( + protocol_version: u32, + protocol_version_validator: Arc, + entropy_generator: Box, + ) -> Self { + let validator = Arc::new(DataContractValidator::new(protocol_version_validator)); + Self { + factory: DataContractFactory::new_with_entropy_generator( + protocol_version, + validator.clone(), + entropy_generator, + ), + data_contract_validator: validator, + } + } + /// Create Data Contract pub fn create( &self, @@ -88,7 +104,7 @@ impl DataContractFacade { pub async fn validate( &self, data_contract: Value, - ) -> Result { + ) -> Result, ProtocolError> { self.data_contract_validator.validate(&data_contract) } } diff --git a/packages/rs-dpp/src/data_contract/document_type/document_type.rs b/packages/rs-dpp/src/data_contract/document_type/document_type.rs index fe1844aa09d..a59b16000ad 100644 --- a/packages/rs-dpp/src/data_contract/document_type/document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/document_type.rs @@ -8,8 +8,6 @@ use super::{ use crate::data_contract::document_type::{property_names, ArrayFieldType}; use crate::data_contract::errors::{DataContractError, StructureError}; -use crate::document::document_transition::INITIAL_REVISION; -use crate::prelude::Revision; use crate::ProtocolError; use platform_value::btreemap_extensions::{BTreeValueMapHelper, BTreeValueRemoveFromMapHelper}; use platform_value::Value; @@ -339,14 +337,6 @@ impl DocumentType { pub fn field_can_be_null(&self, name: &str) -> bool { !self.required_fields.contains(name) } - - pub fn initial_revision(&self) -> Option { - if self.documents_mutable { - Some(INITIAL_REVISION) - } else { - None - } - } } pub fn string_to_field_type(field_type_name: &str) -> Option { diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index ddab89c8744..82bc16a2b53 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -21,12 +21,8 @@ use crate::{ use super::property_names::*; -mod action; pub mod apply_data_contract_create_transition_factory; pub mod validation; -pub use action::{ - DataContractCreateTransitionAction, DATA_CONTRACT_CREATE_TRANSITION_ACTION_VERSION, -}; pub mod property_names { pub const PROTOCOL_VERSION: &str = "protocolVersion"; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs index ed20868f5e3..0b3cfe4f0b8 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs @@ -90,11 +90,11 @@ fn validate_data_contract_create_transition_basic( { Ok(v) => v, Err(parsing_error) => { - return Ok(SimpleValidationResult::new_with_errors(vec![ + return Ok(SimpleValidationResult::new(Some(vec![ ConsensusError::ProtocolVersionParsingError(ProtocolVersionParsingError::new( parsing_error, )), - ])) + ]))) } }; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs index d38e77d853c..83ca8906bae 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs @@ -3,8 +3,6 @@ use std::convert::TryInto; use anyhow::Result; use async_trait::async_trait; -use crate::data_contract::state_transition::data_contract_create_transition::DataContractCreateTransitionAction; -use crate::validation::ValidationResult; use crate::{ data_contract::{ state_transition::data_contract_create_transition::DataContractCreateTransition, @@ -13,7 +11,7 @@ use crate::{ errors::StateError, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - validation::AsyncDataValidator, + validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}, ProtocolError, }; @@ -30,12 +28,11 @@ where SR: StateRepositoryLike, { type Item = DataContractCreateTransition; - type ResultItem = DataContractCreateTransitionAction; async fn validate( &self, data: &DataContractCreateTransition, - ) -> Result, ProtocolError> { + ) -> Result { validate_data_contract_create_transition_state(&self.state_repository, data).await } } @@ -55,7 +52,9 @@ where pub async fn validate_data_contract_create_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &DataContractCreateTransition, -) -> Result, ProtocolError> { +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); + // Data contract shouldn't exist let maybe_existing_data_contract: Option = state_repository .fetch_data_contract( @@ -67,19 +66,17 @@ pub async fn validate_data_contract_create_transition_state( .transpose() .map_err(Into::into)?; - if maybe_existing_data_contract.is_none() - || state_transition.get_execution_context().is_dry_run() - { - let action: DataContractCreateTransitionAction = state_transition.into(); - Ok(action.into()) - } else { - Ok(ValidationResult::new_with_errors(vec![ - StateError::DataContractAlreadyPresentError { - data_contract_id: state_transition.data_contract.id.to_owned(), - } - .into(), - ])) + if state_transition.get_execution_context().is_dry_run() { + return Ok(result); } + + if maybe_existing_data_contract.is_some() { + result.add_error(StateError::DataContractAlreadyPresentError { + data_contract_id: state_transition.data_contract.id.to_owned(), + }) + } + + Ok(result) } #[cfg(test)] diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 155f034805f..165bfaba1d7 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -20,12 +20,8 @@ use crate::{ use super::property_names::*; -mod action; pub mod apply_data_contract_update_transition_factory; pub mod validation; -pub use action::{ - DataContractUpdateTransitionAction, DATA_CONTRACT_UPDATE_TRANSITION_ACTION_VERSION, -}; pub mod property_names { pub const PROTOCOL_VERSION: &str = "protocolVersion"; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs index 99a083101a7..f6a57abb9c4 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs @@ -96,11 +96,11 @@ where match raw_state_transition.get_integer(property_names::PROTOCOL_VERSION) { Ok(v) => v, Err(parsing_error) => { - return Ok(SimpleValidationResult::new_with_errors(vec![ + return Ok(SimpleValidationResult::new(Some(vec![ ConsensusError::ProtocolVersionParsingError( ProtocolVersionParsingError::new(parsing_error.into()), ), - ])) + ]))) } }; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs index 654651e8a5d..c82de08cb7a 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs @@ -10,7 +10,7 @@ use crate::data_contract::document_type::IndexProperty; use crate::util::json_schema::Index; use crate::util::json_schema::JsonSchemaExt; use crate::util::json_value::JsonValueExt; -use crate::validation::SimpleValidationResult; +use crate::validation::ValidationResult; use crate::ProtocolError; use anyhow::anyhow; @@ -21,8 +21,8 @@ type JsonSchema = serde_json::Value; pub fn validate_indices_are_backward_compatible<'a>( existing_documents: impl IntoIterator, new_documents: impl IntoIterator, -) -> Result { - let mut result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let new_documents_by_type: HashMap<&DocumentType, &JsonSchema> = new_documents.into_iter().collect(); diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs index d52b558a8eb..9037bc621ce 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs @@ -4,8 +4,6 @@ use anyhow::Result; use async_trait::async_trait; use crate::consensus::basic::invalid_data_contract_version_error::InvalidDataContractVersionError; -use crate::data_contract::state_transition::data_contract_update_transition::DataContractUpdateTransitionAction; -use crate::validation::{AsyncDataValidator, ValidationResult}; use crate::{ data_contract::{ state_transition::data_contract_update_transition::DataContractUpdateTransition, @@ -14,6 +12,7 @@ use crate::{ errors::consensus::basic::BasicError, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, + validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}, ProtocolError, }; @@ -30,11 +29,10 @@ where SR: StateRepositoryLike, { type Item = DataContractUpdateTransition; - type ResultItem = DataContractUpdateTransitionAction; async fn validate( &self, state_transition: &DataContractUpdateTransition, - ) -> Result, ProtocolError> { + ) -> Result { validate_data_contract_update_transition_state(&self.state_repository, state_transition) .await } @@ -52,8 +50,8 @@ where pub async fn validate_data_contract_update_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &DataContractUpdateTransition, -) -> Result, ProtocolError> { - let mut result = ValidationResult::::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); // Data contract should exist let maybe_existing_data_contract: Option = state_repository @@ -67,8 +65,7 @@ pub async fn validate_data_contract_update_transition_state( .map_err(Into::into)?; if state_transition.execution_context.is_dry_run() { - let action: DataContractUpdateTransitionAction = state_transition.into(); - return Ok(action.into()); + return Ok(result); } let existing_data_contract: DataContract = match maybe_existing_data_contract { @@ -91,11 +88,9 @@ pub async fn validate_data_contract_update_transition_state( InvalidDataContractVersionError::new(old_version + 1, new_version), ); result.add_error(err); - Ok(result) - } else { - let action: DataContractUpdateTransitionAction = state_transition.into(); - Ok(action.into()) } + + Ok(result) } #[cfg(test)] diff --git a/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs b/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs index e1221a4e989..65d99e0e160 100644 --- a/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs +++ b/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs @@ -11,7 +11,6 @@ use crate::consensus::basic::data_contract::{ SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, }; -use crate::validation::{SimpleValidationResult, ValidationResult}; use crate::{ consensus::basic::{BasicError, IndexError}, data_contract::{ @@ -23,7 +22,7 @@ use crate::{ json_schema::{Index, JsonSchemaExt}, json_value::JsonValueExt, }, - validation::{DataValidator, JsonSchemaValidator}, + validation::{DataValidator, JsonSchemaValidator, ValidationResult}, version::ProtocolVersionValidator, ProtocolError, }; @@ -72,7 +71,7 @@ impl DataContractValidator { pub fn validate( &self, raw_data_contract: &Value, - ) -> Result { + ) -> Result, ProtocolError> { let mut result = ValidationResult::default(); trace!("validating against data contract meta validator"); @@ -170,7 +169,7 @@ fn validate_index_definitions( indices: &[Index], document_type: &str, document_schema: &JsonValue, -) -> (SimpleValidationResult, bool) { +) -> (ValidationResult<()>, bool) { let mut result = ValidationResult::default(); let mut indices_fingerprints: Vec = vec![]; @@ -263,8 +262,8 @@ fn validate_property_definition( maybe_property_definition: Option<&JsonValue>, document_type: &str, index_definition: &Index, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); // we are allowed to use unwrap as we return if some of the properties definitions is None let property_definition = maybe_property_definition.unwrap(); @@ -384,8 +383,8 @@ fn validate_not_defined_properties( properties: &HashMap<&String, Option<&JsonValue>>, index_definition: &Index, document_type: &str, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); for (property_name, definition) in properties { if definition.is_none() { result.add_error(BasicError::IndexError( @@ -404,8 +403,8 @@ fn validate_not_defined_properties( fn validate_index_naming_duplicates( indices: &[Index], document_type: &str, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); for duplicate_index in indices.iter().map(|i| &i.name).duplicates() { result.add_error(BasicError::DuplicateIndexNameError( DuplicateIndexNameError::new(document_type.to_owned(), duplicate_index.to_owned()), @@ -415,8 +414,8 @@ fn validate_index_naming_duplicates( } /// checks the limit of unique indexes defined in the data contract -fn validate_max_unique_indices(indices: &[Index], document_type: &str) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +fn validate_max_unique_indices(indices: &[Index], document_type: &str) -> ValidationResult<()> { + let mut result = ValidationResult::default(); if indices.iter().filter(|i| i.unique).count() > UNIQUE_INDEX_LIMIT { result.add_error(BasicError::IndexError( IndexError::UniqueIndicesLimitReachedError(UniqueIndicesLimitReachedError::new( @@ -433,8 +432,8 @@ fn validate_max_unique_indices(indices: &[Index], document_type: &str) -> Simple fn validate_no_system_indices( index_definition: &Index, document_type: &str, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); for property in index_definition.properties.iter() { if NOT_ALLOWED_SYSTEM_PROPERTIES.contains(&property.name.as_str()) { diff --git a/packages/rs-dpp/src/data_contract/validation/multi_validator.rs b/packages/rs-dpp/src/data_contract/validation/multi_validator.rs index 5098342789b..0e2e3adba27 100644 --- a/packages/rs-dpp/src/data_contract/validation/multi_validator.rs +++ b/packages/rs-dpp/src/data_contract/validation/multi_validator.rs @@ -2,14 +2,16 @@ use platform_value::Value; use regex::Regex; use crate::consensus::basic::data_contract::IncompatibleRe2PatternError; -use crate::consensus::{basic::BasicError, ConsensusError}; -use crate::validation::SimpleValidationResult; +use crate::{ + consensus::{basic::BasicError, ConsensusError}, + validation::ValidationResult, +}; pub type SubValidator = - fn(path: &str, key: &str, parent: &Value, value: &Value, result: &mut SimpleValidationResult); + fn(path: &str, key: &str, parent: &Value, value: &Value, result: &mut ValidationResult<()>); -pub fn validate(raw_data_contract: &Value, validators: &[SubValidator]) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +pub fn validate(raw_data_contract: &Value, validators: &[SubValidator]) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let mut values_queue: Vec<(&Value, String)> = vec![(raw_data_contract, String::from(""))]; while let Some((value, path)) = values_queue.pop() { @@ -50,7 +52,7 @@ pub fn pattern_is_valid_regex_validator( key: &str, _parent: &Value, value: &Value, - result: &mut SimpleValidationResult, + result: &mut ValidationResult<()>, ) { if key == "pattern" { if let Some(pattern) = value.as_str() { @@ -77,7 +79,7 @@ pub fn pattern_is_valid_regex_validator( fn unwrap_error_to_result<'a, 'b>( v: Result, ConsensusError>, - result: &'b mut SimpleValidationResult, + result: &'b mut ValidationResult<()>, ) -> Option<&'a Value> { match v { Ok(v) => v, @@ -93,7 +95,7 @@ pub fn byte_array_has_no_items_as_parent_validator( key: &str, parent: &Value, value: &Value, - result: &mut SimpleValidationResult, + result: &mut ValidationResult<()>, ) { if key == "byteArray" && value.is_bool() @@ -148,7 +150,7 @@ mod test { } ); let mut result = validate(&schema, &[byte_array_has_no_items_as_parent_validator]); - assert_eq!(2, result.errors.len()); + assert_eq!(2, result.errors().len()); let first_error = get_basic_error(result.errors.pop().unwrap()); let second_error = get_basic_error(result.errors.pop().unwrap()); diff --git a/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs b/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs index beba9bd4c9e..dae02556bd0 100644 --- a/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs +++ b/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs @@ -2,13 +2,12 @@ use platform_value::Value; use std::collections::BTreeSet; use crate::consensus::basic::data_contract::InvalidJsonSchemaRefError; -use crate::validation::SimpleValidationResult; -use crate::{consensus::basic::BasicError, ProtocolError}; +use crate::{consensus::basic::BasicError, validation::ValidationResult, ProtocolError}; const MAX_DEPTH: usize = 500; -pub fn validate_data_contract_max_depth(data_contract_object: &Value) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +pub fn validate_data_contract_max_depth(data_contract_object: &Value) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let schema_depth = match calc_max_depth(data_contract_object) { Ok(depth) => depth, Err(err) => { diff --git a/packages/rs-dpp/src/document/document_facade.rs b/packages/rs-dpp/src/document/document_facade.rs index 020aa688f2e..b37ddc2f61e 100644 --- a/packages/rs-dpp/src/document/document_facade.rs +++ b/packages/rs-dpp/src/document/document_facade.rs @@ -1,11 +1,11 @@ +use anyhow::anyhow; use platform_value::Value; use std::sync::Arc; use crate::document::ExtendedDocument; -use crate::validation::ValidationResult; use crate::{ data_contract::DataContract, prelude::Identifier, state_repository::StateRepositoryLike, - version::ProtocolVersionValidator, ProtocolError, + validation::ValidationResult, version::ProtocolVersionValidator, ProtocolError, }; use super::{ @@ -90,21 +90,20 @@ where } /// Creates Documents State Transition - pub async fn validate_extended_document( + pub async fn validate_document( &self, extended_document: &ExtendedDocument, ) -> Result, ProtocolError> { let raw_extended_document = extended_document.to_value()?; - self.validate_raw_extended_document(&raw_extended_document) - .await + self.validate_raw_document(&raw_extended_document).await } /// Creates Documents State Transition - pub async fn validate_raw_extended_document( + pub async fn validate_raw_document( &self, raw_extended_document: &Value, ) -> Result, ProtocolError> { - let mut result = self + let result = self .data_contract_fetcher_and_validator .validate_extended(raw_extended_document) .await?; @@ -113,13 +112,13 @@ where return Ok(result); } - let data_contract = result.data()?; - let validation_result = self + let data_contract = result + .data() + .ok_or_else(|| anyhow!("Data Contract for document not present"))?; + let result = self .validator .validate_extended(raw_extended_document, data_contract)?; - result.add_errors(validation_result.errors); - - Ok(result) + Ok(ValidationResult::new(Some(result.errors))) } } diff --git a/packages/rs-dpp/src/document/document_factory.rs b/packages/rs-dpp/src/document/document_factory.rs index e266ff5b8ab..aa1c99e46cc 100644 --- a/packages/rs-dpp/src/document/document_factory.rs +++ b/packages/rs-dpp/src/document/document_factory.rs @@ -6,7 +6,8 @@ use itertools::Itertools; use platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use platform_value::{Bytes32, ReplacementType, Value}; - +use rand::rngs::StdRng; +use rand::SeedableRng; use serde::{Deserialize, Serialize}; use crate::consensus::basic::document::InvalidDocumentTypeError; @@ -308,7 +309,7 @@ where raw_document: &Value, options: FactoryOptions, ) -> Result { - let result = self + let mut result = self .data_contract_fetcher_and_validator .validate_extended(raw_document) .await?; @@ -322,7 +323,7 @@ where ))); } let data_contract = result - .into_data() + .take_data() .context("Validator didn't return Data Contract. This shouldn't happen")?; if !options.skip_validation { diff --git a/packages/rs-dpp/src/document/document_validator.rs b/packages/rs-dpp/src/document/document_validator.rs index 47811854961..79a517a7c47 100644 --- a/packages/rs-dpp/src/document/document_validator.rs +++ b/packages/rs-dpp/src/document/document_validator.rs @@ -8,14 +8,13 @@ use serde_json::Value as JsonValue; use crate::consensus::basic::document::InvalidDocumentTypeError; use crate::data_contract::document_type::DocumentType; use crate::data_contract::DriveContractExt; -use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::BasicError, data_contract::{ enrich_data_contract_with_base_schema::enrich_data_contract_with_base_schema, enrich_data_contract_with_base_schema::PREFIX_BYTE_0, DataContract, }, - validation::JsonSchemaValidator, + validation::{JsonSchemaValidator, ValidationResult}, version::ProtocolVersionValidator, ProtocolError, }; @@ -50,8 +49,8 @@ impl DocumentValidator { raw_document: &JsonValue, data_contract: &DataContract, document_type: &DocumentType, - ) -> Result { - let mut result = SimpleValidationResult::default(); + ) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let enriched_data_contract = enrich_data_contract_with_base_schema( data_contract, &BASE_DOCUMENT_SCHEMA, @@ -87,8 +86,8 @@ impl DocumentValidator { &self, raw_document: &Value, data_contract: &DataContract, - ) -> Result { - let mut result = SimpleValidationResult::default(); + ) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let Some(document_type_name) = raw_document.get_optional_str(PROPERTY_DOCUMENT_TYPE).map_err(ProtocolError::ValueError)? else { result.add_error(BasicError::MissingDocumentTypeError); @@ -155,12 +154,12 @@ mod test { use test_case::test_case; use crate::tests::fixtures::get_extended_documents_fixture; - use crate::validation::SimpleValidationResult; use crate::{ codes::ErrorWithCode, consensus::{basic::JsonSchemaError, ConsensusError}, data_contract::DataContract, tests::fixtures::get_data_contract_fixture, + validation::ValidationResult, version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}, }; @@ -574,7 +573,7 @@ mod test { assert!(result.is_valid()) } - fn get_first_schema_error(result: &SimpleValidationResult) -> &JsonSchemaError { + fn get_first_schema_error(result: &ValidationResult<()>) -> &JsonSchemaError { result .errors .get(0) diff --git a/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs b/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs index 03ffb3c05e8..27a21b017a8 100644 --- a/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs +++ b/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs @@ -9,11 +9,11 @@ use crate::{ prelude::Identifier, state_repository::StateRepositoryLike, state_transition::state_transition_execution_context::StateTransitionExecutionContext, + validation::ValidationResult, ProtocolError, }; use crate::document::extended_document::property_names; -use crate::validation::ValidationResult; pub struct DataContractFetcherAndValidator { state_repository: Arc, diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index 83ff43a6755..303ef5626b9 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -7,7 +7,6 @@ mod document; pub mod document_facade; pub mod document_factory; -mod document_patch; pub mod document_validator; pub mod errors; pub mod extended_document; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs index fb208fbe71f..4dd7cef7c88 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs @@ -9,7 +9,7 @@ use crate::{ use super::{ document_transition::{Action, DocumentReplaceTransition, DocumentTransition}, - validation::state::fetch_documents::fetch_extended_documents, + validation::state::fetch_extended_documents::fetch_extended_documents, DocumentsBatchTransition, }; @@ -43,15 +43,14 @@ pub async fn apply_documents_batch_transition( state_repository: &impl StateRepositoryLike, state_transition: &DocumentsBatchTransition, ) -> Result<(), ProtocolError> { - let replace_transitions: Vec<_> = state_transition - .get_transitions_slice() - .into_iter() - .filter(|dt| dt.base().action == Action::Replace) - .collect(); + let replace_transitions = state_transition + .get_transitions() + .iter() + .filter(|dt| dt.base().action == Action::Replace); let fetched_documents = fetch_extended_documents( state_repository, - replace_transitions.as_slice(), + replace_transitions, &state_transition.execution_context, ) .await?; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs index c5aa7aadc19..04543cff022 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs @@ -10,15 +10,10 @@ use crate::{ }; use document_base_transition::DocumentBaseTransition; -mod action; pub mod document_base_transition; -mod document_base_transition_action; pub mod document_create_transition; -mod document_create_transition_action; pub mod document_delete_transition; -mod document_delete_transition_action; pub mod document_replace_transition; -mod document_replace_transition_action; use crate::identity::TimestampMillis; use crate::prelude::Revision; @@ -29,13 +24,6 @@ pub use document_replace_transition::DocumentReplaceTransition; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::Value; -pub use document_base_transition_action::DocumentBaseTransitionAction; -pub use document_create_transition_action::DocumentCreateTransitionAction; -pub use document_delete_transition_action::DocumentDeleteTransitionAction; -pub use document_replace_transition_action::DocumentReplaceTransitionAction; - -pub use action::{DocumentTransitionAction, DOCUMENT_TRANSITION_ACTION_VERSION}; - /// the initial revision of newly created document pub const INITIAL_REVISION: u64 = 1; pub const PROPERTY_ACTION: &str = "$action"; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs index bb12333312a..7df17b71f77 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs @@ -32,13 +32,10 @@ use self::document_transition::{ document_base_transition, document_create_transition, DocumentTransitionExt, }; -mod action; pub mod apply_documents_batch_transition_factory; pub mod document_transition; pub mod validation; -pub use action::{DocumentsBatchTransitionAction, DOCUMENTS_BATCH_TRANSITION_ACTION_VERSION}; - pub mod property_names { pub const TRANSITION_TYPE: &str = "type"; pub const DATA_CONTRACT_ID: &str = "$dataContractId"; @@ -260,10 +257,6 @@ impl DocumentsBatchTransition { &self.transitions } - pub fn get_transitions_slice(&self) -> &[DocumentTransition] { - self.transitions.as_slice() - } - pub fn clean_value(value: &mut Value) -> Result<(), platform_value::Error> { value.replace_at_paths(IDENTIFIER_FIELDS, ReplacementType::Identifier)?; value.replace_integer_type_at_paths(U32_FIELDS, IntegerReplacementType::U32)?; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs index dd9ef46fdbf..e80aef598c7 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs @@ -14,7 +14,6 @@ use crate::consensus::ConsensusError; use crate::data_contract::state_transition::errors::MissingDataContractIdError; use crate::document::state_transition::documents_batch_transition::property_names; use crate::document::validation::basic::find_duplicates_by_id::find_duplicates_by_id; -use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::BasicError, data_contract::{ @@ -27,7 +26,7 @@ use crate::{ prelude::Identifier, state_repository::StateRepositoryLike, state_transition::state_transition_execution_context::StateTransitionExecutionContext, - validation::JsonSchemaValidator, + validation::{JsonSchemaValidator, ValidationResult}, version::ProtocolVersionValidator, ProtocolError, }; @@ -63,7 +62,7 @@ lazy_static! { } pub trait Validator { - fn validate(&self, data: JsonValue) -> Result; + fn validate(&self, data: JsonValue) -> Result, ProtocolError>; } pub struct DocumentBatchTransitionBasicValidator { @@ -89,7 +88,7 @@ where &self, raw_state_transition: &Value, execution_context: &StateTransitionExecutionContext, - ) -> Result { + ) -> Result, ProtocolError> { // TODO: move validation code into function body to avoid cloning of state_repository validate_documents_batch_transition_basic( &self.protocol_version_validator, @@ -106,8 +105,8 @@ pub async fn validate_documents_batch_transition_basic( raw_state_transition: &Value, state_repository: Arc, execution_context: &StateTransitionExecutionContext, -) -> Result { - let mut result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let validator = JsonSchemaValidator::new(DOCUMENTS_BATCH_TRANSITIONS_SCHEMA.clone()).map_err(|e| { anyhow!( @@ -206,8 +205,8 @@ fn validate_document_transitions<'a>( data_contract: &DataContract, owner_id: Identifier, raw_document_transitions: impl IntoIterator>, -) -> Result { - let mut result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let enriched_contracts_by_action = get_enriched_contracts_by_action(data_contract)?; let validation_result = validate_raw_transitions( @@ -254,8 +253,8 @@ fn validate_raw_transitions<'a>( raw_document_transitions: impl IntoIterator>, enriched_contracts_by_action: &HashMap, owner_id: Identifier, -) -> Result { - let mut result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let mut raw_document_transitions_as_value: Vec = vec![]; let owner_id_value: Value = owner_id.into(); for mut raw_document_transition in raw_document_transitions { diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs index 0bfe140cb22..abae49bf100 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs @@ -9,15 +9,15 @@ use crate::{ consensus::basic::BasicError, data_contract::DataContract, util::json_schema::{Index, JsonSchemaExt}, - validation::SimpleValidationResult, + validation::ValidationResult, ProtocolError, }; pub fn validate_partial_compound_indices<'a>( raw_document_transitions: impl IntoIterator, data_contract: &DataContract, -) -> Result { - let mut result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); for transition in raw_document_transitions { let document_type = transition.get_str("$type")?; @@ -41,11 +41,11 @@ pub fn validate_indices( indices: &[Index], document_type: &str, raw_transition_map: &BTreeMap, -) -> SimpleValidationResult +) -> ValidationResult<()> where V: Borrow, { - let mut validation_result = SimpleValidationResult::default(); + let mut validation_result = ValidationResult::default(); for index in indices .iter() diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs index ba94443a68f..6d4b733acc4 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs @@ -9,7 +9,7 @@ use crate::{ }; pub async fn execute_data_triggers<'a, SR>( - document_transitions: &[&DocumentTransition], + document_transitions: impl IntoIterator>, context: &DataTriggerExecutionContext<'a, SR>, ) -> Result, ProtocolError> where @@ -20,7 +20,7 @@ where } pub async fn execute_data_triggers_with_custom_list<'a, SR>( - document_transitions: &[&DocumentTransition], + document_transitions: impl IntoIterator>, context: &DataTriggerExecutionContext<'a, SR>, data_triggers_list: impl IntoIterator, ) -> Result, ProtocolError> diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_documents_factory.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_documents_factory.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs new file mode 100644 index 00000000000..1e580eaf7e9 --- /dev/null +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs @@ -0,0 +1,76 @@ +use std::{ + collections::hash_map::{Entry, HashMap}, + convert::TryInto, +}; + +use futures::future::join_all; +use itertools::Itertools; +use platform_value::string_encoding::Encoding; +use serde_json::json; + +use crate::document::ExtendedDocument; +use crate::{ + document::document_transition::DocumentTransition, get_from_transition, + state_repository::StateRepositoryLike, + state_transition::state_transition_execution_context::StateTransitionExecutionContext, + ProtocolError, +}; + +pub async fn fetch_extended_documents( + state_repository: &impl StateRepositoryLike, + document_transitions: impl IntoIterator>, + execution_context: &StateTransitionExecutionContext, +) -> Result, anyhow::Error> { + let mut transitions_by_contracts_and_types: HashMap> = + HashMap::new(); + let collected_transitions: Vec<_> = document_transitions.into_iter().collect(); + + for dt in collected_transitions.iter() { + let document_transition = dt.as_ref(); + let document_type = get_from_transition!(document_transition, document_type_name); + let data_contract_id = get_from_transition!(document_transition, data_contract_id); + let unique_key = format!("{}{}", data_contract_id, document_type); + + match transitions_by_contracts_and_types.entry(unique_key) { + Entry::Vacant(v) => { + v.insert(vec![document_transition]); + } + Entry::Occupied(mut o) => o.get_mut().push(document_transition), + } + } + + let mut fetch_documents_futures = vec![]; + for (_, dts) in transitions_by_contracts_and_types { + let ids: Vec = dts + .iter() + .map(|dt| get_from_transition!(dt, id).to_string(Encoding::Base58)) + .collect(); + + let options = json!({ + "where" : [["$id", "in", ids ]], + "orderBy" : [[ "$id", "asc"]], + }); + + let future = state_repository.fetch_extended_documents( + get_from_transition!(dts[0], data_contract_id), + get_from_transition!(dts[0], document_type_name), + options, + Some(execution_context), + ); + + fetch_documents_futures.push(future); + } + let results = join_all(fetch_documents_futures).await; + + let mut documents = vec![]; + for result in results.into_iter() { + let result = result?; + let documents_from_fetch: Vec = result + .into_iter() + .map(|d| d.try_into().map_err(Into::::into)) + .try_collect()?; + documents.extend(documents_from_fetch) + } + + Ok(documents) +} diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs index 6e2a50de31d..cc9fc53d891 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs @@ -1,4 +1,4 @@ pub mod execute_data_triggers; -pub mod fetch_documents; +pub mod fetch_extended_documents; pub mod validate_documents_batch_transition_state; pub mod validate_documents_uniqueness_by_indices; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs index 97af008ff72..e9204df2034 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs @@ -5,21 +5,14 @@ use futures::future::join_all; use itertools::Itertools; use crate::data_contract::errors::DataContractNotPresentError; -use crate::document::document_transition::{ - DocumentCreateTransitionAction, DocumentDeleteTransitionAction, - DocumentReplaceTransitionAction, DocumentTransitionAction, -}; -use crate::document::state_transition::documents_batch_transition::{ - DocumentsBatchTransitionAction, DOCUMENTS_BATCH_TRANSITION_ACTION_VERSION, -}; -use crate::document::Document; +use crate::document::ExtendedDocument; use crate::validation::{AsyncDataValidator, SimpleValidationResult}; use crate::{ block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window, consensus::ConsensusError, data_trigger::DataTriggerExecutionContext, document::{ - document_transition::{DocumentTransition, DocumentTransitionExt}, + document_transition::{Action, DocumentTransition, DocumentTransitionExt}, DocumentsBatchTransition, }, prelude::{Identifier, TimestampMillis}, @@ -33,7 +26,8 @@ use crate::{ }; use super::{ - execute_data_triggers::execute_data_triggers, fetch_documents::fetch_documents, + execute_data_triggers::execute_data_triggers, + fetch_extended_documents::fetch_extended_documents, validate_documents_uniqueness_by_indices::validate_documents_uniqueness_by_indices, }; @@ -50,12 +44,11 @@ where SR: StateRepositoryLike, { type Item = DocumentsBatchTransition; - type ResultItem = DocumentsBatchTransitionAction; async fn validate( &self, data: &DocumentsBatchTransition, - ) -> Result, ProtocolError> { + ) -> Result { validate_document_batch_transition_state(&self.state_repository, data).await } } @@ -75,17 +68,17 @@ where pub async fn validate_document_batch_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &DocumentsBatchTransition, -) -> Result, ProtocolError> { - let mut result = ValidationResult::::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); let owner_id = *state_transition.get_owner_id(); let transitions_by_data_contract_id = state_transition - .get_transitions_slice() + .get_transitions() .iter() .into_group_map_by(|t| &t.base().data_contract_id); let mut futures = vec![]; - for (data_contract_id, transitions) in transitions_by_data_contract_id.iter() { + for (data_contract_id, transitions) in transitions_by_data_contract_id.into_iter() { futures.push(validate_document_transitions( state_repository, data_contract_id, @@ -94,43 +87,22 @@ pub async fn validate_document_batch_transition_state( state_transition.get_execution_context(), )) } - - let state_transition_actions = join_all(futures) - .await - .into_iter() - .collect::>>, ProtocolError>>()? - .into_iter() - .filter_map(|validation_result| { - if validation_result.has_data() { - Some(validation_result.into_data().unwrap()) - } else { - result.add_errors(validation_result.errors); - None - } - }) - .flatten() - .collect(); - - if result.is_valid() { - let batch_transition_action = DocumentsBatchTransitionAction { - version: DOCUMENTS_BATCH_TRANSITION_ACTION_VERSION, - owner_id, - transitions: state_transition_actions, - }; - Ok(ValidationResult::new_with_data(batch_transition_action)) - } else { - Ok(result) + for execution_result in join_all(futures).await { + result.merge(execution_result?); } + + Ok(result) } pub async fn validate_document_transitions( state_repository: &impl StateRepositoryLike, data_contract_id: &Identifier, owner_id: Identifier, - document_transitions: &[&DocumentTransition], + document_transitions: impl IntoIterator>, execution_context: &StateTransitionExecutionContext, -) -> Result>, ProtocolError> { - let mut result = ValidationResult::>::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); + let transitions: Vec<_> = document_transitions.into_iter().collect(); // We use temporary execution context without dry run, // because despite the dryRun, we need to get the @@ -153,56 +125,39 @@ pub async fn validate_document_transitions( execution_context.add_operations(tmp_execution_context.get_operations()); let fetched_documents = - fetch_documents(state_repository, document_transitions, execution_context).await?; + fetch_extended_documents(state_repository, &transitions, execution_context).await?; // Calculate time window for timestamp let last_header_time_millis = state_repository.fetch_latest_platform_block_time().await?; - let document_transition_actions = if !execution_context.is_dry_run() { - let document_transition_actions = document_transitions - .iter() - .filter_map(|transition| { - let validation_result = validate_transition( - transition, - &fetched_documents, - last_header_time_millis, - &owner_id, - ); - match validation_result { - Ok(validation_result) => { - if validation_result.has_data() && validation_result.is_valid() { - Some(validation_result.into_data()) - } else { - result.add_errors(validation_result.errors); - None - } - } - Err(protocol_error) => Some(Err(protocol_error)), - } - }) - .collect::, ProtocolError>>()?; + if !execution_context.is_dry_run() { + for transition in transitions.iter() { + let validation_result = validate_transition( + transition.as_ref(), + &fetched_documents, + last_header_time_millis, + &owner_id, + ); + result.merge(validation_result); + } if !result.is_valid() { return Ok(result); } - document_transition_actions - } else { - vec![] - }; + } - let validation_uniqueness_by_indices_result = validate_documents_uniqueness_by_indices( + let validation_result = validate_documents_uniqueness_by_indices( state_repository, &owner_id, - document_transitions + transitions .iter() - .filter(|d| d.as_transition_delete().is_none()) - .cloned(), + .filter(|d| d.as_ref().as_transition_delete().is_none()), &data_contract, execution_context, ) .await?; - - if !validation_uniqueness_by_indices_result.is_valid() { - result.add_errors(validation_uniqueness_by_indices_result.errors) + if !result.is_valid() { + result.merge(validation_result); + return Ok(result); } let data_trigger_execution_context = DataTriggerExecutionContext { @@ -212,7 +167,7 @@ pub async fn validate_document_transitions( state_transition_execution_context: execution_context, }; let data_trigger_execution_results = - execute_data_triggers(document_transitions, &data_trigger_execution_context).await?; + execute_data_triggers(transitions.iter(), &data_trigger_execution_context).await?; for execution_result in data_trigger_execution_results.into_iter() { if !execution_result.is_ok() { @@ -226,24 +181,18 @@ pub async fn validate_document_transitions( } } - if !result.is_valid() { - Ok(result) - } else { - Ok(document_transition_actions.into()) - } + Ok(result) } fn validate_transition( transition: &DocumentTransition, - fetched_documents: &[Document], + fetched_documents: &[ExtendedDocument], last_header_block_time_millis: u64, owner_id: &Identifier, -) -> Result, ProtocolError> { - match transition { - DocumentTransition::Create(document_create_transition) => { - let mut result = ValidationResult::::new_with_data( - DocumentTransitionAction::CreateAction(DocumentCreateTransitionAction::default()), - ); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); + match transition.base().action { + Action::Create => { let validation_result = check_if_timestamps_are_equal(transition); result.merge(validation_result); @@ -258,20 +207,8 @@ fn validate_transition( let validation_result = check_if_document_is_already_present(transition, fetched_documents); result.merge(validation_result); - - if result.is_valid() { - Ok( - DocumentTransitionAction::CreateAction(document_create_transition.into()) - .into(), - ) - } else { - Ok(result) - } } - DocumentTransition::Replace(document_replace_transition) => { - let mut result = ValidationResult::::new_with_data( - DocumentTransitionAction::ReplaceAction(DocumentReplaceTransitionAction::default()), - ); + Action::Replace => { let validation_result = check_updated_inside_time_window(transition, last_header_block_time_millis); result.merge(validation_result); @@ -280,69 +217,47 @@ fn validate_transition( result.merge(validation_result); let validation_result = check_if_document_can_be_found(transition, fetched_documents); - let original_document = if validation_result.has_data() { - validation_result.into_data()? - } else { - result.add_errors(validation_result.errors); - return Ok(result); - }; - - let validation_result = check_ownership(transition, original_document, owner_id); - result.merge(validation_result); - - if result.is_valid() { - Ok(DocumentTransitionAction::ReplaceAction( - DocumentReplaceTransitionAction::from_document_replace_transition( - document_replace_transition, - original_document.created_at, - ), - ) - .into()) - } else { - Ok(result) + if !validation_result.is_valid() { + result.merge(validation_result); + return result; } + + let validation_result = check_ownership(transition, fetched_documents, owner_id); + result.merge(validation_result); } - DocumentTransition::Delete(document_delete_transition) => { - let mut result = ValidationResult::::new_with_data( - DocumentTransitionAction::DeleteAction(DocumentDeleteTransitionAction::default()), - ); + Action::Delete => { let validation_result = check_if_document_can_be_found(transition, fetched_documents); - let original_document = if validation_result.has_data() { - validation_result.into_data()? - } else { - result.add_errors(validation_result.errors); - return Ok(result); - }; - - let validation_result = check_ownership(transition, original_document, owner_id); if !validation_result.is_valid() { - result.add_errors(validation_result.errors); + result.merge(validation_result); + return result; } - if result.is_valid() { - Ok( - DocumentTransitionAction::DeleteAction(document_delete_transition.into()) - .into(), - ) - } else { - Ok(result) - } + let validation_result = check_ownership(transition, fetched_documents, owner_id); + result.merge(validation_result); } } + result } fn check_ownership( document_transition: &DocumentTransition, - fetched_document: &Document, + fetched_documents: &[ExtendedDocument], owner_id: &Identifier, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); - if fetched_document.owner_id != owner_id { +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); + let fetched_document = match fetched_documents + .iter() + .find(|d| d.id() == document_transition.base().id) + { + Some(d) => d, + None => return result, + }; + if fetched_document.owner_id() != owner_id { result.add_error(ConsensusError::StateError(Box::new( StateError::DocumentOwnerIdMismatchError { document_id: document_transition.base().id, document_owner_id: owner_id.to_owned(), - existing_document_owner_id: fetched_document.owner_id, + existing_document_owner_id: fetched_document.owner_id(), }, ))); } @@ -351,12 +266,12 @@ fn check_ownership( fn check_revision( document_transition: &DocumentTransition, - fetched_documents: &[Document], -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); + fetched_documents: &[ExtendedDocument], +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let fetched_document = match fetched_documents .iter() - .find(|d| d.id == document_transition.base().id) + .find(|d| d.id() == document_transition.base().id) { Some(d) => d, None => return result, @@ -365,7 +280,7 @@ fn check_revision( Some(d) => d.revision, None => return result, }; - let Some(previous_revision) = fetched_document.revision else { + let Some(previous_revision) = fetched_document.revision() else { result.add_error(ConsensusError::StateError(Box::new( StateError::InvalidDocumentRevisionError { document_id: document_transition.base().id, @@ -379,7 +294,7 @@ fn check_revision( result.add_error(ConsensusError::StateError(Box::new( StateError::InvalidDocumentRevisionError { document_id: document_transition.base().id, - current_revision: Some(previous_revision), + current_revision: Some(*previous_revision), }, ))) } @@ -388,12 +303,12 @@ fn check_revision( fn check_if_document_is_already_present( document_transition: &DocumentTransition, - fetched_documents: &[Document], -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); + fetched_documents: &[ExtendedDocument], +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let maybe_fetched_document = fetched_documents .iter() - .find(|d| d.id == document_transition.base().id); + .find(|d| d.id() == document_transition.base().id); if maybe_fetched_document.is_some() { result.add_error(ConsensusError::StateError(Box::new( @@ -405,29 +320,27 @@ fn check_if_document_is_already_present( result } -fn check_if_document_can_be_found<'a>( - document_transition: &'a DocumentTransition, - fetched_documents: &'a [Document], -) -> ValidationResult<&'a Document> { +fn check_if_document_can_be_found( + document_transition: &DocumentTransition, + fetched_documents: &[ExtendedDocument], +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let maybe_fetched_document = fetched_documents .iter() - .find(|d| d.id == document_transition.base().id); + .find(|d| d.id() == document_transition.base().id); - if let Some(document) = maybe_fetched_document { - ValidationResult::new_with_data(document) - } else { - ValidationResult::new_with_errors(vec![ConsensusError::StateError(Box::new( + if maybe_fetched_document.is_none() { + result.add_error(ConsensusError::StateError(Box::new( StateError::DocumentNotFoundError { document_id: document_transition.base().id, }, - ))]) + ))) } + result } -fn check_if_timestamps_are_equal( - document_transition: &DocumentTransition, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +fn check_if_timestamps_are_equal(document_transition: &DocumentTransition) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let created_at = document_transition.get_created_at(); let updated_at = document_transition.get_updated_at(); @@ -445,8 +358,8 @@ fn check_if_timestamps_are_equal( fn check_created_inside_time_window( document_transition: &DocumentTransition, last_block_ts_millis: TimestampMillis, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let created_at = match document_transition.get_created_at() { Some(t) => t, None => return result, @@ -470,8 +383,8 @@ fn check_created_inside_time_window( fn check_updated_inside_time_window( document_transition: &DocumentTransition, last_block_ts_millis: TimestampMillis, -) -> SimpleValidationResult { - let mut result = SimpleValidationResult::default(); +) -> ValidationResult<()> { + let mut result = ValidationResult::default(); let updated_at = match document_transition.get_updated_at() { Some(t) => t, None => return result, diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs index 728651d7a30..0ef6c9a6298 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs @@ -6,13 +6,13 @@ use platform_value::string_encoding::Encoding; use serde_json::{json, Value as JsonValue}; use crate::document::Document; -use crate::validation::SimpleValidationResult; use crate::{ document::document_transition::{Action, DocumentTransition, DocumentTransitionExt}, prelude::{DataContract, Identifier}, state_repository::StateRepositoryLike, state_transition::state_transition_execution_context::StateTransitionExecutionContext, util::json_schema::{Index, JsonSchemaExt}, + validation::ValidationResult, ProtocolError, StateError, }; @@ -26,18 +26,14 @@ struct QueryDefinition<'a> { pub async fn validate_documents_uniqueness_by_indices( state_repository: &SR, owner_id: &Identifier, - document_transitions: impl Iterator, + document_transitions: impl IntoIterator>, data_contract: &DataContract, execution_context: &StateTransitionExecutionContext, -) -> Result +) -> Result, ProtocolError> where SR: StateRepositoryLike, { - let mut validation_result = SimpleValidationResult::default(); - - if execution_context.is_dry_run() { - return Ok(validation_result); - } + let mut validation_result = ValidationResult::default(); // 1. Prepare fetchDocuments queries from indexed properties for t in document_transitions { @@ -69,6 +65,10 @@ where let (futures, futures_meta) = unzip_iter_and_collect(queries); let results = join_all(futures).await; + if execution_context.is_dry_run() { + return Ok(validation_result); + } + // 3. Create errors if duplicates found let result = validate_uniqueness(futures_meta, results)?; validation_result.merge(result); @@ -142,8 +142,8 @@ fn validate_uniqueness<'a>( results: Vec< Result>>, anyhow::Error>, >, -) -> Result { - let mut validation_result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut validation_result = ValidationResult::default(); for (i, result) in results.into_iter().enumerate() { let documents: Vec = result? .into_iter() diff --git a/packages/rs-dpp/src/errors/dpp_error.rs b/packages/rs-dpp/src/errors/dpp_error.rs index 3fb869791d4..0e4bc44ad92 100644 --- a/packages/rs-dpp/src/errors/dpp_error.rs +++ b/packages/rs-dpp/src/errors/dpp_error.rs @@ -7,12 +7,10 @@ use crate::identity::errors::{AssetLockOutputNotFoundError, AssetLockTransaction pub enum DPPError { AssetLockOutputNotFoundError(AssetLockOutputNotFoundError), AssetLockTransactionIsNotFoundError(AssetLockTransactionIsNotFoundError), - #[error("expected public key hash to be 20 bytes")] + #[error("Expected public key hash to be 20 bytes")] WrongPublicKeyHashSize, - #[error("expected output type to be OP_RETURN output")] + #[error("Expected output type to be OP_RETURN output")] WrongBurnOutputType, - #[error("invalid transaction")] + #[error("Invalid transaction")] InvalidAssetLockTransaction, - #[error("core message corruption {0}")] - CoreMessageCorruption(String), } diff --git a/packages/rs-dpp/src/errors/errors.rs b/packages/rs-dpp/src/errors/errors.rs index 2e6bb1e6864..a0a0eaac2a6 100644 --- a/packages/rs-dpp/src/errors/errors.rs +++ b/packages/rs-dpp/src/errors/errors.rs @@ -17,8 +17,6 @@ use crate::{ SerdeParsingError, }; -use dashcore::consensus::encode::Error as DashCoreError; - use platform_value::{Error as ValueError, Value}; #[derive(Error, Debug)] @@ -85,8 +83,9 @@ pub enum ProtocolError { #[error(transparent)] InvalidSignaturePublicKeyError(InvalidSignaturePublicKeyError), - #[error(transparent)] - NonConsensusError(#[from] NonConsensusError), + // TODO decide if it should be a string + #[error("Non-Consensus error: {0}")] + NonConsensusError(String), #[error(transparent)] CompatibleProtocolVersionIsNotDefinedError(#[from] CompatibleProtocolVersionIsNotDefinedError), @@ -131,10 +130,6 @@ pub enum ProtocolError { #[error("value error: {0}")] ValueError(#[from] ValueError), - /// Dash core error - #[error("dash core error: {0}")] - DashCoreError(#[from] DashCoreError), - #[error("Invalid Identity: {errors:?}")] InvalidIdentityError { errors: Vec, @@ -143,9 +138,12 @@ pub enum ProtocolError { #[error("Public key generation error {0}")] PublicKeyGenerationError(String), +} - #[error("corrupted code execution: {0}")] - CorruptedCodeExecution(String), +impl From for ProtocolError { + fn from(e: NonConsensusError) -> Self { + Self::NonConsensusError(e.to_string()) + } } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/errors/non_consensus_error.rs b/packages/rs-dpp/src/errors/non_consensus_error.rs index 015098cd6e8..62ebd7941bf 100644 --- a/packages/rs-dpp/src/errors/non_consensus_error.rs +++ b/packages/rs-dpp/src/errors/non_consensus_error.rs @@ -2,7 +2,7 @@ use platform_value::Error as ValueError; use thiserror::Error; use crate::{ - CompatibleProtocolVersionIsNotDefinedError, DPPError, InvalidVectorSizeError, SerdeParsingError, + CompatibleProtocolVersionIsNotDefinedError, InvalidVectorSizeError, SerdeParsingError, }; #[derive(Debug, Error)] @@ -20,8 +20,6 @@ pub enum NonConsensusError { InvalidVectorSizeError(InvalidVectorSizeError), #[error("StateRepositoryFetchError: {0}")] StateRepositoryFetchError(String), - #[error("WithdrawalError: {0}")] - WithdrawalError(String), #[error("IdentifierCreateError: {0}")] IdentifierCreateError(String), #[error("IdentityPublicKeyCreateError: {0}")] @@ -41,9 +39,6 @@ pub enum NonConsensusError { details: String, }, - #[error(transparent)] - DPPError(#[from] DPPError), - #[error(transparent)] Error(#[from] anyhow::Error), } diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index daacea99606..5d494ad8f77 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -14,7 +14,7 @@ use crate::identity::validation::{IdentityValidator, PublicKeysValidator}; use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; use crate::prelude::Identifier; -use crate::validation::SimpleValidationResult; +use crate::validation::ValidationResult; use crate::version::ProtocolVersionValidator; use crate::{BlsModule, DashPlatformProtocolInitError, NonConsensusError, ProtocolError}; @@ -72,7 +72,7 @@ where pub fn validate( &self, identity_object: &Value, - ) -> Result { + ) -> Result, NonConsensusError> { self.identity_validator .validate_identity_object(identity_object) } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs index 85ead347900..a6d4dc28c5f 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs @@ -96,7 +96,7 @@ where .state_repository .fetch_latest_platform_core_chain_locked_height() .await - .map_err(|e| NonConsensusError::StateRepositoryFetchError(format!("state repository fetch current core chain locked height for chain asset lock proof verification error: {}", e)))? + .map_err(|e| NonConsensusError::StateRepositoryFetchError(format!("state repository fetch current core chain locked height for chain asset lock proof verification error: {}",e.to_string())))? .unwrap_or(0); if current_core_chain_locked_height < proof_core_chain_locked_height { @@ -122,7 +122,7 @@ where .map_err(|e| { NonConsensusError::StateRepositoryFetchError(format!( "transaction fetching error for chain lock: {}", - e + e.to_string() )) })?; @@ -132,7 +132,7 @@ where .map_err(|e| { NonConsensusError::StateRepositoryFetchError(format!( "transaction decoding error: {}", - e + e.to_string() )) })?; @@ -160,15 +160,15 @@ where .validate(&raw_tx, output_index as usize, execution_context) .await?; - let validation_result_data = - if validate_asset_lock_transaction_result.is_valid_with_data() { - validate_asset_lock_transaction_result - .into_data() - .expect("This can not happen due to the logic above") - } else { - result.merge(validate_asset_lock_transaction_result); - return Ok(result); - }; + let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { + validate_asset_lock_transaction_result + .data() + .expect("This can not happen due to the logic above") + .clone() + } else { + result.merge(validate_asset_lock_transaction_result); + return Ok(result); + }; let public_key_hash = validation_result_data.public_key_hash; diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs index 5dc013435eb..908e3ff6962 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs @@ -86,7 +86,7 @@ where .map_err(|e| { NonConsensusError::StateRepositoryFetchError(format!( "state repository verify instant send lock error: {}", - e + e.to_string() )) })?; @@ -104,11 +104,11 @@ where .validate(&tx_json_uint_array, output_index, execution_context) .await?; - let validation_result_data = if validate_asset_lock_transaction_result.is_valid_with_data() - { + let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { validate_asset_lock_transaction_result - .into_data() + .data() .expect("This can not happen due to the logic above") + .clone() } else { result.merge(validate_asset_lock_transaction_result); return Ok(result); diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 1ad380843d3..054efcca58b 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -1,8 +1,6 @@ use std::convert::{TryFrom, TryInto}; -use dashcore::consensus::Decodable; -use dashcore::hashes::hex::ToHex; -use dashcore::{OutPoint, Transaction, TxOut}; +use dashcore::Transaction; use serde::de::Error as DeError; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -14,12 +12,9 @@ pub use chain::*; pub use instant::*; use platform_value::Value; -use crate::identity::errors::{AssetLockOutputNotFoundError, AssetLockTransactionIsNotFoundError}; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::prelude::Identifier; -use crate::state_repository::StateRepositoryLike; -use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use crate::{DPPError, NonConsensusError, ProtocolError, SerdeParsingError}; +use crate::{NonConsensusError, ProtocolError, SerdeParsingError}; mod asset_lock_proof_validator; mod asset_lock_public_key_hash_fetcher; @@ -34,64 +29,6 @@ pub enum AssetLockProof { Chain(ChainAssetLockProof), } -impl AssetLockProof { - /// This fetches the asset lock transaction output from core - pub async fn fetch_asset_lock_transaction_output( - &self, - state_repository: &impl StateRepositoryLike, - execution_context: &StateTransitionExecutionContext, - ) -> Result { - match self { - AssetLockProof::Instant(asset_lock_proof) => asset_lock_proof - .output() - .ok_or_else(|| DPPError::from(AssetLockOutputNotFoundError::new())) - .cloned(), - AssetLockProof::Chain(asset_lock_proof) => { - let out_point = OutPoint::from(asset_lock_proof.out_point.to_buffer()); - - let output_index = out_point.vout as usize; - let transaction_hash = out_point.txid; - - let transaction_data = state_repository - .fetch_transaction(&transaction_hash.to_hex(), Some(execution_context)) - .await - .map_err(|_| DPPError::InvalidAssetLockTransaction)?; - - if execution_context.is_dry_run() { - return Ok(TxOut { - value: 1000, - ..Default::default() - }); - } - - let transaction_data = transaction_data - .try_into() - .map_err(|e| DPPError::CoreMessageCorruption(format!("{:?}", e.into())))?; - - if let Some(raw_transaction) = transaction_data.data { - let transaction = Transaction::consensus_decode(raw_transaction.as_slice()) - .map_err(|e| { - DPPError::CoreMessageCorruption(format!( - "could not decode transaction {:?}", - e - )) - })?; - - transaction - .output - .get(output_index) - .cloned() - .ok_or_else(|| AssetLockOutputNotFoundError::new().into()) - } else { - Err(DPPError::from(AssetLockTransactionIsNotFoundError::new( - transaction_hash, - ))) - } - } - } - } -} - impl Default for AssetLockProof { fn default() -> Self { Self::Instant(InstantAssetLockProof::default()) @@ -272,39 +209,3 @@ impl TryInto for &AssetLockProof { } } } - -#[cfg(test)] -mod test { - use crate::state_repository::FetchTransactionResponse; - use crate::{ - identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof, - state_repository::MockStateRepositoryLike, - }; - - use super::*; - - #[tokio::test] - async fn should_return_mocked_data_on_dry_run() { - let mut state_repository_mock = MockStateRepositoryLike::new(); - let asset_lock_proof = &AssetLockProof::Chain(ChainAssetLockProof::new(0, [0u8; 36])); - let execution_context = StateTransitionExecutionContext::default(); - - state_repository_mock - .expect_fetch_transaction() - .return_once(|_, _| Ok(FetchTransactionResponse::default())); - execution_context.enable_dry_run(); - - let result = asset_lock_proof - .fetch_asset_lock_transaction_output(&state_repository_mock, &execution_context) - .await - .expect("the transaction output should be returned"); - - assert_eq!( - TxOut { - value: 1000, - ..Default::default() - }, - result - ); - } -} diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index e0e69dbbaf8..efcb20bbc42 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -125,6 +125,12 @@ impl IdentityCreateTransition { state_transition.set_asset_lock_proof(AssetLockProof::try_from(proof)?)?; } + if let Some(signature) = + transition_map.get_optional_binary_data(property_names::SIGNATURE)? + { + state_transition.set_signature(signature); + } + state_transition.protocol_version = transition_map.get_integer(property_names::PROTOCOL_VERSION)?; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs index 50e5ab96a2a..4b990178025 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -1,8 +1,6 @@ pub use apply_identity_create_transition::*; pub use identity_create_transition::*; -mod action; mod apply_identity_create_transition; mod identity_create_transition; pub mod validation; -pub use action::{IdentityCreateTransitionAction, IDENTITY_CREATE_TRANSITION_ACTION_VERSION}; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs index bb310672aed..c15e202232d 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs @@ -10,7 +10,7 @@ use crate::identity::state_transition::validate_public_key_signatures::TPublicKe use crate::identity::validation::TPublicKeysValidator; use crate::state_repository::StateRepositoryLike; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; +use crate::validation::{JsonSchemaValidator, ValidationResult}; use crate::version::ProtocolVersionValidator; use crate::{BlsModule, DashPlatformProtocolInitError, NonConsensusError}; @@ -70,7 +70,7 @@ impl< &self, transition_object: &Value, execution_context: &StateTransitionExecutionContext, - ) -> Result { + ) -> Result, NonConsensusError> { let mut result = self.json_schema_validator.validate( &transition_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs index 5bf9b1c08a8..3c6bffff237 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs @@ -1,10 +1,8 @@ use crate::consensus::state::identity::IdentityAlreadyExistsError; -use crate::identity::state_transition::identity_create_transition::{ - IdentityCreateTransition, IdentityCreateTransitionAction, -}; +use crate::identity::state_transition::identity_create_transition::IdentityCreateTransition; use crate::state_repository::StateRepositoryLike; use crate::state_transition::StateTransitionLike; -use crate::validation::{AsyncDataValidator, ValidationResult}; +use crate::validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}; use crate::{NonConsensusError, ProtocolError}; use async_trait::async_trait; @@ -21,12 +19,11 @@ where SR: StateRepositoryLike, { type Item = IdentityCreateTransition; - type ResultItem = IdentityCreateTransitionAction; async fn validate( &self, data: &IdentityCreateTransition, - ) -> Result, ProtocolError> { + ) -> Result { validate_identity_create_transition_state(&self.state_repository, data) .await .map_err(|err| err.into()) @@ -55,7 +52,8 @@ where pub async fn validate_identity_create_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &IdentityCreateTransition, -) -> Result, ProtocolError> { +) -> Result, NonConsensusError> { + // TODO: refactor to return ProtocolError? let mut result = ValidationResult::default(); let identity_id = state_transition.get_identity_id(); @@ -70,26 +68,14 @@ pub async fn validate_identity_create_transition_state( })?; if state_transition.get_execution_context().is_dry_run() { - return Ok(IdentityCreateTransitionAction::from_borrowed(state_transition, 0).into()); + return Ok(result); } - // Balance is here to check if the identity does already exist if balance.is_some() { result.add_error(IdentityAlreadyExistsError::new(identity_id.to_buffer())); - Ok(result) - } else { - let tx_out = state_transition - .asset_lock_proof - .fetch_asset_lock_transaction_output( - state_repository, - &state_transition.execution_context, - ) - .await - .map_err(Into::::into)?; - return Ok( - IdentityCreateTransitionAction::from_borrowed(state_transition, tx_out.value).into(), - ); } + + Ok(result) } #[cfg(test)] diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs index f6f190316a0..9bca3abde5c 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs @@ -21,12 +21,8 @@ use super::properties::{ PROPERTY_IDENTITY_ID, PROPERTY_SIGNATURE, PROPERTY_SIGNATURE_PUBLIC_KEY_ID, }; -mod action; pub mod apply_identity_credit_withdrawal_transition_factory; pub mod validation; -pub use action::{ - IdentityCreditWithdrawalTransitionAction, IDENTITY_CREDIT_WITHDRAWAL_TRANSITION_VERSION, -}; #[repr(u8)] #[derive(Serialize_repr, Deserialize_repr, PartialEq, Eq, Clone, Copy, Debug)] diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs index 50d84728abf..95f70f2bbe1 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs @@ -4,7 +4,6 @@ use lazy_static::lazy_static; use platform_value::Value; use serde_json::Value as JsonValue; -use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::identity::{ InvalidIdentityCreditWithdrawalTransitionCoreFeeError, @@ -14,7 +13,7 @@ use crate::{ contracts::withdrawals_contract, identity::core_script::CoreScript, util::is_fibonacci_number::is_fibonacci_number, - validation::JsonSchemaValidator, + validation::{JsonSchemaValidator, ValidationResult}, version::ProtocolVersionValidator, DashPlatformProtocolInitError, NonConsensusError, }; @@ -50,7 +49,7 @@ impl IdentityCreditWithdrawalTransitionBasicValidator { pub async fn validate( &self, transition_object: &Value, - ) -> Result { + ) -> Result, NonConsensusError> { let mut result = self.json_schema_validator.validate( &transition_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs index 34c769e98a7..f7053296950 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs @@ -2,22 +2,13 @@ use std::convert::TryInto; use std::sync::Arc; use anyhow::Result; -use dashcore::{consensus, BlockHeader}; -use platform_value::platform_value; use crate::consensus::signature::IdentityNotFoundError; - -use crate::contracts::withdrawals_contract; -use crate::document::{generate_document_id, Document}; -use crate::identity::state_transition::identity_credit_withdrawal_transition::{ - IdentityCreditWithdrawalTransitionAction, Pooling, -}; -use crate::validation::ValidationResult; use crate::{ consensus::basic::identity::IdentityInsufficientBalanceError, identity::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - NonConsensusError, ProtocolError, StateError, + validation::ValidationResult, NonConsensusError, StateError, }; pub struct IdentityCreditWithdrawalTransitionValidator @@ -38,8 +29,8 @@ where pub async fn validate_identity_credit_withdrawal_transition_state( &self, state_transition: &IdentityCreditWithdrawalTransition, - ) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); + ) -> Result, NonConsensusError> { + let mut result: ValidationResult<()> = ValidationResult::default(); // TODO: Use fetchIdentityBalance let maybe_existing_identity = self @@ -88,48 +79,6 @@ where return Ok(result); } - let document_id = generate_document_id::generate_document_id( - &withdrawals_contract::CONTRACT_ID, - &state_transition.identity_id, - withdrawals_contract::document_types::WITHDRAWAL, - state_transition.output_script.as_bytes(), - ); - - let latest_platform_block_header_bytes: Vec = self - .state_repository - .fetch_latest_platform_block_header() - .await?; - - let latest_platform_block_header: BlockHeader = - consensus::deserialize(&latest_platform_block_header_bytes) - .map_err(ProtocolError::DashCoreError)?; - - let document_created_at_millis: i64 = latest_platform_block_header.time as i64 * 1000i64; - - let document_data = platform_value!({ - withdrawals_contract::property_names::AMOUNT: state_transition.amount, - withdrawals_contract::property_names::CORE_FEE_PER_BYTE: state_transition.core_fee_per_byte, - withdrawals_contract::property_names::POOLING: Pooling::Never, - withdrawals_contract::property_names::OUTPUT_SCRIPT: state_transition.output_script.as_bytes(), - withdrawals_contract::property_names::STATUS: withdrawals_contract::WithdrawalStatus::QUEUED, - withdrawals_contract::property_names::CREATED_AT: document_created_at_millis, - withdrawals_contract::property_names::UPDATED_AT: document_created_at_millis, - }); - - let withdrawal_document = Document { - id: document_id, - owner_id: state_transition.identity_id, - properties: document_data.into_btree_string_map().unwrap(), - revision: None, - created_at: None, - updated_at: None, - }; - - Ok(IdentityCreditWithdrawalTransitionAction { - version: IdentityCreditWithdrawalTransitionAction::current_version(), - identity_id: state_transition.identity_id, - prepared_withdrawal_document: withdrawal_document, - } - .into()) + Ok(result) } } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs index 03f4d2b0d31..209a5b2b4f8 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs @@ -1,8 +1,6 @@ pub use apply_identity_topup_transition::*; pub use identity_topup_transition::*; -mod action; mod apply_identity_topup_transition; mod identity_topup_transition; pub mod validation; -pub use action::{IdentityTopUpTransitionAction, IDENTITY_TOP_UP_TRANSITION_ACTION_VERSION}; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs index 5750c9dc79f..b711bf9133d 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs @@ -7,7 +7,7 @@ use serde_json::Value as JsonValue; use crate::identity::state_transition::asset_lock_proof::AssetLockProofValidator; use crate::state_repository::StateRepositoryLike; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; +use crate::validation::{JsonSchemaValidator, ValidationResult}; use crate::version::ProtocolVersionValidator; use crate::{DashPlatformProtocolInitError, NonConsensusError}; @@ -47,7 +47,7 @@ impl IdentityTopUpTransitionBasicValidator { &self, identity_topup_transition_object: &Value, execution_context: &StateTransitionExecutionContext, - ) -> Result { + ) -> Result, NonConsensusError> { let mut result = self.json_schema_validator.validate( &identity_topup_transition_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs index 1de6aad3963..fd2dd71381c 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs @@ -1,9 +1,6 @@ -use crate::identity::state_transition::identity_topup_transition::{ - IdentityTopUpTransition, IdentityTopUpTransitionAction, -}; +use crate::identity::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::state_repository::StateRepositoryLike; - -use crate::validation::{AsyncDataValidator, ValidationResult}; +use crate::validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}; use crate::{NonConsensusError, ProtocolError}; use async_trait::async_trait; @@ -20,13 +17,12 @@ where SR: StateRepositoryLike, { type Item = IdentityTopUpTransition; - type ResultItem = IdentityTopUpTransitionAction; async fn validate( &self, data: &IdentityTopUpTransition, - ) -> Result, ProtocolError> { - validate_identity_topup_transition_state(&self.state_repository, data) + ) -> Result { + validate_identity_topup_transition_state(data, &self.state_repository) .await .map(|result| result.into()) .map_err(|err| err.into()) @@ -53,17 +49,8 @@ where /// 1. We need to check that outpoint exists (not now) /// 2. Verify ownership proof signature, as it requires special transaction to be implemented pub async fn validate_identity_topup_transition_state( - state_repository: &impl StateRepositoryLike, - state_transition: &IdentityTopUpTransition, -) -> Result, NonConsensusError> { - //todo: I think we need to validate that the identity actually exists - let top_up_balance_amount = state_transition - .asset_lock_proof - .fetch_asset_lock_transaction_output(state_repository, &state_transition.execution_context) - .await - .map_err(Into::::into)?; - Ok( - IdentityTopUpTransitionAction::from_borrowed(state_transition, top_up_balance_amount.value) - .into(), - ) + _state_transition: &IdentityTopUpTransition, + _state_repository: &impl StateRepositoryLike, +) -> Result, NonConsensusError> { + Ok(ValidationResult::default()) } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs index 4bbfa3c800c..31cae78f4fa 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs @@ -1,7 +1,5 @@ -mod action; pub mod apply_identity_update_transition; pub mod identity_update_transition; pub mod validate_identity_update_transition_basic; pub mod validate_identity_update_transition_state; pub mod validate_public_keys; -pub use action::{IdentityUpdateTransitionAction, IDENTITY_UPDATE_TRANSITION_ACTION_VERSION}; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs index 6e16c419f61..6da3789e332 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs @@ -4,13 +4,12 @@ use std::convert::TryInto; use std::sync::Arc; use crate::consensus::signature::{IdentityNotFoundError, SignatureError}; -use crate::identity::state_transition::identity_update_transition::IdentityUpdateTransitionAction; use crate::{ block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window, identity::validation::{RequiredPurposeAndSecurityLevelValidator, TPublicKeysValidator}, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - validation::ValidationResult, + validation::SimpleValidationResult, NonConsensusError, StateError, }; @@ -36,8 +35,8 @@ where pub async fn validate( &self, state_transition: &IdentityUpdateTransition, - ) -> Result, NonConsensusError> { - let mut validation_result = ValidationResult::default(); + ) -> Result { + let mut validation_result = SimpleValidationResult::default(); let maybe_stored_identity = self .state_repository @@ -57,8 +56,7 @@ where })?; if state_transition.get_execution_context().is_dry_run() { - let action: IdentityUpdateTransitionAction = state_transition.into(); - return Ok(action.into()); + return Ok(validation_result); } let stored_identity = match maybe_stored_identity { @@ -169,18 +167,10 @@ where .public_keys_validator .validate_keys(raw_public_keys.as_slice())?; if !result.is_valid() { - validation_result.add_errors(result.errors); - return Ok(validation_result); + return Ok(result); } let validator = RequiredPurposeAndSecurityLevelValidator {}; - let result = validator.validate_keys(&raw_public_keys)?; - if !result.is_valid() { - validation_result.add_errors(result.errors); - return Ok(validation_result); - } - - let action: IdentityUpdateTransitionAction = state_transition.into(); - Ok(action.into()) + validator.validate_keys(&raw_public_keys) } } diff --git a/packages/rs-dpp/src/identity/validation/identity_validator.rs b/packages/rs-dpp/src/identity/validation/identity_validator.rs index 2be5786b69d..3f23539e0a2 100644 --- a/packages/rs-dpp/src/identity/validation/identity_validator.rs +++ b/packages/rs-dpp/src/identity/validation/identity_validator.rs @@ -4,7 +4,7 @@ use serde_json::Value as JsonValue; use std::sync::Arc; use crate::identity::validation::TPublicKeysValidator; -use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; +use crate::validation::{JsonSchemaValidator, ValidationResult}; use crate::version::ProtocolVersionValidator; use crate::{DashPlatformProtocolInitError, NonConsensusError}; use crate::identity::state_transition::identity_update_transition::identity_update_transition::property_names::PROTOCOL_VERSION; @@ -40,7 +40,7 @@ impl IdentityValidator { pub fn validate_identity_object( &self, identity_object: &Value, - ) -> Result { + ) -> Result, NonConsensusError> { let mut validation_result = self.json_schema_validator.validate( &identity_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/validation/public_keys_validator.rs b/packages/rs-dpp/src/identity/validation/public_keys_validator.rs index 479210c1eba..31cca957ab2 100644 --- a/packages/rs-dpp/src/identity/validation/public_keys_validator.rs +++ b/packages/rs-dpp/src/identity/validation/public_keys_validator.rs @@ -8,7 +8,7 @@ use crate::errors::consensus::basic::identity::{ InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError, }; use crate::identity::{IdentityPublicKey, KeyID, KeyType}; -use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; +use crate::validation::{JsonSchemaValidator, ValidationResult}; use crate::{ BlsModule, DashPlatformProtocolInitError, NonConsensusError, PublicKeyValidationError, }; @@ -33,7 +33,7 @@ pub trait TPublicKeysValidator { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result; + ) -> Result, NonConsensusError>; } pub struct PublicKeysValidator { @@ -45,8 +45,8 @@ impl TPublicKeysValidator for PublicKeysValidator { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result { - let mut result = SimpleValidationResult::default(); + ) -> Result, NonConsensusError> { + let mut result = ValidationResult::new(None); // TODO: convert buffers to arrays? // Validate public key structure @@ -175,7 +175,7 @@ impl PublicKeysValidator { pub fn validate_public_key_structure( &self, public_key: &Value, - ) -> Result { + ) -> Result, NonConsensusError> { self.public_key_schema_validator.validate( &public_key .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs b/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs index 0af11418ef4..510fbc2c4ae 100644 --- a/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs +++ b/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use crate::consensus::basic::identity::MissingMasterPublicKeyError; use crate::identity::validation::TPublicKeysValidator; use crate::identity::{IdentityPublicKey, Purpose, SecurityLevel}; -use crate::validation::SimpleValidationResult; +use crate::validation::ValidationResult; use crate::{DashPlatformProtocolInitError, NonConsensusError}; #[derive(Eq, Hash, PartialEq)] @@ -20,8 +20,8 @@ impl TPublicKeysValidator for RequiredPurposeAndSecurityLevelValidator { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result { - let mut result = SimpleValidationResult::default(); + ) -> Result, NonConsensusError> { + let mut result = ValidationResult::default(); let mut key_purposes_and_levels_count: HashMap = HashMap::new(); diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index a0c465e3b10..784a931bf13 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -35,8 +35,6 @@ pub mod fee; pub mod state_transition_execution_context; mod example; -mod state_transition_action; -pub use state_transition_action::StateTransitionAction; macro_rules! call_method { ($state_transition:expr, $method:ident, $args:tt ) => { match $state_transition { diff --git a/packages/rs-dpp/src/state_transition/state_transition_facade.rs b/packages/rs-dpp/src/state_transition/state_transition_facade.rs index 949e5dc3a9d..481476af3d5 100644 --- a/packages/rs-dpp/src/state_transition/state_transition_facade.rs +++ b/packages/rs-dpp/src/state_transition/state_transition_facade.rs @@ -16,8 +16,7 @@ use crate::identity::validation::{PUBLIC_KEY_SCHEMA_FOR_TRANSITION, PublicKeysVa use crate::state_repository::StateRepositoryLike; use crate::state_transition::{ - StateTransition, StateTransitionAction, StateTransitionConvert, StateTransitionFactory, - StateTransitionFactoryOptions, + StateTransition, StateTransitionConvert, StateTransitionFactory, StateTransitionFactoryOptions, }; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; @@ -28,7 +27,7 @@ use crate::state_transition::validation::validate_state_transition_identity_sign use crate::state_transition::validation::validate_state_transition_key_signature::StateTransitionKeySignatureValidator; use crate::state_transition::validation::validate_state_transition_state::StateTransitionStateValidator; use crate::validation::{ - AsyncDataValidator, AsyncDataValidatorWithContext, SimpleValidationResult, ValidationResult, + AsyncDataValidator, AsyncDataValidatorWithContext, SimpleValidationResult, }; use crate::version::ProtocolVersionValidator; @@ -224,41 +223,42 @@ where state_transition: &StateTransition, execution_context: &StateTransitionExecutionContext, options: ValidateOptions, - ) -> Result>, ProtocolError> { - let mut result = ValidationResult::>::new_with_data(None); + ) -> Result { + let mut result = SimpleValidationResult::default(); + if options.basic { let state_transition_cleaned = state_transition.to_cleaned_object(false)?; result.merge( self.validate_basic(&state_transition_cleaned, execution_context) .await?, ); + } - if !result.is_valid() { - return Ok(result); - } + if !result.is_valid() { + return Ok(result); } if options.signature { result.merge(self.validate_signature(state_transition.clone()).await?); + } - if !result.is_valid() { - return Ok(result); - } + if !result.is_valid() { + return Ok(result); } if options.fee { result.merge(self.validate_fee(state_transition).await?); + } - if !result.is_valid() { - return Ok(result); - } + if !result.is_valid() { + return Ok(result); } if options.state { - Ok(self.validate_state(state_transition).await?.map(Some)) - } else { - Ok(result) + result.merge(self.validate_state(state_transition).await?); } + + Ok(result) } pub async fn validate_basic( @@ -335,7 +335,7 @@ where pub async fn validate_state( &self, state_transition: &StateTransition, - ) -> Result, ProtocolError> { + ) -> Result { self.state_validator.validate(state_transition).await } } diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs index a60b660ef61..5ca4d3b2f8f 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs @@ -125,7 +125,6 @@ mod test { use super::StateTransitionBasicValidator; - use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::BasicError, data_contract::{ @@ -138,6 +137,7 @@ mod test { StateTransitionConvert, StateTransitionLike, }, tests::{fixtures::get_data_contract_fixture, utils::get_basic_error_from_result}, + validation::ValidationResult, version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}, NativeBlsModule, }; @@ -307,7 +307,7 @@ mod test { let mut validate_by_type_mock = MockValidatorByStateTransitionType::new(); validate_by_type_mock .expect_validate() - .returning(|_, _, _| Ok(SimpleValidationResult::default())); + .returning(|_, _, _| Ok(ValidationResult::<()>::default())); for i in 0..500 { let document_type_name = format!("anotherDocument{}", i); @@ -352,7 +352,7 @@ mod test { let mut validate_by_type_mock = MockValidatorByStateTransitionType::new(); validate_by_type_mock .expect_validate() - .returning(|_, _, _| Ok(SimpleValidationResult::default())); + .returning(|_, _, _| Ok(ValidationResult::<()>::default())); let validator = StateTransitionBasicValidator::new( Arc::new(state_repository_mock), diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs index eb4570653b1..cc45ac6d3c7 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs @@ -8,10 +8,9 @@ use crate::{ state_transition::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransitionType, }, - validation::{AsyncDataValidatorWithContext, DataValidatorWithContext, SimpleValidationResult}, - ProtocolError, BlsModule, state_repository::StateRepositoryLike, data_contract::state_transition::{data_contract_update_transition::validation::basic::DataContractUpdateTransitionBasicValidator, data_contract_create_transition::validation::state::validate_data_contract_create_transition_basic::DataContractCreateTransitionBasicValidator}, identity::{state_transition::{identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator, validate_public_key_signatures::PublicKeysSignaturesValidator, identity_update_transition::validate_identity_update_transition_basic::ValidateIdentityUpdateTransitionBasic, identity_topup_transition::validation::basic::IdentityTopUpTransitionBasicValidator, identity_credit_withdrawal_transition::validation::basic::validate_identity_credit_withdrawal_transition_basic::IdentityCreditWithdrawalTransitionBasicValidator}, validation::PublicKeysValidator}, document::validation::basic::validate_documents_batch_transition_basic::DocumentBatchTransitionBasicValidator, + validation::{AsyncDataValidatorWithContext, DataValidatorWithContext, SimpleValidationResult, ValidationResult}, + ProtocolError, BlsModule, state_repository::StateRepositoryLike, data_contract::state_transition::{data_contract_update_transition::validation::basic::DataContractUpdateTransitionBasicValidator, data_contract_create_transition::validation::state::validate_data_contract_create_transition_basic::DataContractCreateTransitionBasicValidator}, identity::{state_transition::{identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator, validate_public_key_signatures::PublicKeysSignaturesValidator, identity_update_transition::validate_identity_update_transition_basic::ValidateIdentityUpdateTransitionBasic, identity_topup_transition::validation::basic::IdentityTopUpTransitionBasicValidator, identity_credit_withdrawal_transition::validation::basic::validate_identity_credit_withdrawal_transition_basic::IdentityCreditWithdrawalTransitionBasicValidator}, validation::PublicKeysValidator}, document::validation::basic::validate_documents_batch_transition_basic::DocumentBatchTransitionBasicValidator, }; -use crate::validation::ValidationResult; #[cfg_attr(test, automock)] #[async_trait(?Send)] diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index 994857e72f7..0b011208653 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -271,7 +271,7 @@ mod test { let fee_error = get_fee_error_from_result(&result, 0); assert!( - matches!(fee_error, FeeError::BalanceIsNotEnoughError { balance, fee: _ } if { + matches!(fee_error, FeeError::BalanceIsNotEnoughError { balance, fee } if { *balance == 1 }) ); diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs index b632af5493b..ed5c6316a5f 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs @@ -8,7 +8,6 @@ use crate::consensus::signature::{ IdentityNotFoundError, InvalidIdentityPublicKeyTypeError, MissingPublicKeyError, PublicKeyIsDisabledError, PublicKeySecurityLevelNotMetError, }; -use crate::validation::SimpleValidationResult; use crate::{ consensus::{signature::SignatureError, ConsensusError}, identity::KeyType, @@ -18,6 +17,7 @@ use crate::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransitionIdentitySigned, }, + validation::ValidationResult, BlsModule, ProtocolError, }; @@ -35,8 +35,8 @@ pub async fn validate_state_transition_identity_signature( state_repository: Arc, state_transition: &mut impl StateTransitionIdentitySigned, bls: &impl BlsModule, -) -> Result { - let mut validation_result = SimpleValidationResult::default(); +) -> Result, ProtocolError> { + let mut validation_result = ValidationResult::<()>::default(); // We use temporary execution context without dry run, // because despite the dryRun, we need to get the diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs index 96f565dda52..457cbf3de80 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs @@ -6,7 +6,6 @@ use dashcore::signer::verify_hash_signature; use crate::consensus::signature::IdentityNotFoundError; use crate::consensus::ConsensusError; -use crate::validation::AsyncDataValidator; use crate::{ consensus::signature::SignatureError, identity::{ @@ -19,7 +18,7 @@ use crate::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransition, StateTransitionConvert, StateTransitionLike, }, - validation::SimpleValidationResult, + validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}, ProtocolError, }; @@ -34,8 +33,6 @@ where SR: StateRepositoryLike, { type Item = StateTransition; - type ResultItem = (); - async fn validate(&self, data: &Self::Item) -> Result { validate_state_transition_key_signature( self.state_repository.as_ref(), @@ -65,7 +62,7 @@ pub async fn validate_state_transition_key_signature( state_repository: &impl StateRepositoryLike, asset_lock_public_key_hash_fetcher: &AssetLockPublicKeyHashFetcher, state_transition: &StateTransition, -) -> Result { +) -> Result, ProtocolError> { let mut result = SimpleValidationResult::default(); let execution_context = state_transition.get_execution_context(); diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs index 1d92a381a46..c827c5e6706 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs @@ -9,9 +9,8 @@ use crate::identity::state_transition::identity_topup_transition::validation::st use crate::identity::state_transition::identity_update_transition::validate_identity_update_transition_state::IdentityUpdateTransitionStateValidator; use crate::identity::state_transition::identity_update_transition::validate_public_keys::IdentityUpdatePublicKeysValidator; use crate::ProtocolError; -use crate::state_transition::{StateTransition, StateTransitionAction}; -use crate::state_transition::StateTransitionAction::{DataContractCreateAction, DataContractUpdateAction, DocumentsBatchAction, IdentityCreateAction, IdentityCreditWithdrawalAction, IdentityTopUpAction, IdentityUpdateAction}; -use crate::validation::{AsyncDataValidator, ValidationResult}; +use crate::state_transition::StateTransition; +use crate::validation::{AsyncDataValidator, SimpleValidationResult}; pub struct StateTransitionStateValidator where @@ -67,44 +66,29 @@ where pub async fn validate( &self, state_transition: &StateTransition, - ) -> Result, ProtocolError> { + ) -> Result { match state_transition { - StateTransition::DataContractCreate(st) => Ok(self - .data_contract_create_validator - .validate(st) - .await? - .map(DataContractCreateAction)), - - StateTransition::DataContractUpdate(st) => Ok(self - .data_contract_update_validator - .validate(st) - .await? - .map(DataContractUpdateAction)), - StateTransition::IdentityCreate(st) => Ok(self - .identity_create_validator - .validate(st) - .await? - .map(IdentityCreateAction)), - StateTransition::IdentityUpdate(st) => Ok(self + StateTransition::DataContractCreate(st) => { + self.data_contract_create_validator.validate(st).await + } + StateTransition::DataContractUpdate(st) => { + self.data_contract_update_validator.validate(st).await + } + StateTransition::IdentityCreate(st) => { + self.identity_create_validator.validate(st).await + } + StateTransition::IdentityUpdate(st) => self .identity_update_validator .validate(st) - .await? - .map(IdentityUpdateAction)), - StateTransition::IdentityTopUp(st) => Ok(self - .identity_top_up_validator - .validate(st) - .await? - .map(IdentityTopUpAction)), - StateTransition::IdentityCreditWithdrawal(st) => Ok(self + .await + .map_err(|e| ProtocolError::from(e)), + StateTransition::IdentityTopUp(st) => self.identity_top_up_validator.validate(st).await, + StateTransition::IdentityCreditWithdrawal(st) => self .identity_credit_withdrawal_validator .validate_identity_credit_withdrawal_transition_state(st) - .await? - .map(IdentityCreditWithdrawalAction)), - StateTransition::DocumentsBatch(st) => Ok(self - .document_batch_validator - .validate(st) - .await? - .map(DocumentsBatchAction)), + .await + .map_err(|e| ProtocolError::from(e)), + StateTransition::DocumentsBatch(st) => self.document_batch_validator.validate(st).await, } } } diff --git a/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs b/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs index e8b743ecae5..2bda80f836e 100644 --- a/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs +++ b/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs @@ -1,10 +1,10 @@ use crate::{ consensus::basic::BasicError, data_contract::state_transition::data_contract_update_transition::validation::basic::validate_indices_are_backward_compatible, + validation::ValidationResult, }; use std::collections::BTreeMap; -use crate::validation::SimpleValidationResult; use crate::{ consensus::ConsensusError, data_contract::DataContract, tests::fixtures::get_data_contract_fixture, util::json_value::JsonValueExt, @@ -61,7 +61,7 @@ fn setup_test() -> TestData { } } -fn get_basic_error(result: &SimpleValidationResult, error_number: usize) -> &BasicError { +fn get_basic_error(result: &ValidationResult<()>, error_number: usize) -> &BasicError { match result .errors .get(error_number) @@ -92,8 +92,8 @@ fn should_return_invalid_result_if_some_of_unique_indices_have_changed() { ) .expect("validation result should be returned"); - assert_eq!(1, result.errors.len()); - assert_eq!(1053, result.errors[0].code()); + assert_eq!(1, result.errors().len()); + assert_eq!(1053, result.errors()[0].code()); let basic_error = get_basic_error(&result, 0); @@ -125,9 +125,9 @@ fn should_return_invalid_result_if_non_unique_index_update_failed_due_to_changed ) .expect("validation result should be returned"); - assert_eq!(1, result.errors.len()); + assert_eq!(1, result.errors().len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors[0].code()); + assert_eq!(0, result.errors()[0].code()); let basic_error = get_basic_error(&result, 0); @@ -160,9 +160,9 @@ fn should_return_invalid_result_if_already_indexed_properties_are_added_to_exist ) .expect("validation result should be returned"); - assert_eq!(1, result.errors.len()); + assert_eq!(1, result.errors().len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors[0].code()); + assert_eq!(0, result.errors()[0].code()); let basic_error = get_basic_error(&result, 0); match basic_error { @@ -201,9 +201,9 @@ fn should_return_invalid_result_if_one_of_new_indices_contains_old_properties_in ) .expect("validation result should be returned"); - assert_eq!(1, result.errors.len()); + assert_eq!(1, result.errors().len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors[0].code()); + assert_eq!(0, result.errors()[0].code()); let basic_error = get_basic_error(&result, 0); @@ -244,9 +244,9 @@ fn should_return_invalid_result_if_one_of_new_indices_is_unique() { ) .expect("validation result should be returned"); - assert_eq!(1, result.errors.len()); + assert_eq!(1, result.errors().len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors[0].code()); + assert_eq!(0, result.errors()[0].code()); let basic_error = get_basic_error(&result, 0); @@ -313,9 +313,9 @@ fn should_return_invalid_result_if_non_unique_index_added_for_non_indexed_proper ) .expect("validation result should be returned"); - assert_eq!(result.errors.len(), 1); + assert_eq!(result.errors().len(), 1); // TODO the error doesn't have assigned error code - assert_eq!(result.errors[0].code(), 0); + assert_eq!(result.errors()[0].code(), 0); let basic_error = get_basic_error(&result, 0); diff --git a/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs b/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs index 02d4fc8e0e8..291904e0f6d 100644 --- a/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs +++ b/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs @@ -46,10 +46,7 @@ fn init() { .try_init(); } -fn get_schema_error( - result: &ValidationResult, - number: usize, -) -> &JsonSchemaError { +fn get_schema_error(result: &ValidationResult<()>, number: usize) -> &JsonSchemaError { result .errors .get(number) @@ -58,10 +55,7 @@ fn get_schema_error( .expect("the error should be json schema error") } -fn get_value_error( - result: &ValidationResult, - number: usize, -) -> &platform_value::Error { +fn get_value_error(result: &ValidationResult<()>, number: usize) -> &platform_value::Error { result .errors .get(number) @@ -87,7 +81,7 @@ fn get_index_error(consensus_error: &ConsensusError) -> &IndexError { } } -fn print_json_schema_errors(result: &ValidationResult) { +fn print_json_schema_errors(result: &ValidationResult<()>) { for (i, e) in result.errors.iter().enumerate() { let schema_error = e.json_schema_error().unwrap(); println!( @@ -2563,7 +2557,7 @@ mod indices { .validate(&cloned_data_contract) .expect("should return validation result"); - let index_error = get_index_error(&result.errors[0]); + let index_error = get_index_error(&result.errors()[0]); assert_eq!(1016, index_error.get_code()); match index_error { IndexError::UndefinedIndexPropertyError(err) => { diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs index f58509a33ee..a09a420b4d9 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs @@ -22,12 +22,11 @@ use crate::{ get_data_contract_fixture, get_document_transitions_fixture, }, utils::{generate_random_identifier_struct}, - }, + }, validation::ValidationResult, }; use crate::document::{Document, ExtendedDocument}; use crate::identity::TimestampMillis; use crate::tests::fixtures::get_extended_documents_fixture; -use crate::validation::ValidationResult; struct TestData { owner_id: Identifier, @@ -87,16 +86,13 @@ fn setup_test() -> TestData { } } -fn get_state_error( - result: &ValidationResult, - error_number: usize, -) -> &StateError { +fn get_state_error(result: &ValidationResult<()>, error_number: usize) -> &StateError { match result .errors .get(error_number) .expect("error should be found") { - ConsensusError::StateError(state_error) => &*state_error, + ConsensusError::StateError(state_error) => state_error, _ => panic!( "error '{:?}' isn't a basic error", result.errors[error_number] @@ -136,7 +132,7 @@ async fn should_throw_error_if_data_contract_was_not_found() { &state_repository_mock, &data_contract.id, owner_id, - document_transitions.iter().collect::>().as_slice(), + document_transitions, &Default::default(), ) .await @@ -182,7 +178,7 @@ async fn should_return_invalid_result_if_document_transition_with_action_delete_ .expect("documents batch state transition should be created"); state_repository_mock - .expect_fetch_documents() + .expect_fetch_extended_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -255,8 +251,8 @@ async fn should_return_invalid_result_if_document_transition_with_action_replace .expect("documents batch state transition should be created"); state_repository_mock - .expect_fetch_documents() - .returning(move |_, _, _, _| Ok(vec![documents[0].clone()])); + .expect_fetch_extended_documents() + .returning(move |_, _, _, _| Ok(vec![extended_documents[0].clone()])); let validation_result = validate_document_batch_transition_state(&state_repository_mock, &state_transition) @@ -332,8 +328,8 @@ async fn should_return_invalid_result_if_document_transition_with_action_replace .expect("documents batch state transition should be created"); state_repository_mock - .expect_fetch_documents() - .returning(move |_, _, _, _| Ok(vec![fetched_document.document.clone()])); + .expect_fetch_extended_documents() + .returning(move |_, _, _, _| Ok(vec![fetched_document.clone()])); let validation_result = validate_document_batch_transition_state(&state_repository_mock, &state_transition) @@ -406,7 +402,7 @@ async fn should_return_invalid_result_if_timestamps_mismatch() { .for_each(|t| set_updated_at(t, Some(now_ts))); state_repository_mock - .expect_fetch_documents() + .expect_fetch_extended_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -466,7 +462,7 @@ async fn should_return_invalid_result_if_crated_at_has_violated_time_window() { .for_each(|t| set_created_at(t, Some(now_ts_minus_6_mins))); state_repository_mock - .expect_fetch_documents() + .expect_fetch_extended_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -527,7 +523,7 @@ async fn should_not_validate_time_in_block_window_on_dry_run() { .for_each(|t| set_created_at(t, Some(now_ts_minus_6_mins))); state_repository_mock - .expect_fetch_documents() + .expect_fetch_extended_documents() .returning(move |_, _, _, _| Ok(vec![])); let result = @@ -580,7 +576,7 @@ async fn should_return_invalid_result_if_updated_at_has_violated_time_window() { }); state_repository_mock - .expect_fetch_documents() + .expect_fetch_extended_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -616,12 +612,9 @@ async fn should_return_valid_result_if_document_transitions_are_valid() { fetched_document_2.document.owner_id = owner_id; state_repository_mock - .expect_fetch_documents() + .expect_fetch_extended_documents() .returning(move |_, _, _, _| { - Ok(vec![ - fetched_document_1.document.clone(), - fetched_document_2.document.clone(), - ]) + Ok(vec![fetched_document_1.clone(), fetched_document_2.clone()]) }); let document_transitions = get_document_transitions_fixture([ (Action::Create, vec![]), diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs index b1f4ff26979..60691a72c2f 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs @@ -472,7 +472,7 @@ async fn property_should_should_exist_with_code(property_name: &str, error_code: .await .expect("validation result should be returned"); - let error = &result.errors[0]; + let error = &result.errors()[0]; assert_eq!(error_code, error.code()); } @@ -534,7 +534,7 @@ async fn data_contract_id_should_be_byte_array() { .await .expect("validation result should be returned"); - let error = &result.errors[0]; + let error = &result.errors()[0]; assert_eq!(5000, error.code()); } @@ -629,7 +629,7 @@ async fn data_contract_should_exist_in_the_state() { .await .expect("validation result should be returned"); - let error = &result.errors[0]; + let error = &result.errors()[0]; assert_eq!(1018, error.code()); } @@ -654,7 +654,7 @@ async fn type_should_be_defined_in_data_contract() { .await .expect("validation result should be returned"); - let error = &result.errors[0]; + let error = &result.errors()[0]; assert_eq!(1024, error.code()); } @@ -679,7 +679,7 @@ async fn should_throw_invalid_document_transaction_action_error_if_action_is_not .await .expect("validation result should be returned"); - let error = &result.errors[0]; + let error = &result.errors()[0]; assert_eq!(1022, error.code()); } @@ -705,7 +705,7 @@ async fn id_should_be_valid_generated_id() { .await .expect("validation result should be returned"); - let error = &result.errors[0]; + let error = &result.errors()[0]; assert_eq!(1023, error.code()); } diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs index 2baabc0dee7..914aeffa732 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs @@ -10,10 +10,9 @@ use crate::{consensus::ConsensusError, data_contract::DataContract, document::{ get_data_contract_fixture, get_document_transitions_fixture, }, utils::generate_random_identifier_struct, -}}; +}, validation::ValidationResult}; use crate::document::{Document, ExtendedDocument}; use crate::tests::fixtures::get_extended_documents_fixture; -use crate::validation::ValidationResult; struct TestData { owner_id: Identifier, @@ -62,7 +61,7 @@ async fn should_return_valid_result_if_documents_have_no_unique_indices() { let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - document_transitions.iter(), + &document_transitions, &data_contract, &Default::default(), ) @@ -120,7 +119,7 @@ async fn should_return_valid_result_if_document_has_unique_indices_and_there_are let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - document_transitions.iter(), + &document_transitions, &data_contract, &Default::default(), ) @@ -213,7 +212,7 @@ async fn should_return_invalid_result_if_document_has_unique_indices_and_there_a let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - document_transitions.iter(), + &document_transitions, &data_contract, &Default::default(), ) @@ -324,7 +323,7 @@ async fn should_return_valid_result_in_dry_run_if_document_has_unique_indices_an let result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - document_transitions.iter(), + &document_transitions, &data_contract, &execution_context, ) @@ -382,7 +381,7 @@ async fn should_return_valid_result_if_document_has_undefined_field_from_index() let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - document_transitions.iter(), + &document_transitions, &data_contract, &Default::default(), ) @@ -424,7 +423,7 @@ async fn should_return_valid_result_if_document_being_created_and_has_created_at let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - document_transitions.iter(), + &document_transitions, &data_contract, &Default::default(), ) @@ -433,16 +432,13 @@ async fn should_return_valid_result_if_document_being_created_and_has_created_at assert!(validation_result.is_valid()); } -fn get_state_error( - result: &ValidationResult, - error_number: usize, -) -> &StateError { +fn get_state_error(result: &ValidationResult<()>, error_number: usize) -> &StateError { match result .errors .get(error_number) .expect("error should be found") { - ConsensusError::StateError(state_error) => &*state_error, + ConsensusError::StateError(state_error) => state_error, _ => panic!( "error '{:?}' isn't a basic error", result.errors[error_number] diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs index 0c800a87e96..3bf46f3f9dc 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs @@ -10,10 +10,10 @@ use crate::{ tests::fixtures::{ get_data_contract_fixture, get_document_transitions_fixture, }, + validation::ValidationResult, }; use crate::document::ExtendedDocument; use crate::tests::fixtures::get_extended_documents_fixture; -use crate::validation::ValidationResult; struct TestData { data_contract: DataContract, @@ -125,16 +125,13 @@ fn should_return_valid_result_if_compound_index_contains_all_fields() { assert!(result.is_valid()); } -fn get_basic_error( - result: &ValidationResult, - error_number: usize, -) -> &BasicError { +fn get_basic_error(result: &ValidationResult<()>, error_number: usize) -> &BasicError { match result .errors .get(error_number) .expect("error should be found") { - ConsensusError::BasicError(basic_error) => &*basic_error, + ConsensusError::BasicError(basic_error) => basic_error, _ => panic!( "error '{:?}' isn't a basic error", result.errors[error_number] diff --git a/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs b/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs index d3f27981806..6453c70e943 100644 --- a/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs +++ b/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs @@ -2,33 +2,33 @@ use platform_value::Value; use std::sync::Mutex; use crate::identity::validation::TPublicKeysValidator; -use crate::validation::SimpleValidationResult; +use crate::validation::ValidationResult; use crate::NonConsensusError; #[cfg(feature = "fixtures-and-mocks")] pub struct PublicKeysValidatorMock { - returns: Mutex>, + returns: Mutex, NonConsensusError>>, returns_fn: - Mutex Result + 'static>>>, + Mutex Result, NonConsensusError> + 'static>>>, called_with: Mutex>, } impl PublicKeysValidatorMock { pub fn new() -> Self { Self { - returns: Mutex::new(Ok(SimpleValidationResult::default())), + returns: Mutex::new(Ok(ValidationResult::default())), returns_fn: Mutex::new(None), called_with: Mutex::new(vec![]), } } - pub fn returns(&self, result: Result) { + pub fn returns(&self, result: Result, NonConsensusError>) { *self.returns.lock().unwrap() = result; } pub fn returns_fun( &self, - func: impl Fn() -> Result + 'static, + func: impl Fn() -> Result, NonConsensusError> + 'static, ) { *self.returns_fn.lock().unwrap() = Some(Box::new(func)) } @@ -42,7 +42,7 @@ impl TPublicKeysValidator for PublicKeysValidatorMock { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result { + ) -> Result, NonConsensusError> { *self.called_with.lock().unwrap() = Vec::from(raw_public_keys); let guard = self.returns_fn.lock().unwrap(); let fun = guard.as_ref().unwrap(); diff --git a/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs b/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs index a2aed15f798..9d371d12c3d 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs @@ -231,7 +231,7 @@ mod validate_instant_asset_lock_proof_structure_factory { assert_consensus_errors!(result, ConsensusError::InvalidInstantAssetLockProofError, 1); - let consensus_error = result.first_error().unwrap(); + let consensus_error = result.errors().first().unwrap(); assert_eq!(consensus_error.code(), 1041); } @@ -263,7 +263,7 @@ mod validate_instant_asset_lock_proof_structure_factory { ); let error = errors.first().unwrap(); - let consensus_error = result.first_error().unwrap(); + let consensus_error = result.errors().first().unwrap(); assert_eq!(consensus_error.code(), 1031); assert_eq!( error.instant_lock_transaction_id(), @@ -294,7 +294,7 @@ mod validate_instant_asset_lock_proof_structure_factory { 1 ); - let consensus_error = result.first_error().unwrap(); + let consensus_error = result.errors().first().unwrap(); assert_eq!(consensus_error.code(), 1042); } } @@ -409,7 +409,7 @@ mod validate_instant_asset_lock_proof_structure_factory { 1 ); - let consensus_error = result.first_error().unwrap(); + let consensus_error = result.errors().first().unwrap(); assert_eq!(consensus_error.code(), 1038); } } @@ -495,9 +495,6 @@ mod validate_instant_asset_lock_proof_structure_factory { .unwrap(); assert!(result.is_valid()); - assert_eq!( - result.data().expect("expected data").to_vec(), - test_data.public_key_hash - ); + assert_eq!(result.data().unwrap().to_vec(), test_data.public_key_hash); } } diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs index bfbfd2913bb..5279674cb18 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs @@ -480,9 +480,9 @@ mod validate_identity_create_transition_basic_factory { let pk_validator_mock = Arc::new(PublicKeysValidatorMock::new()); let pk_error = TestConsensusError::new("test"); pk_validator_mock.returns_fun(move || { - Ok(ValidationResult::new_with_errors(vec![ - ConsensusError::from(TestConsensusError::new("test")), - ])) + Ok(ValidationResult::new(Some(vec![ConsensusError::from( + TestConsensusError::new("test"), + )]))) }); let (raw_state_transition, validator) = setup_test( @@ -513,9 +513,9 @@ mod validate_identity_create_transition_basic_factory { let pk_validator_mock = Arc::new(PublicKeysValidatorMock::new()); let pk_error = TestConsensusError::new("test"); pk_validator_mock.returns_fun(move || { - Ok(ValidationResult::new_with_errors(vec![ - ConsensusError::from(TestConsensusError::new("test")), - ])) + Ok(ValidationResult::new(Some(vec![ConsensusError::from( + TestConsensusError::new("test"), + )]))) }); let (raw_state_transition, validator) = setup_test( diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs index af75a0ed9eb..ebce1b8479b 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs @@ -31,7 +31,6 @@ pub fn setup_test( #[cfg(test)] mod validate_identity_credit_withdrawal_transition_state_factory { use anyhow::Error; - use dashcore::{consensus, BlockHeader}; use crate::assert_consensus_errors; use crate::consensus::signature::SignatureError; @@ -57,7 +56,7 @@ mod validate_identity_credit_withdrawal_transition_state_factory { .await .unwrap(); - let errors = result.errors; + let errors = result.errors(); assert_eq!(errors.len(), 1); let error = errors.first().unwrap(); @@ -142,24 +141,6 @@ mod validate_identity_credit_withdrawal_transition_state_factory { anyhow::Ok(Some(identity)) }); - let block_time_seconds = 1675709306; - - state_repository - .expect_fetch_latest_platform_block_header() - .times(1) - .returning(move || { - let header = BlockHeader { - time: block_time_seconds, - version: 1, - prev_blockhash: Default::default(), - merkle_root: Default::default(), - bits: Default::default(), - nonce: Default::default(), - }; - - anyhow::Ok(consensus::serialize(&header)) - }); - let (mut state_transition, validator) = setup_test(state_repository, Some(5)); state_transition.revision = 1; diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs index 6f92ea86573..3d6cc81e76c 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs @@ -529,9 +529,9 @@ fn add_public_keys_should_be_valid() { validate_public_keys_mock .expect_validate_keys() .return_once(|_| { - Ok(SimpleValidationResult::new_with_errors(vec![ + Ok(SimpleValidationResult::new(Some(vec![ ConsensusError::TestConsensusError(TestConsensusError::new("test")), - ])) + ]))) }); let _ = raw_state_transition.remove(property_names::DISABLE_PUBLIC_KEYS); diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs index f9aa3f0f7ae..5d9365d135e 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs @@ -367,7 +367,7 @@ async fn should_validate_pubic_keys_to_add() { } = setup_test(); let mut validate_public_keys_mock = MockTPublicKeysValidator::new(); let some_consensus_error = ConsensusError::TestConsensusError(TestConsensusError::new("test")); - let validation_result = SimpleValidationResult::new_with_errors(vec![some_consensus_error]); + let validation_result = SimpleValidationResult::new(Some(vec![some_consensus_error])); validate_public_keys_mock .expect_validate_keys() .return_once(|_| Ok(validation_result)); diff --git a/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs b/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs index b0628ddd04e..80624d87e31 100644 --- a/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs @@ -341,7 +341,7 @@ pub fn should_return_invalid_result_if_there_are_duplicate_key_ids() { ConsensusError::DuplicatedIdentityPublicKeyBasicIdError, 1 ); - let consensus_error = result.errors.first().unwrap(); + let consensus_error = result.errors().first().unwrap(); let error = errors.first().unwrap(); let expected_ids = vec![raw_public_keys @@ -369,7 +369,7 @@ pub fn should_return_invalid_result_if_there_are_duplicate_keys() { 1 ); - let consensus_error = result.errors.first().unwrap(); + let consensus_error = result.errors().first().unwrap(); let error = errors.get(0).unwrap(); let expected_ids = vec![raw_public_keys @@ -398,7 +398,7 @@ pub fn should_return_invalid_result_if_key_data_is_not_a_valid_der() { 1 ); - let consensus_error = result.errors.first().unwrap(); + let consensus_error = result.errors().first().unwrap(); let error = errors.first().unwrap(); assert_eq!(consensus_error.code(), 1040); @@ -434,7 +434,7 @@ pub fn should_return_invalid_result_if_key_has_an_invalid_combination_of_purpose ConsensusError::InvalidIdentityPublicKeySecurityLevelError, 1 ); - let consensus_error = result.errors.first().unwrap(); + let consensus_error = result.errors().first().unwrap(); let error = errors.first().unwrap(); assert_eq!(consensus_error.code(), 1047); @@ -480,7 +480,7 @@ pub fn should_pass_valid_bls12_381_public_key() { let raw_public_keys = raw_public_keys_json.as_array().unwrap(); let result = validator.validate_keys(raw_public_keys).unwrap(); - for err in &result.errors { + for err in result.errors() { println!("{:?}", err); } @@ -525,7 +525,7 @@ pub fn should_return_invalid_result_if_bls12_381_public_key_is_invalid() { ConsensusError::InvalidIdentityPublicKeyDataError, 1 ); - let consensus_error = result.errors.first().unwrap(); + let consensus_error = result.errors().first().unwrap(); let error = errors.first().unwrap(); assert_eq!(consensus_error.code(), 1040); diff --git a/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs b/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs index 150935200a6..42b451260b9 100644 --- a/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs @@ -35,10 +35,10 @@ fn should_return_invalid_result_if_state_transition_does_not_contain_master_key( .expect("validation result should be returned"); assert!(matches!( - result.errors[0], + result.errors()[0], crate::consensus::ConsensusError::MissingMasterPublicKeyError(..) )); - assert_eq!(1046, result.errors[0].code()) + assert_eq!(1046, result.errors()[0].code()) } #[test] diff --git a/packages/rs-dpp/src/tests/utils/error_helpers.rs b/packages/rs-dpp/src/tests/utils/error_helpers.rs index cf007d155ce..c091cce447d 100644 --- a/packages/rs-dpp/src/tests/utils/error_helpers.rs +++ b/packages/rs-dpp/src/tests/utils/error_helpers.rs @@ -1,4 +1,3 @@ -use crate::validation::{SimpleValidationResult, ValidationResult}; use crate::{ consensus::{ basic::{BasicError, IndexError, JsonSchemaError}, @@ -7,10 +6,11 @@ use crate::{ ConsensusError, }, data_trigger::DataTriggerExecutionResult, + validation::ValidationResult, DataTriggerError, StateError, }; -pub fn get_schema_error(result: &SimpleValidationResult, number: usize) -> &JsonSchemaError { +pub fn get_schema_error(result: &ValidationResult<()>, number: usize) -> &JsonSchemaError { result .errors .get(number) @@ -36,8 +36,8 @@ pub fn get_index_error(consensus_error: &ConsensusError) -> &IndexError { } } -pub fn get_state_error_from_result( - result: &ValidationResult, +pub fn get_state_error_from_result( + result: &ValidationResult<()>, error_number: usize, ) -> &StateError { match result @@ -54,7 +54,7 @@ pub fn get_state_error_from_result( } pub fn get_basic_error_from_result( - result: &SimpleValidationResult, + result: &ValidationResult<()>, error_number: usize, ) -> &BasicError { match result diff --git a/packages/rs-dpp/src/tests/utils/utils.rs b/packages/rs-dpp/src/tests/utils/utils.rs index a4965f4f5a3..d48bd7a6e65 100644 --- a/packages/rs-dpp/src/tests/utils/utils.rs +++ b/packages/rs-dpp/src/tests/utils/utils.rs @@ -132,17 +132,17 @@ impl SerdeTestExtension for serde_json::Value { #[macro_export] macro_rules! assert_consensus_errors { ($validation_result: expr, $variant: path, $expected_errors_count: expr) => {{ - if $validation_result.errors.len() != $expected_errors_count { - for error in $validation_result.errors.iter() { + if $validation_result.errors().len() != $expected_errors_count { + for error in $validation_result.errors().iter() { println!("{:?}", error); } } - assert_eq!($validation_result.errors.len(), $expected_errors_count); + assert_eq!($validation_result.errors().len(), $expected_errors_count); let mut errors = Vec::new(); - for error in &$validation_result.errors { + for error in $validation_result.errors() { match error { $variant(err) => errors.push(err), err => { diff --git a/packages/rs-dpp/src/validation/json_schema_validator.rs b/packages/rs-dpp/src/validation/json_schema_validator.rs index 3bd52f16f9a..6030875982a 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator.rs @@ -6,7 +6,8 @@ use serde_json::{json, Value as JsonValue}; use crate::consensus::ConsensusError; use crate::util::json_value::JsonValueExt; -use crate::validation::{DataValidator, SimpleValidationResult}; +use crate::validation::DataValidator; +use crate::validation::ValidationResult; use crate::{DashPlatformProtocolInitError, NonConsensusError, SerdeParsingError}; use super::meta_validators; @@ -68,10 +69,7 @@ impl JsonSchemaValidator { Ok(json_schema_validator) } - pub fn validate( - &self, - object: &JsonValue, - ) -> Result { + pub fn validate(&self, object: &JsonValue) -> Result, NonConsensusError> { // TODO: create better error messages let res = self .schema @@ -79,7 +77,7 @@ impl JsonSchemaValidator { .ok_or_else(|| SerdeParsingError::new("Expected identity schema to be initialized"))? .validate(object); - let mut validation_result = SimpleValidationResult::default(); + let mut validation_result = ValidationResult::new(None); match res { Ok(_) => Ok(validation_result), @@ -93,8 +91,8 @@ impl JsonSchemaValidator { } /// validates schema through compilation - pub fn validate_schema(schema: &JsonValue) -> SimpleValidationResult { - let mut validation_result = SimpleValidationResult::default(); + pub fn validate_schema(schema: &JsonValue) -> ValidationResult<()> { + let mut validation_result = ValidationResult::new(None); let res = JSONSchema::options() .should_ignore_unknown_formats(false) @@ -110,10 +108,8 @@ impl JsonSchemaValidator { } /// Uses predefined meta-schemas to validate data contract schema - pub fn validate_data_contract_schema( - data_contract_schema: &JsonValue, - ) -> SimpleValidationResult { - let mut validation_result = SimpleValidationResult::default(); + pub fn validate_data_contract_schema(data_contract_schema: &JsonValue) -> ValidationResult<()> { + let mut validation_result = ValidationResult::new(None); let res = meta_validators::DATA_CONTRACT_META_SCHEMA.validate(data_contract_schema); match res { diff --git a/packages/rs-dpp/src/validation/mod.rs b/packages/rs-dpp/src/validation/mod.rs index d721213a15e..e6c3113e218 100644 --- a/packages/rs-dpp/src/validation/mod.rs +++ b/packages/rs-dpp/src/validation/mod.rs @@ -29,12 +29,9 @@ pub trait DataValidator { /// Async validator validates data of given type #[async_trait(?Send)] pub trait AsyncDataValidator { + // TODO, when GAT is available remove the reference in method and use: `type Item<'a>` type Item; - type ResultItem: Clone; - async fn validate( - &self, - data: &Self::Item, - ) -> Result, ProtocolError>; + async fn validate(&self, data: &Self::Item) -> Result; } /// Validator takes additionally an execution context and generates fee diff --git a/packages/rs-dpp/src/validation/validation_result.rs b/packages/rs-dpp/src/validation/validation_result.rs index 5ec21873ce8..386518a3312 100644 --- a/packages/rs-dpp/src/validation/validation_result.rs +++ b/packages/rs-dpp/src/validation/validation_result.rs @@ -1,24 +1,21 @@ use crate::errors::consensus::ConsensusError; -use crate::ProtocolError; pub type SimpleValidationResult = ValidationResult<()>; #[derive(Default, Debug)] pub struct ValidationResult { pub errors: Vec, + // TODO: data can be anything, figure out what to do with it data: Option, } impl ValidationResult { - pub fn new_with_data(data: TData) -> Self { + pub fn new(errors: Option>) -> Self { Self { - errors: vec![], - data: Some(data), + errors: errors.unwrap_or_default(), + data: None, } } - pub fn new_with_errors(errors: Vec) -> Self { - Self { errors, data: None } - } pub fn map(self, f: F) -> ValidationResult where @@ -42,65 +39,41 @@ impl ValidationResult { } pub fn merge(&mut self, mut other: ValidationResult) { - self.errors.append(&mut other.errors); + self.errors.append(other.errors_mut()); } - pub fn is_valid(&self) -> bool { - self.errors.is_empty() + pub fn errors(&self) -> &Vec { + &self.errors } - pub fn first_error(&self) -> Option<&ConsensusError> { - self.errors.first() - } - - pub fn into_result_without_data(self) -> ValidationResult<()> { - ValidationResult { - errors: self.errors, - data: None, - } + pub fn errors_mut(&mut self) -> &mut Vec { + &mut self.errors } - pub fn is_valid_with_data(&self) -> bool { - self.is_valid() && self.data.is_some() + pub fn is_valid(&self) -> bool { + self.errors().is_empty() } - pub fn has_data(&self) -> bool { - self.data.is_some() + pub fn first_error(&self) -> Option<&ConsensusError> { + self.errors.first() } pub fn set_data(&mut self, data: TData) { - self.data = Some(data) + self.data = Some(data); } - pub fn into_data(self) -> Result { - self.data - .ok_or(ProtocolError::CorruptedCodeExecution(format!( - "trying to push validation result into data (errors are {:?})", - self.errors - ))) + pub fn data(&self) -> Option<&TData> { + self.data.as_ref() } - pub fn data(&self) -> Result<&TData, ProtocolError> { - self.data - .as_ref() - .ok_or(ProtocolError::CorruptedCodeExecution(format!( - "trying to get validation result as data (errors are {:?})", - self.errors - ))) + pub fn take_data(&mut self) -> Option { + self.data.take() } -} -impl From for ValidationResult { - fn from(value: TData) -> Self { - ValidationResult::new_with_data(value) - } -} - -impl From> for ValidationResult { - fn from(value: Result) -> Self { - match value { - Ok(data) => ValidationResult::new_with_data(data), - Err(e) => ValidationResult::new_with_errors(vec![e]), + pub fn into_result_without_data(self) -> ValidationResult<()> { + ValidationResult { + errors: self.errors, + data: Some(()), } } } diff --git a/packages/rs-dpp/src/version/protocol_version_validator.rs b/packages/rs-dpp/src/version/protocol_version_validator.rs index 37267f1a39d..9fbefb45e25 100644 --- a/packages/rs-dpp/src/version/protocol_version_validator.rs +++ b/packages/rs-dpp/src/version/protocol_version_validator.rs @@ -7,7 +7,8 @@ use crate::errors::consensus::basic::{ IncompatibleProtocolVersionError, UnsupportedProtocolVersionError, }; use crate::errors::CompatibleProtocolVersionIsNotDefinedError; -use crate::validation::{DataValidator, SimpleValidationResult}; +use crate::validation::DataValidator; +use crate::validation::ValidationResult; use crate::version::{COMPATIBILITY_MAP, LATEST_VERSION}; #[derive(Clone)] @@ -57,8 +58,8 @@ impl ProtocolVersionValidator { pub fn validate( &self, protocol_version: u32, - ) -> Result { - let mut result = SimpleValidationResult::default(); + ) -> Result, CompatibleProtocolVersionIsNotDefinedError> { + let mut result = ValidationResult::new(None); // Parsed protocol version must be equal or lower than latest protocol version if protocol_version > self.latest_protocol_version { From 4238b2e152eaaec5a28eaa6235f997549598f687 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 17:03:42 +0500 Subject: [PATCH 3/8] chore: updates from v0.24 --- .../execute_data_triggers_factory.rs | 14 ++++----- .../wasm-dpp/src/decode_protocol_entity.rs | 2 +- .../src/document/extended_document.rs | 7 ++++- .../state/fetch_extended_documents.rs | 6 ++-- ...alidate_documents_uniqueness_by_indices.rs | 2 +- .../wasm-dpp/src/identity/factory_utils.rs | 8 ++--- .../identity_create_transition.rs | 20 ++++++------ ...ntity_create_transition_state_validator.rs | 2 +- .../identity_public_key_transitions.rs | 24 +++++++------- ...entity_topup_transition_state_validator.rs | 2 +- .../identity_update_public_keys_validator.rs | 4 +-- .../identity_update_transition.rs | 16 +++++----- .../validate_public_key_signatures.rs | 4 +-- .../src/validation/validation_result.rs | 12 ++----- ...ntractCreateTransitionBasicFactory.spec.js | 1 - .../integration/document/Document.spec.js | 2 -- .../DocumentBatchTransition.spec.js | 1 - ...cumentsBatchTransitionBasicFactory.spec.js | 1 - .../identity/IdentityFacade.spec.js | 6 ++-- ...entityCreateTransitionBasicFactory.spec.js | 16 +++++----- ...entityUpdateTransitionBasicFactory.spec.js | 12 +++---- ...validatePublicKeySignaturesFactory.spec.js | 10 +++--- .../basic/findDuplicatesById.spec.js | 2 -- ...cumentsBatchTransitionStateFactory.spec.js | 31 ++++++++++--------- .../unit/identity/IdentityFactory.spec.js | 6 ++-- .../IdentityCreateTransition.spec.js | 16 +++++----- .../IdentityUpdateTransition.spec.js | 8 ++--- 27 files changed, 112 insertions(+), 123 deletions(-) diff --git a/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs b/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs index eb92135596a..4f918fa786f 100644 --- a/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs +++ b/packages/wasm-dpp/src/data_trigger/execute_data_triggers_factory.rs @@ -1,5 +1,5 @@ use dpp::document::validation::state::execute_data_triggers::execute_data_triggers_with_custom_list; -use itertools::Itertools; +use dpp::prelude::{DataTrigger, DocumentTransition}; use js_sys::Array; use wasm_bindgen::prelude::*; @@ -26,24 +26,24 @@ pub async fn execute_data_triggers_wasm( let st_wrapper = ExternalStateRepositoryLikeWrapper::new_with_arc(js_context.state_repository()); let context = data_trigger_context_from_wasm(&js_context, &st_wrapper); - let document_transitions: Vec<_> = js_document_transitions + let document_transitions = js_document_transitions .iter() .map(|v| { v.to_wasm::("DocumentTransition") - .map(|v| v.to_owned()) + .map(|v| v.to_owned().into_inner()) }) - .try_collect()?; + .collect::, JsValue>>()?; - let data_triggers: Vec<_> = js_data_triggers + let data_triggers = js_data_triggers .iter() .map(|v| { v.to_wasm::("DataTrigger") .map(|v| v.to_owned().into_inner()) }) - .try_collect()?; + .collect::, JsValue>>()?; let results = execute_data_triggers_with_custom_list( - document_transitions.iter().map(|v| v.inner()), + document_transitions.iter().collect::>().as_slice(), &context, data_triggers, ) diff --git a/packages/wasm-dpp/src/decode_protocol_entity.rs b/packages/wasm-dpp/src/decode_protocol_entity.rs index 792a674e777..b78efff6a27 100644 --- a/packages/wasm-dpp/src/decode_protocol_entity.rs +++ b/packages/wasm-dpp/src/decode_protocol_entity.rs @@ -17,7 +17,7 @@ pub fn decode_protocol_entity(buffer: Vec) -> Result { .try_to_validating_json() .map_err(|e| from_protocol_error(ProtocolError::ValueError(e)))? .serialize(&serializer) - .map_err(|e| from_protocol_error(ProtocolError::NonConsensusError(e.to_string())))?; + .map_err(|e| from_protocol_error(ProtocolError::EncodingError(e.to_string())))?; Ok(Array::from_iter(vec![ JsValue::from(protocol_version), js_value, diff --git a/packages/wasm-dpp/src/document/extended_document.rs b/packages/wasm-dpp/src/document/extended_document.rs index 16f01e77904..5ec98afa856 100644 --- a/packages/wasm-dpp/src/document/extended_document.rs +++ b/packages/wasm-dpp/src/document/extended_document.rs @@ -18,7 +18,7 @@ use crate::errors::RustConversionError; use crate::identifier::{identifier_from_js_value, IdentifierWrapper}; use crate::lodash::lodash_set; use crate::utils::{with_serde_to_platform_value, Inner, ToSerdeJSONExt, WithJsError}; -use crate::{with_js_error, ConversionOptions}; +use crate::{with_js_error, ConversionOptions, DocumentWasm}; use crate::{DataContractWasm, MetadataWasm}; #[wasm_bindgen(js_name=ExtendedDocument)] @@ -102,6 +102,11 @@ impl ExtendedDocumentWasm { Ok(()) } + #[wasm_bindgen(js_name=getDocument)] + pub fn get_document(&self) -> DocumentWasm { + self.0.document.clone().into() + } + #[wasm_bindgen(js_name=setOwnerId)] pub fn set_owner_id(&mut self, owner_id: IdentifierWrapper) { self.0.document.owner_id = owner_id.into_inner(); diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs index 63a101f4ba6..6c570f83741 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs @@ -1,5 +1,5 @@ use dpp::{ - document::validation::state::fetch_extended_documents, prelude::DocumentTransition, + document::validation::state::fetch_documents, prelude::DocumentTransition, state_transition::state_transition_execution_context::StateTransitionExecutionContext, }; use js_sys::Array; @@ -26,9 +26,9 @@ pub async fn fetch_extended_documents_wasm( } let execution_context: StateTransitionExecutionContext = js_execution_context.into(); - let documents = fetch_extended_documents::fetch_extended_documents( + let documents = fetch_documents::fetch_extended_documents( &wrapped_state_repository, - document_transitions, + document_transitions.iter().collect::>().as_slice(), &execution_context, ) .await diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs index 2aeb530602c..ed4aff8cffc 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs @@ -36,7 +36,7 @@ pub async fn validate_uniqueness_by_indices_wasm( validate_documents_uniqueness_by_indices::validate_documents_uniqueness_by_indices( &wrapped_state_repository, &owner_id, - document_transitions, + document_transitions.iter(), js_data_contract.inner(), &execution_context, ) diff --git a/packages/wasm-dpp/src/identity/factory_utils.rs b/packages/wasm-dpp/src/identity/factory_utils.rs index 50ee7267a8f..8693a7a5387 100644 --- a/packages/wasm-dpp/src/identity/factory_utils.rs +++ b/packages/wasm-dpp/src/identity/factory_utils.rs @@ -1,5 +1,5 @@ use crate::errors::RustConversionError; -use crate::identity::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm; +use crate::identity::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; use crate::utils::{generic_of_js_val, to_vec_of_platform_values}; use crate::{create_asset_lock_proof_from_wasm_instance, IdentityPublicKeyWasm}; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; @@ -47,10 +47,10 @@ pub fn parse_create_identity_update_transition_keys( let keys: Vec = add_public_keys_array .iter() .map(|key| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( &key, - "IdentityPublicKeyCreateTransition", + "IdentityPublicKeyWithWitness", )?; Ok(public_key.clone().into()) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 3862895aa13..5a6ba58895d 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -13,7 +13,7 @@ use crate::{ identity::state_transition::asset_lock_proof::{ ChainAssetLockProofWasm, InstantAssetLockProofWasm, }, - identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm, + identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, state_transition::StateTransitionExecutionContextWasm, with_js_error, }; @@ -97,10 +97,10 @@ impl IdentityCreateTransitionWasm { let public_keys = public_keys .iter() .map(|value| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( value, - "IdentityPublicKeyCreateTransition", + "IdentityPublicKeyWithWitness", )?; Ok(public_key.clone().into()) }) @@ -116,10 +116,10 @@ impl IdentityCreateTransitionWasm { let mut public_keys = public_keys .iter() .map(|value| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( value, - "IdentityPublicKeyCreateTransition", + "IdentityPublicKeyWithWitness", )?; Ok(public_key.clone().into()) }) @@ -136,7 +136,7 @@ impl IdentityCreateTransitionWasm { .get_public_keys() .iter() .map(IdentityPublicKeyWithWitness::to_owned) - .map(IdentityPublicKeyCreateTransitionWasm::from) + .map(IdentityPublicKeyWithWitnessWasm::from) .map(JsValue::from) .collect() } @@ -218,7 +218,7 @@ impl IdentityCreateTransitionWasm { let keys_objects = object .public_keys .into_iter() - .map(IdentityPublicKeyCreateTransitionWasm::from) + .map(IdentityPublicKeyWithWitnessWasm::from) .map(|key| key.to_object(options.clone())) .collect::>()?; @@ -288,7 +288,7 @@ impl IdentityCreateTransitionWasm { let keys_objects = object .public_keys .into_iter() - .map(IdentityPublicKeyCreateTransitionWasm::from) + .map(IdentityPublicKeyWithWitnessWasm::from) .map(|key| key.to_json()) .collect::>()?; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs index e4f5f7abd7c..f6f5734ea34 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs @@ -30,7 +30,7 @@ impl IdentityCreateTransitionStateValidator { &state_transition.to_owned().into(), ) .await - .map_err(|e| from_dpp_err(e.into()))?; + .map_err(from_dpp_err)?; Ok(validation_result.map(|_| JsValue::undefined()).into()) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs index 3cc52cc1738..fa5ea7d3a95 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs @@ -18,20 +18,20 @@ struct ToObjectOptions { pub skip_signature: Option, } -#[wasm_bindgen(js_name=IdentityPublicKeyCreateTransition)] +#[wasm_bindgen(js_name=IdentityPublicKeyWithWitness)] #[derive(Serialize, Deserialize, Debug, Clone)] -pub struct IdentityPublicKeyCreateTransitionWasm(IdentityPublicKeyWithWitness); +pub struct IdentityPublicKeyWithWitnessWasm(IdentityPublicKeyWithWitness); -#[wasm_bindgen(js_class = IdentityPublicKeyCreateTransition)] -impl IdentityPublicKeyCreateTransitionWasm { +#[wasm_bindgen(js_class = IdentityPublicKeyWithWitness)] +impl IdentityPublicKeyWithWitnessWasm { #[wasm_bindgen(constructor)] - pub fn new(raw_public_key: JsValue) -> Result { + pub fn new(raw_public_key: JsValue) -> Result { let data_string = utils::stringify(&raw_public_key)?; let value: JsonValue = serde_json::from_str(&data_string).map_err(|e| e.to_string())?; let pk = IdentityPublicKeyWithWitness::from_json_object(value).with_js_error()?; - Ok(IdentityPublicKeyCreateTransitionWasm(pk)) + Ok(IdentityPublicKeyWithWitnessWasm(pk)) } #[wasm_bindgen(js_name=getId)] @@ -173,7 +173,7 @@ impl IdentityPublicKeyCreateTransitionWasm { } } -impl IdentityPublicKeyCreateTransitionWasm { +impl IdentityPublicKeyWithWitnessWasm { pub fn into_inner(self) -> IdentityPublicKeyWithWitness { self.0 } @@ -187,13 +187,13 @@ impl IdentityPublicKeyCreateTransitionWasm { } } -impl From for IdentityPublicKeyCreateTransitionWasm { +impl From for IdentityPublicKeyWithWitnessWasm { fn from(v: IdentityPublicKeyWithWitness) -> Self { - IdentityPublicKeyCreateTransitionWasm(v) + IdentityPublicKeyWithWitnessWasm(v) } } -impl TryFrom for IdentityPublicKeyCreateTransitionWasm { +impl TryFrom for IdentityPublicKeyWithWitnessWasm { type Error = JsValue; fn try_from(value: JsValue) -> Result { @@ -205,8 +205,8 @@ impl TryFrom for IdentityPublicKeyCreateTransitionWasm { } } -impl From for IdentityPublicKeyWithWitness { - fn from(pk: IdentityPublicKeyCreateTransitionWasm) -> Self { +impl From for IdentityPublicKeyWithWitness { + fn from(pk: IdentityPublicKeyWithWitnessWasm) -> Self { pk.0 } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs index b8e38429c99..130acd6d2c5 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs @@ -26,8 +26,8 @@ impl IdentityTopUpTransitionStateValidator { state_transition: &IdentityTopUpTransitionWasm, ) -> Result { let validation_result = validate_identity_topup_transition_state( - &state_transition.to_owned().into(), &self.state_repository, + &state_transition.to_owned().into(), ) .await .map_err(|e| from_dpp_err(e.into()))?; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs index 94d4f8079d6..b97935fc454 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs @@ -1,5 +1,5 @@ use crate::errors::from_dpp_err; -use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm; +use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; use crate::utils::WithJsError; use crate::validation::ValidationResultWasm; use dpp::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitness; @@ -32,7 +32,7 @@ impl IdentityUpdatePublicKeysValidatorWasm { .into_iter() .map(|raw_key| { let parsed_key: IdentityPublicKeyWithWitness = - IdentityPublicKeyCreateTransitionWasm::new(raw_key)?.into(); + IdentityPublicKeyWithWitnessWasm::new(raw_key)?.into(); parsed_key.to_raw_object(false).with_js_error() }) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index fa5ea9069a8..9cd16bd44d9 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -9,7 +9,7 @@ use crate::identifier::IdentifierWrapper; use crate::{ buffer::Buffer, errors::RustConversionError, - identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm, + identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, identity::IdentityPublicKeyWasm, state_transition::StateTransitionExecutionContextWasm, with_js_error, }; @@ -94,10 +94,10 @@ impl IdentityUpdateTransitionWasm { keys_to_add = keys .iter() .map(|value| { - let public_key: Ref = - generic_of_js_val::( + let public_key: Ref = + generic_of_js_val::( value, - "IdentityPublicKeyCreateTransition", + "IdentityPublicKeyWithWitness", )?; Ok(public_key.clone().into()) }) @@ -114,7 +114,7 @@ impl IdentityUpdateTransitionWasm { self.0 .get_public_keys_to_add() .iter() - .map(|key| IdentityPublicKeyCreateTransitionWasm::from(key.to_owned()).into()) + .map(|key| IdentityPublicKeyWithWitnessWasm::from(key.to_owned()).into()) .collect() } @@ -251,9 +251,7 @@ impl IdentityUpdateTransitionWasm { if let Some(public_keys_to_add) = object.public_keys_to_add { let keys_objects = public_keys_to_add .into_iter() - .map(|key| { - IdentityPublicKeyCreateTransitionWasm::from(key).to_object(options.clone()) - }) + .map(|key| IdentityPublicKeyWithWitnessWasm::from(key).to_object(options.clone())) .collect::>()?; js_sys::Reflect::set( @@ -359,7 +357,7 @@ impl IdentityUpdateTransitionWasm { if let Some(public_keys_to_add) = object.public_keys_to_add { let keys_objects = public_keys_to_add .into_iter() - .map(|key| IdentityPublicKeyCreateTransitionWasm::from(key).to_json()) + .map(|key| IdentityPublicKeyWithWitnessWasm::from(key).to_json()) .collect::>()?; js_sys::Reflect::set( diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs index 2543c102843..2674b03437b 100644 --- a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -4,7 +4,7 @@ use crate::utils::{ToSerdeJSONExt, WithJsError}; use crate::validation::ValidationResultWasm; -use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm; +use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; use dpp::identity::state_transition::validate_public_key_signatures::{ PublicKeysSignaturesValidator, TPublicKeysSignaturesValidator, @@ -45,7 +45,7 @@ impl PublicKeysSignaturesValidatorWasm { .into_iter() .map(|raw_key| { let parsed_key: IdentityPublicKeyWithWitness = - IdentityPublicKeyCreateTransitionWasm::new(raw_key)?.into(); + IdentityPublicKeyWithWitnessWasm::new(raw_key)?.into(); parsed_key.to_raw_object(false).with_js_error() }) .collect::, JsValue>>()?; diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index 51c4e867a1f..5e5fa73a8e7 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -22,11 +22,7 @@ impl ValidationResultWasm { /// remove before shipping #[wasm_bindgen(js_name=errorsText)] pub fn errors_text(&self) -> Vec { - self.0 - .errors() - .iter() - .map(|e| e.to_string().into()) - .collect() + self.0.errors.iter().map(|e| e.to_string().into()).collect() } #[wasm_bindgen(js_name=isValid)] @@ -36,11 +32,7 @@ impl ValidationResultWasm { #[wasm_bindgen(js_name=getErrors)] pub fn errors(&self) -> Vec { - self.0 - .errors() - .iter() - .map(from_consensus_error_ref) - .collect() + self.0.errors.iter().map(from_consensus_error_ref).collect() } #[wasm_bindgen(js_name=getData)] diff --git a/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js index 6418baaf2bf..b9af33a9662 100644 --- a/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js @@ -127,7 +127,6 @@ describe('validateDataContractCreateTransitionBasicFactory', () => { it('should be valid', async () => { const result = await validateDataContractCreateTransitionBasic(rawStateTransition); - console.log(result.errorsText()); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); }); diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index f9dc489e2a1..a9d11a8c7be 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -53,8 +53,6 @@ describe('ExtendedDocument', () => { it('should return raw document - Rust', () => { const result = document.toObject(); - console.log(document.get('byteArrayField')); - expect(result).to.deep.equal({ $protocolVersion: document.getProtocolVersion(), $dataContractId: dataContract.getId().toBuffer(), diff --git a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js index b2ccef02df2..4f4e96f96e5 100644 --- a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +++ b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js @@ -31,7 +31,6 @@ describe('DocumentBatchTransition', () => { DocumentValidator, } = await loadWasmDpp()); - console.log(ExtendedDocument); const dataContractFixtureJs = getDataContractFixture(); dataContractFixtureJs.documents.niceDocument diff --git a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js index a0df164b1a6..b71a98e929c 100644 --- a/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js @@ -637,7 +637,6 @@ describe('validateDocumentsBatchTransitionBasicFactory', () => { ); const [error] = result.getErrors(); - console.log(error.toString()); await expectValidationError(result, InvalidDocumentTransitionIdError); diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index 07cfc552ab9..734b8f7bb60 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -22,7 +22,7 @@ describe('IdentityFacade', () => { let IdentityCreateTransition; let IdentityTopUpTransition; let IdentityUpdateTransition; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; let ChainAssetLockProof; let DashPlatformProtocol; let ValidationResult; @@ -30,7 +30,7 @@ describe('IdentityFacade', () => { before(async () => { ({ Identity, InstantAssetLockProof, ChainAssetLockProof, IdentityUpdateTransition, - IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyCreateTransition, + IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyWithWitness, DashPlatformProtocol, ValidationResult, } = await loadWasmDpp()); }); @@ -189,7 +189,7 @@ describe('IdentityFacade', () => { describe('#createIdentityUpdateTransition', () => { it('should create IdentityUpdateTransition from identity id and public keys', () => { const publicKeys = { - add: [new IdentityPublicKeyCreateTransition({ + add: [new IdentityPublicKeyWithWitness({ id: 3, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'), diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index 261a2efa2b4..761e8fec658 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -12,7 +12,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { let stateTransition; let stateRepositoryMock; - let mockIdentityPublicKeyCreateTransition; + let mockIdentityPublicKeyWithWitness; let executionContext; let validateIdentityCreateTransitionBasic; @@ -26,7 +26,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { let InvalidIdentityPublicKeyDataError; let InvalidIdentityKeySignatureError; let IdentityCreateTransitionBasicValidator; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; before(async () => { ({ @@ -37,13 +37,13 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { InvalidIdentityPublicKeySecurityLevelError, InvalidIdentityPublicKeyDataError, InvalidIdentityKeySignatureError, - IdentityPublicKeyCreateTransition, + IdentityPublicKeyWithWitness, IdentityCreateTransitionBasicValidator, IdentityPublicKey, } = await loadWasmDpp()); - mockIdentityPublicKeyCreateTransition = (publicKey, opts = {}) => ( - new IdentityPublicKeyCreateTransition({ + mockIdentityPublicKeyWithWitness = (publicKey, opts = {}) => ( + new IdentityPublicKeyWithWitness({ id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: publicKey, @@ -74,7 +74,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const privateKey = new PrivateKey('9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2'); const publicKey = privateKey.toPublicKey(); - const identityPublicKey = mockIdentityPublicKeyCreateTransition(publicKey.toBuffer()); + const identityPublicKey = mockIdentityPublicKeyWithWitness(publicKey.toBuffer()); stateTransition.setPublicKeys([identityPublicKey]); @@ -299,7 +299,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const privateKey = new PrivateKey(); // Mess up public key - const identityPublicKey = mockIdentityPublicKeyCreateTransition(Buffer.alloc(33)); + const identityPublicKey = mockIdentityPublicKeyWithWitness(Buffer.alloc(33)); stateTransition.setPublicKeys([identityPublicKey]); await stateTransition.signByPrivateKey( @@ -323,7 +323,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const privateKey = new PrivateKey(); // Mess up public key's purpose - const identityPublicKey = mockIdentityPublicKeyCreateTransition( + const identityPublicKey = mockIdentityPublicKeyWithWitness( privateKey.toPublicKey().toBuffer(), ); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js index 8b711df8f36..c3305245f8d 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js @@ -12,7 +12,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { let publicKeyToAdd; let IdentityPublicKey; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; let UnsupportedProtocolVersionError; let InvalidIdentityKeySignatureError; let DuplicatedIdentityPublicKeyIdStateError; @@ -24,7 +24,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { InvalidIdentityKeySignatureError, DuplicatedIdentityPublicKeyIdStateError, IdentityPublicKey, - IdentityPublicKeyCreateTransition, + IdentityPublicKeyWithWitness, IdentityUpdateTransitionBasicValidator, } = await loadWasmDpp()); }); @@ -49,7 +49,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { readOnly: false, }); - let identityPublicKeyCreateTransition = new IdentityPublicKeyCreateTransition({ + let identityPublicKeyCreateTransition = new IdentityPublicKeyWithWitness({ ...identityPublicKey.toObject(), signature: Buffer.alloc(0), }); @@ -312,7 +312,7 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { const privateKey = new PrivateKey(); const publicKey = privateKey.toPublicKey(); - const identityPublicKeyCreateTransition = new IdentityPublicKeyCreateTransition( + const identityPublicKeyCreateTransition = new IdentityPublicKeyWithWitness( publicKeyToAdd, ); identityPublicKeyCreateTransition.setData(publicKey.toBuffer()); @@ -384,8 +384,8 @@ describe('validateIdentityUpdateTransitionBasicFactory', () => { const keyWithDupeId = { ...publicKeyToAdd, data: Buffer.alloc(33) }; stateTransition.setPublicKeysToAdd([ - new IdentityPublicKeyCreateTransition(publicKeyToAdd), - new IdentityPublicKeyCreateTransition(keyWithDupeId), + new IdentityPublicKeyWithWitness(publicKeyToAdd), + new IdentityPublicKeyWithWitness(keyWithDupeId), ]); rawStateTransition = stateTransition.toObject(); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js index 7154af874d4..b776d0610d6 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js @@ -18,7 +18,7 @@ describe('validatePublicKeySignaturesFactory', () => { let IdentityCreateTransition; let IdentityPublicKey; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; let InvalidIdentityKeySignatureError; let ValidationResult; let PublicKeysSignaturesValidator; @@ -28,7 +28,7 @@ describe('validatePublicKeySignaturesFactory', () => { ({ IdentityCreateTransition, IdentityPublicKey, - IdentityPublicKeyCreateTransition, + IdentityPublicKeyWithWitness, InvalidIdentityKeySignatureError, PublicKeysSignaturesValidator, ValidationResult, @@ -43,7 +43,7 @@ describe('validatePublicKeySignaturesFactory', () => { const privateKey1 = new PrivateKey('17e0b1703e226204c557bce68b0871683ea409ae90c7a733b72a33f7c129c959'); const publicKey1 = privateKey1.toPublicKey(); - const identityPublicKey1 = new IdentityPublicKeyCreateTransition({ + const identityPublicKey1 = new IdentityPublicKeyWithWitness({ id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: publicKey1.toBuffer(), @@ -56,7 +56,7 @@ describe('validatePublicKeySignaturesFactory', () => { const privateKey2 = new PrivateKey('afc20afac882f676af5a268a2eca9c763996c36dbeb3660648df2108006820c7'); const publicKey2 = privateKey2.toPublicKey(); - const identityPublicKey2 = new IdentityPublicKeyCreateTransition({ + const identityPublicKey2 = new IdentityPublicKeyWithWitness({ id: 1, type: IdentityPublicKey.TYPES.ECDSA_HASH160, data: Hash.sha256ripemd160(publicKey2.toBuffer()), @@ -75,7 +75,7 @@ describe('validatePublicKeySignaturesFactory', () => { const privateKey3 = BasicSchemeMPL.keyGen(randomBytes); const publicKey3 = privateKey3.getG1(); - const identityPublicKey3 = new IdentityPublicKeyCreateTransition({ + const identityPublicKey3 = new IdentityPublicKeyWithWitness({ id: 2, type: IdentityPublicKey.TYPES.BLS12_381, data: Buffer.from(publicKey3.serialize()), diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js index b2b3849fd18..f9d85440046 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js @@ -23,8 +23,6 @@ describe('findDuplicatesById', () => { it('should return duplicated Documents', () => { rawDocumentTransitions.push(rawDocumentTransitions[0]); - console.dir(rawDocumentTransitions[0]); - const result = findDuplicatesById(rawDocumentTransitions); expect(result).to.be.an('array'); diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js index f4e9da79b90..7f1182c6da0 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js @@ -106,6 +106,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(blockTime); stateRepositoryMock.fetchExtendedDocuments.resolves([]); + stateRepositoryMock.fetchDocuments.resolves([]); executeDataTriggersMock = this.sinonSandbox.stub(); validateDocumentsUniquenessByIndicesMock = this.sinonSandbox.stub(); @@ -138,7 +139,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { }); it('should return invalid result if document transition with action "create" is already present - Rust', async () => { - stateRepositoryMock.fetchExtendedDocuments.resolves([documents[0]]); + stateRepositoryMock.fetchDocuments.resolves([documents[0].getDocument()]); const result = await validateDocumentsBatchTransitionState( stateRepositoryMock, stateTransition, @@ -182,7 +183,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchExtendedDocuments) + expect(stateRepositoryMock.fetchDocuments) .to.have.been.callCount(documentTransitionsJs.length); }); @@ -213,7 +214,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been + expect(stateRepositoryMock.fetchDocuments).to.have.been .callCount(documentTransitionsJs.length); }); @@ -233,7 +234,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { }, [dataContract]); documents[0].setCreatedAt(replaceDocument.getCreatedAt().getMilliseconds()); - stateRepositoryMock.fetchExtendedDocuments.resolves([documents[0]]); + stateRepositoryMock.fetchDocuments.resolves([documents[0].getDocument()]); const result = await validateDocumentsBatchTransitionState( stateRepositoryMock, stateTransition, @@ -252,7 +253,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been + expect(stateRepositoryMock.fetchDocuments).to.have.been .callCount(documentTransitionsJs.length); }); @@ -274,7 +275,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { transitions: documentTransitionsJs.map((t) => t.toObject()), }, [dataContract]); - stateRepositoryMock.fetchExtendedDocuments.resolves([fetchedDocument]); + stateRepositoryMock.fetchDocuments.resolves([fetchedDocument.getDocument()]); const result = await validateDocumentsBatchTransitionState( stateRepositoryMock, @@ -295,7 +296,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been + expect(stateRepositoryMock.fetchDocuments).to.have.been .callCount(documentTransitionsJs.length); }); @@ -598,11 +599,11 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { it('should return valid result if document transitions are valid - Rust', async () => { const fetchedDocuments = [ - new ExtendedDocument(documentsJs[1].toObject(), dataContract), - new ExtendedDocument(documentsJs[2].toObject(), dataContract), + new ExtendedDocument(documentsJs[1].toObject(), dataContract).getDocument(), + new ExtendedDocument(documentsJs[2].toObject(), dataContract).getDocument(), ]; - stateRepositoryMock.fetchExtendedDocuments.resolves(fetchedDocuments); + stateRepositoryMock.fetchDocuments.resolves(fetchedDocuments); documentsJs[1].setRevision(1); documentsJs[2].setRevision(1); @@ -630,16 +631,16 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been.calledOnce(); + expect(stateRepositoryMock.fetchDocuments).to.have.been.calledOnce(); }); it('should return valid result if document transitions are valid - Rust', async () => { const fetchedDocuments = [ - new ExtendedDocument(documentsJs[1].toObject(), dataContract), - new ExtendedDocument(documentsJs[2].toObject(), dataContract), + new ExtendedDocument(documentsJs[1].toObject(), dataContract).getDocument(), + new ExtendedDocument(documentsJs[2].toObject(), dataContract).getDocument(), ]; - stateRepositoryMock.fetchExtendedDocuments.resolves(fetchedDocuments); + stateRepositoryMock.fetchDocuments.resolves(fetchedDocuments); documentsJs[1].setRevision(1); documentsJs[2].setRevision(1); @@ -667,6 +668,6 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; expect(fetchDataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer()); - expect(stateRepositoryMock.fetchExtendedDocuments).to.have.been.calledOnce(); + expect(stateRepositoryMock.fetchDocuments).to.have.been.calledOnce(); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index d50f8a1541e..1c9ccfaa9a6 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -19,7 +19,7 @@ describe('IdentityFactory', () => { let IdentityCreateTransition; let IdentityTopUpTransition; let IdentityUpdateTransition; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; let InvalidIdentityError; let PlatformValueError; let UnsupportedProtocolVersionError; @@ -29,7 +29,7 @@ describe('IdentityFactory', () => { ({ Identity, IdentityFactory, IdentityValidator, InstantAssetLockProof, ChainAssetLockProof, IdentityUpdateTransition, - IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyCreateTransition, + IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyWithWitness, InvalidIdentityError, UnsupportedProtocolVersionError, PlatformValueError, } = await loadWasmDpp()); }); @@ -235,7 +235,7 @@ describe('IdentityFactory', () => { it('should create IdentityUpdateTransition', () => { const revision = 1; const disablePublicKeys = [identity.getPublicKeyById(0)]; - const addPublicKeys = [new IdentityPublicKeyCreateTransition({ + const addPublicKeys = [new IdentityPublicKeyWithWitness({ id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'), diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 3566ea1dc98..2172245c2e9 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -15,7 +15,7 @@ describe('IdentityCreateTransition', () => { let KeyPurpose; let KeySecurityLevel; let Identifier; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -31,7 +31,7 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ IdentityCreateTransition, - IdentityPublicKeyCreateTransition, + IdentityPublicKeyWithWitness, KeyType, KeyPurpose, KeySecurityLevel, @@ -53,7 +53,7 @@ describe('IdentityCreateTransition', () => { ); expect(stateTransition.publicKeys.map((key) => key.toObject())).to.deep.equal([ - new IdentityPublicKeyCreateTransition(rawStateTransition.publicKeys[0]).toObject(), + new IdentityPublicKeyWithWitness(rawStateTransition.publicKeys[0]).toObject(), ]); }); @@ -104,8 +104,8 @@ describe('IdentityCreateTransition', () => { describe('#setPublicKeys', () => { it('should set public keys', () => { const publicKeys = [ - new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 0 })), - new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 1 })), + new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 0 })), + new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 1 })), ]; stateTransition.setPublicKeys(publicKeys); @@ -119,7 +119,7 @@ describe('IdentityCreateTransition', () => { it('should return set public keys', () => { expect(stateTransition.getPublicKeys().map((key) => key.toObject())).to.deep.equal( rawStateTransition.publicKeys - .map((rawPublicKey) => new IdentityPublicKeyCreateTransition(rawPublicKey).toObject()), + .map((rawPublicKey) => new IdentityPublicKeyWithWitness(rawPublicKey).toObject()), ); }); }); @@ -127,8 +127,8 @@ describe('IdentityCreateTransition', () => { describe('#addPublicKeys', () => { it('should add more public keys', () => { const publicKeys = [ - new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 0 })), - new IdentityPublicKeyCreateTransition(mockRawPublicKey({ id: 1 })), + new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 0 })), + new IdentityPublicKeyWithWitness(mockRawPublicKey({ id: 1 })), ]; stateTransition.setPublicKeys([]); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js index c3210650134..a4638f662fb 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js @@ -15,13 +15,13 @@ describe('IdentityUpdateTransition', () => { let IdentityPublicKey; let Identifier; - let IdentityPublicKeyCreateTransition; + let IdentityPublicKeyWithWitness; before(async () => { ({ IdentityPublicKey, Identifier, - IdentityPublicKeyCreateTransition, + IdentityPublicKeyWithWitness, } = await loadWasmDpp()); }); @@ -81,14 +81,14 @@ describe('IdentityUpdateTransition', () => { expect(stateTransition.getPublicKeysToAdd().map((key) => key.toObject())) .to.deep.equal( rawStateTransition.addPublicKeys - .map((rawPublicKey) => new IdentityPublicKeyCreateTransition(rawPublicKey).toObject()), + .map((rawPublicKey) => new IdentityPublicKeyWithWitness(rawPublicKey).toObject()), ); }); }); describe('#setPublicKeysToAdd', () => { it('should set public keys to add', () => { - const publicKeys = [new IdentityPublicKeyCreateTransition({ + const publicKeys = [new IdentityPublicKeyWithWitness({ id: 0, type: IdentityPublicKey.TYPES.BLS12_381, purpose: 0, From 3f358309d81eeda7c52ccac4d6a72cef9bb47576 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 17:04:01 +0500 Subject: [PATCH 4/8] chore: updates from v0.24 --- .../src/contracts/withdrawals_contract.rs | 2 +- .../src/data_contract/data_contract_facade.rs | 5 +- .../document_type/document_type.rs | 10 + .../data_contract_create_transition/mod.rs | 4 + ...e_data_contract_create_transition_basic.rs | 4 +- ...e_data_contract_create_transition_state.rs | 33 ++- .../data_contract_update_transition/mod.rs | 4 + ...e_data_contract_update_transition_basic.rs | 4 +- ...alidate_indices_are_backward_compatible.rs | 6 +- ...e_data_contract_update_transition_state.rs | 19 +- .../validation/data_contract_validator.rs | 27 +- .../validation/multi_validator.rs | 20 +- .../validate_data_contract_max_depth.rs | 7 +- .../rs-dpp/src/document/document_facade.rs | 23 +- .../rs-dpp/src/document/document_factory.rs | 7 +- .../rs-dpp/src/document/document_validator.rs | 15 +- .../fetch_and_validate_data_contract.rs | 2 +- packages/rs-dpp/src/document/mod.rs | 1 + ...pply_documents_batch_transition_factory.rs | 13 +- .../document_transition/mod.rs | 12 + .../documents_batch_transition/mod.rs | 7 + ...lidate_documents_batch_transition_basic.rs | 19 +- .../validate_partial_compound_indices.rs | 10 +- .../validation/state/execute_data_triggers.rs | 4 +- .../validation/state/mod.rs | 2 +- ...lidate_documents_batch_transition_state.rs | 273 ++++++++++++------ ...alidate_documents_uniqueness_by_indices.rs | 20 +- packages/rs-dpp/src/errors/dpp_error.rs | 8 +- packages/rs-dpp/src/errors/errors.rs | 18 +- .../rs-dpp/src/errors/non_consensus_error.rs | 7 +- .../rs-dpp/src/identity/identity_facade.rs | 4 +- ...in_asset_lock_proof_structure_validator.rs | 24 +- ...nt_asset_lock_proof_structure_validator.rs | 8 +- .../state_transition/asset_lock_proof/mod.rs | 103 ++++++- .../identity_create_transition/mod.rs | 2 + ...ntity_create_transition_basic_validator.rs | 4 +- .../validation/state/mod.rs | 30 +- .../mod.rs | 4 + ...tity_credit_withdrawal_transition_basic.rs | 5 +- ...tity_credit_withdrawal_transition_state.rs | 59 +++- .../identity_topup_transition/mod.rs | 2 + ...entity_topup_transition_basic_validator.rs | 4 +- .../validation/state/mod.rs | 29 +- .../identity_update_transition/mod.rs | 2 + ...lidate_identity_update_transition_state.rs | 22 +- .../identity/validation/identity_validator.rs | 4 +- .../validation/public_keys_validator.rs | 10 +- ...ed_purpose_and_security_level_validator.rs | 6 +- packages/rs-dpp/src/state_transition/mod.rs | 2 + .../state_transition_facade.rs | 36 +-- .../validate_state_transition_basic.rs | 6 +- .../validate_state_transition_by_type.rs | 5 +- .../validate_state_transition_fee.rs | 2 +- ...ate_state_transition_identity_signature.rs | 6 +- ...validate_state_transition_key_signature.rs | 7 +- .../validate_state_transition_state.rs | 56 ++-- ...te_indices_are_backward_compatible_spec.rs | 28 +- .../data_contract_validator_spec.rs | 14 +- ...e_documents_batch_transition_state_spec.rs | 37 ++- ..._documents_batch_transitions_basic_spec.rs | 12 +- ...te_documents_uniqueness_by_indices_spec.rs | 22 +- .../validate_partial_compound_indices_spec.rs | 9 +- .../fixtures/public_keys_validator_mock.rs | 14 +- .../asset_lock/instant/mod.rs | 13 +- ..._create_transition_basic_validator_spec.rs | 12 +- ...e_identity_credit_withdrawal_state_spec.rs | 21 +- ...e_identity_update_transition_basic_spec.rs | 4 +- ...e_identity_update_transition_state_spec.rs | 2 +- .../validation/public_keys_validator_spec.rs | 12 +- ...rpose_and_security_level_validator_spec.rs | 4 +- .../rs-dpp/src/tests/utils/error_helpers.rs | 10 +- packages/rs-dpp/src/tests/utils/utils.rs | 8 +- .../src/validation/json_schema_validator.rs | 20 +- packages/rs-dpp/src/validation/mod.rs | 7 +- .../src/validation/validation_result.rs | 71 +++-- .../src/version/protocol_version_validator.rs | 7 +- 76 files changed, 898 insertions(+), 457 deletions(-) diff --git a/packages/rs-dpp/src/contracts/withdrawals_contract.rs b/packages/rs-dpp/src/contracts/withdrawals_contract.rs index c397debfa9b..c8ab1dcb4bd 100644 --- a/packages/rs-dpp/src/contracts/withdrawals_contract.rs +++ b/packages/rs-dpp/src/contracts/withdrawals_contract.rs @@ -17,7 +17,7 @@ pub mod property_names { pub const POOLING: &str = "pooling"; pub const OUTPUT_SCRIPT: &str = "outputScript"; pub const STATUS: &str = "status"; - pub const CREATE_AT: &str = "$createdAt"; + pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; pub const OWNER_ID: &str = "$ownerId"; } diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index a6450c9c6d2..d0de8c56d2e 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -2,8 +2,9 @@ use crate::data_contract::contract_config::ContractConfig; use crate::data_contract::validation::data_contract_validator::DataContractValidator; use crate::data_contract::{DataContract, DataContractFactory}; -use crate::prelude::{Identifier, ValidationResult}; +use crate::prelude::Identifier; use crate::util::entropy_generator::EntropyGenerator; +use crate::validation::SimpleValidationResult; use crate::version::ProtocolVersionValidator; use crate::ProtocolError; use platform_value::Value; @@ -104,7 +105,7 @@ impl DataContractFacade { pub async fn validate( &self, data_contract: Value, - ) -> Result, ProtocolError> { + ) -> Result { self.data_contract_validator.validate(&data_contract) } } diff --git a/packages/rs-dpp/src/data_contract/document_type/document_type.rs b/packages/rs-dpp/src/data_contract/document_type/document_type.rs index a59b16000ad..fe1844aa09d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/document_type.rs @@ -8,6 +8,8 @@ use super::{ use crate::data_contract::document_type::{property_names, ArrayFieldType}; use crate::data_contract::errors::{DataContractError, StructureError}; +use crate::document::document_transition::INITIAL_REVISION; +use crate::prelude::Revision; use crate::ProtocolError; use platform_value::btreemap_extensions::{BTreeValueMapHelper, BTreeValueRemoveFromMapHelper}; use platform_value::Value; @@ -337,6 +339,14 @@ impl DocumentType { pub fn field_can_be_null(&self, name: &str) -> bool { !self.required_fields.contains(name) } + + pub fn initial_revision(&self) -> Option { + if self.documents_mutable { + Some(INITIAL_REVISION) + } else { + None + } + } } pub fn string_to_field_type(field_type_name: &str) -> Option { diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index 82bc16a2b53..ddab89c8744 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -21,8 +21,12 @@ use crate::{ use super::property_names::*; +mod action; pub mod apply_data_contract_create_transition_factory; pub mod validation; +pub use action::{ + DataContractCreateTransitionAction, DATA_CONTRACT_CREATE_TRANSITION_ACTION_VERSION, +}; pub mod property_names { pub const PROTOCOL_VERSION: &str = "protocolVersion"; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs index 0b3cfe4f0b8..ed20868f5e3 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_basic.rs @@ -90,11 +90,11 @@ fn validate_data_contract_create_transition_basic( { Ok(v) => v, Err(parsing_error) => { - return Ok(SimpleValidationResult::new(Some(vec![ + return Ok(SimpleValidationResult::new_with_errors(vec![ ConsensusError::ProtocolVersionParsingError(ProtocolVersionParsingError::new( parsing_error, )), - ]))) + ])) } }; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs index 83ca8906bae..d38e77d853c 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/validation/state/validate_data_contract_create_transition_state.rs @@ -3,6 +3,8 @@ use std::convert::TryInto; use anyhow::Result; use async_trait::async_trait; +use crate::data_contract::state_transition::data_contract_create_transition::DataContractCreateTransitionAction; +use crate::validation::ValidationResult; use crate::{ data_contract::{ state_transition::data_contract_create_transition::DataContractCreateTransition, @@ -11,7 +13,7 @@ use crate::{ errors::StateError, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}, + validation::AsyncDataValidator, ProtocolError, }; @@ -28,11 +30,12 @@ where SR: StateRepositoryLike, { type Item = DataContractCreateTransition; + type ResultItem = DataContractCreateTransitionAction; async fn validate( &self, data: &DataContractCreateTransition, - ) -> Result { + ) -> Result, ProtocolError> { validate_data_contract_create_transition_state(&self.state_repository, data).await } } @@ -52,9 +55,7 @@ where pub async fn validate_data_contract_create_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &DataContractCreateTransition, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); - +) -> Result, ProtocolError> { // Data contract shouldn't exist let maybe_existing_data_contract: Option = state_repository .fetch_data_contract( @@ -66,17 +67,19 @@ pub async fn validate_data_contract_create_transition_state( .transpose() .map_err(Into::into)?; - if state_transition.get_execution_context().is_dry_run() { - return Ok(result); - } - - if maybe_existing_data_contract.is_some() { - result.add_error(StateError::DataContractAlreadyPresentError { - data_contract_id: state_transition.data_contract.id.to_owned(), - }) + if maybe_existing_data_contract.is_none() + || state_transition.get_execution_context().is_dry_run() + { + let action: DataContractCreateTransitionAction = state_transition.into(); + Ok(action.into()) + } else { + Ok(ValidationResult::new_with_errors(vec![ + StateError::DataContractAlreadyPresentError { + data_contract_id: state_transition.data_contract.id.to_owned(), + } + .into(), + ])) } - - Ok(result) } #[cfg(test)] diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 165bfaba1d7..155f034805f 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -20,8 +20,12 @@ use crate::{ use super::property_names::*; +mod action; pub mod apply_data_contract_update_transition_factory; pub mod validation; +pub use action::{ + DataContractUpdateTransitionAction, DATA_CONTRACT_UPDATE_TRANSITION_ACTION_VERSION, +}; pub mod property_names { pub const PROTOCOL_VERSION: &str = "protocolVersion"; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs index f6a57abb9c4..99a083101a7 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs @@ -96,11 +96,11 @@ where match raw_state_transition.get_integer(property_names::PROTOCOL_VERSION) { Ok(v) => v, Err(parsing_error) => { - return Ok(SimpleValidationResult::new(Some(vec![ + return Ok(SimpleValidationResult::new_with_errors(vec![ ConsensusError::ProtocolVersionParsingError( ProtocolVersionParsingError::new(parsing_error.into()), ), - ]))) + ])) } }; diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs index c82de08cb7a..654651e8a5d 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible.rs @@ -10,7 +10,7 @@ use crate::data_contract::document_type::IndexProperty; use crate::util::json_schema::Index; use crate::util::json_schema::JsonSchemaExt; use crate::util::json_value::JsonValueExt; -use crate::validation::ValidationResult; +use crate::validation::SimpleValidationResult; use crate::ProtocolError; use anyhow::anyhow; @@ -21,8 +21,8 @@ type JsonSchema = serde_json::Value; pub fn validate_indices_are_backward_compatible<'a>( existing_documents: impl IntoIterator, new_documents: impl IntoIterator, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result { + let mut result = SimpleValidationResult::default(); let new_documents_by_type: HashMap<&DocumentType, &JsonSchema> = new_documents.into_iter().collect(); diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs index 9037bc621ce..d52b558a8eb 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/state/validate_data_contract_update_transition_state.rs @@ -4,6 +4,8 @@ use anyhow::Result; use async_trait::async_trait; use crate::consensus::basic::invalid_data_contract_version_error::InvalidDataContractVersionError; +use crate::data_contract::state_transition::data_contract_update_transition::DataContractUpdateTransitionAction; +use crate::validation::{AsyncDataValidator, ValidationResult}; use crate::{ data_contract::{ state_transition::data_contract_update_transition::DataContractUpdateTransition, @@ -12,7 +14,6 @@ use crate::{ errors::consensus::basic::BasicError, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}, ProtocolError, }; @@ -29,10 +30,11 @@ where SR: StateRepositoryLike, { type Item = DataContractUpdateTransition; + type ResultItem = DataContractUpdateTransitionAction; async fn validate( &self, state_transition: &DataContractUpdateTransition, - ) -> Result { + ) -> Result, ProtocolError> { validate_data_contract_update_transition_state(&self.state_repository, state_transition) .await } @@ -50,8 +52,8 @@ where pub async fn validate_data_contract_update_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &DataContractUpdateTransition, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::::default(); // Data contract should exist let maybe_existing_data_contract: Option = state_repository @@ -65,7 +67,8 @@ pub async fn validate_data_contract_update_transition_state( .map_err(Into::into)?; if state_transition.execution_context.is_dry_run() { - return Ok(result); + let action: DataContractUpdateTransitionAction = state_transition.into(); + return Ok(action.into()); } let existing_data_contract: DataContract = match maybe_existing_data_contract { @@ -88,9 +91,11 @@ pub async fn validate_data_contract_update_transition_state( InvalidDataContractVersionError::new(old_version + 1, new_version), ); result.add_error(err); + Ok(result) + } else { + let action: DataContractUpdateTransitionAction = state_transition.into(); + Ok(action.into()) } - - Ok(result) } #[cfg(test)] diff --git a/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs b/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs index 65d99e0e160..e1221a4e989 100644 --- a/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs +++ b/packages/rs-dpp/src/data_contract/validation/data_contract_validator.rs @@ -11,6 +11,7 @@ use crate::consensus::basic::data_contract::{ SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, }; +use crate::validation::{SimpleValidationResult, ValidationResult}; use crate::{ consensus::basic::{BasicError, IndexError}, data_contract::{ @@ -22,7 +23,7 @@ use crate::{ json_schema::{Index, JsonSchemaExt}, json_value::JsonValueExt, }, - validation::{DataValidator, JsonSchemaValidator, ValidationResult}, + validation::{DataValidator, JsonSchemaValidator}, version::ProtocolVersionValidator, ProtocolError, }; @@ -71,7 +72,7 @@ impl DataContractValidator { pub fn validate( &self, raw_data_contract: &Value, - ) -> Result, ProtocolError> { + ) -> Result { let mut result = ValidationResult::default(); trace!("validating against data contract meta validator"); @@ -169,7 +170,7 @@ fn validate_index_definitions( indices: &[Index], document_type: &str, document_schema: &JsonValue, -) -> (ValidationResult<()>, bool) { +) -> (SimpleValidationResult, bool) { let mut result = ValidationResult::default(); let mut indices_fingerprints: Vec = vec![]; @@ -262,8 +263,8 @@ fn validate_property_definition( maybe_property_definition: Option<&JsonValue>, document_type: &str, index_definition: &Index, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); // we are allowed to use unwrap as we return if some of the properties definitions is None let property_definition = maybe_property_definition.unwrap(); @@ -383,8 +384,8 @@ fn validate_not_defined_properties( properties: &HashMap<&String, Option<&JsonValue>>, index_definition: &Index, document_type: &str, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); for (property_name, definition) in properties { if definition.is_none() { result.add_error(BasicError::IndexError( @@ -403,8 +404,8 @@ fn validate_not_defined_properties( fn validate_index_naming_duplicates( indices: &[Index], document_type: &str, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); for duplicate_index in indices.iter().map(|i| &i.name).duplicates() { result.add_error(BasicError::DuplicateIndexNameError( DuplicateIndexNameError::new(document_type.to_owned(), duplicate_index.to_owned()), @@ -414,8 +415,8 @@ fn validate_index_naming_duplicates( } /// checks the limit of unique indexes defined in the data contract -fn validate_max_unique_indices(indices: &[Index], document_type: &str) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +fn validate_max_unique_indices(indices: &[Index], document_type: &str) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); if indices.iter().filter(|i| i.unique).count() > UNIQUE_INDEX_LIMIT { result.add_error(BasicError::IndexError( IndexError::UniqueIndicesLimitReachedError(UniqueIndicesLimitReachedError::new( @@ -432,8 +433,8 @@ fn validate_max_unique_indices(indices: &[Index], document_type: &str) -> Valida fn validate_no_system_indices( index_definition: &Index, document_type: &str, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); for property in index_definition.properties.iter() { if NOT_ALLOWED_SYSTEM_PROPERTIES.contains(&property.name.as_str()) { diff --git a/packages/rs-dpp/src/data_contract/validation/multi_validator.rs b/packages/rs-dpp/src/data_contract/validation/multi_validator.rs index 0e2e3adba27..5098342789b 100644 --- a/packages/rs-dpp/src/data_contract/validation/multi_validator.rs +++ b/packages/rs-dpp/src/data_contract/validation/multi_validator.rs @@ -2,16 +2,14 @@ use platform_value::Value; use regex::Regex; use crate::consensus::basic::data_contract::IncompatibleRe2PatternError; -use crate::{ - consensus::{basic::BasicError, ConsensusError}, - validation::ValidationResult, -}; +use crate::consensus::{basic::BasicError, ConsensusError}; +use crate::validation::SimpleValidationResult; pub type SubValidator = - fn(path: &str, key: &str, parent: &Value, value: &Value, result: &mut ValidationResult<()>); + fn(path: &str, key: &str, parent: &Value, value: &Value, result: &mut SimpleValidationResult); -pub fn validate(raw_data_contract: &Value, validators: &[SubValidator]) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +pub fn validate(raw_data_contract: &Value, validators: &[SubValidator]) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let mut values_queue: Vec<(&Value, String)> = vec![(raw_data_contract, String::from(""))]; while let Some((value, path)) = values_queue.pop() { @@ -52,7 +50,7 @@ pub fn pattern_is_valid_regex_validator( key: &str, _parent: &Value, value: &Value, - result: &mut ValidationResult<()>, + result: &mut SimpleValidationResult, ) { if key == "pattern" { if let Some(pattern) = value.as_str() { @@ -79,7 +77,7 @@ pub fn pattern_is_valid_regex_validator( fn unwrap_error_to_result<'a, 'b>( v: Result, ConsensusError>, - result: &'b mut ValidationResult<()>, + result: &'b mut SimpleValidationResult, ) -> Option<&'a Value> { match v { Ok(v) => v, @@ -95,7 +93,7 @@ pub fn byte_array_has_no_items_as_parent_validator( key: &str, parent: &Value, value: &Value, - result: &mut ValidationResult<()>, + result: &mut SimpleValidationResult, ) { if key == "byteArray" && value.is_bool() @@ -150,7 +148,7 @@ mod test { } ); let mut result = validate(&schema, &[byte_array_has_no_items_as_parent_validator]); - assert_eq!(2, result.errors().len()); + assert_eq!(2, result.errors.len()); let first_error = get_basic_error(result.errors.pop().unwrap()); let second_error = get_basic_error(result.errors.pop().unwrap()); diff --git a/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs b/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs index dae02556bd0..beba9bd4c9e 100644 --- a/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs +++ b/packages/rs-dpp/src/data_contract/validation/validate_data_contract_max_depth.rs @@ -2,12 +2,13 @@ use platform_value::Value; use std::collections::BTreeSet; use crate::consensus::basic::data_contract::InvalidJsonSchemaRefError; -use crate::{consensus::basic::BasicError, validation::ValidationResult, ProtocolError}; +use crate::validation::SimpleValidationResult; +use crate::{consensus::basic::BasicError, ProtocolError}; const MAX_DEPTH: usize = 500; -pub fn validate_data_contract_max_depth(data_contract_object: &Value) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +pub fn validate_data_contract_max_depth(data_contract_object: &Value) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let schema_depth = match calc_max_depth(data_contract_object) { Ok(depth) => depth, Err(err) => { diff --git a/packages/rs-dpp/src/document/document_facade.rs b/packages/rs-dpp/src/document/document_facade.rs index b37ddc2f61e..020aa688f2e 100644 --- a/packages/rs-dpp/src/document/document_facade.rs +++ b/packages/rs-dpp/src/document/document_facade.rs @@ -1,11 +1,11 @@ -use anyhow::anyhow; use platform_value::Value; use std::sync::Arc; use crate::document::ExtendedDocument; +use crate::validation::ValidationResult; use crate::{ data_contract::DataContract, prelude::Identifier, state_repository::StateRepositoryLike, - validation::ValidationResult, version::ProtocolVersionValidator, ProtocolError, + version::ProtocolVersionValidator, ProtocolError, }; use super::{ @@ -90,20 +90,21 @@ where } /// Creates Documents State Transition - pub async fn validate_document( + pub async fn validate_extended_document( &self, extended_document: &ExtendedDocument, ) -> Result, ProtocolError> { let raw_extended_document = extended_document.to_value()?; - self.validate_raw_document(&raw_extended_document).await + self.validate_raw_extended_document(&raw_extended_document) + .await } /// Creates Documents State Transition - pub async fn validate_raw_document( + pub async fn validate_raw_extended_document( &self, raw_extended_document: &Value, ) -> Result, ProtocolError> { - let result = self + let mut result = self .data_contract_fetcher_and_validator .validate_extended(raw_extended_document) .await?; @@ -112,13 +113,13 @@ where return Ok(result); } - let data_contract = result - .data() - .ok_or_else(|| anyhow!("Data Contract for document not present"))?; - let result = self + let data_contract = result.data()?; + let validation_result = self .validator .validate_extended(raw_extended_document, data_contract)?; - Ok(ValidationResult::new(Some(result.errors))) + result.add_errors(validation_result.errors); + + Ok(result) } } diff --git a/packages/rs-dpp/src/document/document_factory.rs b/packages/rs-dpp/src/document/document_factory.rs index aa1c99e46cc..e266ff5b8ab 100644 --- a/packages/rs-dpp/src/document/document_factory.rs +++ b/packages/rs-dpp/src/document/document_factory.rs @@ -6,8 +6,7 @@ use itertools::Itertools; use platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use platform_value::{Bytes32, ReplacementType, Value}; -use rand::rngs::StdRng; -use rand::SeedableRng; + use serde::{Deserialize, Serialize}; use crate::consensus::basic::document::InvalidDocumentTypeError; @@ -309,7 +308,7 @@ where raw_document: &Value, options: FactoryOptions, ) -> Result { - let mut result = self + let result = self .data_contract_fetcher_and_validator .validate_extended(raw_document) .await?; @@ -323,7 +322,7 @@ where ))); } let data_contract = result - .take_data() + .into_data() .context("Validator didn't return Data Contract. This shouldn't happen")?; if !options.skip_validation { diff --git a/packages/rs-dpp/src/document/document_validator.rs b/packages/rs-dpp/src/document/document_validator.rs index 79a517a7c47..47811854961 100644 --- a/packages/rs-dpp/src/document/document_validator.rs +++ b/packages/rs-dpp/src/document/document_validator.rs @@ -8,13 +8,14 @@ use serde_json::Value as JsonValue; use crate::consensus::basic::document::InvalidDocumentTypeError; use crate::data_contract::document_type::DocumentType; use crate::data_contract::DriveContractExt; +use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::BasicError, data_contract::{ enrich_data_contract_with_base_schema::enrich_data_contract_with_base_schema, enrich_data_contract_with_base_schema::PREFIX_BYTE_0, DataContract, }, - validation::{JsonSchemaValidator, ValidationResult}, + validation::JsonSchemaValidator, version::ProtocolVersionValidator, ProtocolError, }; @@ -49,8 +50,8 @@ impl DocumentValidator { raw_document: &JsonValue, data_contract: &DataContract, document_type: &DocumentType, - ) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); + ) -> Result { + let mut result = SimpleValidationResult::default(); let enriched_data_contract = enrich_data_contract_with_base_schema( data_contract, &BASE_DOCUMENT_SCHEMA, @@ -86,8 +87,8 @@ impl DocumentValidator { &self, raw_document: &Value, data_contract: &DataContract, - ) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); + ) -> Result { + let mut result = SimpleValidationResult::default(); let Some(document_type_name) = raw_document.get_optional_str(PROPERTY_DOCUMENT_TYPE).map_err(ProtocolError::ValueError)? else { result.add_error(BasicError::MissingDocumentTypeError); @@ -154,12 +155,12 @@ mod test { use test_case::test_case; use crate::tests::fixtures::get_extended_documents_fixture; + use crate::validation::SimpleValidationResult; use crate::{ codes::ErrorWithCode, consensus::{basic::JsonSchemaError, ConsensusError}, data_contract::DataContract, tests::fixtures::get_data_contract_fixture, - validation::ValidationResult, version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}, }; @@ -573,7 +574,7 @@ mod test { assert!(result.is_valid()) } - fn get_first_schema_error(result: &ValidationResult<()>) -> &JsonSchemaError { + fn get_first_schema_error(result: &SimpleValidationResult) -> &JsonSchemaError { result .errors .get(0) diff --git a/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs b/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs index 27a21b017a8..03ffb3c05e8 100644 --- a/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs +++ b/packages/rs-dpp/src/document/fetch_and_validate_data_contract.rs @@ -9,11 +9,11 @@ use crate::{ prelude::Identifier, state_repository::StateRepositoryLike, state_transition::state_transition_execution_context::StateTransitionExecutionContext, - validation::ValidationResult, ProtocolError, }; use crate::document::extended_document::property_names; +use crate::validation::ValidationResult; pub struct DataContractFetcherAndValidator { state_repository: Arc, diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index 303ef5626b9..83ff43a6755 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -7,6 +7,7 @@ mod document; pub mod document_facade; pub mod document_factory; +mod document_patch; pub mod document_validator; pub mod errors; pub mod extended_document; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs index 4dd7cef7c88..fb208fbe71f 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs @@ -9,7 +9,7 @@ use crate::{ use super::{ document_transition::{Action, DocumentReplaceTransition, DocumentTransition}, - validation::state::fetch_extended_documents::fetch_extended_documents, + validation::state::fetch_documents::fetch_extended_documents, DocumentsBatchTransition, }; @@ -43,14 +43,15 @@ pub async fn apply_documents_batch_transition( state_repository: &impl StateRepositoryLike, state_transition: &DocumentsBatchTransition, ) -> Result<(), ProtocolError> { - let replace_transitions = state_transition - .get_transitions() - .iter() - .filter(|dt| dt.base().action == Action::Replace); + let replace_transitions: Vec<_> = state_transition + .get_transitions_slice() + .into_iter() + .filter(|dt| dt.base().action == Action::Replace) + .collect(); let fetched_documents = fetch_extended_documents( state_repository, - replace_transitions, + replace_transitions.as_slice(), &state_transition.execution_context, ) .await?; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs index 04543cff022..c5aa7aadc19 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs @@ -10,10 +10,15 @@ use crate::{ }; use document_base_transition::DocumentBaseTransition; +mod action; pub mod document_base_transition; +mod document_base_transition_action; pub mod document_create_transition; +mod document_create_transition_action; pub mod document_delete_transition; +mod document_delete_transition_action; pub mod document_replace_transition; +mod document_replace_transition_action; use crate::identity::TimestampMillis; use crate::prelude::Revision; @@ -24,6 +29,13 @@ pub use document_replace_transition::DocumentReplaceTransition; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::Value; +pub use document_base_transition_action::DocumentBaseTransitionAction; +pub use document_create_transition_action::DocumentCreateTransitionAction; +pub use document_delete_transition_action::DocumentDeleteTransitionAction; +pub use document_replace_transition_action::DocumentReplaceTransitionAction; + +pub use action::{DocumentTransitionAction, DOCUMENT_TRANSITION_ACTION_VERSION}; + /// the initial revision of newly created document pub const INITIAL_REVISION: u64 = 1; pub const PROPERTY_ACTION: &str = "$action"; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs index 7df17b71f77..bb12333312a 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs @@ -32,10 +32,13 @@ use self::document_transition::{ document_base_transition, document_create_transition, DocumentTransitionExt, }; +mod action; pub mod apply_documents_batch_transition_factory; pub mod document_transition; pub mod validation; +pub use action::{DocumentsBatchTransitionAction, DOCUMENTS_BATCH_TRANSITION_ACTION_VERSION}; + pub mod property_names { pub const TRANSITION_TYPE: &str = "type"; pub const DATA_CONTRACT_ID: &str = "$dataContractId"; @@ -257,6 +260,10 @@ impl DocumentsBatchTransition { &self.transitions } + pub fn get_transitions_slice(&self) -> &[DocumentTransition] { + self.transitions.as_slice() + } + pub fn clean_value(value: &mut Value) -> Result<(), platform_value::Error> { value.replace_at_paths(IDENTIFIER_FIELDS, ReplacementType::Identifier)?; value.replace_integer_type_at_paths(U32_FIELDS, IntegerReplacementType::U32)?; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs index e80aef598c7..dd9ef46fdbf 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs @@ -14,6 +14,7 @@ use crate::consensus::ConsensusError; use crate::data_contract::state_transition::errors::MissingDataContractIdError; use crate::document::state_transition::documents_batch_transition::property_names; use crate::document::validation::basic::find_duplicates_by_id::find_duplicates_by_id; +use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::BasicError, data_contract::{ @@ -26,7 +27,7 @@ use crate::{ prelude::Identifier, state_repository::StateRepositoryLike, state_transition::state_transition_execution_context::StateTransitionExecutionContext, - validation::{JsonSchemaValidator, ValidationResult}, + validation::JsonSchemaValidator, version::ProtocolVersionValidator, ProtocolError, }; @@ -62,7 +63,7 @@ lazy_static! { } pub trait Validator { - fn validate(&self, data: JsonValue) -> Result, ProtocolError>; + fn validate(&self, data: JsonValue) -> Result; } pub struct DocumentBatchTransitionBasicValidator { @@ -88,7 +89,7 @@ where &self, raw_state_transition: &Value, execution_context: &StateTransitionExecutionContext, - ) -> Result, ProtocolError> { + ) -> Result { // TODO: move validation code into function body to avoid cloning of state_repository validate_documents_batch_transition_basic( &self.protocol_version_validator, @@ -105,8 +106,8 @@ pub async fn validate_documents_batch_transition_basic( raw_state_transition: &Value, state_repository: Arc, execution_context: &StateTransitionExecutionContext, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result { + let mut result = SimpleValidationResult::default(); let validator = JsonSchemaValidator::new(DOCUMENTS_BATCH_TRANSITIONS_SCHEMA.clone()).map_err(|e| { anyhow!( @@ -205,8 +206,8 @@ fn validate_document_transitions<'a>( data_contract: &DataContract, owner_id: Identifier, raw_document_transitions: impl IntoIterator>, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result { + let mut result = SimpleValidationResult::default(); let enriched_contracts_by_action = get_enriched_contracts_by_action(data_contract)?; let validation_result = validate_raw_transitions( @@ -253,8 +254,8 @@ fn validate_raw_transitions<'a>( raw_document_transitions: impl IntoIterator>, enriched_contracts_by_action: &HashMap, owner_id: Identifier, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result { + let mut result = SimpleValidationResult::default(); let mut raw_document_transitions_as_value: Vec = vec![]; let owner_id_value: Value = owner_id.into(); for mut raw_document_transition in raw_document_transitions { diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs index abae49bf100..0bfe140cb22 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_partial_compound_indices.rs @@ -9,15 +9,15 @@ use crate::{ consensus::basic::BasicError, data_contract::DataContract, util::json_schema::{Index, JsonSchemaExt}, - validation::ValidationResult, + validation::SimpleValidationResult, ProtocolError, }; pub fn validate_partial_compound_indices<'a>( raw_document_transitions: impl IntoIterator, data_contract: &DataContract, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result { + let mut result = SimpleValidationResult::default(); for transition in raw_document_transitions { let document_type = transition.get_str("$type")?; @@ -41,11 +41,11 @@ pub fn validate_indices( indices: &[Index], document_type: &str, raw_transition_map: &BTreeMap, -) -> ValidationResult<()> +) -> SimpleValidationResult where V: Borrow, { - let mut validation_result = ValidationResult::default(); + let mut validation_result = SimpleValidationResult::default(); for index in indices .iter() diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs index 6d4b733acc4..ba94443a68f 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/execute_data_triggers.rs @@ -9,7 +9,7 @@ use crate::{ }; pub async fn execute_data_triggers<'a, SR>( - document_transitions: impl IntoIterator>, + document_transitions: &[&DocumentTransition], context: &DataTriggerExecutionContext<'a, SR>, ) -> Result, ProtocolError> where @@ -20,7 +20,7 @@ where } pub async fn execute_data_triggers_with_custom_list<'a, SR>( - document_transitions: impl IntoIterator>, + document_transitions: &[&DocumentTransition], context: &DataTriggerExecutionContext<'a, SR>, data_triggers_list: impl IntoIterator, ) -> Result, ProtocolError> diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs index cc9fc53d891..6e2a50de31d 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/mod.rs @@ -1,4 +1,4 @@ pub mod execute_data_triggers; -pub mod fetch_extended_documents; +pub mod fetch_documents; pub mod validate_documents_batch_transition_state; pub mod validate_documents_uniqueness_by_indices; diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs index e9204df2034..97af008ff72 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs @@ -5,14 +5,21 @@ use futures::future::join_all; use itertools::Itertools; use crate::data_contract::errors::DataContractNotPresentError; -use crate::document::ExtendedDocument; +use crate::document::document_transition::{ + DocumentCreateTransitionAction, DocumentDeleteTransitionAction, + DocumentReplaceTransitionAction, DocumentTransitionAction, +}; +use crate::document::state_transition::documents_batch_transition::{ + DocumentsBatchTransitionAction, DOCUMENTS_BATCH_TRANSITION_ACTION_VERSION, +}; +use crate::document::Document; use crate::validation::{AsyncDataValidator, SimpleValidationResult}; use crate::{ block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window, consensus::ConsensusError, data_trigger::DataTriggerExecutionContext, document::{ - document_transition::{Action, DocumentTransition, DocumentTransitionExt}, + document_transition::{DocumentTransition, DocumentTransitionExt}, DocumentsBatchTransition, }, prelude::{Identifier, TimestampMillis}, @@ -26,8 +33,7 @@ use crate::{ }; use super::{ - execute_data_triggers::execute_data_triggers, - fetch_extended_documents::fetch_extended_documents, + execute_data_triggers::execute_data_triggers, fetch_documents::fetch_documents, validate_documents_uniqueness_by_indices::validate_documents_uniqueness_by_indices, }; @@ -44,11 +50,12 @@ where SR: StateRepositoryLike, { type Item = DocumentsBatchTransition; + type ResultItem = DocumentsBatchTransitionAction; async fn validate( &self, data: &DocumentsBatchTransition, - ) -> Result { + ) -> Result, ProtocolError> { validate_document_batch_transition_state(&self.state_repository, data).await } } @@ -68,17 +75,17 @@ where pub async fn validate_document_batch_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &DocumentsBatchTransition, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); +) -> Result, ProtocolError> { + let mut result = ValidationResult::::default(); let owner_id = *state_transition.get_owner_id(); let transitions_by_data_contract_id = state_transition - .get_transitions() + .get_transitions_slice() .iter() .into_group_map_by(|t| &t.base().data_contract_id); let mut futures = vec![]; - for (data_contract_id, transitions) in transitions_by_data_contract_id.into_iter() { + for (data_contract_id, transitions) in transitions_by_data_contract_id.iter() { futures.push(validate_document_transitions( state_repository, data_contract_id, @@ -87,22 +94,43 @@ pub async fn validate_document_batch_transition_state( state_transition.get_execution_context(), )) } - for execution_result in join_all(futures).await { - result.merge(execution_result?); - } - Ok(result) + let state_transition_actions = join_all(futures) + .await + .into_iter() + .collect::>>, ProtocolError>>()? + .into_iter() + .filter_map(|validation_result| { + if validation_result.has_data() { + Some(validation_result.into_data().unwrap()) + } else { + result.add_errors(validation_result.errors); + None + } + }) + .flatten() + .collect(); + + if result.is_valid() { + let batch_transition_action = DocumentsBatchTransitionAction { + version: DOCUMENTS_BATCH_TRANSITION_ACTION_VERSION, + owner_id, + transitions: state_transition_actions, + }; + Ok(ValidationResult::new_with_data(batch_transition_action)) + } else { + Ok(result) + } } pub async fn validate_document_transitions( state_repository: &impl StateRepositoryLike, data_contract_id: &Identifier, owner_id: Identifier, - document_transitions: impl IntoIterator>, + document_transitions: &[&DocumentTransition], execution_context: &StateTransitionExecutionContext, -) -> Result, ProtocolError> { - let mut result = ValidationResult::default(); - let transitions: Vec<_> = document_transitions.into_iter().collect(); +) -> Result>, ProtocolError> { + let mut result = ValidationResult::>::default(); // We use temporary execution context without dry run, // because despite the dryRun, we need to get the @@ -125,39 +153,56 @@ pub async fn validate_document_transitions( execution_context.add_operations(tmp_execution_context.get_operations()); let fetched_documents = - fetch_extended_documents(state_repository, &transitions, execution_context).await?; + fetch_documents(state_repository, document_transitions, execution_context).await?; // Calculate time window for timestamp let last_header_time_millis = state_repository.fetch_latest_platform_block_time().await?; - if !execution_context.is_dry_run() { - for transition in transitions.iter() { - let validation_result = validate_transition( - transition.as_ref(), - &fetched_documents, - last_header_time_millis, - &owner_id, - ); - result.merge(validation_result); - } + let document_transition_actions = if !execution_context.is_dry_run() { + let document_transition_actions = document_transitions + .iter() + .filter_map(|transition| { + let validation_result = validate_transition( + transition, + &fetched_documents, + last_header_time_millis, + &owner_id, + ); + match validation_result { + Ok(validation_result) => { + if validation_result.has_data() && validation_result.is_valid() { + Some(validation_result.into_data()) + } else { + result.add_errors(validation_result.errors); + None + } + } + Err(protocol_error) => Some(Err(protocol_error)), + } + }) + .collect::, ProtocolError>>()?; if !result.is_valid() { return Ok(result); } - } + document_transition_actions + } else { + vec![] + }; - let validation_result = validate_documents_uniqueness_by_indices( + let validation_uniqueness_by_indices_result = validate_documents_uniqueness_by_indices( state_repository, &owner_id, - transitions + document_transitions .iter() - .filter(|d| d.as_ref().as_transition_delete().is_none()), + .filter(|d| d.as_transition_delete().is_none()) + .cloned(), &data_contract, execution_context, ) .await?; - if !result.is_valid() { - result.merge(validation_result); - return Ok(result); + + if !validation_uniqueness_by_indices_result.is_valid() { + result.add_errors(validation_uniqueness_by_indices_result.errors) } let data_trigger_execution_context = DataTriggerExecutionContext { @@ -167,7 +212,7 @@ pub async fn validate_document_transitions( state_transition_execution_context: execution_context, }; let data_trigger_execution_results = - execute_data_triggers(transitions.iter(), &data_trigger_execution_context).await?; + execute_data_triggers(document_transitions, &data_trigger_execution_context).await?; for execution_result in data_trigger_execution_results.into_iter() { if !execution_result.is_ok() { @@ -181,18 +226,24 @@ pub async fn validate_document_transitions( } } - Ok(result) + if !result.is_valid() { + Ok(result) + } else { + Ok(document_transition_actions.into()) + } } fn validate_transition( transition: &DocumentTransition, - fetched_documents: &[ExtendedDocument], + fetched_documents: &[Document], last_header_block_time_millis: u64, owner_id: &Identifier, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); - match transition.base().action { - Action::Create => { +) -> Result, ProtocolError> { + match transition { + DocumentTransition::Create(document_create_transition) => { + let mut result = ValidationResult::::new_with_data( + DocumentTransitionAction::CreateAction(DocumentCreateTransitionAction::default()), + ); let validation_result = check_if_timestamps_are_equal(transition); result.merge(validation_result); @@ -207,8 +258,20 @@ fn validate_transition( let validation_result = check_if_document_is_already_present(transition, fetched_documents); result.merge(validation_result); + + if result.is_valid() { + Ok( + DocumentTransitionAction::CreateAction(document_create_transition.into()) + .into(), + ) + } else { + Ok(result) + } } - Action::Replace => { + DocumentTransition::Replace(document_replace_transition) => { + let mut result = ValidationResult::::new_with_data( + DocumentTransitionAction::ReplaceAction(DocumentReplaceTransitionAction::default()), + ); let validation_result = check_updated_inside_time_window(transition, last_header_block_time_millis); result.merge(validation_result); @@ -217,47 +280,69 @@ fn validate_transition( result.merge(validation_result); let validation_result = check_if_document_can_be_found(transition, fetched_documents); - if !validation_result.is_valid() { - result.merge(validation_result); - return result; - } - - let validation_result = check_ownership(transition, fetched_documents, owner_id); + let original_document = if validation_result.has_data() { + validation_result.into_data()? + } else { + result.add_errors(validation_result.errors); + return Ok(result); + }; + + let validation_result = check_ownership(transition, original_document, owner_id); result.merge(validation_result); + + if result.is_valid() { + Ok(DocumentTransitionAction::ReplaceAction( + DocumentReplaceTransitionAction::from_document_replace_transition( + document_replace_transition, + original_document.created_at, + ), + ) + .into()) + } else { + Ok(result) + } } - Action::Delete => { + DocumentTransition::Delete(document_delete_transition) => { + let mut result = ValidationResult::::new_with_data( + DocumentTransitionAction::DeleteAction(DocumentDeleteTransitionAction::default()), + ); let validation_result = check_if_document_can_be_found(transition, fetched_documents); + let original_document = if validation_result.has_data() { + validation_result.into_data()? + } else { + result.add_errors(validation_result.errors); + return Ok(result); + }; + + let validation_result = check_ownership(transition, original_document, owner_id); if !validation_result.is_valid() { - result.merge(validation_result); - return result; + result.add_errors(validation_result.errors); } - let validation_result = check_ownership(transition, fetched_documents, owner_id); - result.merge(validation_result); + if result.is_valid() { + Ok( + DocumentTransitionAction::DeleteAction(document_delete_transition.into()) + .into(), + ) + } else { + Ok(result) + } } } - result } fn check_ownership( document_transition: &DocumentTransition, - fetched_documents: &[ExtendedDocument], + fetched_document: &Document, owner_id: &Identifier, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); - let fetched_document = match fetched_documents - .iter() - .find(|d| d.id() == document_transition.base().id) - { - Some(d) => d, - None => return result, - }; - if fetched_document.owner_id() != owner_id { +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); + if fetched_document.owner_id != owner_id { result.add_error(ConsensusError::StateError(Box::new( StateError::DocumentOwnerIdMismatchError { document_id: document_transition.base().id, document_owner_id: owner_id.to_owned(), - existing_document_owner_id: fetched_document.owner_id(), + existing_document_owner_id: fetched_document.owner_id, }, ))); } @@ -266,12 +351,12 @@ fn check_ownership( fn check_revision( document_transition: &DocumentTransition, - fetched_documents: &[ExtendedDocument], -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); + fetched_documents: &[Document], +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let fetched_document = match fetched_documents .iter() - .find(|d| d.id() == document_transition.base().id) + .find(|d| d.id == document_transition.base().id) { Some(d) => d, None => return result, @@ -280,7 +365,7 @@ fn check_revision( Some(d) => d.revision, None => return result, }; - let Some(previous_revision) = fetched_document.revision() else { + let Some(previous_revision) = fetched_document.revision else { result.add_error(ConsensusError::StateError(Box::new( StateError::InvalidDocumentRevisionError { document_id: document_transition.base().id, @@ -294,7 +379,7 @@ fn check_revision( result.add_error(ConsensusError::StateError(Box::new( StateError::InvalidDocumentRevisionError { document_id: document_transition.base().id, - current_revision: Some(*previous_revision), + current_revision: Some(previous_revision), }, ))) } @@ -303,12 +388,12 @@ fn check_revision( fn check_if_document_is_already_present( document_transition: &DocumentTransition, - fetched_documents: &[ExtendedDocument], -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); + fetched_documents: &[Document], +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let maybe_fetched_document = fetched_documents .iter() - .find(|d| d.id() == document_transition.base().id); + .find(|d| d.id == document_transition.base().id); if maybe_fetched_document.is_some() { result.add_error(ConsensusError::StateError(Box::new( @@ -320,27 +405,29 @@ fn check_if_document_is_already_present( result } -fn check_if_document_can_be_found( - document_transition: &DocumentTransition, - fetched_documents: &[ExtendedDocument], -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +fn check_if_document_can_be_found<'a>( + document_transition: &'a DocumentTransition, + fetched_documents: &'a [Document], +) -> ValidationResult<&'a Document> { let maybe_fetched_document = fetched_documents .iter() - .find(|d| d.id() == document_transition.base().id); + .find(|d| d.id == document_transition.base().id); - if maybe_fetched_document.is_none() { - result.add_error(ConsensusError::StateError(Box::new( + if let Some(document) = maybe_fetched_document { + ValidationResult::new_with_data(document) + } else { + ValidationResult::new_with_errors(vec![ConsensusError::StateError(Box::new( StateError::DocumentNotFoundError { document_id: document_transition.base().id, }, - ))) + ))]) } - result } -fn check_if_timestamps_are_equal(document_transition: &DocumentTransition) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +fn check_if_timestamps_are_equal( + document_transition: &DocumentTransition, +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let created_at = document_transition.get_created_at(); let updated_at = document_transition.get_updated_at(); @@ -358,8 +445,8 @@ fn check_if_timestamps_are_equal(document_transition: &DocumentTransition) -> Va fn check_created_inside_time_window( document_transition: &DocumentTransition, last_block_ts_millis: TimestampMillis, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let created_at = match document_transition.get_created_at() { Some(t) => t, None => return result, @@ -383,8 +470,8 @@ fn check_created_inside_time_window( fn check_updated_inside_time_window( document_transition: &DocumentTransition, last_block_ts_millis: TimestampMillis, -) -> ValidationResult<()> { - let mut result = ValidationResult::default(); +) -> SimpleValidationResult { + let mut result = SimpleValidationResult::default(); let updated_at = match document_transition.get_updated_at() { Some(t) => t, None => return result, diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs index 0ef6c9a6298..728651d7a30 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs @@ -6,13 +6,13 @@ use platform_value::string_encoding::Encoding; use serde_json::{json, Value as JsonValue}; use crate::document::Document; +use crate::validation::SimpleValidationResult; use crate::{ document::document_transition::{Action, DocumentTransition, DocumentTransitionExt}, prelude::{DataContract, Identifier}, state_repository::StateRepositoryLike, state_transition::state_transition_execution_context::StateTransitionExecutionContext, util::json_schema::{Index, JsonSchemaExt}, - validation::ValidationResult, ProtocolError, StateError, }; @@ -26,14 +26,18 @@ struct QueryDefinition<'a> { pub async fn validate_documents_uniqueness_by_indices( state_repository: &SR, owner_id: &Identifier, - document_transitions: impl IntoIterator>, + document_transitions: impl Iterator, data_contract: &DataContract, execution_context: &StateTransitionExecutionContext, -) -> Result, ProtocolError> +) -> Result where SR: StateRepositoryLike, { - let mut validation_result = ValidationResult::default(); + let mut validation_result = SimpleValidationResult::default(); + + if execution_context.is_dry_run() { + return Ok(validation_result); + } // 1. Prepare fetchDocuments queries from indexed properties for t in document_transitions { @@ -65,10 +69,6 @@ where let (futures, futures_meta) = unzip_iter_and_collect(queries); let results = join_all(futures).await; - if execution_context.is_dry_run() { - return Ok(validation_result); - } - // 3. Create errors if duplicates found let result = validate_uniqueness(futures_meta, results)?; validation_result.merge(result); @@ -142,8 +142,8 @@ fn validate_uniqueness<'a>( results: Vec< Result>>, anyhow::Error>, >, -) -> Result, ProtocolError> { - let mut validation_result = ValidationResult::default(); +) -> Result { + let mut validation_result = SimpleValidationResult::default(); for (i, result) in results.into_iter().enumerate() { let documents: Vec = result? .into_iter() diff --git a/packages/rs-dpp/src/errors/dpp_error.rs b/packages/rs-dpp/src/errors/dpp_error.rs index 0e4bc44ad92..3fb869791d4 100644 --- a/packages/rs-dpp/src/errors/dpp_error.rs +++ b/packages/rs-dpp/src/errors/dpp_error.rs @@ -7,10 +7,12 @@ use crate::identity::errors::{AssetLockOutputNotFoundError, AssetLockTransaction pub enum DPPError { AssetLockOutputNotFoundError(AssetLockOutputNotFoundError), AssetLockTransactionIsNotFoundError(AssetLockTransactionIsNotFoundError), - #[error("Expected public key hash to be 20 bytes")] + #[error("expected public key hash to be 20 bytes")] WrongPublicKeyHashSize, - #[error("Expected output type to be OP_RETURN output")] + #[error("expected output type to be OP_RETURN output")] WrongBurnOutputType, - #[error("Invalid transaction")] + #[error("invalid transaction")] InvalidAssetLockTransaction, + #[error("core message corruption {0}")] + CoreMessageCorruption(String), } diff --git a/packages/rs-dpp/src/errors/errors.rs b/packages/rs-dpp/src/errors/errors.rs index a0a0eaac2a6..2e6bb1e6864 100644 --- a/packages/rs-dpp/src/errors/errors.rs +++ b/packages/rs-dpp/src/errors/errors.rs @@ -17,6 +17,8 @@ use crate::{ SerdeParsingError, }; +use dashcore::consensus::encode::Error as DashCoreError; + use platform_value::{Error as ValueError, Value}; #[derive(Error, Debug)] @@ -83,9 +85,8 @@ pub enum ProtocolError { #[error(transparent)] InvalidSignaturePublicKeyError(InvalidSignaturePublicKeyError), - // TODO decide if it should be a string - #[error("Non-Consensus error: {0}")] - NonConsensusError(String), + #[error(transparent)] + NonConsensusError(#[from] NonConsensusError), #[error(transparent)] CompatibleProtocolVersionIsNotDefinedError(#[from] CompatibleProtocolVersionIsNotDefinedError), @@ -130,6 +131,10 @@ pub enum ProtocolError { #[error("value error: {0}")] ValueError(#[from] ValueError), + /// Dash core error + #[error("dash core error: {0}")] + DashCoreError(#[from] DashCoreError), + #[error("Invalid Identity: {errors:?}")] InvalidIdentityError { errors: Vec, @@ -138,12 +143,9 @@ pub enum ProtocolError { #[error("Public key generation error {0}")] PublicKeyGenerationError(String), -} -impl From for ProtocolError { - fn from(e: NonConsensusError) -> Self { - Self::NonConsensusError(e.to_string()) - } + #[error("corrupted code execution: {0}")] + CorruptedCodeExecution(String), } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/errors/non_consensus_error.rs b/packages/rs-dpp/src/errors/non_consensus_error.rs index 62ebd7941bf..015098cd6e8 100644 --- a/packages/rs-dpp/src/errors/non_consensus_error.rs +++ b/packages/rs-dpp/src/errors/non_consensus_error.rs @@ -2,7 +2,7 @@ use platform_value::Error as ValueError; use thiserror::Error; use crate::{ - CompatibleProtocolVersionIsNotDefinedError, InvalidVectorSizeError, SerdeParsingError, + CompatibleProtocolVersionIsNotDefinedError, DPPError, InvalidVectorSizeError, SerdeParsingError, }; #[derive(Debug, Error)] @@ -20,6 +20,8 @@ pub enum NonConsensusError { InvalidVectorSizeError(InvalidVectorSizeError), #[error("StateRepositoryFetchError: {0}")] StateRepositoryFetchError(String), + #[error("WithdrawalError: {0}")] + WithdrawalError(String), #[error("IdentifierCreateError: {0}")] IdentifierCreateError(String), #[error("IdentityPublicKeyCreateError: {0}")] @@ -39,6 +41,9 @@ pub enum NonConsensusError { details: String, }, + #[error(transparent)] + DPPError(#[from] DPPError), + #[error(transparent)] Error(#[from] anyhow::Error), } diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 5d494ad8f77..daacea99606 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -14,7 +14,7 @@ use crate::identity::validation::{IdentityValidator, PublicKeysValidator}; use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; use crate::prelude::Identifier; -use crate::validation::ValidationResult; +use crate::validation::SimpleValidationResult; use crate::version::ProtocolVersionValidator; use crate::{BlsModule, DashPlatformProtocolInitError, NonConsensusError, ProtocolError}; @@ -72,7 +72,7 @@ where pub fn validate( &self, identity_object: &Value, - ) -> Result, NonConsensusError> { + ) -> Result { self.identity_validator .validate_identity_object(identity_object) } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs index a6d4dc28c5f..85ead347900 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs @@ -96,7 +96,7 @@ where .state_repository .fetch_latest_platform_core_chain_locked_height() .await - .map_err(|e| NonConsensusError::StateRepositoryFetchError(format!("state repository fetch current core chain locked height for chain asset lock proof verification error: {}",e.to_string())))? + .map_err(|e| NonConsensusError::StateRepositoryFetchError(format!("state repository fetch current core chain locked height for chain asset lock proof verification error: {}", e)))? .unwrap_or(0); if current_core_chain_locked_height < proof_core_chain_locked_height { @@ -122,7 +122,7 @@ where .map_err(|e| { NonConsensusError::StateRepositoryFetchError(format!( "transaction fetching error for chain lock: {}", - e.to_string() + e )) })?; @@ -132,7 +132,7 @@ where .map_err(|e| { NonConsensusError::StateRepositoryFetchError(format!( "transaction decoding error: {}", - e.to_string() + e )) })?; @@ -160,15 +160,15 @@ where .validate(&raw_tx, output_index as usize, execution_context) .await?; - let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { - validate_asset_lock_transaction_result - .data() - .expect("This can not happen due to the logic above") - .clone() - } else { - result.merge(validate_asset_lock_transaction_result); - return Ok(result); - }; + let validation_result_data = + if validate_asset_lock_transaction_result.is_valid_with_data() { + validate_asset_lock_transaction_result + .into_data() + .expect("This can not happen due to the logic above") + } else { + result.merge(validate_asset_lock_transaction_result); + return Ok(result); + }; let public_key_hash = validation_result_data.public_key_hash; diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs index 908e3ff6962..5dc013435eb 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs @@ -86,7 +86,7 @@ where .map_err(|e| { NonConsensusError::StateRepositoryFetchError(format!( "state repository verify instant send lock error: {}", - e.to_string() + e )) })?; @@ -104,11 +104,11 @@ where .validate(&tx_json_uint_array, output_index, execution_context) .await?; - let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { + let validation_result_data = if validate_asset_lock_transaction_result.is_valid_with_data() + { validate_asset_lock_transaction_result - .data() + .into_data() .expect("This can not happen due to the logic above") - .clone() } else { result.merge(validate_asset_lock_transaction_result); return Ok(result); diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 054efcca58b..1ad380843d3 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -1,6 +1,8 @@ use std::convert::{TryFrom, TryInto}; -use dashcore::Transaction; +use dashcore::consensus::Decodable; +use dashcore::hashes::hex::ToHex; +use dashcore::{OutPoint, Transaction, TxOut}; use serde::de::Error as DeError; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -12,9 +14,12 @@ pub use chain::*; pub use instant::*; use platform_value::Value; +use crate::identity::errors::{AssetLockOutputNotFoundError, AssetLockTransactionIsNotFoundError}; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::prelude::Identifier; -use crate::{NonConsensusError, ProtocolError, SerdeParsingError}; +use crate::state_repository::StateRepositoryLike; +use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; +use crate::{DPPError, NonConsensusError, ProtocolError, SerdeParsingError}; mod asset_lock_proof_validator; mod asset_lock_public_key_hash_fetcher; @@ -29,6 +34,64 @@ pub enum AssetLockProof { Chain(ChainAssetLockProof), } +impl AssetLockProof { + /// This fetches the asset lock transaction output from core + pub async fn fetch_asset_lock_transaction_output( + &self, + state_repository: &impl StateRepositoryLike, + execution_context: &StateTransitionExecutionContext, + ) -> Result { + match self { + AssetLockProof::Instant(asset_lock_proof) => asset_lock_proof + .output() + .ok_or_else(|| DPPError::from(AssetLockOutputNotFoundError::new())) + .cloned(), + AssetLockProof::Chain(asset_lock_proof) => { + let out_point = OutPoint::from(asset_lock_proof.out_point.to_buffer()); + + let output_index = out_point.vout as usize; + let transaction_hash = out_point.txid; + + let transaction_data = state_repository + .fetch_transaction(&transaction_hash.to_hex(), Some(execution_context)) + .await + .map_err(|_| DPPError::InvalidAssetLockTransaction)?; + + if execution_context.is_dry_run() { + return Ok(TxOut { + value: 1000, + ..Default::default() + }); + } + + let transaction_data = transaction_data + .try_into() + .map_err(|e| DPPError::CoreMessageCorruption(format!("{:?}", e.into())))?; + + if let Some(raw_transaction) = transaction_data.data { + let transaction = Transaction::consensus_decode(raw_transaction.as_slice()) + .map_err(|e| { + DPPError::CoreMessageCorruption(format!( + "could not decode transaction {:?}", + e + )) + })?; + + transaction + .output + .get(output_index) + .cloned() + .ok_or_else(|| AssetLockOutputNotFoundError::new().into()) + } else { + Err(DPPError::from(AssetLockTransactionIsNotFoundError::new( + transaction_hash, + ))) + } + } + } + } +} + impl Default for AssetLockProof { fn default() -> Self { Self::Instant(InstantAssetLockProof::default()) @@ -209,3 +272,39 @@ impl TryInto for &AssetLockProof { } } } + +#[cfg(test)] +mod test { + use crate::state_repository::FetchTransactionResponse; + use crate::{ + identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof, + state_repository::MockStateRepositoryLike, + }; + + use super::*; + + #[tokio::test] + async fn should_return_mocked_data_on_dry_run() { + let mut state_repository_mock = MockStateRepositoryLike::new(); + let asset_lock_proof = &AssetLockProof::Chain(ChainAssetLockProof::new(0, [0u8; 36])); + let execution_context = StateTransitionExecutionContext::default(); + + state_repository_mock + .expect_fetch_transaction() + .return_once(|_, _| Ok(FetchTransactionResponse::default())); + execution_context.enable_dry_run(); + + let result = asset_lock_proof + .fetch_asset_lock_transaction_output(&state_repository_mock, &execution_context) + .await + .expect("the transaction output should be returned"); + + assert_eq!( + TxOut { + value: 1000, + ..Default::default() + }, + result + ); + } +} diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs index 4b990178025..50e5ab96a2a 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -1,6 +1,8 @@ pub use apply_identity_create_transition::*; pub use identity_create_transition::*; +mod action; mod apply_identity_create_transition; mod identity_create_transition; pub mod validation; +pub use action::{IdentityCreateTransitionAction, IDENTITY_CREATE_TRANSITION_ACTION_VERSION}; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs index c15e202232d..bb310672aed 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs @@ -10,7 +10,7 @@ use crate::identity::state_transition::validate_public_key_signatures::TPublicKe use crate::identity::validation::TPublicKeysValidator; use crate::state_repository::StateRepositoryLike; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use crate::validation::{JsonSchemaValidator, ValidationResult}; +use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; use crate::version::ProtocolVersionValidator; use crate::{BlsModule, DashPlatformProtocolInitError, NonConsensusError}; @@ -70,7 +70,7 @@ impl< &self, transition_object: &Value, execution_context: &StateTransitionExecutionContext, - ) -> Result, NonConsensusError> { + ) -> Result { let mut result = self.json_schema_validator.validate( &transition_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs index 3c6bffff237..5bf9b1c08a8 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs @@ -1,8 +1,10 @@ use crate::consensus::state::identity::IdentityAlreadyExistsError; -use crate::identity::state_transition::identity_create_transition::IdentityCreateTransition; +use crate::identity::state_transition::identity_create_transition::{ + IdentityCreateTransition, IdentityCreateTransitionAction, +}; use crate::state_repository::StateRepositoryLike; use crate::state_transition::StateTransitionLike; -use crate::validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}; +use crate::validation::{AsyncDataValidator, ValidationResult}; use crate::{NonConsensusError, ProtocolError}; use async_trait::async_trait; @@ -19,11 +21,12 @@ where SR: StateRepositoryLike, { type Item = IdentityCreateTransition; + type ResultItem = IdentityCreateTransitionAction; async fn validate( &self, data: &IdentityCreateTransition, - ) -> Result { + ) -> Result, ProtocolError> { validate_identity_create_transition_state(&self.state_repository, data) .await .map_err(|err| err.into()) @@ -52,8 +55,7 @@ where pub async fn validate_identity_create_transition_state( state_repository: &impl StateRepositoryLike, state_transition: &IdentityCreateTransition, -) -> Result, NonConsensusError> { - // TODO: refactor to return ProtocolError? +) -> Result, ProtocolError> { let mut result = ValidationResult::default(); let identity_id = state_transition.get_identity_id(); @@ -68,14 +70,26 @@ pub async fn validate_identity_create_transition_state( })?; if state_transition.get_execution_context().is_dry_run() { - return Ok(result); + return Ok(IdentityCreateTransitionAction::from_borrowed(state_transition, 0).into()); } + // Balance is here to check if the identity does already exist if balance.is_some() { result.add_error(IdentityAlreadyExistsError::new(identity_id.to_buffer())); + Ok(result) + } else { + let tx_out = state_transition + .asset_lock_proof + .fetch_asset_lock_transaction_output( + state_repository, + &state_transition.execution_context, + ) + .await + .map_err(Into::::into)?; + return Ok( + IdentityCreateTransitionAction::from_borrowed(state_transition, tx_out.value).into(), + ); } - - Ok(result) } #[cfg(test)] diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs index 9bca3abde5c..f6f190316a0 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs @@ -21,8 +21,12 @@ use super::properties::{ PROPERTY_IDENTITY_ID, PROPERTY_SIGNATURE, PROPERTY_SIGNATURE_PUBLIC_KEY_ID, }; +mod action; pub mod apply_identity_credit_withdrawal_transition_factory; pub mod validation; +pub use action::{ + IdentityCreditWithdrawalTransitionAction, IDENTITY_CREDIT_WITHDRAWAL_TRANSITION_VERSION, +}; #[repr(u8)] #[derive(Serialize_repr, Deserialize_repr, PartialEq, Eq, Clone, Copy, Debug)] diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs index 95f70f2bbe1..50d84728abf 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs @@ -4,6 +4,7 @@ use lazy_static::lazy_static; use platform_value::Value; use serde_json::Value as JsonValue; +use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::identity::{ InvalidIdentityCreditWithdrawalTransitionCoreFeeError, @@ -13,7 +14,7 @@ use crate::{ contracts::withdrawals_contract, identity::core_script::CoreScript, util::is_fibonacci_number::is_fibonacci_number, - validation::{JsonSchemaValidator, ValidationResult}, + validation::JsonSchemaValidator, version::ProtocolVersionValidator, DashPlatformProtocolInitError, NonConsensusError, }; @@ -49,7 +50,7 @@ impl IdentityCreditWithdrawalTransitionBasicValidator { pub async fn validate( &self, transition_object: &Value, - ) -> Result, NonConsensusError> { + ) -> Result { let mut result = self.json_schema_validator.validate( &transition_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs index f7053296950..34c769e98a7 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs @@ -2,13 +2,22 @@ use std::convert::TryInto; use std::sync::Arc; use anyhow::Result; +use dashcore::{consensus, BlockHeader}; +use platform_value::platform_value; use crate::consensus::signature::IdentityNotFoundError; + +use crate::contracts::withdrawals_contract; +use crate::document::{generate_document_id, Document}; +use crate::identity::state_transition::identity_credit_withdrawal_transition::{ + IdentityCreditWithdrawalTransitionAction, Pooling, +}; +use crate::validation::ValidationResult; use crate::{ consensus::basic::identity::IdentityInsufficientBalanceError, identity::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - validation::ValidationResult, NonConsensusError, StateError, + NonConsensusError, ProtocolError, StateError, }; pub struct IdentityCreditWithdrawalTransitionValidator @@ -29,8 +38,8 @@ where pub async fn validate_identity_credit_withdrawal_transition_state( &self, state_transition: &IdentityCreditWithdrawalTransition, - ) -> Result, NonConsensusError> { - let mut result: ValidationResult<()> = ValidationResult::default(); + ) -> Result, ProtocolError> { + let mut result = ValidationResult::default(); // TODO: Use fetchIdentityBalance let maybe_existing_identity = self @@ -79,6 +88,48 @@ where return Ok(result); } - Ok(result) + let document_id = generate_document_id::generate_document_id( + &withdrawals_contract::CONTRACT_ID, + &state_transition.identity_id, + withdrawals_contract::document_types::WITHDRAWAL, + state_transition.output_script.as_bytes(), + ); + + let latest_platform_block_header_bytes: Vec = self + .state_repository + .fetch_latest_platform_block_header() + .await?; + + let latest_platform_block_header: BlockHeader = + consensus::deserialize(&latest_platform_block_header_bytes) + .map_err(ProtocolError::DashCoreError)?; + + let document_created_at_millis: i64 = latest_platform_block_header.time as i64 * 1000i64; + + let document_data = platform_value!({ + withdrawals_contract::property_names::AMOUNT: state_transition.amount, + withdrawals_contract::property_names::CORE_FEE_PER_BYTE: state_transition.core_fee_per_byte, + withdrawals_contract::property_names::POOLING: Pooling::Never, + withdrawals_contract::property_names::OUTPUT_SCRIPT: state_transition.output_script.as_bytes(), + withdrawals_contract::property_names::STATUS: withdrawals_contract::WithdrawalStatus::QUEUED, + withdrawals_contract::property_names::CREATED_AT: document_created_at_millis, + withdrawals_contract::property_names::UPDATED_AT: document_created_at_millis, + }); + + let withdrawal_document = Document { + id: document_id, + owner_id: state_transition.identity_id, + properties: document_data.into_btree_string_map().unwrap(), + revision: None, + created_at: None, + updated_at: None, + }; + + Ok(IdentityCreditWithdrawalTransitionAction { + version: IdentityCreditWithdrawalTransitionAction::current_version(), + identity_id: state_transition.identity_id, + prepared_withdrawal_document: withdrawal_document, + } + .into()) } } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs index 209a5b2b4f8..03f4d2b0d31 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/mod.rs @@ -1,6 +1,8 @@ pub use apply_identity_topup_transition::*; pub use identity_topup_transition::*; +mod action; mod apply_identity_topup_transition; mod identity_topup_transition; pub mod validation; +pub use action::{IdentityTopUpTransitionAction, IDENTITY_TOP_UP_TRANSITION_ACTION_VERSION}; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs index b711bf9133d..5750c9dc79f 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/basic/identity_topup_transition_basic_validator.rs @@ -7,7 +7,7 @@ use serde_json::Value as JsonValue; use crate::identity::state_transition::asset_lock_proof::AssetLockProofValidator; use crate::state_repository::StateRepositoryLike; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use crate::validation::{JsonSchemaValidator, ValidationResult}; +use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; use crate::version::ProtocolVersionValidator; use crate::{DashPlatformProtocolInitError, NonConsensusError}; @@ -47,7 +47,7 @@ impl IdentityTopUpTransitionBasicValidator { &self, identity_topup_transition_object: &Value, execution_context: &StateTransitionExecutionContext, - ) -> Result, NonConsensusError> { + ) -> Result { let mut result = self.json_schema_validator.validate( &identity_topup_transition_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs index fd2dd71381c..1de6aad3963 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/validation/state/mod.rs @@ -1,6 +1,9 @@ -use crate::identity::state_transition::identity_topup_transition::IdentityTopUpTransition; +use crate::identity::state_transition::identity_topup_transition::{ + IdentityTopUpTransition, IdentityTopUpTransitionAction, +}; use crate::state_repository::StateRepositoryLike; -use crate::validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}; + +use crate::validation::{AsyncDataValidator, ValidationResult}; use crate::{NonConsensusError, ProtocolError}; use async_trait::async_trait; @@ -17,12 +20,13 @@ where SR: StateRepositoryLike, { type Item = IdentityTopUpTransition; + type ResultItem = IdentityTopUpTransitionAction; async fn validate( &self, data: &IdentityTopUpTransition, - ) -> Result { - validate_identity_topup_transition_state(data, &self.state_repository) + ) -> Result, ProtocolError> { + validate_identity_topup_transition_state(&self.state_repository, data) .await .map(|result| result.into()) .map_err(|err| err.into()) @@ -49,8 +53,17 @@ where /// 1. We need to check that outpoint exists (not now) /// 2. Verify ownership proof signature, as it requires special transaction to be implemented pub async fn validate_identity_topup_transition_state( - _state_transition: &IdentityTopUpTransition, - _state_repository: &impl StateRepositoryLike, -) -> Result, NonConsensusError> { - Ok(ValidationResult::default()) + state_repository: &impl StateRepositoryLike, + state_transition: &IdentityTopUpTransition, +) -> Result, NonConsensusError> { + //todo: I think we need to validate that the identity actually exists + let top_up_balance_amount = state_transition + .asset_lock_proof + .fetch_asset_lock_transaction_output(state_repository, &state_transition.execution_context) + .await + .map_err(Into::::into)?; + Ok( + IdentityTopUpTransitionAction::from_borrowed(state_transition, top_up_balance_amount.value) + .into(), + ) } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs index 31cae78f4fa..4bbfa3c800c 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/mod.rs @@ -1,5 +1,7 @@ +mod action; pub mod apply_identity_update_transition; pub mod identity_update_transition; pub mod validate_identity_update_transition_basic; pub mod validate_identity_update_transition_state; pub mod validate_public_keys; +pub use action::{IdentityUpdateTransitionAction, IDENTITY_UPDATE_TRANSITION_ACTION_VERSION}; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs index 6da3789e332..6e16c419f61 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs @@ -4,12 +4,13 @@ use std::convert::TryInto; use std::sync::Arc; use crate::consensus::signature::{IdentityNotFoundError, SignatureError}; +use crate::identity::state_transition::identity_update_transition::IdentityUpdateTransitionAction; use crate::{ block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window, identity::validation::{RequiredPurposeAndSecurityLevelValidator, TPublicKeysValidator}, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - validation::SimpleValidationResult, + validation::ValidationResult, NonConsensusError, StateError, }; @@ -35,8 +36,8 @@ where pub async fn validate( &self, state_transition: &IdentityUpdateTransition, - ) -> Result { - let mut validation_result = SimpleValidationResult::default(); + ) -> Result, NonConsensusError> { + let mut validation_result = ValidationResult::default(); let maybe_stored_identity = self .state_repository @@ -56,7 +57,8 @@ where })?; if state_transition.get_execution_context().is_dry_run() { - return Ok(validation_result); + let action: IdentityUpdateTransitionAction = state_transition.into(); + return Ok(action.into()); } let stored_identity = match maybe_stored_identity { @@ -167,10 +169,18 @@ where .public_keys_validator .validate_keys(raw_public_keys.as_slice())?; if !result.is_valid() { - return Ok(result); + validation_result.add_errors(result.errors); + return Ok(validation_result); } let validator = RequiredPurposeAndSecurityLevelValidator {}; - validator.validate_keys(&raw_public_keys) + let result = validator.validate_keys(&raw_public_keys)?; + if !result.is_valid() { + validation_result.add_errors(result.errors); + return Ok(validation_result); + } + + let action: IdentityUpdateTransitionAction = state_transition.into(); + Ok(action.into()) } } diff --git a/packages/rs-dpp/src/identity/validation/identity_validator.rs b/packages/rs-dpp/src/identity/validation/identity_validator.rs index 3f23539e0a2..2be5786b69d 100644 --- a/packages/rs-dpp/src/identity/validation/identity_validator.rs +++ b/packages/rs-dpp/src/identity/validation/identity_validator.rs @@ -4,7 +4,7 @@ use serde_json::Value as JsonValue; use std::sync::Arc; use crate::identity::validation::TPublicKeysValidator; -use crate::validation::{JsonSchemaValidator, ValidationResult}; +use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; use crate::version::ProtocolVersionValidator; use crate::{DashPlatformProtocolInitError, NonConsensusError}; use crate::identity::state_transition::identity_update_transition::identity_update_transition::property_names::PROTOCOL_VERSION; @@ -40,7 +40,7 @@ impl IdentityValidator { pub fn validate_identity_object( &self, identity_object: &Value, - ) -> Result, NonConsensusError> { + ) -> Result { let mut validation_result = self.json_schema_validator.validate( &identity_object .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/validation/public_keys_validator.rs b/packages/rs-dpp/src/identity/validation/public_keys_validator.rs index 31cca957ab2..479210c1eba 100644 --- a/packages/rs-dpp/src/identity/validation/public_keys_validator.rs +++ b/packages/rs-dpp/src/identity/validation/public_keys_validator.rs @@ -8,7 +8,7 @@ use crate::errors::consensus::basic::identity::{ InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError, }; use crate::identity::{IdentityPublicKey, KeyID, KeyType}; -use crate::validation::{JsonSchemaValidator, ValidationResult}; +use crate::validation::{JsonSchemaValidator, SimpleValidationResult}; use crate::{ BlsModule, DashPlatformProtocolInitError, NonConsensusError, PublicKeyValidationError, }; @@ -33,7 +33,7 @@ pub trait TPublicKeysValidator { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result, NonConsensusError>; + ) -> Result; } pub struct PublicKeysValidator { @@ -45,8 +45,8 @@ impl TPublicKeysValidator for PublicKeysValidator { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result, NonConsensusError> { - let mut result = ValidationResult::new(None); + ) -> Result { + let mut result = SimpleValidationResult::default(); // TODO: convert buffers to arrays? // Validate public key structure @@ -175,7 +175,7 @@ impl PublicKeysValidator { pub fn validate_public_key_structure( &self, public_key: &Value, - ) -> Result, NonConsensusError> { + ) -> Result { self.public_key_schema_validator.validate( &public_key .try_to_validating_json() diff --git a/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs b/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs index 510fbc2c4ae..0af11418ef4 100644 --- a/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs +++ b/packages/rs-dpp/src/identity/validation/required_purpose_and_security_level_validator.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use crate::consensus::basic::identity::MissingMasterPublicKeyError; use crate::identity::validation::TPublicKeysValidator; use crate::identity::{IdentityPublicKey, Purpose, SecurityLevel}; -use crate::validation::ValidationResult; +use crate::validation::SimpleValidationResult; use crate::{DashPlatformProtocolInitError, NonConsensusError}; #[derive(Eq, Hash, PartialEq)] @@ -20,8 +20,8 @@ impl TPublicKeysValidator for RequiredPurposeAndSecurityLevelValidator { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result, NonConsensusError> { - let mut result = ValidationResult::default(); + ) -> Result { + let mut result = SimpleValidationResult::default(); let mut key_purposes_and_levels_count: HashMap = HashMap::new(); diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 784a931bf13..a0c465e3b10 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -35,6 +35,8 @@ pub mod fee; pub mod state_transition_execution_context; mod example; +mod state_transition_action; +pub use state_transition_action::StateTransitionAction; macro_rules! call_method { ($state_transition:expr, $method:ident, $args:tt ) => { match $state_transition { diff --git a/packages/rs-dpp/src/state_transition/state_transition_facade.rs b/packages/rs-dpp/src/state_transition/state_transition_facade.rs index 481476af3d5..949e5dc3a9d 100644 --- a/packages/rs-dpp/src/state_transition/state_transition_facade.rs +++ b/packages/rs-dpp/src/state_transition/state_transition_facade.rs @@ -16,7 +16,8 @@ use crate::identity::validation::{PUBLIC_KEY_SCHEMA_FOR_TRANSITION, PublicKeysVa use crate::state_repository::StateRepositoryLike; use crate::state_transition::{ - StateTransition, StateTransitionConvert, StateTransitionFactory, StateTransitionFactoryOptions, + StateTransition, StateTransitionAction, StateTransitionConvert, StateTransitionFactory, + StateTransitionFactoryOptions, }; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; @@ -27,7 +28,7 @@ use crate::state_transition::validation::validate_state_transition_identity_sign use crate::state_transition::validation::validate_state_transition_key_signature::StateTransitionKeySignatureValidator; use crate::state_transition::validation::validate_state_transition_state::StateTransitionStateValidator; use crate::validation::{ - AsyncDataValidator, AsyncDataValidatorWithContext, SimpleValidationResult, + AsyncDataValidator, AsyncDataValidatorWithContext, SimpleValidationResult, ValidationResult, }; use crate::version::ProtocolVersionValidator; @@ -223,42 +224,41 @@ where state_transition: &StateTransition, execution_context: &StateTransitionExecutionContext, options: ValidateOptions, - ) -> Result { - let mut result = SimpleValidationResult::default(); - + ) -> Result>, ProtocolError> { + let mut result = ValidationResult::>::new_with_data(None); if options.basic { let state_transition_cleaned = state_transition.to_cleaned_object(false)?; result.merge( self.validate_basic(&state_transition_cleaned, execution_context) .await?, ); - } - if !result.is_valid() { - return Ok(result); + if !result.is_valid() { + return Ok(result); + } } if options.signature { result.merge(self.validate_signature(state_transition.clone()).await?); - } - if !result.is_valid() { - return Ok(result); + if !result.is_valid() { + return Ok(result); + } } if options.fee { result.merge(self.validate_fee(state_transition).await?); - } - if !result.is_valid() { - return Ok(result); + if !result.is_valid() { + return Ok(result); + } } if options.state { - result.merge(self.validate_state(state_transition).await?); + Ok(self.validate_state(state_transition).await?.map(Some)) + } else { + Ok(result) } - - Ok(result) } pub async fn validate_basic( @@ -335,7 +335,7 @@ where pub async fn validate_state( &self, state_transition: &StateTransition, - ) -> Result { + ) -> Result, ProtocolError> { self.state_validator.validate(state_transition).await } } diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs index 5ca4d3b2f8f..a60b660ef61 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_basic.rs @@ -125,6 +125,7 @@ mod test { use super::StateTransitionBasicValidator; + use crate::validation::SimpleValidationResult; use crate::{ consensus::basic::BasicError, data_contract::{ @@ -137,7 +138,6 @@ mod test { StateTransitionConvert, StateTransitionLike, }, tests::{fixtures::get_data_contract_fixture, utils::get_basic_error_from_result}, - validation::ValidationResult, version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}, NativeBlsModule, }; @@ -307,7 +307,7 @@ mod test { let mut validate_by_type_mock = MockValidatorByStateTransitionType::new(); validate_by_type_mock .expect_validate() - .returning(|_, _, _| Ok(ValidationResult::<()>::default())); + .returning(|_, _, _| Ok(SimpleValidationResult::default())); for i in 0..500 { let document_type_name = format!("anotherDocument{}", i); @@ -352,7 +352,7 @@ mod test { let mut validate_by_type_mock = MockValidatorByStateTransitionType::new(); validate_by_type_mock .expect_validate() - .returning(|_, _, _| Ok(ValidationResult::<()>::default())); + .returning(|_, _, _| Ok(SimpleValidationResult::default())); let validator = StateTransitionBasicValidator::new( Arc::new(state_repository_mock), diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs index cc45ac6d3c7..eb4570653b1 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_by_type.rs @@ -8,9 +8,10 @@ use crate::{ state_transition::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransitionType, }, - validation::{AsyncDataValidatorWithContext, DataValidatorWithContext, SimpleValidationResult, ValidationResult}, - ProtocolError, BlsModule, state_repository::StateRepositoryLike, data_contract::state_transition::{data_contract_update_transition::validation::basic::DataContractUpdateTransitionBasicValidator, data_contract_create_transition::validation::state::validate_data_contract_create_transition_basic::DataContractCreateTransitionBasicValidator}, identity::{state_transition::{identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator, validate_public_key_signatures::PublicKeysSignaturesValidator, identity_update_transition::validate_identity_update_transition_basic::ValidateIdentityUpdateTransitionBasic, identity_topup_transition::validation::basic::IdentityTopUpTransitionBasicValidator, identity_credit_withdrawal_transition::validation::basic::validate_identity_credit_withdrawal_transition_basic::IdentityCreditWithdrawalTransitionBasicValidator}, validation::PublicKeysValidator}, document::validation::basic::validate_documents_batch_transition_basic::DocumentBatchTransitionBasicValidator, + validation::{AsyncDataValidatorWithContext, DataValidatorWithContext, SimpleValidationResult}, + ProtocolError, BlsModule, state_repository::StateRepositoryLike, data_contract::state_transition::{data_contract_update_transition::validation::basic::DataContractUpdateTransitionBasicValidator, data_contract_create_transition::validation::state::validate_data_contract_create_transition_basic::DataContractCreateTransitionBasicValidator}, identity::{state_transition::{identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator, validate_public_key_signatures::PublicKeysSignaturesValidator, identity_update_transition::validate_identity_update_transition_basic::ValidateIdentityUpdateTransitionBasic, identity_topup_transition::validation::basic::IdentityTopUpTransitionBasicValidator, identity_credit_withdrawal_transition::validation::basic::validate_identity_credit_withdrawal_transition_basic::IdentityCreditWithdrawalTransitionBasicValidator}, validation::PublicKeysValidator}, document::validation::basic::validate_documents_batch_transition_basic::DocumentBatchTransitionBasicValidator, }; +use crate::validation::ValidationResult; #[cfg_attr(test, automock)] #[async_trait(?Send)] diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index 0b011208653..994857e72f7 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -271,7 +271,7 @@ mod test { let fee_error = get_fee_error_from_result(&result, 0); assert!( - matches!(fee_error, FeeError::BalanceIsNotEnoughError { balance, fee } if { + matches!(fee_error, FeeError::BalanceIsNotEnoughError { balance, fee: _ } if { *balance == 1 }) ); diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs index ed5c6316a5f..b632af5493b 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs @@ -8,6 +8,7 @@ use crate::consensus::signature::{ IdentityNotFoundError, InvalidIdentityPublicKeyTypeError, MissingPublicKeyError, PublicKeyIsDisabledError, PublicKeySecurityLevelNotMetError, }; +use crate::validation::SimpleValidationResult; use crate::{ consensus::{signature::SignatureError, ConsensusError}, identity::KeyType, @@ -17,7 +18,6 @@ use crate::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransitionIdentitySigned, }, - validation::ValidationResult, BlsModule, ProtocolError, }; @@ -35,8 +35,8 @@ pub async fn validate_state_transition_identity_signature( state_repository: Arc, state_transition: &mut impl StateTransitionIdentitySigned, bls: &impl BlsModule, -) -> Result, ProtocolError> { - let mut validation_result = ValidationResult::<()>::default(); +) -> Result { + let mut validation_result = SimpleValidationResult::default(); // We use temporary execution context without dry run, // because despite the dryRun, we need to get the diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs index 457cbf3de80..96f565dda52 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs @@ -6,6 +6,7 @@ use dashcore::signer::verify_hash_signature; use crate::consensus::signature::IdentityNotFoundError; use crate::consensus::ConsensusError; +use crate::validation::AsyncDataValidator; use crate::{ consensus::signature::SignatureError, identity::{ @@ -18,7 +19,7 @@ use crate::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransition, StateTransitionConvert, StateTransitionLike, }, - validation::{AsyncDataValidator, SimpleValidationResult, ValidationResult}, + validation::SimpleValidationResult, ProtocolError, }; @@ -33,6 +34,8 @@ where SR: StateRepositoryLike, { type Item = StateTransition; + type ResultItem = (); + async fn validate(&self, data: &Self::Item) -> Result { validate_state_transition_key_signature( self.state_repository.as_ref(), @@ -62,7 +65,7 @@ pub async fn validate_state_transition_key_signature( state_repository: &impl StateRepositoryLike, asset_lock_public_key_hash_fetcher: &AssetLockPublicKeyHashFetcher, state_transition: &StateTransition, -) -> Result, ProtocolError> { +) -> Result { let mut result = SimpleValidationResult::default(); let execution_context = state_transition.get_execution_context(); diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs index c827c5e6706..1d92a381a46 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_state.rs @@ -9,8 +9,9 @@ use crate::identity::state_transition::identity_topup_transition::validation::st use crate::identity::state_transition::identity_update_transition::validate_identity_update_transition_state::IdentityUpdateTransitionStateValidator; use crate::identity::state_transition::identity_update_transition::validate_public_keys::IdentityUpdatePublicKeysValidator; use crate::ProtocolError; -use crate::state_transition::StateTransition; -use crate::validation::{AsyncDataValidator, SimpleValidationResult}; +use crate::state_transition::{StateTransition, StateTransitionAction}; +use crate::state_transition::StateTransitionAction::{DataContractCreateAction, DataContractUpdateAction, DocumentsBatchAction, IdentityCreateAction, IdentityCreditWithdrawalAction, IdentityTopUpAction, IdentityUpdateAction}; +use crate::validation::{AsyncDataValidator, ValidationResult}; pub struct StateTransitionStateValidator where @@ -66,29 +67,44 @@ where pub async fn validate( &self, state_transition: &StateTransition, - ) -> Result { + ) -> Result, ProtocolError> { match state_transition { - StateTransition::DataContractCreate(st) => { - self.data_contract_create_validator.validate(st).await - } - StateTransition::DataContractUpdate(st) => { - self.data_contract_update_validator.validate(st).await - } - StateTransition::IdentityCreate(st) => { - self.identity_create_validator.validate(st).await - } - StateTransition::IdentityUpdate(st) => self + StateTransition::DataContractCreate(st) => Ok(self + .data_contract_create_validator + .validate(st) + .await? + .map(DataContractCreateAction)), + + StateTransition::DataContractUpdate(st) => Ok(self + .data_contract_update_validator + .validate(st) + .await? + .map(DataContractUpdateAction)), + StateTransition::IdentityCreate(st) => Ok(self + .identity_create_validator + .validate(st) + .await? + .map(IdentityCreateAction)), + StateTransition::IdentityUpdate(st) => Ok(self .identity_update_validator .validate(st) - .await - .map_err(|e| ProtocolError::from(e)), - StateTransition::IdentityTopUp(st) => self.identity_top_up_validator.validate(st).await, - StateTransition::IdentityCreditWithdrawal(st) => self + .await? + .map(IdentityUpdateAction)), + StateTransition::IdentityTopUp(st) => Ok(self + .identity_top_up_validator + .validate(st) + .await? + .map(IdentityTopUpAction)), + StateTransition::IdentityCreditWithdrawal(st) => Ok(self .identity_credit_withdrawal_validator .validate_identity_credit_withdrawal_transition_state(st) - .await - .map_err(|e| ProtocolError::from(e)), - StateTransition::DocumentsBatch(st) => self.document_batch_validator.validate(st).await, + .await? + .map(IdentityCreditWithdrawalAction)), + StateTransition::DocumentsBatch(st) => Ok(self + .document_batch_validator + .validate(st) + .await? + .map(DocumentsBatchAction)), } } } diff --git a/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs b/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs index 2bda80f836e..e8b743ecae5 100644 --- a/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs +++ b/packages/rs-dpp/src/tests/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_indices_are_backward_compatible_spec.rs @@ -1,10 +1,10 @@ use crate::{ consensus::basic::BasicError, data_contract::state_transition::data_contract_update_transition::validation::basic::validate_indices_are_backward_compatible, - validation::ValidationResult, }; use std::collections::BTreeMap; +use crate::validation::SimpleValidationResult; use crate::{ consensus::ConsensusError, data_contract::DataContract, tests::fixtures::get_data_contract_fixture, util::json_value::JsonValueExt, @@ -61,7 +61,7 @@ fn setup_test() -> TestData { } } -fn get_basic_error(result: &ValidationResult<()>, error_number: usize) -> &BasicError { +fn get_basic_error(result: &SimpleValidationResult, error_number: usize) -> &BasicError { match result .errors .get(error_number) @@ -92,8 +92,8 @@ fn should_return_invalid_result_if_some_of_unique_indices_have_changed() { ) .expect("validation result should be returned"); - assert_eq!(1, result.errors().len()); - assert_eq!(1053, result.errors()[0].code()); + assert_eq!(1, result.errors.len()); + assert_eq!(1053, result.errors[0].code()); let basic_error = get_basic_error(&result, 0); @@ -125,9 +125,9 @@ fn should_return_invalid_result_if_non_unique_index_update_failed_due_to_changed ) .expect("validation result should be returned"); - assert_eq!(1, result.errors().len()); + assert_eq!(1, result.errors.len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors()[0].code()); + assert_eq!(0, result.errors[0].code()); let basic_error = get_basic_error(&result, 0); @@ -160,9 +160,9 @@ fn should_return_invalid_result_if_already_indexed_properties_are_added_to_exist ) .expect("validation result should be returned"); - assert_eq!(1, result.errors().len()); + assert_eq!(1, result.errors.len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors()[0].code()); + assert_eq!(0, result.errors[0].code()); let basic_error = get_basic_error(&result, 0); match basic_error { @@ -201,9 +201,9 @@ fn should_return_invalid_result_if_one_of_new_indices_contains_old_properties_in ) .expect("validation result should be returned"); - assert_eq!(1, result.errors().len()); + assert_eq!(1, result.errors.len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors()[0].code()); + assert_eq!(0, result.errors[0].code()); let basic_error = get_basic_error(&result, 0); @@ -244,9 +244,9 @@ fn should_return_invalid_result_if_one_of_new_indices_is_unique() { ) .expect("validation result should be returned"); - assert_eq!(1, result.errors().len()); + assert_eq!(1, result.errors.len()); // TODO the error doesn't have assigned error code - assert_eq!(0, result.errors()[0].code()); + assert_eq!(0, result.errors[0].code()); let basic_error = get_basic_error(&result, 0); @@ -313,9 +313,9 @@ fn should_return_invalid_result_if_non_unique_index_added_for_non_indexed_proper ) .expect("validation result should be returned"); - assert_eq!(result.errors().len(), 1); + assert_eq!(result.errors.len(), 1); // TODO the error doesn't have assigned error code - assert_eq!(result.errors()[0].code(), 0); + assert_eq!(result.errors[0].code(), 0); let basic_error = get_basic_error(&result, 0); diff --git a/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs b/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs index 291904e0f6d..02d4fc8e0e8 100644 --- a/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs +++ b/packages/rs-dpp/src/tests/data_contract/validation/data_contract_validator_spec.rs @@ -46,7 +46,10 @@ fn init() { .try_init(); } -fn get_schema_error(result: &ValidationResult<()>, number: usize) -> &JsonSchemaError { +fn get_schema_error( + result: &ValidationResult, + number: usize, +) -> &JsonSchemaError { result .errors .get(number) @@ -55,7 +58,10 @@ fn get_schema_error(result: &ValidationResult<()>, number: usize) -> &JsonSchema .expect("the error should be json schema error") } -fn get_value_error(result: &ValidationResult<()>, number: usize) -> &platform_value::Error { +fn get_value_error( + result: &ValidationResult, + number: usize, +) -> &platform_value::Error { result .errors .get(number) @@ -81,7 +87,7 @@ fn get_index_error(consensus_error: &ConsensusError) -> &IndexError { } } -fn print_json_schema_errors(result: &ValidationResult<()>) { +fn print_json_schema_errors(result: &ValidationResult) { for (i, e) in result.errors.iter().enumerate() { let schema_error = e.json_schema_error().unwrap(); println!( @@ -2557,7 +2563,7 @@ mod indices { .validate(&cloned_data_contract) .expect("should return validation result"); - let index_error = get_index_error(&result.errors()[0]); + let index_error = get_index_error(&result.errors[0]); assert_eq!(1016, index_error.get_code()); match index_error { IndexError::UndefinedIndexPropertyError(err) => { diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs index a09a420b4d9..f58509a33ee 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs @@ -22,11 +22,12 @@ use crate::{ get_data_contract_fixture, get_document_transitions_fixture, }, utils::{generate_random_identifier_struct}, - }, validation::ValidationResult, + }, }; use crate::document::{Document, ExtendedDocument}; use crate::identity::TimestampMillis; use crate::tests::fixtures::get_extended_documents_fixture; +use crate::validation::ValidationResult; struct TestData { owner_id: Identifier, @@ -86,13 +87,16 @@ fn setup_test() -> TestData { } } -fn get_state_error(result: &ValidationResult<()>, error_number: usize) -> &StateError { +fn get_state_error( + result: &ValidationResult, + error_number: usize, +) -> &StateError { match result .errors .get(error_number) .expect("error should be found") { - ConsensusError::StateError(state_error) => state_error, + ConsensusError::StateError(state_error) => &*state_error, _ => panic!( "error '{:?}' isn't a basic error", result.errors[error_number] @@ -132,7 +136,7 @@ async fn should_throw_error_if_data_contract_was_not_found() { &state_repository_mock, &data_contract.id, owner_id, - document_transitions, + document_transitions.iter().collect::>().as_slice(), &Default::default(), ) .await @@ -178,7 +182,7 @@ async fn should_return_invalid_result_if_document_transition_with_action_delete_ .expect("documents batch state transition should be created"); state_repository_mock - .expect_fetch_extended_documents() + .expect_fetch_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -251,8 +255,8 @@ async fn should_return_invalid_result_if_document_transition_with_action_replace .expect("documents batch state transition should be created"); state_repository_mock - .expect_fetch_extended_documents() - .returning(move |_, _, _, _| Ok(vec![extended_documents[0].clone()])); + .expect_fetch_documents() + .returning(move |_, _, _, _| Ok(vec![documents[0].clone()])); let validation_result = validate_document_batch_transition_state(&state_repository_mock, &state_transition) @@ -328,8 +332,8 @@ async fn should_return_invalid_result_if_document_transition_with_action_replace .expect("documents batch state transition should be created"); state_repository_mock - .expect_fetch_extended_documents() - .returning(move |_, _, _, _| Ok(vec![fetched_document.clone()])); + .expect_fetch_documents() + .returning(move |_, _, _, _| Ok(vec![fetched_document.document.clone()])); let validation_result = validate_document_batch_transition_state(&state_repository_mock, &state_transition) @@ -402,7 +406,7 @@ async fn should_return_invalid_result_if_timestamps_mismatch() { .for_each(|t| set_updated_at(t, Some(now_ts))); state_repository_mock - .expect_fetch_extended_documents() + .expect_fetch_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -462,7 +466,7 @@ async fn should_return_invalid_result_if_crated_at_has_violated_time_window() { .for_each(|t| set_created_at(t, Some(now_ts_minus_6_mins))); state_repository_mock - .expect_fetch_extended_documents() + .expect_fetch_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -523,7 +527,7 @@ async fn should_not_validate_time_in_block_window_on_dry_run() { .for_each(|t| set_created_at(t, Some(now_ts_minus_6_mins))); state_repository_mock - .expect_fetch_extended_documents() + .expect_fetch_documents() .returning(move |_, _, _, _| Ok(vec![])); let result = @@ -576,7 +580,7 @@ async fn should_return_invalid_result_if_updated_at_has_violated_time_window() { }); state_repository_mock - .expect_fetch_extended_documents() + .expect_fetch_documents() .returning(move |_, _, _, _| Ok(vec![])); let validation_result = @@ -612,9 +616,12 @@ async fn should_return_valid_result_if_document_transitions_are_valid() { fetched_document_2.document.owner_id = owner_id; state_repository_mock - .expect_fetch_extended_documents() + .expect_fetch_documents() .returning(move |_, _, _, _| { - Ok(vec![fetched_document_1.clone(), fetched_document_2.clone()]) + Ok(vec![ + fetched_document_1.document.clone(), + fetched_document_2.document.clone(), + ]) }); let document_transitions = get_document_transitions_fixture([ (Action::Create, vec![]), diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs index 60691a72c2f..b1f4ff26979 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transitions_basic_spec.rs @@ -472,7 +472,7 @@ async fn property_should_should_exist_with_code(property_name: &str, error_code: .await .expect("validation result should be returned"); - let error = &result.errors()[0]; + let error = &result.errors[0]; assert_eq!(error_code, error.code()); } @@ -534,7 +534,7 @@ async fn data_contract_id_should_be_byte_array() { .await .expect("validation result should be returned"); - let error = &result.errors()[0]; + let error = &result.errors[0]; assert_eq!(5000, error.code()); } @@ -629,7 +629,7 @@ async fn data_contract_should_exist_in_the_state() { .await .expect("validation result should be returned"); - let error = &result.errors()[0]; + let error = &result.errors[0]; assert_eq!(1018, error.code()); } @@ -654,7 +654,7 @@ async fn type_should_be_defined_in_data_contract() { .await .expect("validation result should be returned"); - let error = &result.errors()[0]; + let error = &result.errors[0]; assert_eq!(1024, error.code()); } @@ -679,7 +679,7 @@ async fn should_throw_invalid_document_transaction_action_error_if_action_is_not .await .expect("validation result should be returned"); - let error = &result.errors()[0]; + let error = &result.errors[0]; assert_eq!(1022, error.code()); } @@ -705,7 +705,7 @@ async fn id_should_be_valid_generated_id() { .await .expect("validation result should be returned"); - let error = &result.errors()[0]; + let error = &result.errors[0]; assert_eq!(1023, error.code()); } diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs index 914aeffa732..2baabc0dee7 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_uniqueness_by_indices_spec.rs @@ -10,9 +10,10 @@ use crate::{consensus::ConsensusError, data_contract::DataContract, document::{ get_data_contract_fixture, get_document_transitions_fixture, }, utils::generate_random_identifier_struct, -}, validation::ValidationResult}; +}}; use crate::document::{Document, ExtendedDocument}; use crate::tests::fixtures::get_extended_documents_fixture; +use crate::validation::ValidationResult; struct TestData { owner_id: Identifier, @@ -61,7 +62,7 @@ async fn should_return_valid_result_if_documents_have_no_unique_indices() { let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - &document_transitions, + document_transitions.iter(), &data_contract, &Default::default(), ) @@ -119,7 +120,7 @@ async fn should_return_valid_result_if_document_has_unique_indices_and_there_are let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - &document_transitions, + document_transitions.iter(), &data_contract, &Default::default(), ) @@ -212,7 +213,7 @@ async fn should_return_invalid_result_if_document_has_unique_indices_and_there_a let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - &document_transitions, + document_transitions.iter(), &data_contract, &Default::default(), ) @@ -323,7 +324,7 @@ async fn should_return_valid_result_in_dry_run_if_document_has_unique_indices_an let result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - &document_transitions, + document_transitions.iter(), &data_contract, &execution_context, ) @@ -381,7 +382,7 @@ async fn should_return_valid_result_if_document_has_undefined_field_from_index() let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - &document_transitions, + document_transitions.iter(), &data_contract, &Default::default(), ) @@ -423,7 +424,7 @@ async fn should_return_valid_result_if_document_being_created_and_has_created_at let validation_result = validate_documents_uniqueness_by_indices( &state_repository_mock, &owner_id, - &document_transitions, + document_transitions.iter(), &data_contract, &Default::default(), ) @@ -432,13 +433,16 @@ async fn should_return_valid_result_if_document_being_created_and_has_created_at assert!(validation_result.is_valid()); } -fn get_state_error(result: &ValidationResult<()>, error_number: usize) -> &StateError { +fn get_state_error( + result: &ValidationResult, + error_number: usize, +) -> &StateError { match result .errors .get(error_number) .expect("error should be found") { - ConsensusError::StateError(state_error) => state_error, + ConsensusError::StateError(state_error) => &*state_error, _ => panic!( "error '{:?}' isn't a basic error", result.errors[error_number] diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs index 3bf46f3f9dc..0c800a87e96 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_partial_compound_indices_spec.rs @@ -10,10 +10,10 @@ use crate::{ tests::fixtures::{ get_data_contract_fixture, get_document_transitions_fixture, }, - validation::ValidationResult, }; use crate::document::ExtendedDocument; use crate::tests::fixtures::get_extended_documents_fixture; +use crate::validation::ValidationResult; struct TestData { data_contract: DataContract, @@ -125,13 +125,16 @@ fn should_return_valid_result_if_compound_index_contains_all_fields() { assert!(result.is_valid()); } -fn get_basic_error(result: &ValidationResult<()>, error_number: usize) -> &BasicError { +fn get_basic_error( + result: &ValidationResult, + error_number: usize, +) -> &BasicError { match result .errors .get(error_number) .expect("error should be found") { - ConsensusError::BasicError(basic_error) => basic_error, + ConsensusError::BasicError(basic_error) => &*basic_error, _ => panic!( "error '{:?}' isn't a basic error", result.errors[error_number] diff --git a/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs b/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs index 6453c70e943..d3f27981806 100644 --- a/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs +++ b/packages/rs-dpp/src/tests/fixtures/public_keys_validator_mock.rs @@ -2,33 +2,33 @@ use platform_value::Value; use std::sync::Mutex; use crate::identity::validation::TPublicKeysValidator; -use crate::validation::ValidationResult; +use crate::validation::SimpleValidationResult; use crate::NonConsensusError; #[cfg(feature = "fixtures-and-mocks")] pub struct PublicKeysValidatorMock { - returns: Mutex, NonConsensusError>>, + returns: Mutex>, returns_fn: - Mutex Result, NonConsensusError> + 'static>>>, + Mutex Result + 'static>>>, called_with: Mutex>, } impl PublicKeysValidatorMock { pub fn new() -> Self { Self { - returns: Mutex::new(Ok(ValidationResult::default())), + returns: Mutex::new(Ok(SimpleValidationResult::default())), returns_fn: Mutex::new(None), called_with: Mutex::new(vec![]), } } - pub fn returns(&self, result: Result, NonConsensusError>) { + pub fn returns(&self, result: Result) { *self.returns.lock().unwrap() = result; } pub fn returns_fun( &self, - func: impl Fn() -> Result, NonConsensusError> + 'static, + func: impl Fn() -> Result + 'static, ) { *self.returns_fn.lock().unwrap() = Some(Box::new(func)) } @@ -42,7 +42,7 @@ impl TPublicKeysValidator for PublicKeysValidatorMock { fn validate_keys( &self, raw_public_keys: &[Value], - ) -> Result, NonConsensusError> { + ) -> Result { *self.called_with.lock().unwrap() = Vec::from(raw_public_keys); let guard = self.returns_fn.lock().unwrap(); let fun = guard.as_ref().unwrap(); diff --git a/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs b/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs index 9d371d12c3d..a2aed15f798 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/asset_lock/instant/mod.rs @@ -231,7 +231,7 @@ mod validate_instant_asset_lock_proof_structure_factory { assert_consensus_errors!(result, ConsensusError::InvalidInstantAssetLockProofError, 1); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.first_error().unwrap(); assert_eq!(consensus_error.code(), 1041); } @@ -263,7 +263,7 @@ mod validate_instant_asset_lock_proof_structure_factory { ); let error = errors.first().unwrap(); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.first_error().unwrap(); assert_eq!(consensus_error.code(), 1031); assert_eq!( error.instant_lock_transaction_id(), @@ -294,7 +294,7 @@ mod validate_instant_asset_lock_proof_structure_factory { 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.first_error().unwrap(); assert_eq!(consensus_error.code(), 1042); } } @@ -409,7 +409,7 @@ mod validate_instant_asset_lock_proof_structure_factory { 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.first_error().unwrap(); assert_eq!(consensus_error.code(), 1038); } } @@ -495,6 +495,9 @@ mod validate_instant_asset_lock_proof_structure_factory { .unwrap(); assert!(result.is_valid()); - assert_eq!(result.data().unwrap().to_vec(), test_data.public_key_hash); + assert_eq!( + result.data().expect("expected data").to_vec(), + test_data.public_key_hash + ); } } diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs index 5279674cb18..bfbfd2913bb 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs @@ -480,9 +480,9 @@ mod validate_identity_create_transition_basic_factory { let pk_validator_mock = Arc::new(PublicKeysValidatorMock::new()); let pk_error = TestConsensusError::new("test"); pk_validator_mock.returns_fun(move || { - Ok(ValidationResult::new(Some(vec![ConsensusError::from( - TestConsensusError::new("test"), - )]))) + Ok(ValidationResult::new_with_errors(vec![ + ConsensusError::from(TestConsensusError::new("test")), + ])) }); let (raw_state_transition, validator) = setup_test( @@ -513,9 +513,9 @@ mod validate_identity_create_transition_basic_factory { let pk_validator_mock = Arc::new(PublicKeysValidatorMock::new()); let pk_error = TestConsensusError::new("test"); pk_validator_mock.returns_fun(move || { - Ok(ValidationResult::new(Some(vec![ConsensusError::from( - TestConsensusError::new("test"), - )]))) + Ok(ValidationResult::new_with_errors(vec![ + ConsensusError::from(TestConsensusError::new("test")), + ])) }); let (raw_state_transition, validator) = setup_test( diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs index ebce1b8479b..af75a0ed9eb 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs @@ -31,6 +31,7 @@ pub fn setup_test( #[cfg(test)] mod validate_identity_credit_withdrawal_transition_state_factory { use anyhow::Error; + use dashcore::{consensus, BlockHeader}; use crate::assert_consensus_errors; use crate::consensus::signature::SignatureError; @@ -56,7 +57,7 @@ mod validate_identity_credit_withdrawal_transition_state_factory { .await .unwrap(); - let errors = result.errors(); + let errors = result.errors; assert_eq!(errors.len(), 1); let error = errors.first().unwrap(); @@ -141,6 +142,24 @@ mod validate_identity_credit_withdrawal_transition_state_factory { anyhow::Ok(Some(identity)) }); + let block_time_seconds = 1675709306; + + state_repository + .expect_fetch_latest_platform_block_header() + .times(1) + .returning(move || { + let header = BlockHeader { + time: block_time_seconds, + version: 1, + prev_blockhash: Default::default(), + merkle_root: Default::default(), + bits: Default::default(), + nonce: Default::default(), + }; + + anyhow::Ok(consensus::serialize(&header)) + }); + let (mut state_transition, validator) = setup_test(state_repository, Some(5)); state_transition.revision = 1; diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs index 3d6cc81e76c..6f92ea86573 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs @@ -529,9 +529,9 @@ fn add_public_keys_should_be_valid() { validate_public_keys_mock .expect_validate_keys() .return_once(|_| { - Ok(SimpleValidationResult::new(Some(vec![ + Ok(SimpleValidationResult::new_with_errors(vec![ ConsensusError::TestConsensusError(TestConsensusError::new("test")), - ]))) + ])) }); let _ = raw_state_transition.remove(property_names::DISABLE_PUBLIC_KEYS); diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs index 5d9365d135e..f9aa3f0f7ae 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs @@ -367,7 +367,7 @@ async fn should_validate_pubic_keys_to_add() { } = setup_test(); let mut validate_public_keys_mock = MockTPublicKeysValidator::new(); let some_consensus_error = ConsensusError::TestConsensusError(TestConsensusError::new("test")); - let validation_result = SimpleValidationResult::new(Some(vec![some_consensus_error])); + let validation_result = SimpleValidationResult::new_with_errors(vec![some_consensus_error]); validate_public_keys_mock .expect_validate_keys() .return_once(|_| Ok(validation_result)); diff --git a/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs b/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs index 80624d87e31..b0628ddd04e 100644 --- a/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs @@ -341,7 +341,7 @@ pub fn should_return_invalid_result_if_there_are_duplicate_key_ids() { ConsensusError::DuplicatedIdentityPublicKeyBasicIdError, 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.errors.first().unwrap(); let error = errors.first().unwrap(); let expected_ids = vec![raw_public_keys @@ -369,7 +369,7 @@ pub fn should_return_invalid_result_if_there_are_duplicate_keys() { 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.errors.first().unwrap(); let error = errors.get(0).unwrap(); let expected_ids = vec![raw_public_keys @@ -398,7 +398,7 @@ pub fn should_return_invalid_result_if_key_data_is_not_a_valid_der() { 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.errors.first().unwrap(); let error = errors.first().unwrap(); assert_eq!(consensus_error.code(), 1040); @@ -434,7 +434,7 @@ pub fn should_return_invalid_result_if_key_has_an_invalid_combination_of_purpose ConsensusError::InvalidIdentityPublicKeySecurityLevelError, 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.errors.first().unwrap(); let error = errors.first().unwrap(); assert_eq!(consensus_error.code(), 1047); @@ -480,7 +480,7 @@ pub fn should_pass_valid_bls12_381_public_key() { let raw_public_keys = raw_public_keys_json.as_array().unwrap(); let result = validator.validate_keys(raw_public_keys).unwrap(); - for err in result.errors() { + for err in &result.errors { println!("{:?}", err); } @@ -525,7 +525,7 @@ pub fn should_return_invalid_result_if_bls12_381_public_key_is_invalid() { ConsensusError::InvalidIdentityPublicKeyDataError, 1 ); - let consensus_error = result.errors().first().unwrap(); + let consensus_error = result.errors.first().unwrap(); let error = errors.first().unwrap(); assert_eq!(consensus_error.code(), 1040); diff --git a/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs b/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs index 42b451260b9..150935200a6 100644 --- a/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/validation/required_purpose_and_security_level_validator_spec.rs @@ -35,10 +35,10 @@ fn should_return_invalid_result_if_state_transition_does_not_contain_master_key( .expect("validation result should be returned"); assert!(matches!( - result.errors()[0], + result.errors[0], crate::consensus::ConsensusError::MissingMasterPublicKeyError(..) )); - assert_eq!(1046, result.errors()[0].code()) + assert_eq!(1046, result.errors[0].code()) } #[test] diff --git a/packages/rs-dpp/src/tests/utils/error_helpers.rs b/packages/rs-dpp/src/tests/utils/error_helpers.rs index c091cce447d..cf007d155ce 100644 --- a/packages/rs-dpp/src/tests/utils/error_helpers.rs +++ b/packages/rs-dpp/src/tests/utils/error_helpers.rs @@ -1,3 +1,4 @@ +use crate::validation::{SimpleValidationResult, ValidationResult}; use crate::{ consensus::{ basic::{BasicError, IndexError, JsonSchemaError}, @@ -6,11 +7,10 @@ use crate::{ ConsensusError, }, data_trigger::DataTriggerExecutionResult, - validation::ValidationResult, DataTriggerError, StateError, }; -pub fn get_schema_error(result: &ValidationResult<()>, number: usize) -> &JsonSchemaError { +pub fn get_schema_error(result: &SimpleValidationResult, number: usize) -> &JsonSchemaError { result .errors .get(number) @@ -36,8 +36,8 @@ pub fn get_index_error(consensus_error: &ConsensusError) -> &IndexError { } } -pub fn get_state_error_from_result( - result: &ValidationResult<()>, +pub fn get_state_error_from_result( + result: &ValidationResult, error_number: usize, ) -> &StateError { match result @@ -54,7 +54,7 @@ pub fn get_state_error_from_result( } pub fn get_basic_error_from_result( - result: &ValidationResult<()>, + result: &SimpleValidationResult, error_number: usize, ) -> &BasicError { match result diff --git a/packages/rs-dpp/src/tests/utils/utils.rs b/packages/rs-dpp/src/tests/utils/utils.rs index d48bd7a6e65..a4965f4f5a3 100644 --- a/packages/rs-dpp/src/tests/utils/utils.rs +++ b/packages/rs-dpp/src/tests/utils/utils.rs @@ -132,17 +132,17 @@ impl SerdeTestExtension for serde_json::Value { #[macro_export] macro_rules! assert_consensus_errors { ($validation_result: expr, $variant: path, $expected_errors_count: expr) => {{ - if $validation_result.errors().len() != $expected_errors_count { - for error in $validation_result.errors().iter() { + if $validation_result.errors.len() != $expected_errors_count { + for error in $validation_result.errors.iter() { println!("{:?}", error); } } - assert_eq!($validation_result.errors().len(), $expected_errors_count); + assert_eq!($validation_result.errors.len(), $expected_errors_count); let mut errors = Vec::new(); - for error in $validation_result.errors() { + for error in &$validation_result.errors { match error { $variant(err) => errors.push(err), err => { diff --git a/packages/rs-dpp/src/validation/json_schema_validator.rs b/packages/rs-dpp/src/validation/json_schema_validator.rs index 6030875982a..3bd52f16f9a 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator.rs @@ -6,8 +6,7 @@ use serde_json::{json, Value as JsonValue}; use crate::consensus::ConsensusError; use crate::util::json_value::JsonValueExt; -use crate::validation::DataValidator; -use crate::validation::ValidationResult; +use crate::validation::{DataValidator, SimpleValidationResult}; use crate::{DashPlatformProtocolInitError, NonConsensusError, SerdeParsingError}; use super::meta_validators; @@ -69,7 +68,10 @@ impl JsonSchemaValidator { Ok(json_schema_validator) } - pub fn validate(&self, object: &JsonValue) -> Result, NonConsensusError> { + pub fn validate( + &self, + object: &JsonValue, + ) -> Result { // TODO: create better error messages let res = self .schema @@ -77,7 +79,7 @@ impl JsonSchemaValidator { .ok_or_else(|| SerdeParsingError::new("Expected identity schema to be initialized"))? .validate(object); - let mut validation_result = ValidationResult::new(None); + let mut validation_result = SimpleValidationResult::default(); match res { Ok(_) => Ok(validation_result), @@ -91,8 +93,8 @@ impl JsonSchemaValidator { } /// validates schema through compilation - pub fn validate_schema(schema: &JsonValue) -> ValidationResult<()> { - let mut validation_result = ValidationResult::new(None); + pub fn validate_schema(schema: &JsonValue) -> SimpleValidationResult { + let mut validation_result = SimpleValidationResult::default(); let res = JSONSchema::options() .should_ignore_unknown_formats(false) @@ -108,8 +110,10 @@ impl JsonSchemaValidator { } /// Uses predefined meta-schemas to validate data contract schema - pub fn validate_data_contract_schema(data_contract_schema: &JsonValue) -> ValidationResult<()> { - let mut validation_result = ValidationResult::new(None); + pub fn validate_data_contract_schema( + data_contract_schema: &JsonValue, + ) -> SimpleValidationResult { + let mut validation_result = SimpleValidationResult::default(); let res = meta_validators::DATA_CONTRACT_META_SCHEMA.validate(data_contract_schema); match res { diff --git a/packages/rs-dpp/src/validation/mod.rs b/packages/rs-dpp/src/validation/mod.rs index e6c3113e218..d721213a15e 100644 --- a/packages/rs-dpp/src/validation/mod.rs +++ b/packages/rs-dpp/src/validation/mod.rs @@ -29,9 +29,12 @@ pub trait DataValidator { /// Async validator validates data of given type #[async_trait(?Send)] pub trait AsyncDataValidator { - // TODO, when GAT is available remove the reference in method and use: `type Item<'a>` type Item; - async fn validate(&self, data: &Self::Item) -> Result; + type ResultItem: Clone; + async fn validate( + &self, + data: &Self::Item, + ) -> Result, ProtocolError>; } /// Validator takes additionally an execution context and generates fee diff --git a/packages/rs-dpp/src/validation/validation_result.rs b/packages/rs-dpp/src/validation/validation_result.rs index 386518a3312..5ec21873ce8 100644 --- a/packages/rs-dpp/src/validation/validation_result.rs +++ b/packages/rs-dpp/src/validation/validation_result.rs @@ -1,21 +1,24 @@ use crate::errors::consensus::ConsensusError; +use crate::ProtocolError; pub type SimpleValidationResult = ValidationResult<()>; #[derive(Default, Debug)] pub struct ValidationResult { pub errors: Vec, - // TODO: data can be anything, figure out what to do with it data: Option, } impl ValidationResult { - pub fn new(errors: Option>) -> Self { + pub fn new_with_data(data: TData) -> Self { Self { - errors: errors.unwrap_or_default(), - data: None, + errors: vec![], + data: Some(data), } } + pub fn new_with_errors(errors: Vec) -> Self { + Self { errors, data: None } + } pub fn map(self, f: F) -> ValidationResult where @@ -39,41 +42,65 @@ impl ValidationResult { } pub fn merge(&mut self, mut other: ValidationResult) { - self.errors.append(other.errors_mut()); + self.errors.append(&mut other.errors); } - pub fn errors(&self) -> &Vec { - &self.errors + pub fn is_valid(&self) -> bool { + self.errors.is_empty() } - pub fn errors_mut(&mut self) -> &mut Vec { - &mut self.errors + pub fn first_error(&self) -> Option<&ConsensusError> { + self.errors.first() } - pub fn is_valid(&self) -> bool { - self.errors().is_empty() + pub fn into_result_without_data(self) -> ValidationResult<()> { + ValidationResult { + errors: self.errors, + data: None, + } } - pub fn first_error(&self) -> Option<&ConsensusError> { - self.errors.first() + pub fn is_valid_with_data(&self) -> bool { + self.is_valid() && self.data.is_some() + } + + pub fn has_data(&self) -> bool { + self.data.is_some() } pub fn set_data(&mut self, data: TData) { - self.data = Some(data); + self.data = Some(data) } - pub fn data(&self) -> Option<&TData> { - self.data.as_ref() + pub fn into_data(self) -> Result { + self.data + .ok_or(ProtocolError::CorruptedCodeExecution(format!( + "trying to push validation result into data (errors are {:?})", + self.errors + ))) } - pub fn take_data(&mut self) -> Option { - self.data.take() + pub fn data(&self) -> Result<&TData, ProtocolError> { + self.data + .as_ref() + .ok_or(ProtocolError::CorruptedCodeExecution(format!( + "trying to get validation result as data (errors are {:?})", + self.errors + ))) } +} - pub fn into_result_without_data(self) -> ValidationResult<()> { - ValidationResult { - errors: self.errors, - data: Some(()), +impl From for ValidationResult { + fn from(value: TData) -> Self { + ValidationResult::new_with_data(value) + } +} + +impl From> for ValidationResult { + fn from(value: Result) -> Self { + match value { + Ok(data) => ValidationResult::new_with_data(data), + Err(e) => ValidationResult::new_with_errors(vec![e]), } } } diff --git a/packages/rs-dpp/src/version/protocol_version_validator.rs b/packages/rs-dpp/src/version/protocol_version_validator.rs index 9fbefb45e25..37267f1a39d 100644 --- a/packages/rs-dpp/src/version/protocol_version_validator.rs +++ b/packages/rs-dpp/src/version/protocol_version_validator.rs @@ -7,8 +7,7 @@ use crate::errors::consensus::basic::{ IncompatibleProtocolVersionError, UnsupportedProtocolVersionError, }; use crate::errors::CompatibleProtocolVersionIsNotDefinedError; -use crate::validation::DataValidator; -use crate::validation::ValidationResult; +use crate::validation::{DataValidator, SimpleValidationResult}; use crate::version::{COMPATIBILITY_MAP, LATEST_VERSION}; #[derive(Clone)] @@ -58,8 +57,8 @@ impl ProtocolVersionValidator { pub fn validate( &self, protocol_version: u32, - ) -> Result, CompatibleProtocolVersionIsNotDefinedError> { - let mut result = ValidationResult::new(None); + ) -> Result { + let mut result = SimpleValidationResult::default(); // Parsed protocol version must be equal or lower than latest protocol version if protocol_version > self.latest_protocol_version { From f3aa2527ebb5e034c25636842511ca0355205ed5 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 17:16:18 +0500 Subject: [PATCH 5/8] chore: remove unwanted files --- .../state/fetch_documents_factory.rs | 0 .../state/fetch_extended_documents.rs | 76 ------------------- 2 files changed, 76 deletions(-) delete mode 100644 packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_documents_factory.rs delete mode 100644 packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_documents_factory.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_documents_factory.rs deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs deleted file mode 100644 index 1e580eaf7e9..00000000000 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/fetch_extended_documents.rs +++ /dev/null @@ -1,76 +0,0 @@ -use std::{ - collections::hash_map::{Entry, HashMap}, - convert::TryInto, -}; - -use futures::future::join_all; -use itertools::Itertools; -use platform_value::string_encoding::Encoding; -use serde_json::json; - -use crate::document::ExtendedDocument; -use crate::{ - document::document_transition::DocumentTransition, get_from_transition, - state_repository::StateRepositoryLike, - state_transition::state_transition_execution_context::StateTransitionExecutionContext, - ProtocolError, -}; - -pub async fn fetch_extended_documents( - state_repository: &impl StateRepositoryLike, - document_transitions: impl IntoIterator>, - execution_context: &StateTransitionExecutionContext, -) -> Result, anyhow::Error> { - let mut transitions_by_contracts_and_types: HashMap> = - HashMap::new(); - let collected_transitions: Vec<_> = document_transitions.into_iter().collect(); - - for dt in collected_transitions.iter() { - let document_transition = dt.as_ref(); - let document_type = get_from_transition!(document_transition, document_type_name); - let data_contract_id = get_from_transition!(document_transition, data_contract_id); - let unique_key = format!("{}{}", data_contract_id, document_type); - - match transitions_by_contracts_and_types.entry(unique_key) { - Entry::Vacant(v) => { - v.insert(vec![document_transition]); - } - Entry::Occupied(mut o) => o.get_mut().push(document_transition), - } - } - - let mut fetch_documents_futures = vec![]; - for (_, dts) in transitions_by_contracts_and_types { - let ids: Vec = dts - .iter() - .map(|dt| get_from_transition!(dt, id).to_string(Encoding::Base58)) - .collect(); - - let options = json!({ - "where" : [["$id", "in", ids ]], - "orderBy" : [[ "$id", "asc"]], - }); - - let future = state_repository.fetch_extended_documents( - get_from_transition!(dts[0], data_contract_id), - get_from_transition!(dts[0], document_type_name), - options, - Some(execution_context), - ); - - fetch_documents_futures.push(future); - } - let results = join_all(fetch_documents_futures).await; - - let mut documents = vec![]; - for result in results.into_iter() { - let result = result?; - let documents_from_fetch: Vec = result - .into_iter() - .map(|d| d.try_into().map_err(Into::::into)) - .try_collect()?; - documents.extend(documents_from_fetch) - } - - Ok(documents) -} From 88c06f6dbbb10dafc2dc210b7726af14fd774695 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 17:35:15 +0500 Subject: [PATCH 6/8] chore: add missing `verify_signature` --- .../data_contract_update_transition/mod.rs | 34 +++++++++++++++++-- .../identity_update_transition.rs | 32 +++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index e7754ceae5f..0da818cdbbc 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -6,18 +6,20 @@ use std::collections::HashMap; pub use apply::*; pub use validation::*; +use dpp::consensus::ConsensusError::SignatureError as ConsensusSignatureErrorVariant; + use dpp::{ data_contract::state_transition::data_contract_update_transition::DataContractUpdateTransition, platform_value, state_transition::{ StateTransitionConvert, StateTransitionIdentitySigned, StateTransitionLike, }, - ProtocolError, + ProtocolError, consensus::signature::SignatureError, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; -use crate::utils::WithJsError; +use crate::{utils::WithJsError, IdentityPublicKeyWasm, bls_adapter::{JsBlsAdapter, BlsAdapter}}; use crate::{ buffer::Buffer, errors::protocol_error::from_protocol_error, identifier::IdentifierWrapper, with_js_error, DataContractParameters, DataContractWasm, StateTransitionExecutionContextWasm, @@ -159,4 +161,32 @@ impl DataContractUpdateTransitionWasm { .serialize(&serde_wasm_bindgen::Serializer::json_compatible()) .map_err(|e| e.into()) } + + #[wasm_bindgen(js_name=verifySignature)] + pub fn verify_signature( + &self, + identity_public_key: &IdentityPublicKeyWasm, + bls: JsBlsAdapter, + ) -> Result { + let bls_adapter = BlsAdapter(bls); + + let verification_result = self + .0 + .verify_signature(&identity_public_key.to_owned().into(), &bls_adapter); + + match verification_result { + Ok(()) => Ok(true), + Err(protocol_error) => match &protocol_error { + ProtocolError::AbstractConsensusError(err) => match err.as_ref() { + ConsensusSignatureErrorVariant(err) => match err { + SignatureError::InvalidStateTransitionSignatureError => Ok(false), + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + } + .with_js_error() + } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 9cd16bd44d9..8e99eaa6e7c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -1,6 +1,7 @@ use std::convert::TryInto; use std::default::Default; +use dpp::consensus::signature::SignatureError; use serde::{Deserialize, Serialize}; use wasm_bindgen::__rt::Ref; use wasm_bindgen::prelude::*; @@ -18,6 +19,9 @@ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; use crate::errors::from_dpp_err; use crate::utils::{generic_of_js_val, WithJsError}; + +use dpp::consensus::ConsensusError::SignatureError as ConsensusSignatureErrorVariant; + use dpp::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitness; use dpp::identity::{KeyID, TimestampMillis}; use dpp::platform_value::string_encoding::Encoding; @@ -483,4 +487,32 @@ impl IdentityUpdateTransitionWasm { ) .with_js_error() } + + #[wasm_bindgen(js_name=verifySignature)] + pub fn verify_signature( + &self, + identity_public_key: &IdentityPublicKeyWasm, + bls: JsBlsAdapter, + ) -> Result { + let bls_adapter = BlsAdapter(bls); + + let verification_result = self + .0 + .verify_signature(&identity_public_key.to_owned().into(), &bls_adapter); + + match verification_result { + Ok(()) => Ok(true), + Err(protocol_error) => match &protocol_error { + ProtocolError::AbstractConsensusError(err) => match err.as_ref() { + ConsensusSignatureErrorVariant(err) => match err { + SignatureError::InvalidStateTransitionSignatureError => Ok(false), + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + _ => Err(protocol_error), + }, + } + .with_js_error() + } } From 07fd055c1ef4f0089edf309d200882e6f8eb8e65 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 30 Mar 2023 17:40:56 +0500 Subject: [PATCH 7/8] chore: cargo fmt --- .../data_contract_update_transition/mod.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 0da818cdbbc..7dbfd75d043 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -9,17 +9,22 @@ pub use validation::*; use dpp::consensus::ConsensusError::SignatureError as ConsensusSignatureErrorVariant; use dpp::{ + consensus::signature::SignatureError, data_contract::state_transition::data_contract_update_transition::DataContractUpdateTransition, platform_value, state_transition::{ StateTransitionConvert, StateTransitionIdentitySigned, StateTransitionLike, }, - ProtocolError, consensus::signature::SignatureError, + ProtocolError, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; -use crate::{utils::WithJsError, IdentityPublicKeyWasm, bls_adapter::{JsBlsAdapter, BlsAdapter}}; +use crate::{ + bls_adapter::{BlsAdapter, JsBlsAdapter}, + utils::WithJsError, + IdentityPublicKeyWasm, +}; use crate::{ buffer::Buffer, errors::protocol_error::from_protocol_error, identifier::IdentifierWrapper, with_js_error, DataContractParameters, DataContractWasm, StateTransitionExecutionContextWasm, From 2debbb613cba075a28c8f76abf72b3e20d6a1d52 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 30 Mar 2023 15:31:10 +0100 Subject: [PATCH 8/8] refactor(wasm-dpp): clippy fixes --- .../data_contract_create_transition/mod.rs | 8 +++----- .../data_contract_update_transition/mod.rs | 7 +++---- .../state_transition/document_batch_transition/mod.rs | 10 ++++------ .../identity_update_transition.rs | 7 +++---- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index d737a9bd7f1..cf8ba08f1ca 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -173,7 +173,6 @@ impl DataContractCreateTransitionWasm { .with_js_error() } - // TODO: add verify_signature to other identity signed state transitions #[wasm_bindgen(js_name=verifySignature)] pub fn verify_signature( &self, @@ -190,10 +189,9 @@ impl DataContractCreateTransitionWasm { Ok(()) => Ok(true), Err(protocol_error) => match &protocol_error { ProtocolError::AbstractConsensusError(err) => match err.as_ref() { - ConsensusSignatureErrorVariant(err) => match err { - SignatureError::InvalidStateTransitionSignatureError => Ok(false), - _ => Err(protocol_error), - }, + ConsensusSignatureErrorVariant( + SignatureError::InvalidStateTransitionSignatureError, + ) => Ok(false), _ => Err(protocol_error), }, _ => Err(protocol_error), diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 7dbfd75d043..aa1eca937d5 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -183,10 +183,9 @@ impl DataContractUpdateTransitionWasm { Ok(()) => Ok(true), Err(protocol_error) => match &protocol_error { ProtocolError::AbstractConsensusError(err) => match err.as_ref() { - ConsensusSignatureErrorVariant(err) => match err { - SignatureError::InvalidStateTransitionSignatureError => Ok(false), - _ => Err(protocol_error), - }, + ConsensusSignatureErrorVariant( + SignatureError::InvalidStateTransitionSignatureError, + ) => Ok(false), _ => Err(protocol_error), }, _ => Err(protocol_error), diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index 48fccd3f041..3a9f7cf51f0 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -1,5 +1,5 @@ use dpp::identity::KeyID; -use dpp::state_transition::fee::calculate_state_transition_fee_factory::calculate_state_transition_fee; + use dpp::{ consensus::signature::SignatureError, consensus::ConsensusError::SignatureError as ConsensusSignatureErrorVariant, @@ -18,7 +18,6 @@ use dpp::{ use js_sys::{Array, Reflect}; use serde::{Deserialize, Serialize}; -use dpp::platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use dpp::platform_value::{BinaryData, ReplacementType}; use wasm_bindgen::prelude::*; @@ -311,10 +310,9 @@ impl DocumentsBatchTransitionWasm { Ok(()) => Ok(true), Err(protocol_error) => match &protocol_error { ProtocolError::AbstractConsensusError(err) => match err.as_ref() { - ConsensusSignatureErrorVariant(err) => match err { - SignatureError::InvalidStateTransitionSignatureError => Ok(false), - _ => Err(protocol_error), - }, + ConsensusSignatureErrorVariant( + SignatureError::InvalidStateTransitionSignatureError, + ) => Ok(false), _ => Err(protocol_error), }, _ => Err(protocol_error), diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 8e99eaa6e7c..38603d3311f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -504,10 +504,9 @@ impl IdentityUpdateTransitionWasm { Ok(()) => Ok(true), Err(protocol_error) => match &protocol_error { ProtocolError::AbstractConsensusError(err) => match err.as_ref() { - ConsensusSignatureErrorVariant(err) => match err { - SignatureError::InvalidStateTransitionSignatureError => Ok(false), - _ => Err(protocol_error), - }, + ConsensusSignatureErrorVariant( + SignatureError::InvalidStateTransitionSignatureError, + ) => Ok(false), _ => Err(protocol_error), }, _ => Err(protocol_error),