Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions packages/rs-dpp/src/data_contract/data_contract_facade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::data_contract::validation::data_contract_validator::DataContractValid
use crate::data_contract::{DataContract, DataContractFactory};

use crate::prelude::Identifier;
use crate::util::entropy_generator::EntropyGenerator;
use crate::validation::SimpleValidationResult;
use crate::version::ProtocolVersionValidator;
use crate::ProtocolError;
Expand All @@ -29,6 +30,22 @@ impl DataContractFacade {
}
}

pub fn new_with_entropy_generator(
protocol_version: u32,
protocol_version_validator: Arc<ProtocolVersionValidator>,
entropy_generator: Box<dyn EntropyGenerator>,
) -> 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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,12 @@ impl IdentityCreateTransition {
state_transition.set_asset_lock_proof(AssetLockProof::try_from(proof)?)?;
}

if let Some(signature) =
Comment thread
markin-io marked this conversation as resolved.
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)?;

Expand Down
44 changes: 26 additions & 18 deletions packages/wasm-dpp/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,35 @@ import wasmBase from '../wasm/wasm_dpp_bg.js';
import patchIdentifier from "./identifier/patchIdentifier";

let isInitialized = false;
let loadingPromise: Promise<void> | 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);
}

26 changes: 23 additions & 3 deletions packages/wasm-dpp/src/dash_platform_protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand All @@ -26,6 +27,7 @@ pub struct DashPlatformProtocol {
state_repository: ExternalStateRepositoryLike,
public_keys_validator: Arc<PublicKeysValidator<BlsAdapter>>,
bls: BlsAdapter,
entropy_generator: ExternalEntropyGenerator,
}

#[derive(Serialize, Deserialize)]
Expand All @@ -40,6 +42,7 @@ impl DashPlatformProtocol {
pub fn new(
bls_adapter: JsBlsAdapter,
state_repository: ExternalStateRepositoryLike,
entropy_generator: ExternalEntropyGenerator,
maybe_protocol_version: Option<u32>,
) -> Result<DashPlatformProtocol, JsValue> {
let bls = BlsAdapter(bls_adapter);
Expand All @@ -52,6 +55,7 @@ impl DashPlatformProtocol {
protocol_version,
state_repository.clone(),
bls.clone(),
entropy_generator.clone(),
)?;

Ok(Self {
Expand All @@ -63,6 +67,7 @@ impl DashPlatformProtocol {
state_repository,
public_keys_validator,
bls,
entropy_generator,
})
}

Expand Down Expand Up @@ -102,6 +107,7 @@ impl DashPlatformProtocol {
protocol_version,
self.state_repository.clone(),
self.bls.clone(),
self.entropy_generator.clone(),
)
}

Expand All @@ -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)]
Expand All @@ -123,13 +134,15 @@ 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(
self.public_keys_validator.clone(),
protocol_version,
state_repository.clone(),
bls_adapter,
entropy_generator,
)?;

self.protocol_version = protocol_version;
Expand All @@ -148,6 +161,7 @@ fn create_facades(
protocol_version: u32,
state_repository: ExternalStateRepositoryLike,
bls_adapter: BlsAdapter,
entropy_generator: ExternalEntropyGenerator,
) -> Result<
(
IdentityFacadeWasm,
Expand All @@ -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)?;
Expand All @@ -192,12 +210,14 @@ fn init_document_facade(
protocol_version: u32,
protocol_version_validator: Arc<ProtocolVersionValidator>,
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(),
);

Expand Down
8 changes: 7 additions & 1 deletion packages/wasm-dpp/src/data_contract/data_contract_facade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,8 +24,13 @@ impl DataContractFacadeWasm {
pub fn new(
protocol_version: u32,
protocol_version_validator: Arc<ProtocolVersionValidator>,
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))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -161,6 +163,7 @@ impl DataContractCreateTransitionWasm {
bls: JsBlsAdapter,
) -> Result<(), JsValue> {
let bls_adapter = BlsAdapter(bls);

self.0
.sign(
&identity_public_key.to_owned().into(),
Expand All @@ -169,4 +172,31 @@ impl DataContractCreateTransitionWasm {
)
.with_js_error()
}

#[wasm_bindgen(js_name=verifySignature)]
pub fn verify_signature(
Comment thread
markin-io marked this conversation as resolved.
&self,
identity_public_key: &IdentityPublicKeyWasm,
bls: JsBlsAdapter,
) -> Result<bool, JsValue> {
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(
SignatureError::InvalidStateTransitionSignatureError,
) => Ok(false),
_ => Err(protocol_error),
},
_ => Err(protocol_error),
},
}
.with_js_error()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ use std::collections::HashMap;
pub use apply::*;
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::{
Expand All @@ -17,7 +20,11 @@ use dpp::{
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;

use crate::utils::WithJsError;
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,
Expand Down Expand Up @@ -159,4 +166,31 @@ 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<bool, JsValue> {
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(
SignatureError::InvalidStateTransitionSignatureError,
) => Ok(false),
_ => Err(protocol_error),
},
_ => Err(protocol_error),
},
}
.with_js_error()
}
}
4 changes: 3 additions & 1 deletion packages/wasm-dpp/src/document/factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading