From 5e6bb5626f883be8c6c65b115dc69a85bfaacb7c Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Thu, 15 Jun 2023 00:10:58 -0400 Subject: [PATCH] testNonceValue working --- package-lock.json | 13 ++++ package.json | 1 + .../MiningSubmitMessage.spec.ts | 2 +- .../stratum-messages/MiningSubmitMessage.ts | 69 ++++++++++++------- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 145e57e..4c1392c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@types/big.js": "^6.1.6", "@types/express": "^4.17.13", "@types/jest": "29.5.1", "@types/node": "18.16.12", @@ -1832,6 +1833,12 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/big.js": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.6.tgz", + "integrity": "sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA==", + "dev": true + }, "node_modules/@types/bn.js": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", @@ -10265,6 +10272,12 @@ "@babel/types": "^7.20.7" } }, + "@types/big.js": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.6.tgz", + "integrity": "sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA==", + "dev": true + }, "@types/bn.js": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", diff --git a/package.json b/package.json index 1f5d76c..6ab498d 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@types/big.js": "^6.1.6", "@types/express": "^4.17.13", "@types/jest": "29.5.1", "@types/node": "18.16.12", diff --git a/src/models/stratum-messages/MiningSubmitMessage.spec.ts b/src/models/stratum-messages/MiningSubmitMessage.spec.ts index 3658324..1f180a8 100644 --- a/src/models/stratum-messages/MiningSubmitMessage.spec.ts +++ b/src/models/stratum-messages/MiningSubmitMessage.spec.ts @@ -18,7 +18,7 @@ describe('MiningSubmitMessage', () => { merkleRoot: "5bdc1968499c3393873edf8e07a1c3a50a97fc3a9d1a376bbf77087dd63778eb", ntime: 0x647025b5, target: 0x1705ae3a, - } as MiningJob, 0x0a029ed1); + } as MiningJob, 167943889); it('should be correct difficulty', () => { expect(value).toEqual(683); diff --git a/src/models/stratum-messages/MiningSubmitMessage.ts b/src/models/stratum-messages/MiningSubmitMessage.ts index 397788b..31149d8 100644 --- a/src/models/stratum-messages/MiningSubmitMessage.ts +++ b/src/models/stratum-messages/MiningSubmitMessage.ts @@ -42,9 +42,9 @@ export class MiningSubmitMessage extends StratumBaseMessage { } - testNonceValue(job: MiningJob, nonce: number, midstateIndex: number = 0): string { + testNonceValue(job: MiningJob, nonce: number, midstateIndex: number = 0): number { const truediffone = Big('26959535291011309493156476344723991336010898738574164086137773096960'); - let s64: Big, ds: number; + let s64: string; const header = Buffer.alloc(80); // TODO: Use the midstate hash instead of hashing the whole header @@ -56,43 +56,60 @@ export class MiningSubmitMessage extends StratumBaseMessage { rolledVersion = this.incrementBitmask(rolledVersion, job.versionMask); } - header.writeUInt32LE(rolledVersion, 0); - Buffer.from(job.prevhash, 'hex').copy(header, 4); - Buffer.from(job.merkleRoot, 'hex').copy(header, 36); - header.writeUInt32LE(job.ntime, 68); - header.writeUInt32LE(job.target, 72); - header.writeUInt32LE(nonce, 76); - console.log(header); + + header.writeInt32LE(rolledVersion, 0); + + const hexGroups = job.prevhash.match(/.{1,8}/g); + // Reverse each group and concatenate them + const reversedHexString = hexGroups + ?.map(group => group.match(/.{2}/g)?.reverse()?.join('')) + .join(''); + // Create the buffer from the reversed hex string + const buffer = Buffer.from(reversedHexString, 'hex'); + buffer.copy(header, 4, 0, 32); + + // const hexGroups2 = job.merkleRoot.match(/.{1,8}/g); + // // Reverse each group and concatenate them + // const reversedHexString2 = hexGroups2 + // ?.map(group => group.match(/.{2}/g)?.reverse()?.join('')) + // .join(''); + // // Create the buffer from the reversed hex string + // const buffer2 = Buffer.from(reversedHexString2, 'hex'); + // buffer2.copy(header, 36, 0, 32); + + Buffer.from(job.merkleRoot, 'hex').copy(header, 36, 0, 32) + + header.writeInt32LE(job.ntime, 68); + header.writeInt32LE(job.target, 72); + header.writeInt32LE(nonce, 76); + + const hashBuffer: Buffer = crypto.createHash('sha256').update(header).digest(); const hashResult: Buffer = crypto.createHash('sha256').update(hashBuffer).digest(); - s64 = this.le256todouble(hashResult); - ds = truediffone.div(s64); - return ds.toString(); + s64 = this.le256todouble(hashResult); + + return parseInt(truediffone.div(s64).toString()); + + } - private le256todouble(target: Buffer): Big { + private le256todouble(target: Buffer): string { + let number = BigInt(0); - const bits192 = new Big(6277101735386680763835789423207666416102355444464034512896); - const bits128 = new Big(340282366920938463463374607431768211456); - const bits64 = new Big(18446744073709551616); + // Iterate over the buffer bytes in reverse order + for (let i = target.length - 1; i >= 0; i--) { + // Shift the number 8 bits to the left and OR with the current byte + number = (number << BigInt(8)) | BigInt(target[i]); + } - const data64_3 = target.readBigUInt64LE(24); - const data64_2 = target.readBigUInt64LE(16); - const data64_1 = target.readBigUInt64LE(8); - const data64_0 = target.readBigUInt64LE(0); + return number.toString(); - const dcut64 = new Big(data64_3).times(bits192) - .plus(new Big(data64_2).times(bits128)) - .plus(new Big(data64_1).times(bits64)) - .plus(new Big(data64_0)); - - return dcut64; } public incrementBitmask(rolledVersion: number, versionMask: number) {