From dae5b0d57e780346a35c14d2ffc4bb1b019a1378 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 17 Jun 2021 09:45:35 +0500 Subject: [PATCH 01/10] chore: update `dapi-grpc` --- package-lock.json | 19 ++++++++++++++++--- package.json | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d0872088..0895721d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -153,6 +153,19 @@ "lodash.sample": "^4.2.1" }, "dependencies": { + "@dashevo/dapi-grpc": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.19.0.tgz", + "integrity": "sha512-O0W1z0ZocJdA7jkFXlX2LbJlrY6PfAlnBDDXw3HNTJfV0uM4xzx1BYNK9noVa+GxDcpNGim7lj4qLVVWd47sWw==", + "dev": true, + "requires": { + "@dashevo/grpc-common": "^0.3.0", + "google-protobuf": "^3.12.2", + "grpc": "^1.24.3", + "grpc-web": "^1.2.0", + "protobufjs": "github:jawid-h/protobuf.js#fix/buffer-conversion" + } + }, "cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -166,9 +179,9 @@ } }, "@dashevo/dapi-grpc": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.19.0.tgz", - "integrity": "sha512-O0W1z0ZocJdA7jkFXlX2LbJlrY6PfAlnBDDXw3HNTJfV0uM4xzx1BYNK9noVa+GxDcpNGim7lj4qLVVWd47sWw==", + "version": "0.20.0-dev.2", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-grpc/-/dapi-grpc-0.20.0-dev.2.tgz", + "integrity": "sha512-67NlgB+vNFDNN4T6Nlscbr5N9PEe4skbspElFAIKAnuLquPjBT0HmNFHl7VYpUq4DNT5SqQ9Z+sePcHxMOXC4w==", "requires": { "@dashevo/grpc-common": "^0.3.0", "google-protobuf": "^3.12.2", diff --git a/package.json b/package.json index 0e43e785..3dbb6898 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "all": true }, "dependencies": { - "@dashevo/dapi-grpc": "~0.19.0", + "@dashevo/dapi-grpc": "~0.20.0-dev.2", "@dashevo/dashcore-lib": "~0.19.23", "@dashevo/dashd-rpc": "^2.0.2", "@dashevo/dpp": "~0.19.1", From 0a5f192f120376fae4499e28f47858fea6458418 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 17 Jun 2021 10:04:32 +0500 Subject: [PATCH 02/10] feat: add more information to proofs --- lib/externalApis/drive/DriveClient.js | 21 +++++++++++++--- .../platform/getDataContractHandlerFactory.js | 22 ++++------------- .../platform/getDocumentsHandlerFactory.js | 22 ++++------------- ...entitiesByPublicKeyHashesHandlerFactory.js | 24 ++++--------------- .../platform/getIdentityHandlerFactory.js | 22 ++++------------- ...ntityIdsByPublicKeyHashesHandlerFactory.js | 24 ++++--------------- 6 files changed, 38 insertions(+), 97 deletions(-) diff --git a/lib/externalApis/drive/DriveClient.js b/lib/externalApis/drive/DriveClient.js index a2889321..72329d4d 100644 --- a/lib/externalApis/drive/DriveClient.js +++ b/lib/externalApis/drive/DriveClient.js @@ -22,7 +22,7 @@ class DriveClient { * @param {Object} data * @param {boolean} prove * - * @return {Promise<{ data: Buffer, [proof]: {rootTreeProof: Buffer, storeTreeProof: Buffer}}>} + * @return {Promise} */ async request(path, data = {}, prove = false) { const encodedData = cbor.encode(data); @@ -53,7 +53,7 @@ class DriveClient { if (response.code === undefined || response.code === 0) { // no errors found return the serialized response value - return cbor.decode(Buffer.from(response.value, 'base64')); + return Buffer.from(response.value, 'base64'); } const { error: abciError } = JSON.parse(response.log); @@ -61,6 +61,21 @@ class DriveClient { throw new AbciResponseError(response.code, abciError); } + /** + * Makes request to Drive and handle CBOR'ed response + * + * @param {string} path + * @param {Object} data + * @param {boolean} prove + * + * @return {Promise<{ data: Buffer, [proof]: {rootTreeProof: Buffer, storeTreeProof: Buffer}}>} + */ + async requestCbor(path, data = {}, prove = false) { + const responseBuffer = await this.request(path, data, prove); + + return cbor.decode(responseBuffer); + } + /** * Fetch serialized data contract * @@ -170,7 +185,7 @@ class DriveClient { * @return {Promise<{data: Buffer}>} */ async fetchProofs({ documentIds, identityIds, dataContractIds }) { - return this.request( + return this.requestCbor( '/proofs', { documentIds, diff --git a/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js b/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js index 8b9620e5..be4d6b15 100644 --- a/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js @@ -9,7 +9,6 @@ const { const { v0: { GetDataContractResponse, - Proof, }, } = require('@dashevo/dapi-grpc'); @@ -38,11 +37,10 @@ function getDataContractHandlerFactory(driveClient, handleAbciResponseError) { throw new InvalidArgumentGrpcError('id is not specified'); } - let dataContractBuffer; - let proofObject; + let dataContractResponseBuffer; try { - ({ data: dataContractBuffer, proof: proofObject } = await driveClient - .fetchDataContract(id, prove)); + dataContractResponseBuffer = await driveClient + .fetchDataContract(id, prove); } catch (e) { if (e instanceof AbciResponseError) { handleAbciResponseError(e); @@ -50,19 +48,7 @@ function getDataContractHandlerFactory(driveClient, handleAbciResponseError) { throw e; } - const response = new GetDataContractResponse(); - - response.setDataContract(dataContractBuffer); - - if (prove === true) { - const proof = new Proof(); - proof.setRootTreeProof(proofObject.rootTreeProof); - proof.setStoreTreeProof(proofObject.storeTreeProof); - - response.setProof(proof); - } - - return response; + return GetDataContractResponse.deserializeBinary(dataContractResponseBuffer); } return getDataContractHandler; diff --git a/lib/grpcServer/handlers/platform/getDocumentsHandlerFactory.js b/lib/grpcServer/handlers/platform/getDocumentsHandlerFactory.js index 3550987c..3d2f37d1 100644 --- a/lib/grpcServer/handlers/platform/getDocumentsHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/getDocumentsHandlerFactory.js @@ -11,7 +11,6 @@ const { const { v0: { GetDocumentsResponse, - Proof, }, } = require('@dashevo/dapi-grpc'); @@ -111,12 +110,11 @@ function getDocumentsHandlerFactory(driveClient, handleAbciResponseError) { const prove = request.getProve(); - let documentBuffers; - let proofObject; + let documentResponseBuffer; try { - ({ data: documentBuffers, proof: proofObject } = await driveClient.fetchDocuments( + documentResponseBuffer = await driveClient.fetchDocuments( dataContractId, documentType, options, prove, - )); + ); } catch (e) { if (e instanceof AbciResponseError) { handleAbciResponseError(e); @@ -124,19 +122,7 @@ function getDocumentsHandlerFactory(driveClient, handleAbciResponseError) { throw e; } - const response = new GetDocumentsResponse(); - - response.setDocumentsList(documentBuffers); - - if (prove === true) { - const proof = new Proof(); - proof.setRootTreeProof(proofObject.rootTreeProof); - proof.setStoreTreeProof(proofObject.storeTreeProof); - - response.setProof(proof); - } - - return response; + return GetDocumentsResponse.deserializeBinary(documentResponseBuffer); } return getDocumentsHandler; diff --git a/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js b/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js index 669942d4..83d3a6ba 100644 --- a/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js @@ -9,7 +9,6 @@ const { const { v0: { GetIdentitiesByPublicKeyHashesResponse, - Proof, }, } = require('@dashevo/dapi-grpc'); @@ -40,11 +39,10 @@ function getIdentitiesByPublicKeyHashesHandlerFactory( const prove = request.getProve(); - let identities; - let proofObject; + let identitiesResponseBuffer; try { - ({ data: identities, proof: proofObject } = await driveClient - .fetchIdentitiesByPublicKeyHashes(publicKeyHashes, prove)); + identitiesResponseBuffer = await driveClient + .fetchIdentitiesByPublicKeyHashes(publicKeyHashes, prove); } catch (e) { if (e instanceof AbciResponseError) { handleAbciResponseError(e); @@ -52,21 +50,7 @@ function getIdentitiesByPublicKeyHashesHandlerFactory( throw e; } - const response = new GetIdentitiesByPublicKeyHashesResponse(); - - response.setIdentitiesList( - identities, - ); - - if (prove === true) { - const proof = new Proof(); - proof.setRootTreeProof(proofObject.rootTreeProof); - proof.setStoreTreeProof(proofObject.storeTreeProof); - - response.setProof(proof); - } - - return response; + return GetIdentitiesByPublicKeyHashesResponse.deserializeBinary(identitiesResponseBuffer); } return getIdentitiesByPublicKeyHashesHandler; diff --git a/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js b/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js index c95380a6..f77e2963 100644 --- a/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js @@ -9,7 +9,6 @@ const { const { v0: { GetIdentityResponse, - Proof, }, } = require('@dashevo/dapi-grpc'); @@ -40,12 +39,11 @@ function getIdentityHandlerFactory(driveClient, handleAbciResponseError) { const prove = request.getProve(); - let identityBuffer; - let proofObject; + let identityResponseBuffer; try { - ({ data: identityBuffer, proof: proofObject } = await driveClient - .fetchIdentity(id, prove)); + identityResponseBuffer = await driveClient + .fetchIdentity(id, prove); } catch (e) { if (e instanceof AbciResponseError) { handleAbciResponseError(e); @@ -53,19 +51,7 @@ function getIdentityHandlerFactory(driveClient, handleAbciResponseError) { throw e; } - const response = new GetIdentityResponse(); - - response.setIdentity(identityBuffer); - - if (prove === true) { - const proof = new Proof(); - proof.setRootTreeProof(proofObject.rootTreeProof); - proof.setStoreTreeProof(proofObject.storeTreeProof); - - response.setProof(proof); - } - - return response; + return GetIdentityResponse.deserializeBinary(identityResponseBuffer); } return getIdentityHandler; diff --git a/lib/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js b/lib/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js index 8a7e1d93..76885839 100644 --- a/lib/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js @@ -9,7 +9,6 @@ const { const { v0: { GetIdentityIdsByPublicKeyHashesResponse, - Proof, }, } = require('@dashevo/dapi-grpc'); @@ -40,15 +39,14 @@ function getIdentityIdsByPublicKeyHashesHandlerFactory( const prove = request.getProve(); - let identityIds; - let proofObject; + let identityIdsResponseBuffer; try { - ({ data: identityIds, proof: proofObject } = await driveClient + identityIdsResponseBuffer = await driveClient .fetchIdentityIdsByPublicKeyHashes( publicKeyHashes, prove, - )); + ); } catch (e) { if (e instanceof AbciResponseError) { handleAbciResponseError(e); @@ -56,21 +54,7 @@ function getIdentityIdsByPublicKeyHashesHandlerFactory( throw e; } - const response = new GetIdentityIdsByPublicKeyHashesResponse(); - - response.setIdentityIdsList( - identityIds, - ); - - if (prove === true) { - const proof = new Proof(); - proof.setRootTreeProof(proofObject.rootTreeProof); - proof.setStoreTreeProof(proofObject.storeTreeProof); - - response.setProof(proof); - } - - return response; + return GetIdentityIdsByPublicKeyHashesResponse.deserializeBinary(identityIdsResponseBuffer); } return getIdentityIdsByPublicKeyHashesHandler; From 2de0b8105ad1e77f951aea8fa7afd646a01cf6e0 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 17 Jun 2021 10:42:44 +0500 Subject: [PATCH 03/10] chore: update tests --- test/unit/externalApis/drive/DriveClient.js | 22 +++++-------------- .../platform/getDataContractHandlerFactory.js | 19 +++++++++++----- .../platform/getDocumentsHandlerFactory.js | 19 +++++++++++----- ...entitiesByPublicKeyHashesHandlerFactory.js | 20 +++++++++++------ .../platform/getIdentityHandlerFactory.js | 20 ++++++++++++----- ...ntityIdsByPublicKeyHashesHandlerFactory.js | 22 ++++++++++++------- 6 files changed, 73 insertions(+), 49 deletions(-) diff --git a/test/unit/externalApis/drive/DriveClient.js b/test/unit/externalApis/drive/DriveClient.js index c85f5a45..1eecc721 100644 --- a/test/unit/externalApis/drive/DriveClient.js +++ b/test/unit/externalApis/drive/DriveClient.js @@ -103,10 +103,7 @@ describe('DriveClient', () => { data: cbor.encode({ id: contractId }).toString('hex'), // cbor encoded empty object prove: 'true', }); - expect(result).to.be.deep.equal({ - data, - proof, - }); + expect(result).to.be.deep.equal(buffer); }); }); @@ -138,10 +135,7 @@ describe('DriveClient', () => { data: cbor.encode({ ...options, contractId, type }).toString('hex'), // cbor encoded empty object prove: 'true', }); - expect(result).to.be.deep.equal({ - data, - proof, - }); + expect(result).to.be.deep.equal(buffer); }); }); @@ -166,7 +160,7 @@ describe('DriveClient', () => { path: '/identities', data: cbor.encode({ id: identityId }).toString('hex'), // cbor encoded empty object }); - expect(result).to.be.deep.equal({ data }); + expect(result).to.be.deep.equal(buffer); }); }); @@ -194,10 +188,7 @@ describe('DriveClient', () => { data: cbor.encode({ publicKeyHashes }).toString('hex'), prove: 'true', }); - expect(result).to.be.deep.equal({ - data: [identity], - proof, - }); + expect(result).to.be.deep.equal(buffer); }); }); @@ -224,10 +215,7 @@ describe('DriveClient', () => { data: cbor.encode({ publicKeyHashes }).toString('hex'), prove: 'true', }); - expect(result).to.be.deep.equal({ - data: [identityId], - proof, - }); + expect(result).to.be.deep.equal(buffer); }); }); diff --git a/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.js b/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.js index b9b48c5f..84d2f5c3 100644 --- a/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.js +++ b/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.js @@ -34,6 +34,8 @@ describe('getDataContractHandlerFactory', () => { let dataContractFixture; let handleAbciResponseErrorMock; let proofFixture; + let proofMock; + let response; beforeEach(function beforeEach() { id = generateRandomIdentifier(); @@ -50,13 +52,16 @@ describe('getDataContractHandlerFactory', () => { storeTreeProof: Buffer.alloc(1, 2), }; - const response = { - data: dataContractFixture.toBuffer(), - proof: proofFixture, - }; + proofMock = new Proof(); + proofMock.setRootTreeProof(proofFixture.rootTreeProof); + proofMock.setStoreTreeProof(proofFixture.storeTreeProof); + + response = new GetDataContractResponse(); + response.setProof(proofMock); + response.setDataContract(dataContractFixture.toBuffer()); driveStateRepositoryMock = { - fetchDataContract: this.sinon.stub().resolves(response), + fetchDataContract: this.sinon.stub().resolves(response.serializeBinary()), }; handleAbciResponseErrorMock = this.sinon.stub(); @@ -73,7 +78,7 @@ describe('getDataContractHandlerFactory', () => { expect(result).to.be.an.instanceOf(GetDataContractResponse); const contractBinary = result.getDataContract(); - expect(contractBinary).to.be.an.instanceOf(Buffer); + expect(contractBinary).to.be.an.instanceOf(Uint8Array); expect(handleAbciResponseErrorMock).to.not.be.called(); @@ -93,6 +98,8 @@ describe('getDataContractHandlerFactory', () => { it('should not include proof', async () => { request.getProve.returns(false); + response.setProof(null); + driveStateRepositoryMock.fetchDataContract.resolves(response.serializeBinary()); const result = await getDataContractHandler(call); diff --git a/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.js b/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.js index 22ac6a6f..25005df7 100644 --- a/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.js +++ b/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.js @@ -43,6 +43,8 @@ describe('getDocumentsHandlerFactory', () => { let handleAbciResponseErrorMock; let documentsSerialized; let proofFixture; + let response; + let proofMock; beforeEach(function beforeEach() { dataContractId = generateRandomIdentifier(); @@ -76,13 +78,16 @@ describe('getDocumentsHandlerFactory', () => { storeTreeProof: Buffer.alloc(1, 2), }; - const response = { - data: documentsSerialized, - proof: proofFixture, - }; + proofMock = new Proof(); + proofMock.setRootTreeProof(proofFixture.rootTreeProof); + proofMock.setStoreTreeProof(proofFixture.storeTreeProof); + + response = new GetDocumentsResponse(); + response.setProof(proofMock); + response.setDocumentsList(documentsSerialized); driveStateRepositoryMock = { - fetchDocuments: this.sinon.stub().resolves(response), + fetchDocuments: this.sinon.stub().resolves(response.serializeBinary()), }; handleAbciResponseErrorMock = this.sinon.stub(); @@ -94,6 +99,10 @@ describe('getDocumentsHandlerFactory', () => { }); it('should return valid result', async () => { + response.setProof(null); + + driveStateRepositoryMock.fetchDocuments.resolves(response.serializeBinary()); + const result = await getDocumentsHandler(call); expect(result).to.be.an.instanceOf(GetDocumentsResponse); diff --git a/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js b/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js index 5cd29ec5..057521fb 100644 --- a/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js +++ b/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js @@ -31,6 +31,8 @@ describe('getIdentitiesByPublicKeyHashesHandlerFactory', () => { let identity; let publicKeyHash; let proofFixture; + let proofMock; + let response; beforeEach(function beforeEach() { publicKeyHash = '556c2910d46fda2b327ef9d9bda850cc84d30db0'; @@ -50,15 +52,16 @@ describe('getIdentitiesByPublicKeyHashesHandlerFactory', () => { storeTreeProof: Buffer.alloc(1, 2), }; - const response = { - data: [ - identity.toBuffer(), - ], - proof: proofFixture, - }; + proofMock = new Proof(); + proofMock.setRootTreeProof(proofFixture.rootTreeProof); + proofMock.setStoreTreeProof(proofFixture.storeTreeProof); + + response = new GetIdentitiesByPublicKeyHashesResponse(); + response.setProof(proofMock); + response.setIdentitiesList([identity.toBuffer()]); driveStateRepositoryMock = { - fetchIdentitiesByPublicKeyHashes: this.sinon.stub().resolves(response), + fetchIdentitiesByPublicKeyHashes: this.sinon.stub().resolves(response.serializeBinary()), }; getIdentitiesByPublicKeyHashesHandler = getIdentitiesByPublicKeyHashesHandlerFactory( @@ -68,6 +71,9 @@ describe('getIdentitiesByPublicKeyHashesHandlerFactory', () => { }); it('should return valid result', async () => { + response.setProof(null); + driveStateRepositoryMock.fetchIdentitiesByPublicKeyHashes.resolves(response.serializeBinary()); + const result = await getIdentitiesByPublicKeyHashesHandler(call); expect(result).to.be.an.instanceOf(GetIdentitiesByPublicKeyHashesResponse); diff --git a/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.js b/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.js index f4d96824..6b9ab8d8 100644 --- a/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.js +++ b/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.js @@ -32,6 +32,8 @@ describe('getIdentityHandlerFactory', () => { let getIdentityHandler; let identity; let proofFixture; + let proofMock; + let response; beforeEach(function beforeEach() { id = generateRandomIdentifier(); @@ -47,15 +49,18 @@ describe('getIdentityHandlerFactory', () => { storeTreeProof: Buffer.alloc(1, 2), }; - handleAbciResponseErrorMock = this.sinon.stub(); + proofMock = new Proof(); + proofMock.setRootTreeProof(proofFixture.rootTreeProof); + proofMock.setStoreTreeProof(proofFixture.storeTreeProof); - const response = { - data: identity.toBuffer(), - proof: proofFixture, - }; + response = new GetIdentityResponse(); + response.setProof(proofMock); + response.setIdentity(identity.toBuffer()); + + handleAbciResponseErrorMock = this.sinon.stub(); driveStateRepositoryMock = { - fetchIdentity: this.sinon.stub().resolves(response), + fetchIdentity: this.sinon.stub().resolves(response.serializeBinary()), }; getIdentityHandler = getIdentityHandlerFactory( @@ -65,6 +70,9 @@ describe('getIdentityHandlerFactory', () => { }); it('should return valid result', async () => { + response.setProof(null); + driveStateRepositoryMock.fetchIdentity.resolves(response.serializeBinary()); + const result = await getIdentityHandler(call); expect(result).to.be.an.instanceOf(GetIdentityResponse); diff --git a/test/unit/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js b/test/unit/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js index 5dee6e90..2b21f591 100644 --- a/test/unit/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js +++ b/test/unit/grpcServer/handlers/platform/getIdentityIdsByPublicKeyHashesHandlerFactory.js @@ -31,6 +31,8 @@ describe('getIdentityIdsByPublicKeyHashesHandlerFactory', () => { let identity; let publicKeyHash; let proofFixture; + let proofMock; + let response; beforeEach(function beforeEach() { publicKeyHash = '556c2910d46fda2b327ef9d9bda850cc84d30db0'; @@ -51,15 +53,16 @@ describe('getIdentityIdsByPublicKeyHashesHandlerFactory', () => { storeTreeProof: Buffer.alloc(1, 2), }; - const response = { - data: [ - identity.getId(), - ], - proof: proofFixture, - }; + proofMock = new Proof(); + proofMock.setRootTreeProof(proofFixture.rootTreeProof); + proofMock.setStoreTreeProof(proofFixture.storeTreeProof); + + response = new GetIdentityIdsByPublicKeyHashesResponse(); + response.setProof(proofMock); + response.setIdentityIdsList([identity.getId().toBuffer()]); driveStateRepositoryMock = { - fetchIdentityIdsByPublicKeyHashes: this.sinon.stub().resolves(response), + fetchIdentityIdsByPublicKeyHashes: this.sinon.stub().resolves(response.serializeBinary()), }; getIdentityIdsByPublicKeyHashesHandler = getIdentityIdsByPublicKeyHashesHandlerFactory( @@ -69,11 +72,14 @@ describe('getIdentityIdsByPublicKeyHashesHandlerFactory', () => { }); it('should return valid result', async () => { + response.setProof(null); + driveStateRepositoryMock.fetchIdentityIdsByPublicKeyHashes.resolves(response.serializeBinary()); + const result = await getIdentityIdsByPublicKeyHashesHandler(call); expect(result).to.be.an.instanceOf(GetIdentityIdsByPublicKeyHashesResponse); - expect(result.getIdentityIdsList()).to.deep.equal( + expect(result.getIdentityIdsList()).to.have.deep.members( [identity.getId()], ); From 206e7a6338467bb578991daa88f7a4ca1fc71936 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Thu, 17 Jun 2021 16:32:47 +0500 Subject: [PATCH 04/10] chore: workflow --- .github/workflows/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/.env b/.github/workflows/.env index 591c2954..4e34bf60 100644 --- a/.github/workflows/.env +++ b/.github/workflows/.env @@ -1,4 +1,4 @@ -#DRIVE_BRANCH= +DRIVE_BRANCH=feat/additional-info-for-proofs DASHMATE_BRANCH=v0.20-dev #TEST_SUITE_BRANCH= #SDK_BRANCH= From 5d4297c057d5730dfa3e5ca1e0b95e8f1f02d592 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Fri, 18 Jun 2021 10:55:11 +0500 Subject: [PATCH 05/10] chore: populate proof in waitForStateTransitionResultHandler --- .../platform/waitForStateTransitionResultHandlerFactory.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js b/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js index 1e70c176..ea9fd9da 100644 --- a/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js @@ -117,6 +117,8 @@ function waitForStateTransitionResultHandlerFactory( proof.setRootTreeProof(proofObject.rootTreeProof); proof.setStoreTreeProof(proofObject.storeTreeProof); + proof.setSignatureLlmqHash(proofObject.signatureLlmqHash); + proof.setSignature(proofObject.signature); response.setProof(proof); } From fb81a42ea80f99e964d1728c1cfa59c72409f659 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Fri, 18 Jun 2021 14:50:21 +0500 Subject: [PATCH 06/10] chore: set metadata --- .../drive/fetchProofForStateTransitionFactory.js | 9 +++++---- .../waitForStateTransitionResultHandlerFactory.js | 10 +++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/externalApis/drive/fetchProofForStateTransitionFactory.js b/lib/externalApis/drive/fetchProofForStateTransitionFactory.js index b8b9b448..0bc364de 100644 --- a/lib/externalApis/drive/fetchProofForStateTransitionFactory.js +++ b/lib/externalApis/drive/fetchProofForStateTransitionFactory.js @@ -12,21 +12,22 @@ function fetchProofForStateTransitionFactory(driveClient) { const modifiedIds = stateTransition.getModifiedDataIds(); let proof; + let metadata; if (stateTransition.isDocumentStateTransition()) { - ({ documentsProof: proof } = await driveClient.fetchProofs( + ({ documentsProof: proof, metadata } = await driveClient.fetchProofs( { documentIds: modifiedIds }, )); } else if (stateTransition.isIdentityStateTransition()) { - ({ identitiesProof: proof } = await driveClient.fetchProofs( + ({ identitiesProof: proof, metadata } = await driveClient.fetchProofs( { identityIds: modifiedIds }, )); } else if (stateTransition.isDataContractStateTransition()) { - ({ dataContractsProof: proof } = await driveClient.fetchProofs( + ({ dataContractsProof: proof, metadata } = await driveClient.fetchProofs( { dataContractIds: modifiedIds }, )); } - return proof; + return { proof, metadata }; } return fetchProofForStateTransition; diff --git a/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js b/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js index ea9fd9da..e24df4d9 100644 --- a/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js @@ -12,6 +12,7 @@ const { WaitForStateTransitionResultResponse, StateTransitionBroadcastError, Proof, + ResponseMetadata, }, } = require('@dashevo/dapi-grpc'); @@ -111,7 +112,14 @@ function waitForStateTransitionResultHandlerFactory( { skipValidation: true }, ); - const proofObject = await fetchProofForStateTransition(stateTransition); + const { proof: proofObject, metadata } = await fetchProofForStateTransition(stateTransition); + + const responseMetadata = new ResponseMetadata(); + + responseMetadata.setHeight(metadata.height); + responseMetadata.setCoreChainLockedHieght(metadata.coreChainLockedHeight); + + response.setMetadata(responseMetadata); const proof = new Proof(); From 5edf35248219f9cfa1bfb422fa62a7f636a3cf00 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Tue, 22 Jun 2021 21:19:25 +0500 Subject: [PATCH 07/10] chore: fix DriveStateRepo --- lib/dpp/DriveStateRepository.js | 16 ++++++++++++++-- ...waitForStateTransitionResultHandlerFactory.js | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/dpp/DriveStateRepository.js b/lib/dpp/DriveStateRepository.js index 87a5784e..fbc27cbd 100644 --- a/lib/dpp/DriveStateRepository.js +++ b/lib/dpp/DriveStateRepository.js @@ -1,3 +1,9 @@ +const { + v0: { + GetDataContractResponse, + }, +} = require('@dashevo/dapi-grpc'); + /** * @implements StateRepository */ @@ -17,11 +23,17 @@ class DriveStateRepository { * @return {Promise} */ async fetchDataContract(contractIdentifier) { - const driveResponse = await this.driveClient.fetchDataContract( + const dataContractProtoBuffer = await this.driveClient.fetchDataContract( contractIdentifier, false, ); - return this.dpp.dataContract.createFromBuffer(driveResponse.data); + const dataContractResponse = GetDataContractResponse.deserializeBinary( + dataContractProtoBuffer, + ); + + return this.dpp.dataContract.createFromBuffer( + dataContractResponse.getDataContract(), + ); } } diff --git a/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js b/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js index e24df4d9..a74cf11f 100644 --- a/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js +++ b/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js @@ -117,7 +117,7 @@ function waitForStateTransitionResultHandlerFactory( const responseMetadata = new ResponseMetadata(); responseMetadata.setHeight(metadata.height); - responseMetadata.setCoreChainLockedHieght(metadata.coreChainLockedHeight); + responseMetadata.setCoreChainLockedHeight(metadata.coreChainLockedHeight); response.setMetadata(responseMetadata); From aa183fa46ec5872083837a3d5150dfb1e0c2d107 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Tue, 22 Jun 2021 21:26:49 +0500 Subject: [PATCH 08/10] chore: update workflow --- .github/workflows/.env | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/.env b/.github/workflows/.env index 3b380c99..4e34bf60 100644 --- a/.github/workflows/.env +++ b/.github/workflows/.env @@ -1,4 +1,4 @@ -DRIVE_BRANCH=update-dpp -DASHMATE_BRANCH=update-dpp -TEST_SUITE_BRANCH=update-dpp -SDK_BRANCH=update-dpp +DRIVE_BRANCH=feat/additional-info-for-proofs +DASHMATE_BRANCH=v0.20-dev +#TEST_SUITE_BRANCH= +#SDK_BRANCH= From e1e168f6af11c02fa780b4ad9eb5ce1ab209ed6c Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Tue, 22 Jun 2021 21:47:39 +0500 Subject: [PATCH 09/10] chore: update tests --- .../dpp/DriveStateRepository.spec.js | 21 +++++++++++++------ ...tForStateTransitionResultHandlerFactory.js | 8 ++++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/test/integration/dpp/DriveStateRepository.spec.js b/test/integration/dpp/DriveStateRepository.spec.js index dbe9a78d..10da8960 100644 --- a/test/integration/dpp/DriveStateRepository.spec.js +++ b/test/integration/dpp/DriveStateRepository.spec.js @@ -10,6 +10,11 @@ const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRa const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); const DriveStateRepository = require('../../../lib/dpp/DriveStateRepository'); +const { + v0: { + GetDataContractResponse, + }, +} = require('@dashevo/dapi-grpc'); chai.use(chaiAsPromised); chai.use(dirtyChai); @@ -21,6 +26,7 @@ describe('DriveStateRepository', () => { let driveClientMock; let stateRepository; let dataContractFixture; + let proto; beforeEach(async function before() { dataContractFixture = getDataContractFixture(); @@ -29,10 +35,13 @@ describe('DriveStateRepository', () => { await dpp.initialize(); sinon.spy(dpp.dataContract, 'createFromBuffer'); + proto = new GetDataContractResponse(); + proto.setDataContract(dataContractFixture.toBuffer()); + driveClientMock = sinon.stub(); - driveClientMock.fetchDataContract = this.sinon.stub().resolves({ - data: dataContractFixture.toBuffer(), - }); + driveClientMock.fetchDataContract = this.sinon.stub().resolves( + proto.serializeBinary(), + ); stateRepository = new DriveStateRepository(driveClientMock, dpp); }); @@ -45,9 +54,9 @@ describe('DriveStateRepository', () => { expect(result.toObject()).to.be.deep.equal(dataContractFixture.toObject()); expect(dpp.dataContract.createFromBuffer).to.be.calledOnce(); - expect(dpp.dataContract.createFromBuffer).to.be.calledWithExactly( - dataContractFixture.toBuffer(), - ); + expect(dpp.dataContract.createFromBuffer.getCall(0).args).to.have.deep.members([ + proto.getDataContract_asU8(), + ]); expect(driveClientMock.fetchDataContract).to.be.calledOnce(); expect(driveClientMock.fetchDataContract).to.be.calledWithExactly(contractId, false); diff --git a/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js b/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js index 44d16042..3d7dfc51 100644 --- a/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js +++ b/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js @@ -124,7 +124,13 @@ describe('waitForStateTransitionResultHandlerFactory', () => { dppMock.stateTransition.createFromBuffer.resolves(stateTransitionFixture); driveClientMock = { - fetchProofs: this.sinon.stub().resolves({ identitiesProof: proofFixture }), + fetchProofs: this.sinon.stub().resolves({ + identitiesProof: proofFixture, + metadata: { + height: 42, + coreChainLockedHeight: 41, + }, + }), }; blockchainListener = new BlockchainListener(tenderDashWsClientMock); From df08296c8396b101c0f326b8123f8a90ee24eb17 Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Tue, 22 Jun 2021 22:16:43 +0500 Subject: [PATCH 10/10] chore: linter fix --- test/integration/dpp/DriveStateRepository.spec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/dpp/DriveStateRepository.spec.js b/test/integration/dpp/DriveStateRepository.spec.js index 10da8960..847ad420 100644 --- a/test/integration/dpp/DriveStateRepository.spec.js +++ b/test/integration/dpp/DriveStateRepository.spec.js @@ -8,7 +8,6 @@ const DashPlatformProtocol = require('@dashevo/dpp'); const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier'); const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const DriveStateRepository = require('../../../lib/dpp/DriveStateRepository'); const { v0: { @@ -16,6 +15,9 @@ const { }, } = require('@dashevo/dapi-grpc'); +const DriveStateRepository = require('../../../lib/dpp/DriveStateRepository'); + + chai.use(chaiAsPromised); chai.use(dirtyChai);