Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2398796
wip(dapi): test dapi build with wasm-dpp
markin-io Feb 22, 2023
2a82e58
wip(dapi): add missing wasm-dpp to Dockerfiles
markin-io Feb 22, 2023
607a51d
build(dapi): build wasm-dpp
markin-io Feb 22, 2023
d165447
build(dapi): add build step for wasm-dpp
markin-io Feb 28, 2023
a3cdcd5
build(dapi): fixed missing deps for wasm-dpp
markin-io Feb 28, 2023
d9c0e76
build: revert unnecessary added wasm-dpp deps in Dockerfile
markin-io Mar 1, 2023
77ffc0d
wip(dapi): test dpp with state repo
markin-io Mar 13, 2023
89d3e3f
build(dapi): cache apt-get packages
markin-io Mar 13, 2023
d529ea9
test(wasm-dpp): add getIdentityFixture.js
markin-io Mar 16, 2023
b25cdba
test(dapi): use getIdentityFixture from wasm-dpp
markin-io Mar 16, 2023
fd610ef
feat(wasm-dpp): make queueable wasm dpp loader (don't trigger bundle …
markin-io Mar 16, 2023
9996d89
test(dapi): use generateRandomIdentifierAsync from wasm-dpp
markin-io Mar 17, 2023
7d688b5
build(dapi): add rs-platform-value
markin-io Mar 17, 2023
8cc6f3e
build(dashmate): add deterministic instant send for dash core config
markin-io Mar 17, 2023
3f778ab
feat(dpp): rework entropy generator to return Result
markin-io Mar 17, 2023
2083db5
fix(wasm-dpp): provide entropy generator for DataContractFactory fixture
markin-io Mar 17, 2023
fe5fca2
test(dapi): use getDataContractFixture from wasm-dpp
markin-io Mar 17, 2023
483e384
test(dapi): use DashPlatformProtocol from wasm-dpp
markin-io Mar 17, 2023
0fe8d4c
feat(wasm-dpp): provide external entropy generator for document_facto…
markin-io Mar 17, 2023
4191670
test(dapi): use getDocumentsFixture fromw wasm-dpp
markin-io Mar 17, 2023
180c79e
test(wasm-dpp): provide real entropy generator for `getDataContractFi…
markin-io Mar 17, 2023
f8e5079
feat(wasm-dpp): add toBuffer to identity_create_transition.rs
markin-io Mar 17, 2023
8cab8da
test(wasm-dpp): add `getIdentityCreateTransitionFixture.js` and `getI…
markin-io Mar 17, 2023
76b8762
test(dapi): replace dpp fixtures with wasm-dpp in `waitForStateTransi…
markin-io Mar 17, 2023
95fdad8
build(wasm-dpp): update lock files
markin-io Mar 22, 2023
14334a9
chore(dpp): fix inconsistencies after merge
markin-io Mar 22, 2023
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
2 changes: 2 additions & 0 deletions .pnp.cjs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions packages/dapi/Cargo.toml.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Workspace template with Rust packages required for DAPI (needed for Docker build)
[workspace]

members = [
"packages/rs-platform-value",
"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"
]
36 changes: 36 additions & 0 deletions packages/dapi/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,37 @@
# syntax = docker/dockerfile:1.3

# Build wasm-dpp
FROM rust as builder

RUN --mount=type=cache,target=/var/cache/apt \
apt-get update && apt-get install -y clang

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/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
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

# Build Rust part of wasm-dpp
RUN cd packages/wasm-dpp && ./scripts/build.sh

# Build for DAPI
FROM node:16-alpine3.16 as builder

ARG NODE_ENV=production
Expand Down Expand Up @@ -30,6 +63,7 @@ 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
Expand All @@ -38,6 +72,8 @@ 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/

Expand Down
2 changes: 2 additions & 0 deletions packages/dapi/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,13 @@
"all": true
},
"dependencies": {
"@dashevo/bls": "~1.2.7",
"@dashevo/dapi-grpc": "workspace:*",
"@dashevo/dashcore-lib": "~0.20.0",
"@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",
Expand Down
19 changes: 12 additions & 7 deletions packages/dapi/scripts/api.js
Original file line number Diff line number Diff line change
@@ -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: {
Expand All @@ -13,7 +14,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');

Expand All @@ -39,6 +41,9 @@ const platformHandlersFactory = require(
);

async function main() {
const { DashPlatformProtocol } = await loadWasmDpp();
const blsSignatures = await loadBLS();

/* Application start */
const configValidationResult = validateConfig(config);
if (!configValidationResult.isValid) {
Expand All @@ -65,8 +70,7 @@ async function main() {
port: config.tendermintCore.port,
});

const dppForParsingContracts = new DashPlatformProtocol();
await dppForParsingContracts.initialize();
const dppForParsingContracts = new DashPlatformProtocol({}, blsSignatures, {});
const driveStateRepository = new DriveStateRepository(driveClient, dppForParsingContracts);

log.info(`Connecting to Tenderdash on ${config.tendermintCore.host}:${config.tendermintCore.port}`);
Expand Down Expand Up @@ -94,10 +98,11 @@ async function main() {
});
log.info(`JSON RPC server is listening on port ${config.rpcServer.port}`);

const dpp = new DashPlatformProtocol({
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');
Expand Down
31 changes: 15 additions & 16 deletions packages/dapi/test/integration/dpp/DriveStateRepository.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ 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 generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier');
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync');
const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture');

const {
v0: {
Expand All @@ -29,15 +29,21 @@ describe('DriveStateRepository', () => {
let dataContractFixture;
let proto;

let DashPlatformProtocol;

before(async () => {
({ DashPlatformProtocol } = await loadWasmDpp());
});

beforeEach(async function before() {
dataContractFixture = getDataContractFixture();
dataContractFixture = await getDataContractFixture();

dpp = new DashPlatformProtocol();
await dpp.initialize();
sinon.spy(dpp.dataContract, 'createFromBuffer');
dpp = new DashPlatformProtocol({}, null, null);

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(
Expand All @@ -49,18 +55,11 @@ 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());

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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand All @@ -37,7 +37,6 @@ describe('waitForStateTransitionResultHandlerFactory', () => {
let driveClientMock;
let tenderDashWsClientMock;
let blockchainListener;
let dppMock;
let hash;
let proofFixture;
let wsMessagesFixture;
Expand All @@ -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');

Expand All @@ -60,14 +65,17 @@ describe('waitForStateTransitionResultHandlerFactory', () => {
},
};

stateTransitionFixture = await getIdentityCreateTransitionFixture();
const stateTransitionBase64 = stateTransitionFixture.toBuffer().toString('base64');

wsMessagesFixture = {
success: {
query: "tm.event = 'Tx'",
data: {
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: {},
},
},
Expand Down Expand Up @@ -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'),
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -208,7 +213,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => {
fetchProofForStateTransition,
waitForTransactionToBeProvable,
blockchainListener,
dppMock,
dpp,
createGrpcErrorFromDriveResponseMock,
1000,
);
Expand Down Expand Up @@ -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) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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',
);
Expand Down Expand Up @@ -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 };
Expand Down Expand Up @@ -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 };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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,
);
Expand Down
Loading