Prevent duplicate share submissions - this is why we can't have nice things

This commit is contained in:
Ben
2025-04-27 13:07:24 -04:00
parent f39c0dc059
commit c1d8341c22
2 changed files with 28 additions and 11 deletions
+21 -11
View File
@@ -52,7 +52,9 @@ export class StratumV1Client {
//public hashRate: number = 0; //public hashRate: number = 0;
private buffer: string = ''; private buffer: string = '';
private miningSubmissionHashes = new Set<string>()
constructor( constructor(
public readonly socket: Socket, public readonly socket: Socket,
private readonly stratumV1JobsService: StratumV1JobsService, private readonly stratumV1JobsService: StratumV1JobsService,
@@ -368,6 +370,9 @@ export class StratumV1Client {
this.stratumSubscription = this.stratumV1JobsService.newMiningJob$.subscribe(async (jobTemplate) => { this.stratumSubscription = this.stratumV1JobsService.newMiningJob$.subscribe(async (jobTemplate) => {
try { try {
if(jobTemplate.blockData.clearJobs){
this.miningSubmissionHashes.clear();
}
await this.sendNewMiningJob(jobTemplate); await this.sendNewMiningJob(jobTemplate);
} catch (e) { } catch (e) {
await this.socket.end(); await this.socket.end();
@@ -476,6 +481,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); const job = this.stratumV1JobsService.getJobById(submission.jobId);
@@ -554,16 +574,6 @@ export class StratumV1Client {
} catch (e) { } catch (e) {
console.log(e); console.log(e);
const err = new StratumErrorMessage(
submission.id,
eStratumErrorCode.DuplicateShare,
'Duplicate share').response();
console.log(err);
const success = await this.write(err);
if (!success) {
return false;
}
return false;
} }
if (submissionDifficulty > this.clientEntity.bestDifficulty) { if (submissionDifficulty > this.clientEntity.bestDifficulty) {
@@ -3,6 +3,8 @@ import { ArrayMaxSize, ArrayMinSize, IsArray, IsString } from 'class-validator';
import { eRequestMethod } from '../enums/eRequestMethod'; import { eRequestMethod } from '../enums/eRequestMethod';
import { StratumBaseMessage } from './StratumBaseMessage'; import { StratumBaseMessage } from './StratumBaseMessage';
import * as bitcoinjs from 'bitcoinjs-lib';
export class MiningSubmitMessage extends StratumBaseMessage { 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');
}