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

This commit is contained in:
Ben
2025-04-27 13:06:06 -04:00
parent e7f7cb52af
commit e1b88207d3
2 changed files with 27 additions and 10 deletions
+20 -10
View File
@@ -54,6 +54,8 @@ export class StratumV1Client {
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();
@@ -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); const job = this.stratumV1JobsService.getJobById(submission.jobId);
@@ -529,16 +549,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.error(err);
const success = await this.write(err);
if (!success) {
return false;
}
return false;
} }
if (submissionDifficulty > this.entity.bestDifficulty) { if (submissionDifficulty > this.entity.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');
}