@typeberry/lib 0.7.3 → 0.7.4
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/package.json +1 -1
- package/packages/core/numbers/index.d.ts.map +1 -1
- package/packages/core/numbers/index.js +2 -1
- package/packages/core/numbers/index.test.js +19 -1
- package/packages/core/pvm-interpreter/memory/memory-utils.d.ts.map +1 -1
- package/packages/core/pvm-interpreter/memory/memory-utils.js +2 -1
- package/packages/core/pvm-interpreter/memory/memory-utils.test.js +12 -0
- package/packages/core/shuffling/shuffling.js +1 -1
- package/packages/jam/transition/accumulate/accumulate-utils.js +1 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,MAAM,CAAC;AAE7D,MAAM,MAAM,uBAAuB,CAAC,KAAK,SAAS,MAAM,IAAI;IAC1D,QAAQ,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,CAAC;CAC5C,CAAC;AAKF,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,IAAI,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAE5F,4DAA4D;AAC5D,MAAM,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACpC,eAAO,MAAM,YAAY,MAAO,CAAC;AACjC,6DAA6D;AAC7D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACrC,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACrC,eAAO,MAAM,aAAa,aAAc,CAAC;AACzC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACtD,eAAO,MAAM,aAAa,wBAAyB,CAAC;AAEpD,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,EAGnC,CAAC;AACF,kDAAkD;AAClD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,EAA8B,CAAC;AAErE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAsC,CAAC;AAE9E,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,GAI7C,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,kBAAkB;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,KAAG,GAG3E,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,GAAG,GAAG,KAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAS7D,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,7 +86,8 @@ export function u32AsLeBytes(value) {
|
|
|
86
86
|
*/
|
|
87
87
|
export function leBytesAsU32(uint8Array) {
|
|
88
88
|
check `${uint8Array.length === 4} Input must be a Uint8Array of length 4`;
|
|
89
|
-
|
|
89
|
+
// >>> 0 is needed to avoid changing sign of the number (the `<< 24` produces a signed int32)
|
|
90
|
+
return asTypedNumber((uint8Array[0] | (uint8Array[1] << 8) | (uint8Array[2] << 16) | (uint8Array[3] << 24)) >>> 0);
|
|
90
91
|
}
|
|
91
92
|
/** Get the smallest value between U64 a and values given as input parameters. */
|
|
92
93
|
export const minU64 = (a, ...values) => values.reduce((min, value) => (value > min ? min : value), a);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
|
-
import { maxU64, minU64, sumU32, sumU64, tryAsU32, tryAsU64, u32AsLeBytes } from "./index.js";
|
|
3
|
+
import { leBytesAsU32, maxU64, minU64, sumU32, sumU64, tryAsU32, tryAsU64, u32AsLeBytes } from "./index.js";
|
|
4
4
|
describe("sumU32", () => {
|
|
5
5
|
it("should sum and handle overflow", () => {
|
|
6
6
|
const res1 = sumU32(tryAsU32(3), tryAsU32(5), tryAsU32(10));
|
|
@@ -40,6 +40,24 @@ describe("u32AsLittleEndian", () => {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
|
+
describe("leBytesAsU32", () => {
|
|
44
|
+
const createTestCase = (bytes, expectedResult) => ({
|
|
45
|
+
bytes: new Uint8Array(bytes),
|
|
46
|
+
expectedResult,
|
|
47
|
+
});
|
|
48
|
+
const testCases = [
|
|
49
|
+
createTestCase([5, 0, 0, 0], 5),
|
|
50
|
+
createTestCase([0xff, 0xff, 0xff, 0x7f], 2147483647),
|
|
51
|
+
createTestCase([0, 0, 0, 0x80], 2147483648),
|
|
52
|
+
createTestCase([0xff, 0xff, 0xff, 0xff], 2 ** 32 - 1),
|
|
53
|
+
];
|
|
54
|
+
for (const { bytes, expectedResult } of testCases) {
|
|
55
|
+
it(`should decode ${bytes} as ${expectedResult}`, () => {
|
|
56
|
+
const result = leBytesAsU32(bytes);
|
|
57
|
+
assert.strictEqual(result, expectedResult);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
43
61
|
describe("tryAsU32", () => {
|
|
44
62
|
it("should cast numbers", () => {
|
|
45
63
|
const v = 1234;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/pvm-interpreter/memory/memory-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,UAE7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,wEAE7D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/pvm-interpreter/memory/memory-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,UAE7C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,wEAE7D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,kEAGrD;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,UAAU,kEAGrE"}
|
|
@@ -8,7 +8,8 @@ export function getPageNumber(address) {
|
|
|
8
8
|
return tryAsPageNumber(address >>> PAGE_SIZE_SHIFT);
|
|
9
9
|
}
|
|
10
10
|
export function getStartPageIndex(address) {
|
|
11
|
-
|
|
11
|
+
// >>> 0 is needed to avoid changing sign of the number
|
|
12
|
+
return tryAsMemoryIndex(((address >>> PAGE_SIZE_SHIFT) << PAGE_SIZE_SHIFT) >>> 0);
|
|
12
13
|
}
|
|
13
14
|
export function getStartPageIndexFromPageNumber(pageNumber) {
|
|
14
15
|
// >>> 0 is needed to avoid changing sign of the number
|
|
@@ -53,6 +53,18 @@ describe("memory-utils", () => {
|
|
|
53
53
|
const startPageIndex = getStartPageIndex(address);
|
|
54
54
|
assert.strictEqual(startPageIndex, expectedAddress);
|
|
55
55
|
});
|
|
56
|
+
it("should return a non-negative index for an address with bit 31 set", () => {
|
|
57
|
+
const address = tryAsMemoryIndex(0x8e64_e123);
|
|
58
|
+
const expectedAddress = 0x8e64_e000;
|
|
59
|
+
const startPageIndex = getStartPageIndex(address);
|
|
60
|
+
assert.strictEqual(startPageIndex, expectedAddress);
|
|
61
|
+
});
|
|
62
|
+
it("should return start index of the last page", () => {
|
|
63
|
+
const address = tryAsMemoryIndex(MAX_MEMORY_INDEX);
|
|
64
|
+
const expectedAddress = MAX_MEMORY_INDEX - PAGE_SIZE + 1;
|
|
65
|
+
const startPageIndex = getStartPageIndex(address);
|
|
66
|
+
assert.strictEqual(startPageIndex, expectedAddress);
|
|
67
|
+
});
|
|
56
68
|
});
|
|
57
69
|
describe("getStartPageIndexFromPageNumber", () => {
|
|
58
70
|
it("should return a correct start index for page 0", () => {
|
|
@@ -31,7 +31,7 @@ function hashToNumberSequence(blake2b, entropy, length) {
|
|
|
31
31
|
const newHash = blake2b.hashBytes(randomBytes);
|
|
32
32
|
const numberStartIndex = (4 * i) % 32;
|
|
33
33
|
const numberEndIndex = numberStartIndex + 4;
|
|
34
|
-
const number = leBytesAsU32(newHash.raw.subarray(numberStartIndex, numberEndIndex))
|
|
34
|
+
const number = leBytesAsU32(newHash.raw.subarray(numberStartIndex, numberEndIndex));
|
|
35
35
|
result[i] = number;
|
|
36
36
|
}
|
|
37
37
|
return result;
|
|
@@ -42,7 +42,7 @@ export function generateNextServiceId({ serviceId, entropy, timeslot }, chainSpe
|
|
|
42
42
|
timeslot,
|
|
43
43
|
}, chainSpec);
|
|
44
44
|
const result = blake2b.hashBytes(encoded).raw.subarray(0, 4);
|
|
45
|
-
const number = leBytesAsU32(result)
|
|
45
|
+
const number = leBytesAsU32(result);
|
|
46
46
|
const mod = 2 ** 32 - MIN_PUBLIC_SERVICE_INDEX - 2 ** 8;
|
|
47
47
|
return tryAsServiceId((number % mod) + MIN_PUBLIC_SERVICE_INDEX);
|
|
48
48
|
}
|