diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 937c7a5d..bf85dd9b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -114,6 +114,7 @@ dependencies: istanbul-api: 1.3.7 jsdoc: 3.6.10 jsverify: 0.8.4 + long: 5.2.3 merge-stream: 2.0.0 mocha: 9.1.3 mockery: 2.1.0 @@ -405,7 +406,7 @@ packages: dependencies: '@types/long': 4.0.2 lodash.camelcase: 4.3.0 - long: 5.2.0 + long: 5.2.3 protobufjs: 6.11.2 yargs: 16.2.0 dev: false @@ -4449,8 +4450,8 @@ packages: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.0: - resolution: {integrity: sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==} + /long/5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false /loose-envify/1.4.0: @@ -5537,7 +5538,7 @@ packages: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 16.11.33 - long: 5.2.0 + long: 5.2.3 dev: false /pseudomap/1.0.2: @@ -7348,7 +7349,7 @@ packages: dev: false file:projects/fabric-shim.tgz: - resolution: {integrity: sha512-K1Pj+qTUOLtW7ciRo2Q/o2xqtgj2CTl+nK/PxorYvLv7uyEfPTQmv1JSFZq8V1yHaCoNDBY4Ccy55vCi6Wc0jg==, tarball: file:projects/fabric-shim.tgz} + resolution: {integrity: sha512-KT+4EdqGZZT4CSrD8nvbPtIza0k88vAfS6GuJiA6qvfekLIBiX3Yc46OsXugJ0+X+/MAOBaKnI4kRNL4Butvnw==, tarball: file:projects/fabric-shim.tgz} name: '@rush-temp/fabric-shim' version: 0.0.0 dependencies: @@ -7366,6 +7367,7 @@ packages: eslint: 6.8.0 fast-safe-stringify: 2.1.1 fs-extra: 10.1.0 + long: 5.2.3 mocha: 9.1.3 mockery: 2.1.0 nyc: 15.1.0 diff --git a/libraries/fabric-shim/lib/stub.js b/libraries/fabric-shim/lib/stub.js index 6e92773c..1dae7847 100644 --- a/libraries/fabric-shim/lib/stub.js +++ b/libraries/fabric-shim/lib/stub.js @@ -12,6 +12,7 @@ const {msp, peer, common} = require('@hyperledger/fabric-protos'); const util = require('util'); const crypto = require('crypto'); const {ChaincodeEvent} = require('@hyperledger/fabric-protos/lib/peer'); +const Long = require('long'); const logger = require('./logger').getLogger('lib/stub.js'); @@ -416,7 +417,10 @@ class ChaincodeStub { * Object returned: { seconds: [Long] { low: [int32], high: [int32], unsigned: [bool] }, nanos: [int32] } */ getTxTimestamp() { - return this.txTimestamp; + return { + nanos: this.txTimestamp.getNanos(), + seconds: Long.fromNumber(this.txTimestamp.getSeconds(), true), + }; } /** @@ -425,8 +429,7 @@ class ChaincodeStub { * client's date, and will have the same value across all endorsers. */ getDateTimestamp() { - const date = new Date(this.txTimestamp.seconds * 1e3 + this.txTimestamp.nanos / 1e6); - return date; + return this.txTimestamp.toDate(); } /** diff --git a/libraries/fabric-shim/package.json b/libraries/fabric-shim/package.json index 99f2b9b9..ec3da134 100644 --- a/libraries/fabric-shim/package.json +++ b/libraries/fabric-shim/package.json @@ -63,6 +63,7 @@ "fabric-shim-api": "2.5.3", "fast-safe-stringify": "^2.1.1", "fs-extra": "^10.0.1", + "long": "^5.2.3", "reflect-metadata": "^0.1.13", "winston": "^3.7.2", "yargs": "^17.4.0", diff --git a/libraries/fabric-shim/test/unit/stub.js b/libraries/fabric-shim/test/unit/stub.js index add33f45..b907fc29 100644 --- a/libraries/fabric-shim/test/unit/stub.js +++ b/libraries/fabric-shim/test/unit/stub.js @@ -8,6 +8,8 @@ const sinon = require('sinon'); const chai = require('chai'); chai.use(require('chai-as-promised')); +const { Timestamp } = require('google-protobuf/google/protobuf/timestamp_pb'); +const Long = require('long'); // chai.config.truncateThreshold = 0; const expect = chai.expect; const rewire = require('rewire'); @@ -556,19 +558,31 @@ describe('Stub', () => { describe('getTxTimestamp', () => { it ('should return transaction timestamp', () => { const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', chaincodeInput); - - stub.txTimestamp = 'some timestamp'; - - expect(stub.getTxTimestamp()).to.deep.equal('some timestamp'); + const millis = Date.now(); + const seconds = Math.trunc(millis / 1000); + const nanos = (millis - (seconds * 1000)) * 1e6; + const timestamp = new Timestamp(); + timestamp.setSeconds(seconds); + timestamp.setNanos(nanos); + stub.txTimestamp = timestamp; + + const actual = stub.getTxTimestamp(); + + expect(actual).to.deep.include({ + nanos, + seconds: Long.fromNumber(seconds, true), + }); }); }); describe('getDateTimestamp', () => { it ('should return transaction date as Node.js Date object', () => { const stub = new Stub('dummyClient', 'dummyChannelId', 'dummyTxid', chaincodeInput); - stub.txTimestamp = {seconds: 1606233385, nanos: 54000000}; + const now = new Date(); + const timestamp = Timestamp.fromDate(now); + stub.txTimestamp = timestamp; - expect(stub.getDateTimestamp()).to.deep.equal(new Date(1606233385054)); + expect(stub.getDateTimestamp().toISOString()).to.equal(now.toISOString()); }); });