From 23987969b0b03df54a5892e28f38321a81c925ef Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 22 Feb 2023 13:47:08 +0000 Subject: [PATCH 01/26] wip(dapi): test dapi build with wasm-dpp --- .pnp.cjs | 1 + packages/dapi/package.json | 1 + packages/dapi/scripts/api.js | 8 +++++--- yarn.lock | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.pnp.cjs b/.pnp.cjs index 18b34879cd2..efe02e7fb57 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2335,6 +2335,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@dashevo/dp-services-ctl", "https://github.com/dashevo/js-dp-services-ctl.git#commit=3976076b0018c5b4632ceda4c752fc597f27a640"],\ ["@dashevo/dpp", "workspace:packages/js-dpp"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ + ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ ["@grpc/grpc-js", "npm:1.4.4"],\ ["ajv", "npm:8.8.1"],\ ["bs58", "npm:4.0.1"],\ diff --git a/packages/dapi/package.json b/packages/dapi/package.json index e3ba66bb198..409def1cc90 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -38,6 +38,7 @@ "@dashevo/dashd-rpc": "^18.2.0", "@dashevo/dpp": "workspace:*", "@dashevo/grpc-common": "workspace:*", + "@dashevo/wasm-dpp": "workspace:*", "@grpc/grpc-js": "^1.3.7", "ajv": "^8.6.0", "bs58": "^4.0.1", diff --git a/packages/dapi/scripts/api.js b/packages/dapi/scripts/api.js index e5b5db1a368..8f94c09f9a9 100644 --- a/packages/dapi/scripts/api.js +++ b/packages/dapi/scripts/api.js @@ -13,7 +13,8 @@ const { getPlatformDefinition, } = require('@dashevo/dapi-grpc'); -const DashPlatformProtocol = require('@dashevo/dpp'); +const DashPlatformProtocolJS = require('@dashevo/dpp'); +const { default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const { client: RpcClient } = require('jayson/promise'); @@ -39,6 +40,8 @@ const platformHandlersFactory = require( ); async function main() { + const { DashPlatformProtocol } = await loadWasmDpp(); + /* Application start */ const configValidationResult = validateConfig(config); if (!configValidationResult.isValid) { @@ -66,7 +69,6 @@ async function main() { }); const dppForParsingContracts = new DashPlatformProtocol(); - await dppForParsingContracts.initialize(); const driveStateRepository = new DriveStateRepository(driveClient, dppForParsingContracts); log.info(`Connecting to Tenderdash on ${config.tendermintCore.host}:${config.tendermintCore.port}`); @@ -94,7 +96,7 @@ async function main() { }); log.info(`JSON RPC server is listening on port ${config.rpcServer.port}`); - const dpp = new DashPlatformProtocol({ + const dpp = new DashPlatformProtocolJS({ stateRepository: driveStateRepository, }); await dpp.initialize(); diff --git a/yarn.lock b/yarn.lock index e5fc0f43399..3c0277b4bd6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1409,6 +1409,7 @@ __metadata: "@dashevo/dp-services-ctl": "github:dashevo/js-dp-services-ctl#v0.19-dev" "@dashevo/dpp": "workspace:*" "@dashevo/grpc-common": "workspace:*" + "@dashevo/wasm-dpp": "workspace:*" "@grpc/grpc-js": ^1.3.7 ajv: ^8.6.0 bs58: ^4.0.1 @@ -1949,7 +1950,7 @@ __metadata: languageName: unknown linkType: soft -"@dashevo/wasm-dpp@workspace:packages/wasm-dpp": +"@dashevo/wasm-dpp@workspace:*, @dashevo/wasm-dpp@workspace:packages/wasm-dpp": version: 0.0.0-use.local resolution: "@dashevo/wasm-dpp@workspace:packages/wasm-dpp" dependencies: From 2a82e58820e20f948880d07c9632ea51a645dec2 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 22 Feb 2023 14:12:43 +0000 Subject: [PATCH 02/26] wip(dapi): add missing wasm-dpp to Dockerfiles --- packages/dapi/Dockerfile | 1 + packages/dashmate/Dockerfile | 1 + packages/js-drive/Dockerfile | 1 + packages/platform-test-suite/Dockerfile | 1 + 4 files changed, 4 insertions(+) diff --git a/packages/dapi/Dockerfile b/packages/dapi/Dockerfile index 1670494cc30..956cf5c5dfe 100644 --- a/packages/dapi/Dockerfile +++ b/packages/dapi/Dockerfile @@ -25,6 +25,7 @@ COPY package.json yarn.lock .yarnrc.yml .pnp.* ./ COPY packages/dapi packages/dapi COPY packages/dapi-grpc packages/dapi-grpc COPY packages/js-dpp packages/js-dpp +COPY packages/wasm-dpp packages/wasm-dpp COPY packages/js-grpc-common packages/js-grpc-common COPY packages/feature-flags-contract packages/feature-flags-contract COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract diff --git a/packages/dashmate/Dockerfile b/packages/dashmate/Dockerfile index e307e101bba..633a0247b86 100644 --- a/packages/dashmate/Dockerfile +++ b/packages/dashmate/Dockerfile @@ -27,6 +27,7 @@ COPY packages/dashmate packages/dashmate COPY packages/dashpay-contract packages/dashpay-contract COPY packages/dpns-contract packages/dpns-contract COPY packages/js-dpp packages/js-dpp +COPY packages/wasm-dpp packages/wasm-dpp COPY packages/feature-flags-contract packages/feature-flags-contract COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract COPY packages/wallet-lib packages/wallet-lib diff --git a/packages/js-drive/Dockerfile b/packages/js-drive/Dockerfile index 0dfb7f69180..7275d6fb954 100644 --- a/packages/js-drive/Dockerfile +++ b/packages/js-drive/Dockerfile @@ -70,6 +70,7 @@ COPY packages/rs-platform-value packages/rs-platform-value COPY packages/rs-drive-nodejs packages/rs-drive-nodejs COPY packages/dapi-grpc packages/dapi-grpc COPY packages/js-dpp packages/js-dpp +COPY packages/wasm-dpp packages/wasm-dpp COPY packages/js-grpc-common packages/js-grpc-common COPY packages/dashpay-contract packages/dashpay-contract COPY packages/dpns-contract packages/dpns-contract diff --git a/packages/platform-test-suite/Dockerfile b/packages/platform-test-suite/Dockerfile index 2a533fac4ee..d388be59573 100644 --- a/packages/platform-test-suite/Dockerfile +++ b/packages/platform-test-suite/Dockerfile @@ -28,6 +28,7 @@ COPY packages/feature-flags-contract packages/feature-flags-contract COPY packages/js-dapi-client packages/js-dapi-client COPY packages/js-dash-sdk packages/js-dash-sdk COPY packages/js-dpp packages/js-dpp +COPY packages/wasm-dpp packages/wasm-dpp COPY packages/wallet-lib packages/wallet-lib COPY packages/js-grpc-common packages/js-grpc-common COPY packages/platform-test-suite packages/platform-test-suite From 607a51d43d8017ac1e178c5caa59ff7d0efab6f2 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 22 Feb 2023 19:51:20 +0000 Subject: [PATCH 03/26] build(dapi): build wasm-dpp --- packages/dapi/Dockerfile | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/dapi/Dockerfile b/packages/dapi/Dockerfile index 956cf5c5dfe..89efc635850 100644 --- a/packages/dapi/Dockerfile +++ b/packages/dapi/Dockerfile @@ -4,13 +4,41 @@ FROM node:16-alpine3.16 as builder ARG NODE_ENV=production ENV NODE_ENV ${NODE_ENV} +ARG CARGO_BUILD_PROFILE=debug +ENV CARGO_BUILD_PROFILE ${CARGO_BUILD_PROFILE} + RUN apk update && \ apk --no-cache upgrade && \ apk add --no-cache git \ openssh-client \ python3 \ alpine-sdk \ - zeromq-dev + zeromq-dev \ + bash + +# Install Rust +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH \ + RUST_VERSION=stable + +RUN set -eux; \ + apkArch="$(apk --print-arch)"; \ + case "$apkArch" in \ + x86_64) rustArch='x86_64-unknown-linux-musl'; rustupSha256='bdf022eb7cba403d0285bb62cbc47211f610caec24589a72af70e1e900663be9' ;; \ + aarch64) rustArch='aarch64-unknown-linux-musl'; rustupSha256='89ce657fe41e83186f5a6cdca4e0fd40edab4fd41b0f9161ac6241d49fbdbbbe' ;; \ + *) echo >&2 "unsupported architecture: $apkArch"; exit 1 ;; \ + esac; \ + url="https://static.rust-lang.org/rustup/archive/1.24.3/${rustArch}/rustup-init"; \ + wget "$url"; \ + echo "${rustupSha256} *rustup-init" | sha256sum -c -; \ + chmod +x rustup-init; \ + ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \ + rm rustup-init; \ + chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ + rustup --version; \ + cargo --version; \ + rustc --version; # Enable corepack https://github.com/nodejs/corepack RUN corepack enable @@ -19,7 +47,8 @@ WORKDIR /platform # Copy yarn files COPY .yarn ./.yarn -COPY package.json yarn.lock .yarnrc.yml .pnp.* ./ +COPY .cargo /platform/.cargo +COPY package.json yarn.lock .yarnrc.yml .pnp.* Cargo.toml Cargo.lock rust-toolchain.toml ./ # Copy only necessary packages from monorepo COPY packages/dapi packages/dapi @@ -35,6 +64,12 @@ COPY packages/dashpay-contract packages/dashpay-contract # Print build output RUN yarn config set enableInlineBuilds true +# Build wasm-dpp binding +RUN --mount=type=cache,target=target \ + --mount=type=cache,target=$CARGO_HOME/git \ + --mount=type=cache,target=$CARGO_HOME/registry \ + yarn workspace @dashevo/wasm-dpp build + # Install DAPI-specific dependencies using previous # node_modules directory to reuse built binaries RUN --mount=type=cache,target=/tmp/unplugged \ From d1654478fc227076d88c795dddb0a595af288ef5 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 28 Feb 2023 16:35:31 +0000 Subject: [PATCH 04/26] build(dapi): add build step for wasm-dpp --- packages/dapi/Cargo.toml.template | 13 ++++++ packages/dapi/Dockerfile | 76 +++++++++++++++---------------- 2 files changed, 51 insertions(+), 38 deletions(-) create mode 100644 packages/dapi/Cargo.toml.template diff --git a/packages/dapi/Cargo.toml.template b/packages/dapi/Cargo.toml.template new file mode 100644 index 00000000000..c172666796f --- /dev/null +++ b/packages/dapi/Cargo.toml.template @@ -0,0 +1,13 @@ +# Workspace template with Rust packages required for DAPI (needed for Docker build) +[workspace] + +members = [ + "packages/dashpay-contract", + "packages/withdrawals-contract", + "packages/masternode-reward-shares-contract", + "packages/feature-flags-contract", + "packages/dpns-contract", + "packages/data-contracts", + "packages/rs-dpp", + "packages/wasm-dpp" +] diff --git a/packages/dapi/Dockerfile b/packages/dapi/Dockerfile index 89efc635850..8824898c346 100644 --- a/packages/dapi/Dockerfile +++ b/packages/dapi/Dockerfile @@ -1,44 +1,48 @@ # syntax = docker/dockerfile:1.3 + +# Build wasm-dpp +FROM rust as builder + +RUN apt-get update && apt-get install -y clang + +#ARG CARGO_BUILD_PROFILE=debug +#ENV CARGO_BUILD_PROFILE ${CARGO_BUILD_PROFILE} + +WORKDIR /platform + +COPY .cargo /platform/.cargo +COPY Cargo.lock rust-toolchain.toml ./ +COPY packages/dapi/Cargo.toml.template ./Cargo.toml + +COPY packages/withdrawals-contract packages/withdrawals-contract +COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract +COPY packages/dashpay-contract packages/dashpay-contract +COPY packages/feature-flags-contract packages/feature-flags-contract +COPY packages/dpns-contract packages/dpns-contract +COPY packages/data-contracts packages/data-contracts +COPY packages/rs-dpp packages/rs-dpp +COPY packages/wasm-dpp packages/wasm-dpp + +RUN --mount=type=cache,target=target \ + --mount=type=cache,target=$CARGO_HOME/git \ + --mount=type=cache,target=$CARGO_HOME/registry \ + rustup target add wasm32-unknown-unknown + +RUN cd packages/wasm-dpp && ./scripts/build.sh + +# Build for DAPI FROM node:16-alpine3.16 as builder ARG NODE_ENV=production ENV NODE_ENV ${NODE_ENV} -ARG CARGO_BUILD_PROFILE=debug -ENV CARGO_BUILD_PROFILE ${CARGO_BUILD_PROFILE} - RUN apk update && \ apk --no-cache upgrade && \ apk add --no-cache git \ openssh-client \ python3 \ alpine-sdk \ - zeromq-dev \ - bash - -# Install Rust -ENV RUSTUP_HOME=/usr/local/rustup \ - CARGO_HOME=/usr/local/cargo \ - PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=stable - -RUN set -eux; \ - apkArch="$(apk --print-arch)"; \ - case "$apkArch" in \ - x86_64) rustArch='x86_64-unknown-linux-musl'; rustupSha256='bdf022eb7cba403d0285bb62cbc47211f610caec24589a72af70e1e900663be9' ;; \ - aarch64) rustArch='aarch64-unknown-linux-musl'; rustupSha256='89ce657fe41e83186f5a6cdca4e0fd40edab4fd41b0f9161ac6241d49fbdbbbe' ;; \ - *) echo >&2 "unsupported architecture: $apkArch"; exit 1 ;; \ - esac; \ - url="https://static.rust-lang.org/rustup/archive/1.24.3/${rustArch}/rustup-init"; \ - wget "$url"; \ - echo "${rustupSha256} *rustup-init" | sha256sum -c -; \ - chmod +x rustup-init; \ - ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \ - rm rustup-init; \ - chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ - rustup --version; \ - cargo --version; \ - rustc --version; + zeromq-dev # Enable corepack https://github.com/nodejs/corepack RUN corepack enable @@ -47,29 +51,22 @@ WORKDIR /platform # Copy yarn files COPY .yarn ./.yarn -COPY .cargo /platform/.cargo -COPY package.json yarn.lock .yarnrc.yml .pnp.* Cargo.toml Cargo.lock rust-toolchain.toml ./ +COPY package.json yarn.lock .yarnrc.yml .pnp.* ./ # Copy only necessary packages from monorepo COPY packages/dapi packages/dapi COPY packages/dapi-grpc packages/dapi-grpc COPY packages/js-dpp packages/js-dpp -COPY packages/wasm-dpp packages/wasm-dpp COPY packages/js-grpc-common packages/js-grpc-common COPY packages/feature-flags-contract packages/feature-flags-contract COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract COPY packages/dpns-contract packages/dpns-contract COPY packages/dashpay-contract packages/dashpay-contract +COPY --from=0 /platform/packages/wasm-dpp packages/wasm-dpp # Print build output RUN yarn config set enableInlineBuilds true -# Build wasm-dpp binding -RUN --mount=type=cache,target=target \ - --mount=type=cache,target=$CARGO_HOME/git \ - --mount=type=cache,target=$CARGO_HOME/registry \ - yarn workspace @dashevo/wasm-dpp build - # Install DAPI-specific dependencies using previous # node_modules directory to reuse built binaries RUN --mount=type=cache,target=/tmp/unplugged \ @@ -78,6 +75,9 @@ RUN --mount=type=cache,target=/tmp/unplugged \ cp -R /platform/.yarn/unplugged /tmp/ +RUN --mount=type=cache,target=target \ + yarn workspace @dashevo/wasm-dpp webpack + FROM node:16-alpine3.16 ARG NODE_ENV=production From a3cdcd59597c744fbfbbc174a38a9091dc6be6cf Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 28 Feb 2023 16:58:35 +0000 Subject: [PATCH 05/26] build(dapi): fixed missing deps for wasm-dpp --- packages/dapi/Dockerfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/dapi/Dockerfile b/packages/dapi/Dockerfile index 8824898c346..9fc509c4bff 100644 --- a/packages/dapi/Dockerfile +++ b/packages/dapi/Dockerfile @@ -5,13 +5,11 @@ FROM rust as builder RUN apt-get update && apt-get install -y clang -#ARG CARGO_BUILD_PROFILE=debug -#ENV CARGO_BUILD_PROFILE ${CARGO_BUILD_PROFILE} - WORKDIR /platform COPY .cargo /platform/.cargo COPY Cargo.lock rust-toolchain.toml ./ +# Use Cargo.toml.template instead of Cargo.toml from project root to avoid copying unnecessary Rust packages COPY packages/dapi/Cargo.toml.template ./Cargo.toml COPY packages/withdrawals-contract packages/withdrawals-contract @@ -28,6 +26,7 @@ RUN --mount=type=cache,target=target \ --mount=type=cache,target=$CARGO_HOME/registry \ rustup target add wasm32-unknown-unknown +# Build Rust part of wasm-dpp RUN cd packages/wasm-dpp && ./scripts/build.sh # Build for DAPI @@ -71,13 +70,12 @@ RUN yarn config set enableInlineBuilds true # node_modules directory to reuse built binaries RUN --mount=type=cache,target=/tmp/unplugged \ cp -R /tmp/unplugged /platform/.yarn/ && \ + yarn workspaces focus @dashevo/wasm-dpp && \ + yarn workspace @dashevo/wasm-dpp webpack && \ yarn workspaces focus --production @dashevo/dapi && \ cp -R /platform/.yarn/unplugged /tmp/ -RUN --mount=type=cache,target=target \ - yarn workspace @dashevo/wasm-dpp webpack - FROM node:16-alpine3.16 ARG NODE_ENV=production From d9c0e76c068ee03c8d57d585ae34eada0b5be4ae Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 1 Mar 2023 12:45:33 +0000 Subject: [PATCH 06/26] build: revert unnecessary added wasm-dpp deps in Dockerfile --- packages/dashmate/Dockerfile | 1 - packages/js-drive/Dockerfile | 1 - packages/platform-test-suite/Dockerfile | 1 - 3 files changed, 3 deletions(-) diff --git a/packages/dashmate/Dockerfile b/packages/dashmate/Dockerfile index 633a0247b86..e307e101bba 100644 --- a/packages/dashmate/Dockerfile +++ b/packages/dashmate/Dockerfile @@ -27,7 +27,6 @@ COPY packages/dashmate packages/dashmate COPY packages/dashpay-contract packages/dashpay-contract COPY packages/dpns-contract packages/dpns-contract COPY packages/js-dpp packages/js-dpp -COPY packages/wasm-dpp packages/wasm-dpp COPY packages/feature-flags-contract packages/feature-flags-contract COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract COPY packages/wallet-lib packages/wallet-lib diff --git a/packages/js-drive/Dockerfile b/packages/js-drive/Dockerfile index 7275d6fb954..0dfb7f69180 100644 --- a/packages/js-drive/Dockerfile +++ b/packages/js-drive/Dockerfile @@ -70,7 +70,6 @@ COPY packages/rs-platform-value packages/rs-platform-value COPY packages/rs-drive-nodejs packages/rs-drive-nodejs COPY packages/dapi-grpc packages/dapi-grpc COPY packages/js-dpp packages/js-dpp -COPY packages/wasm-dpp packages/wasm-dpp COPY packages/js-grpc-common packages/js-grpc-common COPY packages/dashpay-contract packages/dashpay-contract COPY packages/dpns-contract packages/dpns-contract diff --git a/packages/platform-test-suite/Dockerfile b/packages/platform-test-suite/Dockerfile index d388be59573..2a533fac4ee 100644 --- a/packages/platform-test-suite/Dockerfile +++ b/packages/platform-test-suite/Dockerfile @@ -28,7 +28,6 @@ COPY packages/feature-flags-contract packages/feature-flags-contract COPY packages/js-dapi-client packages/js-dapi-client COPY packages/js-dash-sdk packages/js-dash-sdk COPY packages/js-dpp packages/js-dpp -COPY packages/wasm-dpp packages/wasm-dpp COPY packages/wallet-lib packages/wallet-lib COPY packages/js-grpc-common packages/js-grpc-common COPY packages/platform-test-suite packages/platform-test-suite From 77ffc0dbd08f4d3331a3ab3726aad36a04bae895 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 13 Mar 2023 12:49:06 +0000 Subject: [PATCH 07/26] wip(dapi): test dpp with state repo --- .pnp.cjs | 1 + packages/dapi/package.json | 1 + packages/dapi/scripts/api.js | 13 ++++++++----- yarn.lock | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.pnp.cjs b/.pnp.cjs index efe02e7fb57..49c9e902e1b 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2328,6 +2328,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/dapi/",\ "packageDependencies": [\ ["@dashevo/dapi", "workspace:packages/dapi"],\ + ["@dashevo/bls", "npm:1.2.7"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ ["@dashevo/dashcore-lib", "npm:0.20.0"],\ diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 409def1cc90..a593a2b7c29 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -33,6 +33,7 @@ "all": true }, "dependencies": { + "@dashevo/bls": "~1.2.7", "@dashevo/dapi-grpc": "workspace:*", "@dashevo/dashcore-lib": "~0.20.0", "@dashevo/dashd-rpc": "^18.2.0", diff --git a/packages/dapi/scripts/api.js b/packages/dapi/scripts/api.js index 8f94c09f9a9..8232e50bd05 100644 --- a/packages/dapi/scripts/api.js +++ b/packages/dapi/scripts/api.js @@ -1,6 +1,7 @@ // Entry point for DAPI. const dotenv = require('dotenv'); const grpc = require('@grpc/grpc-js'); +const loadBLS = require('@dashevo/bls'); const { server: { @@ -41,6 +42,7 @@ const platformHandlersFactory = require( async function main() { const { DashPlatformProtocol } = await loadWasmDpp(); + const blsSignatures = await loadBLS(); /* Application start */ const configValidationResult = validateConfig(config); @@ -68,7 +70,7 @@ async function main() { port: config.tendermintCore.port, }); - const dppForParsingContracts = new DashPlatformProtocol(); + const dppForParsingContracts = new DashPlatformProtocol({}, blsSignatures, {}); const driveStateRepository = new DriveStateRepository(driveClient, dppForParsingContracts); log.info(`Connecting to Tenderdash on ${config.tendermintCore.host}:${config.tendermintCore.port}`); @@ -96,10 +98,11 @@ async function main() { }); log.info(`JSON RPC server is listening on port ${config.rpcServer.port}`); - const dpp = new DashPlatformProtocolJS({ - stateRepository: driveStateRepository, - }); - await dpp.initialize(); + const dpp = new DashPlatformProtocol({}, blsSignatures, driveStateRepository); + // const dpp = new DashPlatformProtocolJS({ + // stateRepository: driveStateRepository, + // }); + // await dpp.initialize(); // Start GRPC server log.info('Starting GRPC server'); diff --git a/yarn.lock b/yarn.lock index 3c0277b4bd6..0bda0cc3a34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1402,6 +1402,7 @@ __metadata: version: 0.0.0-use.local resolution: "@dashevo/dapi@workspace:packages/dapi" dependencies: + "@dashevo/bls": ~1.2.7 "@dashevo/dapi-client": "workspace:*" "@dashevo/dapi-grpc": "workspace:*" "@dashevo/dashcore-lib": ~0.20.0 From 89d3e3f2f33969d9553637bc4f9d730bda85700a Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 13 Mar 2023 14:10:04 +0000 Subject: [PATCH 08/26] build(dapi): cache apt-get packages --- packages/dapi/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/dapi/Dockerfile b/packages/dapi/Dockerfile index 9fc509c4bff..6e1ad29c89d 100644 --- a/packages/dapi/Dockerfile +++ b/packages/dapi/Dockerfile @@ -3,7 +3,8 @@ # Build wasm-dpp FROM rust as builder -RUN apt-get update && apt-get install -y clang +RUN --mount=type=cache,target=/var/cache/apt \ + apt-get update && apt-get install -y clang WORKDIR /platform From d529ea9b6b55a76abf59da2225b9c276c7283f23 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 16 Mar 2023 20:04:35 +0000 Subject: [PATCH 09/26] test(wasm-dpp): add getIdentityFixture.js --- .../lib/test/fixtures/getIdentityFixture.js | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js new file mode 100644 index 00000000000..b1029f6f74d --- /dev/null +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js @@ -0,0 +1,49 @@ +const { default: loadWasmDpp } = require('../../..'); +let { Identity, IdentityPublicKey } = require('../../..'); +const generateRandomIdentifierAsync = require('../utils/generateRandomIdentifierAsync'); + +let staticId = null; + +/** + * @return {Identity} + */ +module.exports = async function getIdentityFixture(id = staticId) { + ({ Identity, IdentityPublicKey } = await loadWasmDpp()); + + if (!staticId) { + staticId = await generateRandomIdentifierAsync(); + } + + if (!id) { + // eslint-disable-next-line no-param-reassign + id = staticId; + } + + const rawIdentity = { + // TODO: obtain latest version from some wasm binding? + protocolVersion: 1, + id, // TODO: should be probably id.toBuffer(), but it causes panic in IdentityWasm + balance: 10, + revision: 0, + publicKeys: [ + { + id: 0, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, + data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'), + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, + readOnly: false, + }, + { + id: 1, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, + data: Buffer.from('A8AK95PYMVX5VQKzOhcVQRCUbc9pyg3RiL7jttEMDU+L', 'base64'), + purpose: IdentityPublicKey.PURPOSES.ENCRYPTION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MEDIUM, + readOnly: false, + }, + ], + }; + + return new Identity(rawIdentity); +}; From b25cdba5a88beebafc076deda96baf14ee8258a9 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 16 Mar 2023 20:09:30 +0000 Subject: [PATCH 10/26] test(dapi): use getIdentityFixture from wasm-dpp --- .../externalApis/drive/DriveClient.spec.js | 6 ++--- ...iesByPublicKeyHashesHandlerFactory.spec.js | 6 ++--- .../getIdentityHandlerFactory.spec.js | 27 ++++++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js b/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js index 1d4cb426837..0f04edeeb84 100644 --- a/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js +++ b/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js @@ -5,7 +5,7 @@ const cbor = require('cbor'); const chaiAsPromised = require('chai-as-promised'); const dirtyChai = require('dirty-chai'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); +const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); const InvalidArgumentGrpcError = require('@dashevo/grpc-common/lib/server/error/InvalidArgumentGrpcError'); const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); const DriveClient = require('../../../../lib/externalApis/drive/DriveClient'); @@ -162,11 +162,11 @@ describe('DriveClient', () => { }); }); - describe('#fetchIdentitiesByPublicKeyHashes', () => { + describe('#fetchIdentitiesByPublicKeyHashes', async () => { it('Should call \'fetchIdentitiesByPublicKeyHashes\' RPC with the given parameters', async () => { const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - const identity = getIdentityFixture(); + const identity = await getIdentityFixture(); const proof = Buffer.from('proof'); const buffer = cbor.encode({ data: [identity], proof }); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js index fd1f504852a..84294c95763 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js @@ -13,7 +13,7 @@ const { }, } = require('@dashevo/dapi-grpc'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); +const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); const getIdentitiesByPublicKeyHashesHandlerFactory = require( '../../../../../lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory', @@ -31,7 +31,7 @@ describe('getIdentitiesByPublicKeyHashesHandlerFactory', () => { let proofMock; let response; - beforeEach(function beforeEach() { + beforeEach(async function beforeEach() { publicKeyHash = Buffer.from('556c2910d46fda2b327ef9d9bda850cc84d30db0', 'hex'); call = new GrpcCallMock(this.sinon, { @@ -41,7 +41,7 @@ describe('getIdentitiesByPublicKeyHashesHandlerFactory', () => { getProve: this.sinon.stub().returns(false), }); - identity = getIdentityFixture(); + identity = await getIdentityFixture(); proofFixture = { merkleProof: Buffer.alloc(1, 1), diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js index a90bdb19262..23f79f6fe5f 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js @@ -15,7 +15,7 @@ const { /* eslint-disable import/no-extraneous-dependencies */ const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); -const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); +const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); const getIdentityHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityHandlerFactory'); @@ -31,14 +31,14 @@ describe('getIdentityHandlerFactory', () => { let proofMock; let response; - beforeEach(function beforeEach() { + beforeEach(async function beforeEach() { id = generateRandomIdentifier(); call = new GrpcCallMock(this.sinon, { getId: this.sinon.stub().returns(id), getProve: this.sinon.stub().returns(false), }); - identity = getIdentityFixture(); + identity = await getIdentityFixture(); proofFixture = { merkleProof: Buffer.alloc(1, 1), @@ -60,7 +60,7 @@ describe('getIdentityHandlerFactory', () => { ); }); - it('should return valid result', async () => { + it('should return valid result', async function it() { response.setProof(null); driveStateRepositoryMock.fetchIdentity.resolves(response.serializeBinary()); @@ -68,13 +68,16 @@ describe('getIdentityHandlerFactory', () => { expect(result).to.be.an.instanceOf(GetIdentityResponse); expect(result.getIdentity()).to.deep.equal(identity.toBuffer()); - expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith(id.toBuffer(), false); + expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith( + this.sinon.match((arg) => arg.equals(id.toBuffer())), + false, + ); const proof = result.getProof(); expect(proof).to.be.undefined(); }); - it('should return proof', async () => { + it('should return proof', async function it() { call.request.getProve.returns(true); const result = await getIdentityHandler(call); @@ -88,7 +91,10 @@ describe('getIdentityHandlerFactory', () => { expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith(id.toBuffer(), true); + expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith( + this.sinon.match((arg) => arg.equals(id.toBuffer())), + true, + ); }); it('should throw an InvalidArgumentGrpcError if id is not specified', async () => { @@ -105,7 +111,7 @@ describe('getIdentityHandlerFactory', () => { } }); - it('should throw an error when fetchIdentity throws unknown error', async () => { + it('should throw an error when fetchIdentity throws unknown error', async function it() { const error = new Error('Unknown error'); driveStateRepositoryMock.fetchIdentity.throws(error); @@ -116,7 +122,10 @@ describe('getIdentityHandlerFactory', () => { expect.fail('should throw an error'); } catch (e) { expect(e).to.equal(error); - expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith(id.toBuffer()); + expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith( + this.sinon.match((arg) => arg.equals(id.toBuffer())), + false, + ); } }); }); From fd610ef6390cf4033ac8543fd5d7cab23109952a Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 16 Mar 2023 21:24:16 +0000 Subject: [PATCH 11/26] feat(wasm-dpp): make queueable wasm dpp loader (don't trigger bundle loading on multiple invocations) --- packages/wasm-dpp/lib/index.ts | 44 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/packages/wasm-dpp/lib/index.ts b/packages/wasm-dpp/lib/index.ts index 396fcf87944..ec417a151e4 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 fetch !== '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); +} + From 9996d892fcb8e690e710611114c0ff9fd9ef8486 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 12:38:25 +0000 Subject: [PATCH 12/26] test(dapi): use generateRandomIdentifierAsync from wasm-dpp --- .../dpp/DriveStateRepository.spec.js | 4 ++-- .../createGrpcErrorFromDriveResponse.spec.js | 12 ++++++----- .../getDataContractHandlerFactory.spec.js | 20 ++++++++++++------- .../getDocumentsHandlerFactory.spec.js | 16 +++++++-------- .../getIdentityHandlerFactory.spec.js | 4 ++-- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js b/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js index ff675af03fb..b506e1e04cc 100644 --- a/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js +++ b/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js @@ -6,7 +6,7 @@ const dirtyChai = require('dirty-chai'); const DashPlatformProtocol = require('@dashevo/dpp'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); const { @@ -49,7 +49,7 @@ describe('DriveStateRepository', () => { describe('#fetchDataContract', () => { it('should fetch and parse data contract', async () => { - const contractId = generateRandomIdentifier(); + const contractId = await generateRandomIdentifierAsync(); const result = await stateRepository.fetchDataContract(contractId); expect(result.toObject()).to.be.deep.equal(dataContractFixture.toObject()); diff --git a/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js b/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js index 4e3e4423229..d711177cb95 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js @@ -4,7 +4,7 @@ const cbor = require('cbor'); const InternalGrpcError = require('@dashevo/grpc-common/lib/server/error/InternalGrpcError'); const InvalidArgumentGrpcError = require('@dashevo/grpc-common/lib/server/error/InvalidArgumentGrpcError'); const FailedPreconditionGrpcError = require('@dashevo/grpc-common/lib/server/error/FailedPreconditionGrpcError'); -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const createGrpcErrorFromDriveResponse = require( '../../../../lib/grpcServer/handlers/createGrpcErrorFromDriveResponse', ); @@ -67,8 +67,9 @@ describe('createGrpcErrorFromDriveResponse', () => { }); }); - it('should throw signature consensus error if error code = 2000', () => { - const id = generateRandomIdentifier(); + // TODO: restore once `createConsensusError` is implemented in wasm-dpp + it.skip('should throw signature consensus error if error code = 2000', async () => { + const id = await generateRandomIdentifierAsync(); const data = { arguments: [id] }; info = { data }; @@ -99,8 +100,9 @@ describe('createGrpcErrorFromDriveResponse', () => { }); }); - it('should throw state consensus error if error code = 4000', () => { - const dataContractId = generateRandomIdentifier(); + // TODO: restore once `createConsensusError` is implemented in wasm-dpp + it.skip('should throw state consensus error if error code = 4000', async () => { + const dataContractId = await generateRandomIdentifierAsync(); const data = { arguments: [dataContractId] }; info = { data }; diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js index b1fcbefc35c..6229a5d1c66 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js @@ -14,7 +14,7 @@ const { } = require('@dashevo/dapi-grpc'); /* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); @@ -34,8 +34,8 @@ describe('getDataContractHandlerFactory', () => { let proofMock; let response; - beforeEach(function beforeEach() { - id = generateRandomIdentifier(); + beforeEach(async function beforeEach() { + id = await generateRandomIdentifierAsync(); request = { getId: this.sinon.stub().returns(id), getProve: this.sinon.stub().returns(true), @@ -64,7 +64,7 @@ describe('getDataContractHandlerFactory', () => { ); }); - it('should return valid data', async () => { + it('should return valid data', async function () { const result = await getDataContractHandler(call); expect(result).to.be.an.instanceOf(GetDataContractResponse); @@ -81,10 +81,13 @@ describe('getDataContractHandlerFactory', () => { expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - expect(driveStateRepositoryMock.fetchDataContract).to.be.calledOnceWith(id.toBuffer(), true); + expect(driveStateRepositoryMock.fetchDataContract).to.be.calledOnceWith( + this.sinon.match((identifier) => identifier.equals(id.toBuffer())), + true, + ); }); - it('should not include proof', async () => { + it('should not include proof', async function () { request.getProve.returns(false); response.setProof(null); driveStateRepositoryMock.fetchDataContract.resolves(response.serializeBinary()); @@ -96,7 +99,10 @@ describe('getDataContractHandlerFactory', () => { expect(proof).to.be.undefined(); - expect(driveStateRepositoryMock.fetchDataContract).to.be.calledOnceWith(id.toBuffer(), false); + expect(driveStateRepositoryMock.fetchDataContract).to.be.calledOnceWith( + this.sinon.match((identifier) => identifier.equals(id.toBuffer())), + false, + ); }); it('should throw InvalidArgumentGrpcError error if id is not specified', async () => { diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js index 96c138ae20d..751bc1333dd 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js @@ -16,7 +16,7 @@ const { } = require('@dashevo/dapi-grpc'); /* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); @@ -43,13 +43,13 @@ describe('getDocumentsHandlerFactory', () => { let response; let proofMock; - beforeEach(function beforeEach() { - dataContractId = generateRandomIdentifier(); + beforeEach(async function beforeEach() { + dataContractId = await generateRandomIdentifierAsync(); documentType = 'document'; where = [['name', '==', 'John']]; orderBy = [{ order: 'asc' }]; limit = 20; - startAfter = new Uint8Array(generateRandomIdentifier().toBuffer()); + startAfter = new Uint8Array((await generateRandomIdentifierAsync()).toBuffer()); startAt = new Uint8Array([]); request = { @@ -90,7 +90,7 @@ describe('getDocumentsHandlerFactory', () => { ); }); - it('should return valid result', async () => { + it('should return valid result', async function () { response.setProof(null); driveStateRepositoryMock.fetchDocuments.resolves(response.serializeBinary()); @@ -104,7 +104,7 @@ describe('getDocumentsHandlerFactory', () => { expect(documentsBinary).to.have.lengthOf(documentsFixture.length); expect(driveStateRepositoryMock.fetchDocuments).to.be.calledOnceWith( - dataContractId.toBuffer(), + this.sinon.match((id) => id.equals(dataContractId.toBuffer())), documentType, { where, @@ -123,7 +123,7 @@ describe('getDocumentsHandlerFactory', () => { expect(proof).to.be.undefined(); }); - it('should return proof', async () => { + it('should return proof', async function () { request.getProve.returns(true); const result = await getDocumentsHandler(call); @@ -131,7 +131,7 @@ describe('getDocumentsHandlerFactory', () => { expect(result).to.be.an.instanceOf(GetDocumentsResponse); expect(driveStateRepositoryMock.fetchDocuments).to.be.calledOnceWith( - dataContractId.toBuffer(), + this.sinon.match((id) => id.equals(dataContractId.toBuffer())), documentType, { where, diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js index 23f79f6fe5f..fffbde24c7a 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js @@ -14,7 +14,7 @@ const { } = require('@dashevo/dapi-grpc'); /* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); const getIdentityHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityHandlerFactory'); @@ -32,7 +32,7 @@ describe('getIdentityHandlerFactory', () => { let response; beforeEach(async function beforeEach() { - id = generateRandomIdentifier(); + id = await generateRandomIdentifierAsync(); call = new GrpcCallMock(this.sinon, { getId: this.sinon.stub().returns(id), getProve: this.sinon.stub().returns(false), From 7d688b5c75e99ebf6d2857d23d7c6a8c8abb3d3e Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 14:18:02 +0000 Subject: [PATCH 13/26] build(dapi): add rs-platform-value --- packages/dapi/Cargo.toml.template | 1 + packages/dapi/Dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/dapi/Cargo.toml.template b/packages/dapi/Cargo.toml.template index c172666796f..c0af2a96b33 100644 --- a/packages/dapi/Cargo.toml.template +++ b/packages/dapi/Cargo.toml.template @@ -2,6 +2,7 @@ [workspace] members = [ + "packages/rs-platform-value", "packages/dashpay-contract", "packages/withdrawals-contract", "packages/masternode-reward-shares-contract", diff --git a/packages/dapi/Dockerfile b/packages/dapi/Dockerfile index 6e1ad29c89d..d71c7c9d0b8 100644 --- a/packages/dapi/Dockerfile +++ b/packages/dapi/Dockerfile @@ -13,6 +13,7 @@ COPY Cargo.lock rust-toolchain.toml ./ # Use Cargo.toml.template instead of Cargo.toml from project root to avoid copying unnecessary Rust packages COPY packages/dapi/Cargo.toml.template ./Cargo.toml +COPY packages/rs-platform-value packages/rs-platform-value COPY packages/withdrawals-contract packages/withdrawals-contract COPY packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract COPY packages/dashpay-contract packages/dashpay-contract From 8cc6f3e6fdeb8a42f3f49afa263735b2dca30b36 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 14:18:37 +0000 Subject: [PATCH 14/26] build(dashmate): add deterministic instant send for dash core config --- packages/dashmate/configs/system/base.js | 2 +- packages/dashmate/templates/core/dash.conf.dot | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/configs/system/base.js b/packages/dashmate/configs/system/base.js index ba9180b75cd..5e8157c51c8 100644 --- a/packages/dashmate/configs/system/base.js +++ b/packages/dashmate/configs/system/base.js @@ -37,7 +37,7 @@ module.exports = { }, core: { docker: { - image: 'dashpay/dashd:19.0.0-rc.4', + image: 'dashpay/dashd:latest-dev', }, p2p: { port: 20001, diff --git a/packages/dashmate/templates/core/dash.conf.dot b/packages/dashmate/templates/core/dash.conf.dot index cc81ce4c2b4..cf102ca7b9d 100644 --- a/packages/dashmate/templates/core/dash.conf.dot +++ b/packages/dashmate/templates/core/dash.conf.dot @@ -54,6 +54,8 @@ regtest=1 {{? it.core.spork.address}}sporkaddr={{=it.core.spork.address}}{{?}} {{? it.core.spork.privateKey}}sporkkey={{=it.core.spork.privateKey}}{{?}} {{? it.core.miner.mediantime}}mocktime={{=it.core.miner.mediantime}}{{?}} +llmqinstantsend=llmq_test +llmqinstantsenddip0024=llmq_test_instantsend {{?? it.network === 'devnet'}} devnet={{=it.core.devnetName}} From 3f778ab4af709c27049e6a3f29bce7a030fed766 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 15:22:14 +0000 Subject: [PATCH 15/26] feat(dpp): rework entropy generator to return Result --- .../data_contract/data_contract_factory.rs | 9 ++++--- .../data_contract_factory.rs | 26 ++++++++++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/data_contract_factory.rs b/packages/rs-dpp/src/data_contract/data_contract_factory.rs index 100144ce842..58ae5e1f6d0 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_factory.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_factory.rs @@ -1,3 +1,4 @@ +use anyhow::anyhow; use serde_json::Value as JsonValue; use std::collections::BTreeMap; use std::convert::TryInto; @@ -26,14 +27,14 @@ use super::{validation::data_contract_validator::DataContractValidator, DataCont /// A way to provide external entropy generator. pub trait EntropyGenerator { - fn generate(&self) -> [u8; 32]; + fn generate(&self) -> anyhow::Result<[u8; 32]>; } struct DefaultEntropyGenerator; impl EntropyGenerator for DefaultEntropyGenerator { - fn generate(&self) -> [u8; 32] { - entropy_generator::generate().expect("entropy generation failed") + fn generate(&self) -> anyhow::Result<[u8; 32]> { + entropy_generator::generate() } } @@ -72,7 +73,7 @@ impl DataContractFactory { config: Option, definitions: Option, ) -> Result { - let entropy = Bytes32::new(self.entropy_generator.generate()); + let entropy = Bytes32::new(self.entropy_generator.generate()?); let data_contract_id = Identifier::from_bytes(&generate_data_contract_id( owner_id.to_buffer(), diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 1ebbf0e9e11..324d1518f8c 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -13,6 +13,7 @@ use dpp::{ }; use wasm_bindgen::prelude::*; +use crate::errors::from_js_error; use crate::utils::WithJsError; use crate::{ data_contract::errors::InvalidDataContractError, @@ -83,17 +84,28 @@ impl From for DataContractFactory { extern "C" { pub type ExternalEntropyGenerator; - #[wasm_bindgen(structural, method)] - pub fn generate(this: &ExternalEntropyGenerator) -> Vec; + #[wasm_bindgen(catch, structural, method)] + pub fn generate(this: &ExternalEntropyGenerator) -> Result; } impl EntropyGenerator for ExternalEntropyGenerator { - fn generate(&self) -> [u8; 32] { - // TODO: think about changing API to return an error but does it worth it for JS? + fn generate(&self) -> anyhow::Result<[u8; 32]> { + let js_value = ExternalEntropyGenerator::generate(self).map_err(from_js_error)?; - ExternalEntropyGenerator::generate(self) - .try_into() - .expect("Bad entropy generator provided: should return 32 bytes") + if !js_value.has_type::() { + anyhow::bail!("Entropy generator should return Buffer"); + } + + let vec = js_value + .dyn_into::() + .map_err(from_js_error)? + .to_vec(); + + let bytes = vec.try_into().map_err(|_| { + anyhow::anyhow!("Bad entropy generator provided: should return 32 bytes") + })?; + + Ok(bytes) } } #[wasm_bindgen(js_class=DataContractFactory)] From 2083db53d5a169a0137a95b48c07533296b8bde8 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 15:33:59 +0000 Subject: [PATCH 16/26] fix(wasm-dpp): provide entropy generator for DataContractFactory fixture --- .../lib/test/fixtures/getDataContractFixture.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js b/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js index e0ff5e05dca..e4dd762fac0 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js @@ -250,12 +250,20 @@ module.exports = async function getDataContractFixture(ownerId = randomOwnerId) }; const dataContractValidator = new DataContractValidator(); + const entropyGenerator = { + generate() { + return Buffer.alloc(32); + }, + }; const factory = new DataContractFactory( protocolVersion.latestVersion, dataContractValidator, + entropyGenerator, ); - const dataContract = factory.create(ownerId, documents); + // TODO: Identifier/buffer issue - hidden Identifier bug. + // Without toBuffer() it results on Identifier filled with zeroes + const dataContract = factory.create(ownerId.toBuffer(), documents); // dataContract.setDefinitions({ // lastName: { From fe5fca29dd9dd13b6cff0384087d1e5bb967a22d Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 15:34:28 +0000 Subject: [PATCH 17/26] test(dapi): use getDataContractFixture from wasm-dpp --- .../integration/dpp/DriveStateRepository.spec.js | 8 +++++--- .../broadcastStateTransitionHandlerFactory.spec.js | 14 +++++++++----- .../platform/getDataContractHandlerFactory.spec.js | 8 +++++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js b/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js index b506e1e04cc..ee30ca1e02d 100644 --- a/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js +++ b/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js @@ -7,7 +7,7 @@ const dirtyChai = require('dirty-chai'); const DashPlatformProtocol = require('@dashevo/dpp'); const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); +const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture'); const { v0: { @@ -30,14 +30,16 @@ describe('DriveStateRepository', () => { let proto; beforeEach(async function before() { - dataContractFixture = getDataContractFixture(); + dataContractFixture = await getDataContractFixture(); dpp = new DashPlatformProtocol(); await dpp.initialize(); sinon.spy(dpp.dataContract, 'createFromBuffer'); proto = new GetDataContractResponse(); - proto.setDataContract(dataContractFixture.toBuffer()); + // TODO: Identifier/buffer issue - problem with Buffer shim: + // Without Buffer.from it throws AssertionError: Failure: Type not convertible to Uint8Array. + proto.setDataContract(Buffer.from(dataContractFixture.toBuffer())); driveClientMock = sinon.stub(); driveClientMock.fetchDataContract = this.sinon.stub().resolves( diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js index 103688a06a0..03f80bf971d 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js @@ -13,8 +13,8 @@ const { }, } = require('@dashevo/dapi-grpc'); -const DashPlatformProtocol = require('@dashevo/dpp'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); +const { default: loadWasmDpp } = require('@dashevo/wasm-dpp'); +const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture'); const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); const NotFoundGrpcError = require('@dashevo/grpc-common/lib/server/error/NotFoundGrpcError'); @@ -34,12 +34,16 @@ describe('broadcastStateTransitionHandlerFactory', () => { let log; let code; let createGrpcErrorFromDriveResponseMock; + let DashPlatformProtocol; + + before(async () => { + ({ DashPlatformProtocol } = await loadWasmDpp()); + }); beforeEach(async function beforeEach() { - const dpp = new DashPlatformProtocol(); - await dpp.initialize(); + const dpp = new DashPlatformProtocol({}, null, null); - const dataContractFixture = getDataContractFixture(); + const dataContractFixture = await getDataContractFixture(); stateTransitionFixture = dpp.dataContract.createDataContractCreateTransition( dataContractFixture, ); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js index 6229a5d1c66..ce0232ba85d 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js @@ -15,7 +15,7 @@ const { /* eslint-disable import/no-extraneous-dependencies */ const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); +const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture'); const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); @@ -43,7 +43,7 @@ describe('getDataContractHandlerFactory', () => { call = new GrpcCallMock(this.sinon, request); - dataContractFixture = getDataContractFixture(); + dataContractFixture = await getDataContractFixture(); proofFixture = { merkleProof: Buffer.alloc(1, 1), }; @@ -53,7 +53,9 @@ describe('getDataContractHandlerFactory', () => { response = new GetDataContractResponse(); response.setProof(proofMock); - response.setDataContract(dataContractFixture.toBuffer()); + // TODO: Identifier/buffer issue - problem with Buffer shim: + // Without Buffer.from it throws AssertionError: Failure: Type not convertible to Uint8Array. + response.setDataContract(Buffer.from(dataContractFixture.toBuffer())); driveStateRepositoryMock = { fetchDataContract: this.sinon.stub().resolves(response.serializeBinary()), From 483e38483d58f2b26445247b902a250446382f0b Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 15:43:57 +0000 Subject: [PATCH 18/26] test(dapi): use DashPlatformProtocol from wasm-dpp --- .../dpp/DriveStateRepository.spec.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js b/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js index ee30ca1e02d..a65907a6b0a 100644 --- a/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js +++ b/packages/dapi/test/integration/dpp/DriveStateRepository.spec.js @@ -4,7 +4,7 @@ const sinon = require('sinon'); const chaiAsPromised = require('chai-as-promised'); const dirtyChai = require('dirty-chai'); -const DashPlatformProtocol = require('@dashevo/dpp'); +const { default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture'); @@ -29,12 +29,16 @@ describe('DriveStateRepository', () => { let dataContractFixture; let proto; + let DashPlatformProtocol; + + before(async () => { + ({ DashPlatformProtocol } = await loadWasmDpp()); + }); + beforeEach(async function before() { dataContractFixture = await getDataContractFixture(); - dpp = new DashPlatformProtocol(); - await dpp.initialize(); - sinon.spy(dpp.dataContract, 'createFromBuffer'); + dpp = new DashPlatformProtocol({}, null, null); proto = new GetDataContractResponse(); // TODO: Identifier/buffer issue - problem with Buffer shim: @@ -56,13 +60,6 @@ describe('DriveStateRepository', () => { expect(result.toObject()).to.be.deep.equal(dataContractFixture.toObject()); - expect(dpp.dataContract.createFromBuffer).to.be.calledOnceWithExactly( - proto.getDataContract_asU8(), - { - skipValidation: true, - }, - ); - expect(driveClientMock.fetchDataContract).to.be.calledOnce(); expect(driveClientMock.fetchDataContract).to.be.calledWithExactly(contractId, false); }); From 0fe8d4c86a1213d97c36d1779bb8a82449553a76 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 16:17:06 +0000 Subject: [PATCH 19/26] feat(wasm-dpp): provide external entropy generator for document_factory.rs --- .../data_contract/data_contract_factory.rs | 2 +- .../rs-dpp/src/document/document_factory.rs | 32 ++++++++++------- .../lib/test/fixtures/getDocumentsFixture.js | 7 +++- .../data_contract_factory.rs | 32 ++--------------- packages/wasm-dpp/src/document/factory.rs | 29 +++++++++++----- packages/wasm-dpp/src/entropy_generator.rs | 34 +++++++++++++++++++ packages/wasm-dpp/src/lib.rs | 1 + 7 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 packages/wasm-dpp/src/entropy_generator.rs diff --git a/packages/rs-dpp/src/data_contract/data_contract_factory.rs b/packages/rs-dpp/src/data_contract/data_contract_factory.rs index 58ae5e1f6d0..1c473861c61 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_factory.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_factory.rs @@ -30,7 +30,7 @@ pub trait EntropyGenerator { fn generate(&self) -> anyhow::Result<[u8; 32]>; } -struct DefaultEntropyGenerator; +pub struct DefaultEntropyGenerator; impl EntropyGenerator for DefaultEntropyGenerator { fn generate(&self) -> anyhow::Result<[u8; 32]> { diff --git a/packages/rs-dpp/src/document/document_factory.rs b/packages/rs-dpp/src/document/document_factory.rs index 04dda4d9f9f..290e2e9a8d0 100644 --- a/packages/rs-dpp/src/document/document_factory.rs +++ b/packages/rs-dpp/src/document/document_factory.rs @@ -13,6 +13,7 @@ use crate::consensus::basic::document::InvalidDocumentTypeError; use crate::document::extended_document::{property_names, ExtendedDocument}; use crate::data_contract::DriveContractExt; +use crate::data_contract::{DefaultEntropyGenerator, EntropyGenerator}; use crate::document::document_transition::INITIAL_REVISION; use crate::document::Document; use crate::identity::TimestampMillis; @@ -22,6 +23,7 @@ use crate::{ prelude::Identifier, state_repository::StateRepositoryLike, util::entropy_generator, + util::{json_schema::JsonSchemaExt, json_value::JsonValueExt}, ProtocolError, }; @@ -71,7 +73,7 @@ pub struct DocumentFactory { protocol_version: u32, document_validator: DocumentValidator, data_contract_fetcher_and_validator: DataContractFetcherAndValidator, - rng: StdRng, + entropy_generator: Box, } #[derive(Debug, Copy, Clone, Serialize, Deserialize, Default)] @@ -91,17 +93,26 @@ where protocol_version: u32, validate_document: DocumentValidator, data_contract_fetcher_and_validator: DataContractFetcherAndValidator, - seed: Option, ) -> Self { - let rng = match seed { - None => StdRng::from_entropy(), - Some(seed_value) => StdRng::seed_from_u64(seed_value), - }; DocumentFactory { protocol_version, document_validator: validate_document, data_contract_fetcher_and_validator, - rng, + entropy_generator: Box::new(DefaultEntropyGenerator), + } + } + + pub fn new_with_entropy_generator( + protocol_version: u32, + validate_document: DocumentValidator, + data_contract_fetcher_and_validator: DataContractFetcherAndValidator, + entropy_generator: Box, + ) -> Self { + DocumentFactory { + protocol_version, + document_validator: validate_document, + data_contract_fetcher_and_validator, + entropy_generator, } } @@ -119,7 +130,7 @@ where .into()); } - let document_entropy = entropy_generator::generate()?; // TODO use EntropyGenerator + let document_entropy = self.entropy_generator.generate()?; let document_id = generate_document_id( &data_contract.id, @@ -452,7 +463,6 @@ mod test { 1, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let name = "Cutie"; let contract_id = Identifier::from_string( @@ -500,7 +510,6 @@ mod test { 1, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let result = factory.create_state_transition(vec![]); @@ -516,7 +525,6 @@ mod test { 1, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); documents[0].document.owner_id = generate_random_identifier_struct(); @@ -535,7 +543,6 @@ mod test { 1, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let result = factory.create_state_transition(vec![(Action::Create, documents)]); assert_error_contains!(result, "Invalid Document initial revision '3'") @@ -549,7 +556,6 @@ mod test { 1, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let new_document = documents[0].clone(); diff --git a/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js b/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js index 33e2bd06f15..1e9a119613e 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js @@ -21,7 +21,12 @@ module.exports = async function getDocumentsFixture( ({ DocumentFactory, DocumentValidator, ProtocolVersionValidator } = await loadWasmDpp()); const documentValidator = new DocumentValidator(new ProtocolVersionValidator()); - const factory = new DocumentFactory(1, documentValidator, {}); + const entropyGenerator = { + generate() { + return Buffer.alloc(32); + }, + }; + const factory = new DocumentFactory(1, documentValidator, {}, entropyGenerator); const ownerId = await generateRandomIdentifierAsync(); diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 324d1518f8c..526c00f00fd 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -1,10 +1,8 @@ -use std::convert::TryInto; use std::sync::Arc; use dpp::{ data_contract::{ validation::data_contract_validator::DataContractValidator, DataContractFactory, - EntropyGenerator, }, platform_value, prelude::Identifier, @@ -13,8 +11,10 @@ use dpp::{ }; use wasm_bindgen::prelude::*; +use crate::entropy_generator::ExternalEntropyGenerator; use crate::errors::from_js_error; use crate::utils::WithJsError; + use crate::{ data_contract::errors::InvalidDataContractError, errors::{from_dpp_err, protocol_error::from_protocol_error}, @@ -80,34 +80,6 @@ impl From for DataContractFactory { } } -#[wasm_bindgen] -extern "C" { - pub type ExternalEntropyGenerator; - - #[wasm_bindgen(catch, structural, method)] - pub fn generate(this: &ExternalEntropyGenerator) -> Result; -} - -impl EntropyGenerator for ExternalEntropyGenerator { - fn generate(&self) -> anyhow::Result<[u8; 32]> { - let js_value = ExternalEntropyGenerator::generate(self).map_err(from_js_error)?; - - if !js_value.has_type::() { - anyhow::bail!("Entropy generator should return Buffer"); - } - - let vec = js_value - .dyn_into::() - .map_err(from_js_error)? - .to_vec(); - - let bytes = vec.try_into().map_err(|_| { - anyhow::anyhow!("Bad entropy generator provided: should return 32 bytes") - })?; - - Ok(bytes) - } -} #[wasm_bindgen(js_class=DataContractFactory)] impl DataContractFactoryWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index 1a7cc21c24b..3e94d4fe93b 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -19,6 +19,7 @@ use dpp::prelude::ExtendedDocument; use std::convert::TryFrom; use std::sync::Arc; +use crate::entropy_generator::ExternalEntropyGenerator; use crate::{ identifier::identifier_from_js_value, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, @@ -72,7 +73,6 @@ impl DocumentFactoryWASM { protocol_version, document_validator.into(), DataContractFetcherAndValidator::new(Arc::new(state_repository)), - Some(5000), //5000 has been chosen arbitrarily ); DocumentFactoryWASM(factory) @@ -86,15 +86,26 @@ impl DocumentFactoryWASM { protocol_version: u32, document_validator: DocumentValidatorWasm, state_repository: ExternalStateRepositoryLike, + external_entropy_generator_arg: Option, ) -> DocumentFactoryWASM { - let factory = DocumentFactory::new( - protocol_version, - document_validator.into(), - DataContractFetcherAndValidator::new(Arc::new( - ExternalStateRepositoryLikeWrapper::new(state_repository), - )), - None, - ); + let factory = if let Some(external_entropy_generator) = external_entropy_generator_arg { + DocumentFactory::new_with_entropy_generator( + protocol_version, + document_validator.into(), + DataContractFetcherAndValidator::new(Arc::new( + ExternalStateRepositoryLikeWrapper::new(state_repository), + )), + Box::new(external_entropy_generator), + ) + } else { + DocumentFactory::new( + protocol_version, + document_validator.into(), + DataContractFetcherAndValidator::new(Arc::new( + ExternalStateRepositoryLikeWrapper::new(state_repository), + )), + ) + }; DocumentFactoryWASM(factory) } diff --git a/packages/wasm-dpp/src/entropy_generator.rs b/packages/wasm-dpp/src/entropy_generator.rs new file mode 100644 index 00000000000..17695fee3d2 --- /dev/null +++ b/packages/wasm-dpp/src/entropy_generator.rs @@ -0,0 +1,34 @@ +use crate::errors::from_js_error; +use dpp::data_contract::EntropyGenerator; +use std::convert::TryInto; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsValue; + +#[wasm_bindgen] +extern "C" { + pub type ExternalEntropyGenerator; + + #[wasm_bindgen(catch, structural, method)] + pub fn generate(this: &ExternalEntropyGenerator) -> Result; +} + +impl EntropyGenerator for ExternalEntropyGenerator { + fn generate(&self) -> anyhow::Result<[u8; 32]> { + let js_value = ExternalEntropyGenerator::generate(self).map_err(from_js_error)?; + + if !js_value.has_type::() { + anyhow::bail!("Entropy generator should return Buffer"); + } + + let vec = js_value + .dyn_into::() + .map_err(from_js_error)? + .to_vec(); + + let bytes = vec.try_into().map_err(|_| { + anyhow::anyhow!("Bad entropy generator provided: should return 32 bytes") + })?; + + Ok(bytes) + } +} diff --git a/packages/wasm-dpp/src/lib.rs b/packages/wasm-dpp/src/lib.rs index 15e597323e3..1c0d7c40594 100644 --- a/packages/wasm-dpp/src/lib.rs +++ b/packages/wasm-dpp/src/lib.rs @@ -26,5 +26,6 @@ mod utils; mod bls_adapter; mod buffer; +mod entropy_generator; mod lodash; mod validation; From 41916704ecbeccca5052c321d066aeb295659e69 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 16:17:45 +0000 Subject: [PATCH 20/26] test(dapi): use getDocumentsFixture fromw wasm-dpp --- .../handlers/platform/getDocumentsHandlerFactory.spec.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js index 751bc1333dd..49865c58735 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js @@ -17,7 +17,7 @@ const { /* eslint-disable import/no-extraneous-dependencies */ const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); +const getDocumentsFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDocumentsFixture'); const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); @@ -65,11 +65,12 @@ describe('getDocumentsHandlerFactory', () => { call = new GrpcCallMock(this.sinon, request); - const [document] = getDocumentsFixture(); + const [document] = await getDocumentsFixture(); documentsFixture = [document]; - documentsSerialized = documentsFixture.map((documentItem) => documentItem.toBuffer()); + documentsSerialized = documentsFixture + .map((documentItem) => Buffer.from(documentItem.toBuffer())); proofFixture = { merkleProof: Buffer.alloc(1, 1), }; From 180c79edf63a20132a25cb0e6a50bbc06a4b1fdf Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 17:13:24 +0000 Subject: [PATCH 21/26] test(wasm-dpp): provide real entropy generator for `getDataContractFixture.js` and `getDocumentsFixture.js` --- packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js | 3 ++- packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js b/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js index e4dd762fac0..2196c8a3453 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js @@ -1,3 +1,4 @@ +const crypto = require('crypto'); const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); const JsIdentifier = require('@dashevo/dpp/lib/identifier/Identifier'); const generateRandomIdentifierAsync = require('../utils/generateRandomIdentifierAsync'); @@ -252,7 +253,7 @@ module.exports = async function getDataContractFixture(ownerId = randomOwnerId) const dataContractValidator = new DataContractValidator(); const entropyGenerator = { generate() { - return Buffer.alloc(32); + return crypto.randomBytes(32); }, }; const factory = new DataContractFactory( diff --git a/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js b/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js index 1e9a119613e..78a8333e62b 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getDocumentsFixture.js @@ -23,7 +23,7 @@ module.exports = async function getDocumentsFixture( const documentValidator = new DocumentValidator(new ProtocolVersionValidator()); const entropyGenerator = { generate() { - return Buffer.alloc(32); + return crypto.randomBytes(32); }, }; const factory = new DocumentFactory(1, documentValidator, {}, entropyGenerator); From f8e5079fe5736b091f5580a63121fda5c70b2945 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 17:14:30 +0000 Subject: [PATCH 22/26] feat(wasm-dpp): add toBuffer to identity_create_transition.rs --- .../identity_create_transition.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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 a3709b55586..88d5b3260e8 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 @@ -19,6 +19,9 @@ use crate::{ }; use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; +use crate::utils::{generic_of_js_val, ToSerdeJSONExt}; +use dpp::state_transition::StateTransitionConvert; use crate::utils::{generic_of_js_val, ToSerdeJSONExt, WithJsError}; use dpp::platform_value::string_encoding; @@ -225,6 +228,22 @@ impl IdentityCreateTransitionWasm { Ok(js_object.into()) } + #[wasm_bindgen(js_name=toBuffer)] + pub fn to_buffer(&self, options: JsValue) -> Result { + let opts: super::to_object::ToObjectOptions = if options.is_object() { + with_js_error!(serde_wasm_bindgen::from_value(options))? + } else { + Default::default() + }; + + let buffer = self + .0 + .to_buffer(opts.skip_signature.unwrap_or(false)) + .map_err(from_dpp_err)?; + + Ok(Buffer::from_bytes(&buffer).into()) + } + #[wasm_bindgen(js_name=toJSON)] pub fn to_json(&self) -> Result { let object = super::to_object::to_object_struct(&self.0, Default::default()); From 8cab8da058b94e0a8f7b3d93812e8e0f137e3dac Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 17:14:57 +0000 Subject: [PATCH 23/26] test(wasm-dpp): add `getIdentityCreateTransitionFixture.js` and `getInstantAssetLockProofFixture.js` --- .../getIdentityCreateTransitionFixture.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 packages/wasm-dpp/lib/test/fixtures/getIdentityCreateTransitionFixture.js diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreateTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreateTransitionFixture.js new file mode 100644 index 00000000000..7c1791a51c3 --- /dev/null +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreateTransitionFixture.js @@ -0,0 +1,35 @@ +const PrivateKey = require('@dashevo/dashcore-lib/lib/privatekey'); + +const getInstantAssetLockProofFixture = require('./getInstantAssetLockProofFixture'); + +const { default: loadWasmDpp } = require('../../..'); +let { IdentityCreateTransition, IdentityPublicKey } = require('../../..'); + +/** + * @param {PrivateKey} oneTimePrivateKey + * + * @return {IdentityCreateTransition} + */ +module.exports = async function getIdentityCreateTransitionFixture( + oneTimePrivateKey = new PrivateKey(), +) { + ({ IdentityCreateTransition, IdentityPublicKey } = await loadWasmDpp()); + const rawStateTransition = { + protocolVersion: 1, + type: 2, + assetLockProof: (await getInstantAssetLockProofFixture(oneTimePrivateKey)).toObject(), + publicKeys: [ + { + id: 0, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, + data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'), + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, + readOnly: false, + signature: Buffer.alloc(0), + }, + ], + }; + + return new IdentityCreateTransition(rawStateTransition); +}; From 76b8762ff1f2eb46cbcfdc99c98dce770468f920 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 17 Mar 2023 17:16:28 +0000 Subject: [PATCH 24/26] test(dapi): replace dpp fixtures with wasm-dpp in `waitForStateTransitionResultHandlerFactory.spec.js` --- ...tateTransitionResultHandlerFactory.spec.js | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js b/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js index 49b7fdd9c71..eddc5c6b525 100644 --- a/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js +++ b/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js @@ -15,8 +15,8 @@ const { Proof, }, } = require('@dashevo/dapi-grpc'); -const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock'); -const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); +const getIdentityCreateTransitionFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); +const { default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const { EventEmitter } = require('events'); @@ -37,7 +37,6 @@ describe('waitForStateTransitionResultHandlerFactory', () => { let driveClientMock; let tenderDashWsClientMock; let blockchainListener; - let dppMock; let hash; let proofFixture; let wsMessagesFixture; @@ -49,7 +48,13 @@ describe('waitForStateTransitionResultHandlerFactory', () => { let createGrpcErrorFromDriveResponseMock; let errorInfo; - beforeEach(function beforeEach() { + let DashPlatformProtocol; + + before(async () => { + ({ DashPlatformProtocol } = await loadWasmDpp()); + }); + + beforeEach(async function beforeEach() { const hashString = '56458F2D8A8617EA322931B72C103CDD93820004E534295183A6EF215B93C76E'; hash = Buffer.from(hashString, 'hex'); @@ -60,6 +65,9 @@ describe('waitForStateTransitionResultHandlerFactory', () => { }, }; + stateTransitionFixture = await getIdentityCreateTransitionFixture(); + const stateTransitionBase64 = stateTransitionFixture.toBuffer().toString('base64'); + wsMessagesFixture = { success: { query: "tm.event = 'Tx'", @@ -67,7 +75,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { type: 'tendermint/event/Tx', value: { height: '145', - tx: 'pWR0eXBlA2lhc3NldExvY2ujZXByb29momR0eXBlAGtpbnN0YW50TG9ja1ilAR272lhhsS11I/IKpeDUL1LePc0tXC/pGbpntZ8FDSBuAAAAAHvUKCicVybMXMiWz60mTKDN2H7HesE1zhNhy9w+zKjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa291dHB1dEluZGV4AGt0cmFuc2FjdGlvbljfAwAAAAFft1DH/7MLyiiZTQ0v9kxxx5IO+g3OowKiGXGr/gzTXAEAAABrSDBFAiEA9zBXt5ZbkZ0miGrXtJPF9abrNUHafXIGRHXeritMEZECIBO0nrmvNv/jff27bDehIf3kD+WHQACWj5UvryJNQvyAASECG117xwKATG95Jur1SvBo/vAjYHx5AnYYOwsN3zL8Wyf/////AgEAAAAAAAAAFmoU7MiTGZFsxDcto0FsSOKqkcWmk/5OiAAAAAAAABl2qRTk6MFuEOFzT3vBIbU1Hio2UuiDzYisAAAAAGlzaWduYXR1cmVYQSANwCdg67KHh/OiSv9FW8qNFj+8OBvwnm3Ybg2Ju0tGNmkw3jAkdOgHLqAkmHCtiSvqZ7IhGDXhU5YtHCk6PIOIamlkZW50aXR5SWRYIJmUCrEaSl7bW6UkE3rBhlQjTBhJ4v1m0ORUXh434DTDb3Byb3RvY29sVmVyc2lvbgA=', + tx: stateTransitionBase64, result: {}, }, }, @@ -110,7 +118,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { type: 'tendermint/event/Tx', value: { height: '135', - tx: 'pWR0eXBlAmlhc3NldExvY2ujZXByb29momR0eXBlAGtpbnN0YW50TG9ja1ilAR272lhhsS11I/IKpeDUL1LePc0tXC/pGbpntZ8FDSBuAAAAAMfKlZZZ3oAHaxO0bEIYXCSEpwTuR/baTwASqjgFgDAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa291dHB1dEluZGV4AGt0cmFuc2FjdGlvbljfAwAAAAFl5SQeBBDkK7Us9JcOU+Gp1oi4NIl/01A+5GAKeHi2JwEAAABrSDBFAiEAq9XMPgtU9J0imH6YJ/RtbxwJsavuhIpECU5Lw9h0xpoCIEgkU1njDQCe06YqRyeVYc6wK8G7Y/M5X+XicfJKo5P6ASEDK3jwtdIToEQAgTPMXxpjon4geQaNbbRNT/Xz50UgdHH/////AgEAAAAAAAAAFmoU8HHK+aRqNJOWXjNlOO3iWwvV45CDkAAAAAAAABl2qRTFVGzrfaB6ZhmvE8h2unBNgcJIMIisAAAAAGlzaWduYXR1cmVYQR/OHDEQUcSxczLBvMP9Z0HmRaDoCS6tTyFLbWhn7bAfJTlPF9hIbh13260WSCiDceJjWaYB0JuOGsqu2ZB5F0dDanB1YmxpY0tleXOBo2JpZABkZGF0YVghA85GJWE321+kW0HIwl3M6wO9BIHDxY80HlQgc1wRalT5ZHR5cGUAb3Byb3RvY29sVmVyc2lvbgA=', + tx: stateTransitionBase64, result: { code: 1043, info: cbor.encode(errorInfo).toString('base64'), @@ -166,10 +174,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { tenderDashWsClientMock = new EventEmitter(); tenderDashWsClientMock.subscribe = this.sinon.stub(); - stateTransitionFixture = getIdentityCreateTransitionFixture(); - - dppMock = createDPPMock(this.sinon); - dppMock.stateTransition.createFromBuffer.resolves(stateTransitionFixture); + const dpp = new DashPlatformProtocol({}, null, null); driveClientMock = { fetchProofs: this.sinon.stub().resolves({ @@ -208,7 +213,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { fetchProofForStateTransition, waitForTransactionToBeProvable, blockchainListener, - dppMock, + dpp, createGrpcErrorFromDriveResponseMock, 1000, ); @@ -268,10 +273,11 @@ describe('waitForStateTransitionResultHandlerFactory', () => { expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - expect(driveClientMock.fetchProofs).to.be.calledOnceWithExactly({ - identityIds: stateTransitionFixture.getModifiedDataIds() + const { identityIds } = driveClientMock.fetchProofs.firstCall.firstArg; + expect(identityIds).to.deep.equal( + stateTransitionFixture.getModifiedDataIds() .map((identifier) => identifier.toBuffer()), - }); + ); }); it('should wait for state transition and return result with error', (done) => { From 95fdad8788b7111386026d0d2e8e14771897a090 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 22 Mar 2023 11:38:17 +0000 Subject: [PATCH 25/26] build(wasm-dpp): update lock files --- .pnp.cjs | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pnp.cjs b/.pnp.cjs index 49c9e902e1b..cff50300979 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2328,7 +2328,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/dapi/",\ "packageDependencies": [\ ["@dashevo/dapi", "workspace:packages/dapi"],\ - ["@dashevo/bls", "npm:1.2.7"],\ + ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ ["@dashevo/dashcore-lib", "npm:0.20.0"],\ diff --git a/yarn.lock b/yarn.lock index 0bda0cc3a34..b244a179d64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1313,7 +1313,7 @@ __metadata: languageName: unknown linkType: soft -"@dashevo/bls@npm:~1.2.9": +"@dashevo/bls@npm:~1.2.7, @dashevo/bls@npm:~1.2.9": version: 1.2.9 resolution: "@dashevo/bls@npm:1.2.9" dependencies: From 14334a93043a6bd0680d7a6f931bc35c188d9bab Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 22 Mar 2023 11:39:23 +0000 Subject: [PATCH 26/26] chore(dpp): fix inconsistencies after merge --- packages/rs-dpp/src/data_contract/data_contract_factory.rs | 1 - packages/rs-dpp/src/document/document_facade.rs | 1 - packages/rs-dpp/src/document/document_factory.rs | 5 +---- .../state_transition/documents_batch_transition/mod.rs | 1 - .../src/tests/fixtures/get_dashpay_document_fixture.rs | 1 - .../src/tests/fixtures/get_document_transitions_fixture.rs | 1 - packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs | 2 -- .../rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs | 1 - .../get_masternode_reward_shares_documents_fixture.rs | 1 - packages/rs-drive/src/drive/document/update.rs | 1 - .../src/data_contract_factory/data_contract_factory.rs | 1 - .../identity_create_transition/identity_create_transition.rs | 1 - 12 files changed, 1 insertion(+), 16 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/data_contract_factory.rs b/packages/rs-dpp/src/data_contract/data_contract_factory.rs index 1c473861c61..05ccec4cc03 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_factory.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_factory.rs @@ -1,4 +1,3 @@ -use anyhow::anyhow; use serde_json::Value as JsonValue; use std::collections::BTreeMap; use std::convert::TryInto; diff --git a/packages/rs-dpp/src/document/document_facade.rs b/packages/rs-dpp/src/document/document_facade.rs index d1c8f93dc72..b37ddc2f61e 100644 --- a/packages/rs-dpp/src/document/document_facade.rs +++ b/packages/rs-dpp/src/document/document_facade.rs @@ -39,7 +39,6 @@ where protocol_version, document_validator.clone(), data_contract_fetcher_and_validator.clone(), - None, ); Self { diff --git a/packages/rs-dpp/src/document/document_factory.rs b/packages/rs-dpp/src/document/document_factory.rs index 290e2e9a8d0..96cd90bc90c 100644 --- a/packages/rs-dpp/src/document/document_factory.rs +++ b/packages/rs-dpp/src/document/document_factory.rs @@ -5,8 +5,7 @@ use std::collections::BTreeMap; use itertools::Itertools; use platform_value::{Bytes32, Value}; -use rand::rngs::StdRng; -use rand::SeedableRng; + use serde::{Deserialize, Serialize}; use crate::consensus::basic::document::InvalidDocumentTypeError; @@ -22,8 +21,6 @@ use crate::{ decode_protocol_entity_factory::DecodeProtocolEntity, prelude::Identifier, state_repository::StateRepositoryLike, - util::entropy_generator, - util::{json_schema::JsonSchemaExt, json_value::JsonValueExt}, ProtocolError, }; 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 265ecbac66d..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 @@ -587,7 +587,6 @@ mod test { 1, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let batch_transition = document_factory diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs index bf6f504e916..8e3c35f845e 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs @@ -30,7 +30,6 @@ pub fn get_contact_request_document_fixture( LATEST_VERSION, get_document_validator_fixture(), data_contract_fetcher_and_validator, - None, ); let mut data = platform_value! ({ diff --git a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs index cc899541053..b28024b0d20 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs @@ -20,7 +20,6 @@ pub fn get_document_transitions_fixture( LATEST_VERSION, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let mut documents_collected: HashMap> = diff --git a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs index 3e506103f6c..895e9e3af3b 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs @@ -30,7 +30,6 @@ pub fn get_documents_fixture_with_owner_id_from_contract( LATEST_VERSION, get_document_validator_fixture(), data_contract_fetcher_and_validator, - None, ); let owner_id = data_contract.owner_id; @@ -53,7 +52,6 @@ pub fn get_extended_documents_fixture( LATEST_VERSION, get_document_validator_fixture(), data_contract_fetcher_and_validator, - None, ); let owner_id = gen_owner_id(); diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs index 5ec2af7c669..e0ec428d16c 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs @@ -39,7 +39,6 @@ pub fn get_dpns_parent_document_fixture(options: ParentDocumentOptions) -> Exten LATEST_VERSION, get_document_validator_fixture(), DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), - None, ); let data_contract = get_dpns_data_contract_fixture(Some(options.owner_id)); let mut pre_order_salt = [0u8; 32]; diff --git a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs index 0ee58dc6971..c74aa09d2ba 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs @@ -29,7 +29,6 @@ pub fn get_masternode_reward_shares_documents_fixture() -> (Vec