From f49e7b5b8fb17bd670470c1a6948baa0eae1be3b Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 3 Aug 2026 10:58:23 -0400 Subject: [PATCH] Accept BIP320 version rolling in SV2 shares --- src/models/StratumV2Client.spec.ts | 5 +++-- src/models/StratumV2Client.ts | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/models/StratumV2Client.spec.ts b/src/models/StratumV2Client.spec.ts index a54e01f..caf1185 100644 --- a/src/models/StratumV2Client.spec.ts +++ b/src/models/StratumV2Client.spec.ts @@ -991,7 +991,7 @@ describe('StratumV2Client extended channels', () => { .toBe(parseInt(activation.bits, 16)); }); - it('validates fixed/rolling versions, required bits, and the advertised minimum nTime', async () => { + it('validates BIP320 version rolling, required bits, and the advertised minimum nTime', async () => { const { client } = await createClient(); const now = process.hrtime.bigint(); const context = { @@ -1007,11 +1007,12 @@ describe('StratumV2Client extended channels', () => { }; expect((client as any).isSubmissionHeaderValid(context, 0x20000004, 100)).toBe(true); - expect((client as any).isSubmissionHeaderValid(context, 0x20002004, 100)).toBe(false); + expect((client as any).isSubmissionHeaderValid(context, 0x20002004, 100)).toBe(true); expect((client as any).isSubmissionHeaderValid(context, 0x20000004, 99)).toBe(false); expect((client as any).isSubmissionHeaderValid(context, 0x20000004, 101)).toBe(true); expect((client as any).isSubmissionHeaderValid(context, 0x20000004, 0xffffffff)).toBe(true); expect((client as any).isSubmissionHeaderValid(context, 0x20000004, 0x1_0000_0000)).toBe(false); + expect((client as any).isSubmissionHeaderValid(context, 0x00000004, 100)).toBe(false); (client as any).versionRollingEnabled = true; expect((client as any).isSubmissionHeaderValid(context, 0x20002004, 100)).toBe(true); diff --git a/src/models/StratumV2Client.ts b/src/models/StratumV2Client.ts index e3623a6..b323d5f 100644 --- a/src/models/StratumV2Client.ts +++ b/src/models/StratumV2Client.ts @@ -2088,11 +2088,11 @@ export class StratumV2Client { ): boolean { const submitted = submittedVersion >>> 0; const base = headerContext.baseVersion >>> 0; - if (this.versionRollingEnabled) { - if (((submitted ^ base) & BIP320_CONSENSUS_VERSION_MASK) !== 0) { - return false; - } - } else if (submitted !== base) { + // Some SV2 clients roll BIP320 general-purpose version bits even when + // they did not explicitly require version rolling during setup. Those + // bits are non-consensus signalling space; reject only changes outside + // that mask and continue enforcing required bits below. + if (((submitted ^ base) & BIP320_CONSENSUS_VERSION_MASK) !== 0) { return false; } if ((submitted & headerContext.requiredVersionBits) !== headerContext.requiredVersionBits) {