diff --git a/src/models/StratumV1Client.ts b/src/models/StratumV1Client.ts index b43880f..fa83cfd 100644 --- a/src/models/StratumV1Client.ts +++ b/src/models/StratumV1Client.ts @@ -54,6 +54,8 @@ export class StratumV1Client { private buffer: string = ''; + private miningSubmissionHashes = new Set() + constructor( public readonly socket: Socket, private readonly stratumV1JobsService: StratumV1JobsService, @@ -368,6 +370,9 @@ export class StratumV1Client { this.stratumSubscription = this.stratumV1JobsService.newMiningJob$.subscribe(async (jobTemplate) => { try { + if(jobTemplate.blockData.clearJobs){ + this.miningSubmissionHashes.clear(); + } await this.sendNewMiningJob(jobTemplate); } catch (e) { await this.socket.end(); @@ -466,6 +471,21 @@ export class StratumV1Client { } } + const submissionHash = submission.hash(); + if(this.miningSubmissionHashes.has(submissionHash)){ + const err = new StratumErrorMessage( + submission.id, + eStratumErrorCode.DuplicateShare, + 'Duplicate share').response(); + console.error(err); + const success = await this.write(err); + if (!success) { + return false; + } + return false; + }else{ + this.miningSubmissionHashes.add(submissionHash); + } const job = this.stratumV1JobsService.getJobById(submission.jobId); @@ -529,16 +549,6 @@ export class StratumV1Client { } catch (e) { console.log(e); - const err = new StratumErrorMessage( - submission.id, - eStratumErrorCode.DuplicateShare, - 'Duplicate share').response(); - console.error(err); - const success = await this.write(err); - if (!success) { - return false; - } - return false; } if (submissionDifficulty > this.entity.bestDifficulty) { diff --git a/src/models/stratum-messages/MiningSubmitMessage.ts b/src/models/stratum-messages/MiningSubmitMessage.ts index 127689c..9c5f00a 100644 --- a/src/models/stratum-messages/MiningSubmitMessage.ts +++ b/src/models/stratum-messages/MiningSubmitMessage.ts @@ -3,6 +3,8 @@ import { ArrayMaxSize, ArrayMinSize, IsArray, IsString } from 'class-validator'; import { eRequestMethod } from '../enums/eRequestMethod'; import { StratumBaseMessage } from './StratumBaseMessage'; +import * as bitcoinjs from 'bitcoinjs-lib'; + export class MiningSubmitMessage extends StratumBaseMessage { @@ -63,6 +65,11 @@ export class MiningSubmitMessage extends StratumBaseMessage { }; } + public hash(): string{ + const buffer = Buffer.from(this.versionMask + this.nonce + this.extraNonce2 + this.ntime + this.jobId); + return bitcoinjs.crypto.hash256(buffer).toString('base64'); + } +