openttt 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -26
- package/dist/adaptive_switch.js +1 -1
- package/dist/auto_mint.js +2 -2
- package/dist/http_client.d.ts +98 -0
- package/dist/http_client.js +252 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/integrity_client.d.ts +39 -0
- package/dist/integrity_client.js +114 -0
- package/dist/time_synthesis.js +0 -4
- package/dist/ttt_client.d.ts +18 -0
- package/dist/ttt_client.js +20 -0
- package/package.json +6 -2
- package/dist/golay.d.ts +0 -6
- package/dist/golay.js +0 -166
- package/dist/grg_forward.d.ts +0 -11
- package/dist/grg_forward.js +0 -74
- package/dist/grg_inverse.d.ts +0 -7
- package/dist/grg_inverse.js +0 -100
- package/dist/grg_pipeline.d.ts +0 -13
- package/dist/grg_pipeline.js +0 -64
- package/dist/reed_solomon.d.ts +0 -12
- package/dist/reed_solomon.js +0 -179
- package/vendor/helm-crypto/golay.d.ts +0 -6
- package/vendor/helm-crypto/golay.js +0 -167
- package/vendor/helm-crypto/golay.js.map +0 -1
- package/vendor/helm-crypto/grg_forward.d.ts +0 -22
- package/vendor/helm-crypto/grg_forward.js +0 -89
- package/vendor/helm-crypto/grg_forward.js.map +0 -1
- package/vendor/helm-crypto/grg_inverse.d.ts +0 -16
- package/vendor/helm-crypto/grg_inverse.js +0 -118
- package/vendor/helm-crypto/grg_inverse.js.map +0 -1
- package/vendor/helm-crypto/grg_pipeline.d.ts +0 -13
- package/vendor/helm-crypto/grg_pipeline.js +0 -66
- package/vendor/helm-crypto/grg_pipeline.js.map +0 -1
- package/vendor/helm-crypto/index.d.ts +0 -5
- package/vendor/helm-crypto/index.js +0 -17
- package/vendor/helm-crypto/index.js.map +0 -1
- package/vendor/helm-crypto/logger.d.ts +0 -6
- package/vendor/helm-crypto/logger.js +0 -11
- package/vendor/helm-crypto/logger.js.map +0 -1
- package/vendor/helm-crypto/reed_solomon.d.ts +0 -37
- package/vendor/helm-crypto/reed_solomon.js +0 -210
- package/vendor/helm-crypto/reed_solomon.js.map +0 -1
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GrgPipeline = void 0;
|
|
4
|
-
const grg_forward_1 = require("./grg_forward");
|
|
5
|
-
const grg_inverse_1 = require("./grg_inverse");
|
|
6
|
-
const logger_1 = require("./logger");
|
|
7
|
-
class GrgPipeline {
|
|
8
|
-
/**
|
|
9
|
-
* Runs the full forward pipeline:
|
|
10
|
-
* Golomb-Rice -> RedStuff (Erasure) -> Golay(24,12)
|
|
11
|
-
*/
|
|
12
|
-
static processForward(data, chainId, poolAddress) {
|
|
13
|
-
if (data.length > this.MAX_INPUT_SIZE) {
|
|
14
|
-
throw new Error(`[GRG] Input size ${data.length} exceeds MAX_INPUT_SIZE ${this.MAX_INPUT_SIZE}`);
|
|
15
|
-
}
|
|
16
|
-
logger_1.logger.info("Starting GRG forward pipeline...");
|
|
17
|
-
try {
|
|
18
|
-
const shards = grg_forward_1.GrgForward.encode(data, chainId, poolAddress);
|
|
19
|
-
logger_1.logger.info(`GRG forward pipeline complete. Generated ${shards.length} shards.`);
|
|
20
|
-
return shards;
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
logger_1.logger.error(`GRG forward pipeline failed: ${error}`);
|
|
24
|
-
throw error;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Runs the full inverse pipeline:
|
|
29
|
-
* Golay(24,12) -> RedStuff (Reconstruction) -> Golomb-Rice Decompression
|
|
30
|
-
*/
|
|
31
|
-
static processInverse(shards, originalLength, chainId, poolAddress) {
|
|
32
|
-
logger_1.logger.info("Starting GRG inverse pipeline...");
|
|
33
|
-
try {
|
|
34
|
-
const hmacKey = grg_forward_1.GrgForward.deriveHmacKey(chainId, poolAddress);
|
|
35
|
-
const decodedShards = shards.map(s => {
|
|
36
|
-
try {
|
|
37
|
-
return grg_inverse_1.GrgInverse.golayDecodeWrapper(s, hmacKey);
|
|
38
|
-
}
|
|
39
|
-
catch (e) {
|
|
40
|
-
logger_1.logger.warn(`Golay decode failed for a shard: ${e}`);
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
const withLen = grg_inverse_1.GrgInverse.redstuffDecode(decodedShards);
|
|
45
|
-
// Extract original length from the first 4 bytes
|
|
46
|
-
const decodedLength = (withLen[0] << 24) | (withLen[1] << 16) | (withLen[2] << 8) | withLen[3];
|
|
47
|
-
const compressed = withLen.subarray(4);
|
|
48
|
-
const decompressed = grg_inverse_1.GrgInverse.golombDecode(compressed);
|
|
49
|
-
const final = decompressed.subarray(0, decodedLength);
|
|
50
|
-
// P1-4 FIX: Length mismatch is a corruption signal — throw instead of warn
|
|
51
|
-
if (final.length !== originalLength) {
|
|
52
|
-
throw new Error(`[GRG] Length mismatch in inverse: expected ${originalLength}, got ${final.length}`);
|
|
53
|
-
}
|
|
54
|
-
logger_1.logger.info("GRG inverse pipeline complete.");
|
|
55
|
-
return final;
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
logger_1.logger.error(`GRG inverse pipeline failed: ${error}`);
|
|
59
|
-
throw error;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.GrgPipeline = GrgPipeline;
|
|
64
|
-
// P1-3: Max input size to prevent OOM attacks (100 MB)
|
|
65
|
-
GrgPipeline.MAX_INPUT_SIZE = 100 * 1024 * 1024;
|
|
66
|
-
//# sourceMappingURL=grg_pipeline.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grg_pipeline.js","sourceRoot":"","sources":["../src/grg_pipeline.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAC3C,+CAA2C;AAC3C,qCAAkC;AAElC,MAAa,WAAW;IAItB;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,IAAgB,EAAE,OAAe,EAAE,WAAmB;QAC1E,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,2BAA2B,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,wBAAU,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAC7D,eAAM,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC;YACjF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAoB,EAAE,cAAsB,EAAE,OAAe,EAAE,WAAmB;QACtG,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,wBAAU,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC/D,MAAM,aAAa,GAA0B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC1D,IAAI,CAAC;oBACH,OAAO,wBAAU,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,eAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;oBACrD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,wBAAU,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAEzD,iDAAiD;YACjD,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/F,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEvC,MAAM,YAAY,GAAG,wBAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAEtD,2EAA2E;YAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,8CAA8C,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACvG,CAAC;YAED,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;;AA3DH,kCA4DC;AA3DC,uDAAuD;AACvC,0BAAc,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// @helm-protocol/helm-crypto — GRG Cryptographic Pipeline (PRIVATE)
|
|
3
|
-
// Golomb-Rice -> Reed-Solomon -> Golay(24,12)
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.GrgPipeline = exports.GrgInverse = exports.GrgForward = exports.ReedSolomon = exports.golayDecode = exports.golayEncode = void 0;
|
|
6
|
-
var golay_1 = require("./golay");
|
|
7
|
-
Object.defineProperty(exports, "golayEncode", { enumerable: true, get: function () { return golay_1.golayEncode; } });
|
|
8
|
-
Object.defineProperty(exports, "golayDecode", { enumerable: true, get: function () { return golay_1.golayDecode; } });
|
|
9
|
-
var reed_solomon_1 = require("./reed_solomon");
|
|
10
|
-
Object.defineProperty(exports, "ReedSolomon", { enumerable: true, get: function () { return reed_solomon_1.ReedSolomon; } });
|
|
11
|
-
var grg_forward_1 = require("./grg_forward");
|
|
12
|
-
Object.defineProperty(exports, "GrgForward", { enumerable: true, get: function () { return grg_forward_1.GrgForward; } });
|
|
13
|
-
var grg_inverse_1 = require("./grg_inverse");
|
|
14
|
-
Object.defineProperty(exports, "GrgInverse", { enumerable: true, get: function () { return grg_inverse_1.GrgInverse; } });
|
|
15
|
-
var grg_pipeline_1 = require("./grg_pipeline");
|
|
16
|
-
Object.defineProperty(exports, "GrgPipeline", { enumerable: true, get: function () { return grg_pipeline_1.GrgPipeline; } });
|
|
17
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,8CAA8C;;;AAE9C,iCAAmD;AAA1C,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AACjC,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Minimal logger for helm-crypto (standalone, no external dependency)
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.logger = void 0;
|
|
5
|
-
exports.logger = {
|
|
6
|
-
info: (msg) => console.log(`[helm-crypto] ${msg}`),
|
|
7
|
-
warn: (msg) => console.warn(`[helm-crypto] ${msg}`),
|
|
8
|
-
error: (msg) => console.error(`[helm-crypto] ${msg}`),
|
|
9
|
-
debug: (msg) => console.debug(`[helm-crypto] ${msg}`),
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=logger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,sEAAsE;;;AAEzD,QAAA,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC1D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC3D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC;CAC9D,CAAC"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export declare class ReedSolomon {
|
|
2
|
-
private static expTable;
|
|
3
|
-
private static logTable;
|
|
4
|
-
private static initialized;
|
|
5
|
-
/**
|
|
6
|
-
* Static Vandermonde matrix cache keyed by "${totalShards}-${dataShards}".
|
|
7
|
-
* Avoids recomputing the GF(2^8) Vandermonde + inverse on every tick,
|
|
8
|
-
* which is the most expensive part of RS encoding/decoding.
|
|
9
|
-
*/
|
|
10
|
-
private static vandermondeCache;
|
|
11
|
-
static init(): void;
|
|
12
|
-
static mul(a: number, b: number): number;
|
|
13
|
-
static div(a: number, b: number): number;
|
|
14
|
-
private static invertMatrix;
|
|
15
|
-
/**
|
|
16
|
-
* Build (or retrieve from cache) the normalized Vandermonde encoding matrix.
|
|
17
|
-
* Cache key: "${rows}-${cols}" — RS parameters rarely change within a session,
|
|
18
|
-
* so caching eliminates redundant GF(2^8) matrix inversion on every tick.
|
|
19
|
-
*/
|
|
20
|
-
private static buildVandermonde;
|
|
21
|
-
static encode(data: Uint8Array, dataShards?: number, parityShards?: number): Uint8Array[];
|
|
22
|
-
/**
|
|
23
|
-
* Decode data from a set of Reed-Solomon shards (data + parity).
|
|
24
|
-
*
|
|
25
|
-
* Shards should be provided in order of reliability: place higher-quality,
|
|
26
|
-
* more trustworthy shards first. The decoder selects the first `dataShards`
|
|
27
|
-
* non-null entries for recovery, so ordering by reliability ensures the
|
|
28
|
-
* most dependable shards are preferred. The implementation already handles
|
|
29
|
-
* missing (null) shards transparently via GF(2^8) matrix inversion.
|
|
30
|
-
*
|
|
31
|
-
* @param shards - Array of shard buffers (null for missing/corrupted shards)
|
|
32
|
-
* @param dataShards - Number of data shards (default 4)
|
|
33
|
-
* @param parityShards - Number of parity shards (default 2)
|
|
34
|
-
* @returns Reconstructed data as a single Uint8Array
|
|
35
|
-
*/
|
|
36
|
-
static decode(shards: (Uint8Array | null)[], dataShards?: number, parityShards?: number): Uint8Array;
|
|
37
|
-
}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ReedSolomon = void 0;
|
|
4
|
-
class ReedSolomon {
|
|
5
|
-
static init() {
|
|
6
|
-
if (this.initialized)
|
|
7
|
-
return;
|
|
8
|
-
let x = 1;
|
|
9
|
-
for (let i = 0; i < 255; i++) {
|
|
10
|
-
this.expTable[i] = x;
|
|
11
|
-
this.logTable[x] = i;
|
|
12
|
-
x <<= 1;
|
|
13
|
-
if (x & 0x100) {
|
|
14
|
-
x ^= 0x11D; // x^8 + x^4 + x^3 + x^2 + 1
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
this.expTable[255] = this.expTable[0];
|
|
18
|
-
this.logTable[0] = 0;
|
|
19
|
-
this.initialized = true;
|
|
20
|
-
}
|
|
21
|
-
static mul(a, b) {
|
|
22
|
-
if (a === 0 || b === 0)
|
|
23
|
-
return 0;
|
|
24
|
-
return this.expTable[(this.logTable[a] + this.logTable[b]) % 255];
|
|
25
|
-
}
|
|
26
|
-
static div(a, b) {
|
|
27
|
-
if (b === 0)
|
|
28
|
-
throw new Error("Division by zero");
|
|
29
|
-
if (a === 0)
|
|
30
|
-
return 0;
|
|
31
|
-
return this.expTable[(this.logTable[a] - this.logTable[b] + 255) % 255];
|
|
32
|
-
}
|
|
33
|
-
static invertMatrix(matrix) {
|
|
34
|
-
const n = matrix.length;
|
|
35
|
-
const aug = [];
|
|
36
|
-
for (let i = 0; i < n; i++) {
|
|
37
|
-
aug[i] = [];
|
|
38
|
-
for (let j = 0; j < n; j++) {
|
|
39
|
-
aug[i][j] = matrix[i][j];
|
|
40
|
-
}
|
|
41
|
-
for (let j = 0; j < n; j++) {
|
|
42
|
-
aug[i][j + n] = (i === j) ? 1 : 0;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
for (let i = 0; i < n; i++) {
|
|
46
|
-
let pivot = i;
|
|
47
|
-
while (pivot < n && aug[pivot][i] === 0) {
|
|
48
|
-
pivot++;
|
|
49
|
-
}
|
|
50
|
-
if (pivot === n)
|
|
51
|
-
throw new Error("Singular matrix");
|
|
52
|
-
if (pivot !== i) {
|
|
53
|
-
const temp = aug[i];
|
|
54
|
-
aug[i] = aug[pivot];
|
|
55
|
-
aug[pivot] = temp;
|
|
56
|
-
}
|
|
57
|
-
const pivotVal = aug[i][i];
|
|
58
|
-
if (pivotVal !== 1) {
|
|
59
|
-
for (let j = i; j < 2 * n; j++) {
|
|
60
|
-
aug[i][j] = this.div(aug[i][j], pivotVal);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
for (let j = 0; j < n; j++) {
|
|
64
|
-
if (i !== j && aug[j][i] !== 0) {
|
|
65
|
-
const factor = aug[j][i];
|
|
66
|
-
for (let k = i; k < 2 * n; k++) {
|
|
67
|
-
aug[j][k] ^= this.mul(factor, aug[i][k]);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const inv = [];
|
|
73
|
-
for (let i = 0; i < n; i++) {
|
|
74
|
-
inv[i] = [];
|
|
75
|
-
for (let j = 0; j < n; j++) {
|
|
76
|
-
inv[i][j] = aug[i][j + n];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return inv;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Build (or retrieve from cache) the normalized Vandermonde encoding matrix.
|
|
83
|
-
* Cache key: "${rows}-${cols}" — RS parameters rarely change within a session,
|
|
84
|
-
* so caching eliminates redundant GF(2^8) matrix inversion on every tick.
|
|
85
|
-
*/
|
|
86
|
-
static buildVandermonde(rows, cols) {
|
|
87
|
-
const cacheKey = `${rows}-${cols}`;
|
|
88
|
-
const cached = this.vandermondeCache.get(cacheKey);
|
|
89
|
-
if (cached)
|
|
90
|
-
return cached;
|
|
91
|
-
const V = [];
|
|
92
|
-
for (let r = 0; r < rows; r++) {
|
|
93
|
-
V[r] = [];
|
|
94
|
-
const x = r + 1;
|
|
95
|
-
for (let c = 0; c < cols; c++) {
|
|
96
|
-
if (c === 0) {
|
|
97
|
-
V[r][c] = 1;
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
V[r][c] = this.mul(V[r][c - 1], x);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const V_top = [];
|
|
105
|
-
for (let i = 0; i < cols; i++) {
|
|
106
|
-
V_top.push([...V[i]]);
|
|
107
|
-
}
|
|
108
|
-
const V_top_inv = this.invertMatrix(V_top);
|
|
109
|
-
const G = [];
|
|
110
|
-
for (let r = 0; r < rows; r++) {
|
|
111
|
-
G[r] = [];
|
|
112
|
-
for (let c = 0; c < cols; c++) {
|
|
113
|
-
let val = 0;
|
|
114
|
-
for (let k = 0; k < cols; k++) {
|
|
115
|
-
val ^= this.mul(V[r][k], V_top_inv[k][c]);
|
|
116
|
-
}
|
|
117
|
-
G[r][c] = val;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
this.vandermondeCache.set(cacheKey, G);
|
|
121
|
-
return G;
|
|
122
|
-
}
|
|
123
|
-
static encode(data, dataShards = 4, parityShards = 2) {
|
|
124
|
-
this.init();
|
|
125
|
-
const totalShards = dataShards + parityShards;
|
|
126
|
-
const rawShardSize = Math.ceil(data.length / dataShards);
|
|
127
|
-
const shardSize = Math.ceil(rawShardSize / 3) * 3;
|
|
128
|
-
const matrix = this.buildVandermonde(totalShards, dataShards);
|
|
129
|
-
const shards = [];
|
|
130
|
-
for (let i = 0; i < totalShards; i++) {
|
|
131
|
-
shards.push(new Uint8Array(shardSize));
|
|
132
|
-
}
|
|
133
|
-
for (let i = 0; i < dataShards; i++) {
|
|
134
|
-
shards[i].set(data.subarray(i * shardSize, Math.min((i + 1) * shardSize, data.length)));
|
|
135
|
-
}
|
|
136
|
-
for (let c = 0; c < shardSize; c++) {
|
|
137
|
-
for (let r = dataShards; r < totalShards; r++) {
|
|
138
|
-
let val = 0;
|
|
139
|
-
for (let j = 0; j < dataShards; j++) {
|
|
140
|
-
val ^= this.mul(matrix[r][j], shards[j][c]);
|
|
141
|
-
}
|
|
142
|
-
shards[r][c] = val;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return shards;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Decode data from a set of Reed-Solomon shards (data + parity).
|
|
149
|
-
*
|
|
150
|
-
* Shards should be provided in order of reliability: place higher-quality,
|
|
151
|
-
* more trustworthy shards first. The decoder selects the first `dataShards`
|
|
152
|
-
* non-null entries for recovery, so ordering by reliability ensures the
|
|
153
|
-
* most dependable shards are preferred. The implementation already handles
|
|
154
|
-
* missing (null) shards transparently via GF(2^8) matrix inversion.
|
|
155
|
-
*
|
|
156
|
-
* @param shards - Array of shard buffers (null for missing/corrupted shards)
|
|
157
|
-
* @param dataShards - Number of data shards (default 4)
|
|
158
|
-
* @param parityShards - Number of parity shards (default 2)
|
|
159
|
-
* @returns Reconstructed data as a single Uint8Array
|
|
160
|
-
*/
|
|
161
|
-
static decode(shards, dataShards = 4, parityShards = 2) {
|
|
162
|
-
this.init();
|
|
163
|
-
const totalShards = dataShards + parityShards;
|
|
164
|
-
if (shards.length !== totalShards) {
|
|
165
|
-
throw new Error(`[RS] Expected ${totalShards} shards, got ${shards.length}`);
|
|
166
|
-
}
|
|
167
|
-
const presentIndices = [];
|
|
168
|
-
const presentShards = [];
|
|
169
|
-
for (let i = 0; i < totalShards; i++) {
|
|
170
|
-
if (shards[i] !== null && shards[i] !== undefined) {
|
|
171
|
-
presentIndices.push(i);
|
|
172
|
-
presentShards.push(shards[i]);
|
|
173
|
-
if (presentIndices.length === dataShards)
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (presentIndices.length < dataShards) {
|
|
178
|
-
throw new Error(`[RS] Not enough shards for recovery: need ${dataShards}, got ${presentIndices.length}`);
|
|
179
|
-
}
|
|
180
|
-
const shardSize = presentShards[0].length;
|
|
181
|
-
const origMatrix = this.buildVandermonde(totalShards, dataShards);
|
|
182
|
-
const subMatrix = [];
|
|
183
|
-
for (let i = 0; i < dataShards; i++) {
|
|
184
|
-
subMatrix.push([...origMatrix[presentIndices[i]]]);
|
|
185
|
-
}
|
|
186
|
-
const invMatrix = this.invertMatrix(subMatrix);
|
|
187
|
-
const result = new Uint8Array(shardSize * dataShards);
|
|
188
|
-
for (let c = 0; c < shardSize; c++) {
|
|
189
|
-
for (let r = 0; r < dataShards; r++) {
|
|
190
|
-
let val = 0;
|
|
191
|
-
for (let j = 0; j < dataShards; j++) {
|
|
192
|
-
val ^= this.mul(invMatrix[r][j], presentShards[j][c]);
|
|
193
|
-
}
|
|
194
|
-
result[r * shardSize + c] = val;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return result;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
exports.ReedSolomon = ReedSolomon;
|
|
201
|
-
ReedSolomon.expTable = new Uint8Array(256);
|
|
202
|
-
ReedSolomon.logTable = new Uint8Array(256);
|
|
203
|
-
ReedSolomon.initialized = false;
|
|
204
|
-
/**
|
|
205
|
-
* Static Vandermonde matrix cache keyed by "${totalShards}-${dataShards}".
|
|
206
|
-
* Avoids recomputing the GF(2^8) Vandermonde + inverse on every tick,
|
|
207
|
-
* which is the most expensive part of RS encoding/decoding.
|
|
208
|
-
*/
|
|
209
|
-
ReedSolomon.vandermondeCache = new Map();
|
|
210
|
-
//# sourceMappingURL=reed_solomon.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reed_solomon.js","sourceRoot":"","sources":["../src/reed_solomon.ts"],"names":[],"mappings":"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"}
|