@typeberry/lib 0.1.3-3f7b9cf → 0.1.3-62eb49b
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/index.cjs +642 -1350
- package/index.d.ts +533 -615
- package/index.js +641 -1349
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -35,7 +35,9 @@ declare function parseCurrentVersion(env?: string): GpVersion | undefined {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
declare function parseCurrentSuite(env?: string): TestSuite | undefined {
|
|
38
|
-
if (env === undefined)
|
|
38
|
+
if (env === undefined) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
39
41
|
switch (env) {
|
|
40
42
|
case TestSuite.W3F_DAVXY:
|
|
41
43
|
case TestSuite.JAMDUNA:
|
|
@@ -420,6 +422,20 @@ declare const Result$2 = {
|
|
|
420
422
|
},
|
|
421
423
|
};
|
|
422
424
|
|
|
425
|
+
// about 2GB, the maximum ArrayBuffer length on Chrome confirmed by several sources:
|
|
426
|
+
// - https://issues.chromium.org/issues/40055619
|
|
427
|
+
// - https://stackoverflow.com/a/72124984
|
|
428
|
+
// - https://onnxruntime.ai/docs/tutorials/web/large-models.html#maximum-size-of-arraybuffer
|
|
429
|
+
declare const MAX_LENGTH$1 = 2145386496;
|
|
430
|
+
|
|
431
|
+
declare function safeAllocUint8Array(length: number) {
|
|
432
|
+
if (length > MAX_LENGTH) {
|
|
433
|
+
// biome-ignore lint/suspicious/noConsole: can't have a dependency on logger here
|
|
434
|
+
console.warn(`Trying to allocate ${length} bytes, which is greater than the maximum of ${MAX_LENGTH}.`);
|
|
435
|
+
}
|
|
436
|
+
return new Uint8Array(Math.min(MAX_LENGTH, length));
|
|
437
|
+
}
|
|
438
|
+
|
|
423
439
|
/**
|
|
424
440
|
* Utilities for tests.
|
|
425
441
|
*/
|
|
@@ -573,8 +589,12 @@ declare function deepEqual<T>(
|
|
|
573
589
|
const aKey = `${a.key}`;
|
|
574
590
|
const bKey = `${b.key}`;
|
|
575
591
|
|
|
576
|
-
if (aKey < bKey)
|
|
577
|
-
|
|
592
|
+
if (aKey < bKey) {
|
|
593
|
+
return -1;
|
|
594
|
+
}
|
|
595
|
+
if (bKey < aKey) {
|
|
596
|
+
return 1;
|
|
597
|
+
}
|
|
578
598
|
return 0;
|
|
579
599
|
});
|
|
580
600
|
};
|
|
@@ -755,11 +775,12 @@ declare const index$u_oomWarningPrinted: typeof oomWarningPrinted;
|
|
|
755
775
|
declare const index$u_parseCurrentSuite: typeof parseCurrentSuite;
|
|
756
776
|
declare const index$u_parseCurrentVersion: typeof parseCurrentVersion;
|
|
757
777
|
declare const index$u_resultToString: typeof resultToString;
|
|
778
|
+
declare const index$u_safeAllocUint8Array: typeof safeAllocUint8Array;
|
|
758
779
|
declare const index$u_seeThrough: typeof seeThrough;
|
|
759
780
|
declare const index$u_trimStack: typeof trimStack;
|
|
760
781
|
declare const index$u_workspacePathFix: typeof workspacePathFix;
|
|
761
782
|
declare namespace index$u {
|
|
762
|
-
export { index$u_ALL_VERSIONS_IN_ORDER as ALL_VERSIONS_IN_ORDER, index$u_CURRENT_SUITE as CURRENT_SUITE, index$u_CURRENT_VERSION as CURRENT_VERSION, index$u_Compatibility as Compatibility, index$u_DEFAULT_SUITE as DEFAULT_SUITE, index$u_DEFAULT_VERSION as DEFAULT_VERSION, index$u_ErrorsCollector as ErrorsCollector, index$u_GpVersion as GpVersion, Result$2 as Result, index$u_RichTaggedError as RichTaggedError, index$u_TEST_COMPARE_USING as TEST_COMPARE_USING, index$u_TestSuite as TestSuite, index$u_WithDebug as WithDebug, index$u___OPAQUE_TYPE__ as __OPAQUE_TYPE__, index$u_asOpaqueType as asOpaqueType, index$u_assertEmpty as assertEmpty, index$u_assertNever as assertNever, index$u_callCompareFunction as callCompareFunction, index$u_check as check, index$u_deepEqual as deepEqual, index$u_getAllKeysSorted as getAllKeysSorted, index$u_inspect as inspect, index$u_isBrowser as isBrowser, index$u_isResult as isResult, index$u_isTaggedError as isTaggedError, index$u_maybeTaggedErrorToString as maybeTaggedErrorToString, index$u_measure as measure, index$u_oomWarningPrinted as oomWarningPrinted, index$u_parseCurrentSuite as parseCurrentSuite, index$u_parseCurrentVersion as parseCurrentVersion, index$u_resultToString as resultToString, index$u_seeThrough as seeThrough, index$u_trimStack as trimStack, index$u_workspacePathFix as workspacePathFix };
|
|
783
|
+
export { index$u_ALL_VERSIONS_IN_ORDER as ALL_VERSIONS_IN_ORDER, index$u_CURRENT_SUITE as CURRENT_SUITE, index$u_CURRENT_VERSION as CURRENT_VERSION, index$u_Compatibility as Compatibility, index$u_DEFAULT_SUITE as DEFAULT_SUITE, index$u_DEFAULT_VERSION as DEFAULT_VERSION, index$u_ErrorsCollector as ErrorsCollector, index$u_GpVersion as GpVersion, MAX_LENGTH$1 as MAX_LENGTH, Result$2 as Result, index$u_RichTaggedError as RichTaggedError, index$u_TEST_COMPARE_USING as TEST_COMPARE_USING, index$u_TestSuite as TestSuite, index$u_WithDebug as WithDebug, index$u___OPAQUE_TYPE__ as __OPAQUE_TYPE__, index$u_asOpaqueType as asOpaqueType, index$u_assertEmpty as assertEmpty, index$u_assertNever as assertNever, index$u_callCompareFunction as callCompareFunction, index$u_check as check, index$u_deepEqual as deepEqual, index$u_getAllKeysSorted as getAllKeysSorted, index$u_inspect as inspect, index$u_isBrowser as isBrowser, index$u_isResult as isResult, index$u_isTaggedError as isTaggedError, index$u_maybeTaggedErrorToString as maybeTaggedErrorToString, index$u_measure as measure, index$u_oomWarningPrinted as oomWarningPrinted, index$u_parseCurrentSuite as parseCurrentSuite, index$u_parseCurrentVersion as parseCurrentVersion, index$u_resultToString as resultToString, index$u_safeAllocUint8Array as safeAllocUint8Array, index$u_seeThrough as seeThrough, index$u_trimStack as trimStack, index$u_workspacePathFix as workspacePathFix };
|
|
763
784
|
export type { index$u_DeepEqualOptions as DeepEqualOptions, index$u_EnumMapping as EnumMapping, index$u_ErrorResult as ErrorResult, index$u_OK as OK, index$u_OkResult as OkResult, index$u_Opaque as Opaque, index$u_StringLiteral as StringLiteral, index$u_TaggedError as TaggedError, index$u_TokenOf as TokenOf, index$u_Uninstantiable as Uninstantiable, index$u_WithOpaque as WithOpaque };
|
|
764
785
|
}
|
|
765
786
|
|
|
@@ -929,7 +950,7 @@ declare class BytesBlob {
|
|
|
929
950
|
static blobFromParts(v: Uint8Array | Uint8Array[], ...rest: Uint8Array[]) {
|
|
930
951
|
const vArr = v instanceof Uint8Array ? [v] : v;
|
|
931
952
|
const totalLength = vArr.reduce((a, v) => a + v.length, 0) + rest.reduce((a, v) => a + v.length, 0);
|
|
932
|
-
const buffer =
|
|
953
|
+
const buffer = safeAllocUint8Array(totalLength);
|
|
933
954
|
let offset = 0;
|
|
934
955
|
for (const r of vArr) {
|
|
935
956
|
buffer.set(r, offset);
|
|
@@ -1012,7 +1033,7 @@ declare class Bytes<T extends number> extends BytesBlob {
|
|
|
1012
1033
|
|
|
1013
1034
|
/** Create an empty [`Bytes<X>`] of given length. */
|
|
1014
1035
|
static zero<X extends number>(len: X): Bytes<X> {
|
|
1015
|
-
return new Bytes(
|
|
1036
|
+
return new Bytes(safeAllocUint8Array(len), len);
|
|
1016
1037
|
}
|
|
1017
1038
|
|
|
1018
1039
|
// TODO [ToDr] `fill` should have the argments swapped to align with the rest.
|
|
@@ -1133,7 +1154,7 @@ declare class BitVec {
|
|
|
1133
1154
|
* Create new [`BitVec`] with all values set to `false`.
|
|
1134
1155
|
*/
|
|
1135
1156
|
static empty(bitLength: number) {
|
|
1136
|
-
const data =
|
|
1157
|
+
const data = safeAllocUint8Array(Math.ceil(bitLength / 8));
|
|
1137
1158
|
return new BitVec(data, bitLength);
|
|
1138
1159
|
}
|
|
1139
1160
|
|
|
@@ -3461,6 +3482,99 @@ declare namespace index$q {
|
|
|
3461
3482
|
export type { index$q_ClassConstructor as ClassConstructor, index$q_Codec as Codec, index$q_CodecRecord as CodecRecord, index$q_Decode as Decode, index$q_DescribedBy as DescribedBy, index$q_DescriptorRecord as DescriptorRecord, index$q_Encode as Encode, index$q_LengthRange as LengthRange, index$q_OptionalRecord as OptionalRecord, Options$1 as Options, index$q_PropertyKeys as PropertyKeys, index$q_SimpleDescriptorRecord as SimpleDescriptorRecord, index$q_SizeHint as SizeHint, index$q_ViewOf as ViewOf };
|
|
3462
3483
|
}
|
|
3463
3484
|
|
|
3485
|
+
/**
|
|
3486
|
+
* A utility class providing a readonly view over a portion of an array without copying it.
|
|
3487
|
+
*/
|
|
3488
|
+
declare class ArrayView<T> implements Iterable<T> {
|
|
3489
|
+
private readonly source: T[];
|
|
3490
|
+
public readonly length: number;
|
|
3491
|
+
|
|
3492
|
+
private constructor(
|
|
3493
|
+
source: T[],
|
|
3494
|
+
private readonly start: number,
|
|
3495
|
+
private readonly end: number,
|
|
3496
|
+
) {
|
|
3497
|
+
this.source = source;
|
|
3498
|
+
this.length = end - start;
|
|
3499
|
+
}
|
|
3500
|
+
|
|
3501
|
+
static from<T>(source: T[], start = 0, end = source.length): ArrayView<T> {
|
|
3502
|
+
check`
|
|
3503
|
+
${start >= 0 && end <= source.length && start <= end}
|
|
3504
|
+
Invalid start (${start})/end (${end}) for ArrayView
|
|
3505
|
+
`;
|
|
3506
|
+
return new ArrayView(source, start, end);
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
get(i: number): T {
|
|
3510
|
+
check`
|
|
3511
|
+
${i >= 0 && i < this.length}
|
|
3512
|
+
Index out of bounds: ${i} < ${this.length}
|
|
3513
|
+
`;
|
|
3514
|
+
return this.source[this.start + i];
|
|
3515
|
+
}
|
|
3516
|
+
|
|
3517
|
+
subview(from: number, to: number = this.length): ArrayView<T> {
|
|
3518
|
+
return ArrayView.from(this.source, this.start + from, this.start + to);
|
|
3519
|
+
}
|
|
3520
|
+
|
|
3521
|
+
toArray(): T[] {
|
|
3522
|
+
return this.source.slice(this.start, this.end);
|
|
3523
|
+
}
|
|
3524
|
+
|
|
3525
|
+
*[Symbol.iterator](): Iterator<T> {
|
|
3526
|
+
for (let i = this.start; i < this.end; i++) {
|
|
3527
|
+
yield this.source[i];
|
|
3528
|
+
}
|
|
3529
|
+
}
|
|
3530
|
+
}
|
|
3531
|
+
|
|
3532
|
+
type ITypedArray = Uint8Array | Uint16Array | Uint32Array;
|
|
3533
|
+
type IDataType = string | Buffer | ITypedArray;
|
|
3534
|
+
|
|
3535
|
+
type IHasher = {
|
|
3536
|
+
/**
|
|
3537
|
+
* Initializes hash state to default value
|
|
3538
|
+
*/
|
|
3539
|
+
init: () => IHasher;
|
|
3540
|
+
/**
|
|
3541
|
+
* Updates the hash content with the given data
|
|
3542
|
+
*/
|
|
3543
|
+
update: (data: IDataType) => IHasher;
|
|
3544
|
+
/**
|
|
3545
|
+
* Calculates the hash of all of the data passed to be hashed with hash.update().
|
|
3546
|
+
* Defaults to hexadecimal string
|
|
3547
|
+
* @param outputType If outputType is "binary", it returns Uint8Array. Otherwise it
|
|
3548
|
+
* returns hexadecimal string
|
|
3549
|
+
*/
|
|
3550
|
+
digest: {
|
|
3551
|
+
(outputType: "binary"): Uint8Array;
|
|
3552
|
+
(outputType?: "hex"): string;
|
|
3553
|
+
};
|
|
3554
|
+
/**
|
|
3555
|
+
* Save the current internal state of the hasher for later resumption with load().
|
|
3556
|
+
* Cannot be called before .init() or after .digest()
|
|
3557
|
+
*
|
|
3558
|
+
* Note that this state can include arbitrary information about the value being hashed (e.g.
|
|
3559
|
+
* could include N plaintext bytes from the value), so needs to be treated as being as
|
|
3560
|
+
* sensitive as the input value itself.
|
|
3561
|
+
*/
|
|
3562
|
+
save: () => Uint8Array;
|
|
3563
|
+
/**
|
|
3564
|
+
* Resume a state that was created by save(). If this state was not created by a
|
|
3565
|
+
* compatible build of hash-wasm, an exception will be thrown.
|
|
3566
|
+
*/
|
|
3567
|
+
load: (state: Uint8Array) => IHasher;
|
|
3568
|
+
/**
|
|
3569
|
+
* Block size in bytes
|
|
3570
|
+
*/
|
|
3571
|
+
blockSize: number;
|
|
3572
|
+
/**
|
|
3573
|
+
* Digest size in bytes
|
|
3574
|
+
*/
|
|
3575
|
+
digestSize: number;
|
|
3576
|
+
};
|
|
3577
|
+
|
|
3464
3578
|
/**
|
|
3465
3579
|
* Size of the output of the hash functions.
|
|
3466
3580
|
*
|
|
@@ -3516,144 +3630,46 @@ declare class WithHashAndBytes<THash extends OpaqueHash, TData> extends WithHash
|
|
|
3516
3630
|
}
|
|
3517
3631
|
}
|
|
3518
3632
|
|
|
3519
|
-
|
|
3520
|
-
interface HashAllocator {
|
|
3521
|
-
/** Return a new hash destination. */
|
|
3522
|
-
emptyHash(): OpaqueHash;
|
|
3523
|
-
}
|
|
3524
|
-
|
|
3525
|
-
/** The simplest allocator returning just a fresh copy of bytes each time. */
|
|
3526
|
-
declare class SimpleAllocator implements HashAllocator {
|
|
3527
|
-
emptyHash(): OpaqueHash {
|
|
3528
|
-
return Bytes.zero(HASH_SIZE);
|
|
3529
|
-
}
|
|
3530
|
-
}
|
|
3531
|
-
|
|
3532
|
-
/** An allocator that works by allocating larger (continuous) pages of memory. */
|
|
3533
|
-
declare class PageAllocator implements HashAllocator {
|
|
3534
|
-
private page: Uint8Array = new Uint8Array(0);
|
|
3535
|
-
private currentHash = 0;
|
|
3536
|
-
|
|
3537
|
-
// TODO [ToDr] Benchmark the performance!
|
|
3538
|
-
constructor(private readonly hashesPerPage: number) {
|
|
3539
|
-
check`${hashesPerPage > 0 && hashesPerPage >>> 0 === hashesPerPage} Expected a non-zero integer.`;
|
|
3540
|
-
this.resetPage();
|
|
3541
|
-
}
|
|
3633
|
+
declare const zero$1 = Bytes.zero(HASH_SIZE);
|
|
3542
3634
|
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
this.page = new Uint8Array(pageSizeBytes);
|
|
3635
|
+
declare class Blake2b {
|
|
3636
|
+
static async createHasher() {
|
|
3637
|
+
return new Blake2b(await createBLAKE2b(HASH_SIZE * 8));
|
|
3547
3638
|
}
|
|
3548
3639
|
|
|
3549
|
-
|
|
3550
|
-
const startIdx = this.currentHash * HASH_SIZE;
|
|
3551
|
-
const endIdx = startIdx + HASH_SIZE;
|
|
3640
|
+
private constructor(private readonly hasher: IHasher) {}
|
|
3552
3641
|
|
|
3553
|
-
|
|
3554
|
-
|
|
3555
|
-
|
|
3642
|
+
/**
|
|
3643
|
+
* Hash given collection of blobs.
|
|
3644
|
+
*
|
|
3645
|
+
* If empty array is given a zero-hash is returned.
|
|
3646
|
+
*/
|
|
3647
|
+
hashBlobs<H extends Blake2bHash>(r: (BytesBlob | Uint8Array)[]): H {
|
|
3648
|
+
if (r.length === 0) {
|
|
3649
|
+
return zero.asOpaque();
|
|
3556
3650
|
}
|
|
3557
3651
|
|
|
3558
|
-
|
|
3652
|
+
const hasher = this.hasher.init();
|
|
3653
|
+
for (const v of r) {
|
|
3654
|
+
hasher.update(v instanceof BytesBlob ? v.raw : v);
|
|
3655
|
+
}
|
|
3656
|
+
return Bytes.fromBlob(hasher.digest("binary"), HASH_SIZE).asOpaque();
|
|
3559
3657
|
}
|
|
3560
|
-
}
|
|
3561
3658
|
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
*/
|
|
3569
|
-
declare function hashBlobs$1<H extends Blake2bHash>(
|
|
3570
|
-
r: (BytesBlob | Uint8Array)[],
|
|
3571
|
-
allocator: HashAllocator = defaultAllocator,
|
|
3572
|
-
): H {
|
|
3573
|
-
const out = allocator.emptyHash();
|
|
3574
|
-
if (r.length === 0) {
|
|
3575
|
-
return out.asOpaque();
|
|
3659
|
+
/** Hash given blob of bytes. */
|
|
3660
|
+
hashBytes(blob: BytesBlob | Uint8Array): Blake2bHash {
|
|
3661
|
+
const hasher = this.hasher.init();
|
|
3662
|
+
const bytes = blob instanceof BytesBlob ? blob.raw : blob;
|
|
3663
|
+
hasher.update(bytes);
|
|
3664
|
+
return Bytes.fromBlob(hasher.digest("binary"), HASH_SIZE).asOpaque();
|
|
3576
3665
|
}
|
|
3577
3666
|
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3667
|
+
/** Convert given string into bytes and hash it. */
|
|
3668
|
+
hashString(str: string) {
|
|
3669
|
+
return this.hashBytes(BytesBlob.blobFromString(str));
|
|
3581
3670
|
}
|
|
3582
|
-
hasher?.digest(out.raw);
|
|
3583
|
-
return out.asOpaque();
|
|
3584
|
-
}
|
|
3585
|
-
|
|
3586
|
-
/** Hash given blob of bytes. */
|
|
3587
|
-
declare function hashBytes(blob: BytesBlob | Uint8Array, allocator: HashAllocator = defaultAllocator): Blake2bHash {
|
|
3588
|
-
const hasher = blake2b(HASH_SIZE);
|
|
3589
|
-
const bytes = blob instanceof BytesBlob ? blob.raw : blob;
|
|
3590
|
-
hasher?.update(bytes);
|
|
3591
|
-
const out = allocator.emptyHash();
|
|
3592
|
-
hasher?.digest(out.raw);
|
|
3593
|
-
return out;
|
|
3594
|
-
}
|
|
3595
|
-
|
|
3596
|
-
/** Convert given string into bytes and hash it. */
|
|
3597
|
-
declare function hashString(str: string, allocator: HashAllocator = defaultAllocator) {
|
|
3598
|
-
return hashBytes(BytesBlob.blobFromString(str), allocator);
|
|
3599
3671
|
}
|
|
3600
3672
|
|
|
3601
|
-
declare const blake2b_hashBytes: typeof hashBytes;
|
|
3602
|
-
declare const blake2b_hashString: typeof hashString;
|
|
3603
|
-
declare namespace blake2b {
|
|
3604
|
-
export {
|
|
3605
|
-
hashBlobs$1 as hashBlobs,
|
|
3606
|
-
blake2b_hashBytes as hashBytes,
|
|
3607
|
-
blake2b_hashString as hashString,
|
|
3608
|
-
};
|
|
3609
|
-
}
|
|
3610
|
-
|
|
3611
|
-
type ITypedArray = Uint8Array | Uint16Array | Uint32Array;
|
|
3612
|
-
type IDataType = string | Buffer | ITypedArray;
|
|
3613
|
-
|
|
3614
|
-
type IHasher = {
|
|
3615
|
-
/**
|
|
3616
|
-
* Initializes hash state to default value
|
|
3617
|
-
*/
|
|
3618
|
-
init: () => IHasher;
|
|
3619
|
-
/**
|
|
3620
|
-
* Updates the hash content with the given data
|
|
3621
|
-
*/
|
|
3622
|
-
update: (data: IDataType) => IHasher;
|
|
3623
|
-
/**
|
|
3624
|
-
* Calculates the hash of all of the data passed to be hashed with hash.update().
|
|
3625
|
-
* Defaults to hexadecimal string
|
|
3626
|
-
* @param outputType If outputType is "binary", it returns Uint8Array. Otherwise it
|
|
3627
|
-
* returns hexadecimal string
|
|
3628
|
-
*/
|
|
3629
|
-
digest: {
|
|
3630
|
-
(outputType: "binary"): Uint8Array;
|
|
3631
|
-
(outputType?: "hex"): string;
|
|
3632
|
-
};
|
|
3633
|
-
/**
|
|
3634
|
-
* Save the current internal state of the hasher for later resumption with load().
|
|
3635
|
-
* Cannot be called before .init() or after .digest()
|
|
3636
|
-
*
|
|
3637
|
-
* Note that this state can include arbitrary information about the value being hashed (e.g.
|
|
3638
|
-
* could include N plaintext bytes from the value), so needs to be treated as being as
|
|
3639
|
-
* sensitive as the input value itself.
|
|
3640
|
-
*/
|
|
3641
|
-
save: () => Uint8Array;
|
|
3642
|
-
/**
|
|
3643
|
-
* Resume a state that was created by save(). If this state was not created by a
|
|
3644
|
-
* compatible build of hash-wasm, an exception will be thrown.
|
|
3645
|
-
*/
|
|
3646
|
-
load: (state: Uint8Array) => IHasher;
|
|
3647
|
-
/**
|
|
3648
|
-
* Block size in bytes
|
|
3649
|
-
*/
|
|
3650
|
-
blockSize: number;
|
|
3651
|
-
/**
|
|
3652
|
-
* Digest size in bytes
|
|
3653
|
-
*/
|
|
3654
|
-
digestSize: number;
|
|
3655
|
-
};
|
|
3656
|
-
|
|
3657
3673
|
declare class KeccakHasher {
|
|
3658
3674
|
static async create(): Promise<KeccakHasher> {
|
|
3659
3675
|
return new KeccakHasher(await createKeccak(256));
|
|
@@ -3681,15 +3697,15 @@ declare namespace keccak {
|
|
|
3681
3697
|
};
|
|
3682
3698
|
}
|
|
3683
3699
|
|
|
3700
|
+
// TODO [ToDr] (#213) this should most likely be moved to a separate
|
|
3701
|
+
// package to avoid pulling in unnecessary deps.
|
|
3702
|
+
|
|
3703
|
+
type index$p_Blake2b = Blake2b;
|
|
3704
|
+
declare const index$p_Blake2b: typeof Blake2b;
|
|
3684
3705
|
type index$p_Blake2bHash = Blake2bHash;
|
|
3685
3706
|
type index$p_HASH_SIZE = HASH_SIZE;
|
|
3686
|
-
type index$p_HashAllocator = HashAllocator;
|
|
3687
3707
|
type index$p_KeccakHash = KeccakHash;
|
|
3688
3708
|
type index$p_OpaqueHash = OpaqueHash;
|
|
3689
|
-
type index$p_PageAllocator = PageAllocator;
|
|
3690
|
-
declare const index$p_PageAllocator: typeof PageAllocator;
|
|
3691
|
-
type index$p_SimpleAllocator = SimpleAllocator;
|
|
3692
|
-
declare const index$p_SimpleAllocator: typeof SimpleAllocator;
|
|
3693
3709
|
type index$p_TRUNCATED_HASH_SIZE = TRUNCATED_HASH_SIZE;
|
|
3694
3710
|
type index$p_TruncatedHash = TruncatedHash;
|
|
3695
3711
|
type index$p_WithHash<THash extends OpaqueHash, TData> = WithHash<THash, TData>;
|
|
@@ -3697,12 +3713,10 @@ declare const index$p_WithHash: typeof WithHash;
|
|
|
3697
3713
|
type index$p_WithHashAndBytes<THash extends OpaqueHash, TData> = WithHashAndBytes<THash, TData>;
|
|
3698
3714
|
declare const index$p_WithHashAndBytes: typeof WithHashAndBytes;
|
|
3699
3715
|
declare const index$p_ZERO_HASH: typeof ZERO_HASH;
|
|
3700
|
-
declare const index$p_blake2b: typeof blake2b;
|
|
3701
|
-
declare const index$p_defaultAllocator: typeof defaultAllocator;
|
|
3702
3716
|
declare const index$p_keccak: typeof keccak;
|
|
3703
3717
|
declare namespace index$p {
|
|
3704
|
-
export { index$
|
|
3705
|
-
export type { index$p_Blake2bHash as Blake2bHash, index$p_HASH_SIZE as HASH_SIZE, index$
|
|
3718
|
+
export { index$p_Blake2b as Blake2b, index$p_WithHash as WithHash, index$p_WithHashAndBytes as WithHashAndBytes, index$p_ZERO_HASH as ZERO_HASH, index$p_keccak as keccak, zero$1 as zero };
|
|
3719
|
+
export type { index$p_Blake2bHash as Blake2bHash, index$p_HASH_SIZE as HASH_SIZE, index$p_KeccakHash as KeccakHash, index$p_OpaqueHash as OpaqueHash, index$p_TRUNCATED_HASH_SIZE as TRUNCATED_HASH_SIZE, index$p_TruncatedHash as TruncatedHash };
|
|
3706
3720
|
}
|
|
3707
3721
|
|
|
3708
3722
|
/** Immutable view of the `HashDictionary`. */
|
|
@@ -4479,6 +4493,8 @@ declare class TruncatedHashDictionary<T extends OpaqueHash, V> {
|
|
|
4479
4493
|
}
|
|
4480
4494
|
}
|
|
4481
4495
|
|
|
4496
|
+
type index$o_ArrayView<T> = ArrayView<T>;
|
|
4497
|
+
declare const index$o_ArrayView: typeof ArrayView;
|
|
4482
4498
|
type index$o_FixedSizeArray<T, N extends number> = FixedSizeArray<T, N>;
|
|
4483
4499
|
declare const index$o_FixedSizeArray: typeof FixedSizeArray;
|
|
4484
4500
|
type index$o_HashDictionary<K extends OpaqueHash, V> = HashDictionary<K, V>;
|
|
@@ -4506,7 +4522,7 @@ type index$o_TruncatedHashDictionary<T extends OpaqueHash, V> = TruncatedHashDic
|
|
|
4506
4522
|
declare const index$o_TruncatedHashDictionary: typeof TruncatedHashDictionary;
|
|
4507
4523
|
declare const index$o_asKnownSize: typeof asKnownSize;
|
|
4508
4524
|
declare namespace index$o {
|
|
4509
|
-
export { index$o_FixedSizeArray as FixedSizeArray, index$o_HashDictionary as HashDictionary, index$o_HashSet as HashSet, index$o_MultiMap as MultiMap, index$o_SortedArray as SortedArray, index$o_SortedSet as SortedSet, index$o_TruncatedHashDictionary as TruncatedHashDictionary, index$o_asKnownSize as asKnownSize };
|
|
4525
|
+
export { index$o_ArrayView as ArrayView, index$o_FixedSizeArray as FixedSizeArray, index$o_HashDictionary as HashDictionary, index$o_HashSet as HashSet, index$o_MultiMap as MultiMap, index$o_SortedArray as SortedArray, index$o_SortedSet as SortedSet, index$o_TruncatedHashDictionary as TruncatedHashDictionary, index$o_asKnownSize as asKnownSize };
|
|
4510
4526
|
export type { index$o_HashWithZeroedBit as HashWithZeroedBit, index$o_ImmutableHashDictionary as ImmutableHashDictionary, index$o_ImmutableHashSet as ImmutableHashSet, index$o_ImmutableSortedArray as ImmutableSortedArray, index$o_ImmutableSortedSet as ImmutableSortedSet, index$o_KeyMapper as KeyMapper, index$o_KeyMappers as KeyMappers, index$o_KnownSize as KnownSize, index$o_KnownSizeArray as KnownSizeArray, index$o_KnownSizeId as KnownSizeId, index$o_NestedMaps as NestedMaps };
|
|
4511
4527
|
}
|
|
4512
4528
|
|
|
@@ -4735,7 +4751,7 @@ declare async function verify<T extends BytesBlob>(input: Input<T>[]): Promise<b
|
|
|
4735
4751
|
(acc, { message, key, signature }) => acc + key.length + signature.length + message.length + 1,
|
|
4736
4752
|
0,
|
|
4737
4753
|
);
|
|
4738
|
-
const data =
|
|
4754
|
+
const data = safeAllocUint8Array(dataLength);
|
|
4739
4755
|
|
|
4740
4756
|
let offset = 0;
|
|
4741
4757
|
|
|
@@ -4825,22 +4841,16 @@ declare function trivialSeed(s: U32): KeySeed {
|
|
|
4825
4841
|
* Derives a Ed25519 secret key from a seed.
|
|
4826
4842
|
* https://github.com/polkadot-fellows/JIPs/blob/7048f79edf4f4eb8bfe6fb42e6bbf61900f44c65/JIP-5.md#derivation-method
|
|
4827
4843
|
*/
|
|
4828
|
-
declare function deriveEd25519SecretKey(
|
|
4829
|
-
|
|
4830
|
-
allocator: SimpleAllocator = new SimpleAllocator(),
|
|
4831
|
-
): Ed25519SecretSeed {
|
|
4832
|
-
return blake2b.hashBytes(BytesBlob.blobFromParts([ED25519_SECRET_KEY.raw, seed.raw]), allocator).asOpaque();
|
|
4844
|
+
declare function deriveEd25519SecretKey(seed: KeySeed, blake2b: Blake2b): Ed25519SecretSeed {
|
|
4845
|
+
return blake2b.hashBytes(BytesBlob.blobFromParts([ED25519_SECRET_KEY.raw, seed.raw])).asOpaque();
|
|
4833
4846
|
}
|
|
4834
4847
|
|
|
4835
4848
|
/**
|
|
4836
4849
|
* Derives a Bandersnatch secret key from a seed.
|
|
4837
4850
|
* https://github.com/polkadot-fellows/JIPs/blob/7048f79edf4f4eb8bfe6fb42e6bbf61900f44c65/JIP-5.md#derivation-method
|
|
4838
4851
|
*/
|
|
4839
|
-
declare function deriveBandersnatchSecretKey(
|
|
4840
|
-
|
|
4841
|
-
allocator: SimpleAllocator = new SimpleAllocator(),
|
|
4842
|
-
): BandersnatchSecretSeed {
|
|
4843
|
-
return blake2b.hashBytes(BytesBlob.blobFromParts([BANDERSNATCH_SECRET_KEY.raw, seed.raw]), allocator).asOpaque();
|
|
4852
|
+
declare function deriveBandersnatchSecretKey(seed: KeySeed, blake2b: Blake2b): BandersnatchSecretSeed {
|
|
4853
|
+
return blake2b.hashBytes(BytesBlob.blobFromParts([BANDERSNATCH_SECRET_KEY.raw, seed.raw])).asOpaque();
|
|
4844
4854
|
}
|
|
4845
4855
|
|
|
4846
4856
|
/**
|
|
@@ -8373,7 +8383,7 @@ declare enum NodeType {
|
|
|
8373
8383
|
declare class TrieNode {
|
|
8374
8384
|
constructor(
|
|
8375
8385
|
/** Exactly 512 bits / 64 bytes */
|
|
8376
|
-
public readonly raw: Uint8Array =
|
|
8386
|
+
public readonly raw: Uint8Array = safeAllocUint8Array(TRIE_NODE_BYTES),
|
|
8377
8387
|
) {}
|
|
8378
8388
|
|
|
8379
8389
|
/** Returns the type of the node */
|
|
@@ -9111,21 +9121,6 @@ declare function accumulationOutputComparator(a: AccumulationOutput, b: Accumula
|
|
|
9111
9121
|
return Ordering.Equal;
|
|
9112
9122
|
}
|
|
9113
9123
|
|
|
9114
|
-
declare const codecWithHash = <T, V, H extends OpaqueHash>(val: Descriptor<T, V>): Descriptor<WithHash<H, T>, V> =>
|
|
9115
|
-
Descriptor.withView(
|
|
9116
|
-
val.name,
|
|
9117
|
-
val.sizeHint,
|
|
9118
|
-
(e, elem) => val.encode(e, elem.data),
|
|
9119
|
-
(d): WithHash<H, T> => {
|
|
9120
|
-
const decoder2 = d.clone();
|
|
9121
|
-
const encoded = val.skipEncoded(decoder2);
|
|
9122
|
-
const hash = blake2b.hashBytes(encoded);
|
|
9123
|
-
return new WithHash(hash.asOpaque(), val.decode(d));
|
|
9124
|
-
},
|
|
9125
|
-
val.skip,
|
|
9126
|
-
val.View,
|
|
9127
|
-
);
|
|
9128
|
-
|
|
9129
9124
|
/**
|
|
9130
9125
|
* Assignment of particular work report to a core.
|
|
9131
9126
|
*
|
|
@@ -9136,7 +9131,7 @@ declare const codecWithHash = <T, V, H extends OpaqueHash>(val: Descriptor<T, V>
|
|
|
9136
9131
|
*/
|
|
9137
9132
|
declare class AvailabilityAssignment extends WithDebug {
|
|
9138
9133
|
static Codec = codec.Class(AvailabilityAssignment, {
|
|
9139
|
-
workReport:
|
|
9134
|
+
workReport: WorkReport.Codec,
|
|
9140
9135
|
timeout: codec.u32.asOpaque<TimeSlot>(),
|
|
9141
9136
|
});
|
|
9142
9137
|
|
|
@@ -9146,7 +9141,7 @@ declare class AvailabilityAssignment extends WithDebug {
|
|
|
9146
9141
|
|
|
9147
9142
|
private constructor(
|
|
9148
9143
|
/** Work report assigned to a core. */
|
|
9149
|
-
public readonly workReport:
|
|
9144
|
+
public readonly workReport: WorkReport,
|
|
9150
9145
|
/** Time slot at which the report becomes obsolete. */
|
|
9151
9146
|
public readonly timeout: TimeSlot,
|
|
9152
9147
|
) {
|
|
@@ -9250,8 +9245,6 @@ declare function hashComparator<V extends OpaqueHash>(a: V, b: V) {
|
|
|
9250
9245
|
return a.compare(b);
|
|
9251
9246
|
}
|
|
9252
9247
|
|
|
9253
|
-
// TODO [ToDr] Not sure where these should live yet :(
|
|
9254
|
-
|
|
9255
9248
|
/**
|
|
9256
9249
|
* `J`: The maximum sum of dependency items in a work-report.
|
|
9257
9250
|
*
|
|
@@ -9305,6 +9298,215 @@ declare class NotYetAccumulatedReport extends WithDebug {
|
|
|
9305
9298
|
}
|
|
9306
9299
|
}
|
|
9307
9300
|
|
|
9301
|
+
/**
|
|
9302
|
+
* `B_S`: The basic minimum balance which all services require.
|
|
9303
|
+
*
|
|
9304
|
+
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445800445800?v=0.6.7
|
|
9305
|
+
*/
|
|
9306
|
+
declare const BASE_SERVICE_BALANCE = 100n;
|
|
9307
|
+
/**
|
|
9308
|
+
* `B_I`: The additional minimum balance required per item of elective service state.
|
|
9309
|
+
*
|
|
9310
|
+
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445000445000?v=0.6.7
|
|
9311
|
+
*/
|
|
9312
|
+
declare const ELECTIVE_ITEM_BALANCE = 10n;
|
|
9313
|
+
/**
|
|
9314
|
+
* `B_L`: The additional minimum balance required per octet of elective service state.
|
|
9315
|
+
*
|
|
9316
|
+
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445400445400?v=0.6.7
|
|
9317
|
+
*/
|
|
9318
|
+
declare const ELECTIVE_BYTE_BALANCE = 1n;
|
|
9319
|
+
|
|
9320
|
+
declare const zeroSizeHint: SizeHint = {
|
|
9321
|
+
bytes: 0,
|
|
9322
|
+
isExact: true,
|
|
9323
|
+
};
|
|
9324
|
+
|
|
9325
|
+
/** 0-byte read, return given default value */
|
|
9326
|
+
declare const ignoreValueWithDefault = <T>(defaultValue: T) =>
|
|
9327
|
+
Descriptor.new<T>(
|
|
9328
|
+
"ignoreValue",
|
|
9329
|
+
zeroSizeHint,
|
|
9330
|
+
(_e, _v) => {},
|
|
9331
|
+
(_d) => defaultValue,
|
|
9332
|
+
(_s) => {},
|
|
9333
|
+
);
|
|
9334
|
+
|
|
9335
|
+
/** Encode and decode object with leading version number. */
|
|
9336
|
+
declare const codecWithVersion = <T>(val: Descriptor<T>): Descriptor<T> =>
|
|
9337
|
+
Descriptor.new<T>(
|
|
9338
|
+
"withVersion",
|
|
9339
|
+
{
|
|
9340
|
+
bytes: val.sizeHint.bytes + 8,
|
|
9341
|
+
isExact: false,
|
|
9342
|
+
},
|
|
9343
|
+
(e, v) => {
|
|
9344
|
+
e.varU64(0n);
|
|
9345
|
+
val.encode(e, v);
|
|
9346
|
+
},
|
|
9347
|
+
(d) => {
|
|
9348
|
+
const version = d.varU64();
|
|
9349
|
+
if (version !== 0n) {
|
|
9350
|
+
throw new Error("Non-zero version is not supported!");
|
|
9351
|
+
}
|
|
9352
|
+
return val.decode(d);
|
|
9353
|
+
},
|
|
9354
|
+
(s) => {
|
|
9355
|
+
s.varU64();
|
|
9356
|
+
val.skip(s);
|
|
9357
|
+
},
|
|
9358
|
+
);
|
|
9359
|
+
|
|
9360
|
+
/**
|
|
9361
|
+
* Service account details.
|
|
9362
|
+
*
|
|
9363
|
+
* https://graypaper.fluffylabs.dev/#/7e6ff6a/108301108301?v=0.6.7
|
|
9364
|
+
*/
|
|
9365
|
+
declare class ServiceAccountInfo extends WithDebug {
|
|
9366
|
+
static Codec = codec.Class(ServiceAccountInfo, {
|
|
9367
|
+
codeHash: codec.bytes(HASH_SIZE).asOpaque<CodeHash>(),
|
|
9368
|
+
balance: codec.u64,
|
|
9369
|
+
accumulateMinGas: codec.u64.convert((x) => x, tryAsServiceGas),
|
|
9370
|
+
onTransferMinGas: codec.u64.convert((x) => x, tryAsServiceGas),
|
|
9371
|
+
storageUtilisationBytes: codec.u64,
|
|
9372
|
+
gratisStorage: codec.u64,
|
|
9373
|
+
storageUtilisationCount: codec.u32,
|
|
9374
|
+
created: codec.u32.convert((x) => x, tryAsTimeSlot),
|
|
9375
|
+
lastAccumulation: codec.u32.convert((x) => x, tryAsTimeSlot),
|
|
9376
|
+
parentService: codec.u32.convert((x) => x, tryAsServiceId),
|
|
9377
|
+
});
|
|
9378
|
+
|
|
9379
|
+
static create(a: CodecRecord<ServiceAccountInfo>) {
|
|
9380
|
+
return new ServiceAccountInfo(
|
|
9381
|
+
a.codeHash,
|
|
9382
|
+
a.balance,
|
|
9383
|
+
a.accumulateMinGas,
|
|
9384
|
+
a.onTransferMinGas,
|
|
9385
|
+
a.storageUtilisationBytes,
|
|
9386
|
+
a.gratisStorage,
|
|
9387
|
+
a.storageUtilisationCount,
|
|
9388
|
+
a.created,
|
|
9389
|
+
a.lastAccumulation,
|
|
9390
|
+
a.parentService,
|
|
9391
|
+
);
|
|
9392
|
+
}
|
|
9393
|
+
|
|
9394
|
+
/**
|
|
9395
|
+
* `a_t = max(0, BS + BI * a_i + BL * a_o - a_f)`
|
|
9396
|
+
* https://graypaper.fluffylabs.dev/#/7e6ff6a/119e01119e01?v=0.6.7
|
|
9397
|
+
*/
|
|
9398
|
+
static calculateThresholdBalance(items: U32, bytes: U64, gratisStorage: U64): U64 {
|
|
9399
|
+
const storageCost =
|
|
9400
|
+
BASE_SERVICE_BALANCE + ELECTIVE_ITEM_BALANCE * BigInt(items) + ELECTIVE_BYTE_BALANCE * bytes - gratisStorage;
|
|
9401
|
+
|
|
9402
|
+
if (storageCost < 0n) {
|
|
9403
|
+
return tryAsU64(0);
|
|
9404
|
+
}
|
|
9405
|
+
|
|
9406
|
+
if (storageCost >= 2n ** 64n) {
|
|
9407
|
+
return tryAsU64(2n ** 64n - 1n);
|
|
9408
|
+
}
|
|
9409
|
+
|
|
9410
|
+
return tryAsU64(storageCost);
|
|
9411
|
+
}
|
|
9412
|
+
|
|
9413
|
+
private constructor(
|
|
9414
|
+
/** `a_c`: Hash of the service code. */
|
|
9415
|
+
public readonly codeHash: CodeHash,
|
|
9416
|
+
/** `a_b`: Current account balance. */
|
|
9417
|
+
public readonly balance: U64,
|
|
9418
|
+
/** `a_g`: Minimal gas required to execute Accumulate entrypoint. */
|
|
9419
|
+
public readonly accumulateMinGas: ServiceGas,
|
|
9420
|
+
/** `a_m`: Minimal gas required to execute On Transfer entrypoint. */
|
|
9421
|
+
public readonly onTransferMinGas: ServiceGas,
|
|
9422
|
+
/** `a_o`: Total number of octets in storage. */
|
|
9423
|
+
public readonly storageUtilisationBytes: U64,
|
|
9424
|
+
/** `a_f`: Cost-free storage. Decreases both storage item count and total byte size. */
|
|
9425
|
+
public readonly gratisStorage: U64,
|
|
9426
|
+
/** `a_i`: Number of items in storage. */
|
|
9427
|
+
public readonly storageUtilisationCount: U32,
|
|
9428
|
+
/** `a_r`: Creation account time slot. */
|
|
9429
|
+
public readonly created: TimeSlot,
|
|
9430
|
+
/** `a_a`: Most recent accumulation time slot. */
|
|
9431
|
+
public readonly lastAccumulation: TimeSlot,
|
|
9432
|
+
/** `a_p`: Parent service ID. */
|
|
9433
|
+
public readonly parentService: ServiceId,
|
|
9434
|
+
) {
|
|
9435
|
+
super();
|
|
9436
|
+
}
|
|
9437
|
+
}
|
|
9438
|
+
|
|
9439
|
+
declare class PreimageItem extends WithDebug {
|
|
9440
|
+
static Codec = codec.Class(PreimageItem, {
|
|
9441
|
+
hash: codec.bytes(HASH_SIZE).asOpaque<PreimageHash>(),
|
|
9442
|
+
blob: codec.blob,
|
|
9443
|
+
});
|
|
9444
|
+
|
|
9445
|
+
static create({ hash, blob }: CodecRecord<PreimageItem>) {
|
|
9446
|
+
return new PreimageItem(hash, blob);
|
|
9447
|
+
}
|
|
9448
|
+
|
|
9449
|
+
private constructor(
|
|
9450
|
+
readonly hash: PreimageHash,
|
|
9451
|
+
readonly blob: BytesBlob,
|
|
9452
|
+
) {
|
|
9453
|
+
super();
|
|
9454
|
+
}
|
|
9455
|
+
}
|
|
9456
|
+
|
|
9457
|
+
type StorageKey = Opaque<BytesBlob, "storage key">;
|
|
9458
|
+
|
|
9459
|
+
declare class StorageItem extends WithDebug {
|
|
9460
|
+
static Codec = codec.Class(StorageItem, {
|
|
9461
|
+
key: codec.blob.convert(
|
|
9462
|
+
(i) => i,
|
|
9463
|
+
(o) => asOpaqueType(o),
|
|
9464
|
+
),
|
|
9465
|
+
value: codec.blob,
|
|
9466
|
+
});
|
|
9467
|
+
|
|
9468
|
+
static create({ key, value }: CodecRecord<StorageItem>) {
|
|
9469
|
+
return new StorageItem(key, value);
|
|
9470
|
+
}
|
|
9471
|
+
|
|
9472
|
+
private constructor(
|
|
9473
|
+
readonly key: StorageKey,
|
|
9474
|
+
readonly value: BytesBlob,
|
|
9475
|
+
) {
|
|
9476
|
+
super();
|
|
9477
|
+
}
|
|
9478
|
+
}
|
|
9479
|
+
|
|
9480
|
+
declare const MAX_LOOKUP_HISTORY_SLOTS = 3;
|
|
9481
|
+
type LookupHistorySlots = KnownSizeArray<TimeSlot, `0-${typeof MAX_LOOKUP_HISTORY_SLOTS} timeslots`>;
|
|
9482
|
+
declare function tryAsLookupHistorySlots(items: readonly TimeSlot[]): LookupHistorySlots {
|
|
9483
|
+
const knownSize = asKnownSize(items) as LookupHistorySlots;
|
|
9484
|
+
if (knownSize.length > MAX_LOOKUP_HISTORY_SLOTS) {
|
|
9485
|
+
throw new Error(`Lookup history items must contain 0-${MAX_LOOKUP_HISTORY_SLOTS} timeslots.`);
|
|
9486
|
+
}
|
|
9487
|
+
return knownSize;
|
|
9488
|
+
}
|
|
9489
|
+
|
|
9490
|
+
/** https://graypaper.fluffylabs.dev/#/5f542d7/115400115800 */
|
|
9491
|
+
declare class LookupHistoryItem {
|
|
9492
|
+
constructor(
|
|
9493
|
+
public readonly hash: PreimageHash,
|
|
9494
|
+
public readonly length: U32,
|
|
9495
|
+
/**
|
|
9496
|
+
* Preimage availability history as a sequence of time slots.
|
|
9497
|
+
* See PreimageStatus and the following GP fragment for more details.
|
|
9498
|
+
* https://graypaper.fluffylabs.dev/#/5f542d7/11780011a500 */
|
|
9499
|
+
public readonly slots: LookupHistorySlots,
|
|
9500
|
+
) {}
|
|
9501
|
+
|
|
9502
|
+
static isRequested(item: LookupHistoryItem | LookupHistorySlots): boolean {
|
|
9503
|
+
if ("slots" in item) {
|
|
9504
|
+
return item.slots.length === 0;
|
|
9505
|
+
}
|
|
9506
|
+
return item.length === 0;
|
|
9507
|
+
}
|
|
9508
|
+
}
|
|
9509
|
+
|
|
9308
9510
|
/** Dictionary entry of services that auto-accumulate every block. */
|
|
9309
9511
|
declare class AutoAccumulate {
|
|
9310
9512
|
static Codec = codec.Class(AutoAccumulate, {
|
|
@@ -9325,33 +9527,42 @@ declare class AutoAccumulate {
|
|
|
9325
9527
|
}
|
|
9326
9528
|
|
|
9327
9529
|
/**
|
|
9328
|
-
* https://graypaper.fluffylabs.dev/#/
|
|
9530
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/114402114402?v=0.7.2
|
|
9329
9531
|
*/
|
|
9330
9532
|
declare class PrivilegedServices {
|
|
9533
|
+
/** https://graypaper.fluffylabs.dev/#/ab2cdbd/3bbd023bcb02?v=0.7.2 */
|
|
9331
9534
|
static Codec = codec.Class(PrivilegedServices, {
|
|
9332
9535
|
manager: codec.u32.asOpaque<ServiceId>(),
|
|
9333
|
-
|
|
9334
|
-
|
|
9536
|
+
assigners: codecPerCore(codec.u32.asOpaque<ServiceId>()),
|
|
9537
|
+
delegator: codec.u32.asOpaque<ServiceId>(),
|
|
9538
|
+
registrar: Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)
|
|
9539
|
+
? codec.u32.asOpaque<ServiceId>()
|
|
9540
|
+
: ignoreValueWithDefault(tryAsServiceId(2 ** 32 - 1)),
|
|
9335
9541
|
autoAccumulateServices: readonlyArray(codec.sequenceVarLen(AutoAccumulate.Codec)),
|
|
9336
9542
|
});
|
|
9337
9543
|
|
|
9338
|
-
static create(
|
|
9339
|
-
return new PrivilegedServices(manager,
|
|
9544
|
+
static create(a: CodecRecord<PrivilegedServices>) {
|
|
9545
|
+
return new PrivilegedServices(a.manager, a.delegator, a.registrar, a.assigners, a.autoAccumulateServices);
|
|
9340
9546
|
}
|
|
9341
9547
|
|
|
9342
9548
|
private constructor(
|
|
9343
9549
|
/**
|
|
9344
|
-
*
|
|
9345
|
-
* the service able to effect an alteration of χ from block to block,
|
|
9550
|
+
* `χ_M`: Manages alteration of χ from block to block,
|
|
9346
9551
|
* as well as bestow services with storage deposit credits.
|
|
9347
|
-
* https://graypaper.fluffylabs.dev/#/
|
|
9552
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/111502111902?v=0.7.2
|
|
9348
9553
|
*/
|
|
9349
9554
|
readonly manager: ServiceId,
|
|
9350
|
-
/**
|
|
9351
|
-
readonly
|
|
9352
|
-
/**
|
|
9353
|
-
|
|
9354
|
-
|
|
9555
|
+
/** `χ_V`: Managers validator keys. */
|
|
9556
|
+
readonly delegator: ServiceId,
|
|
9557
|
+
/**
|
|
9558
|
+
* `χ_R`: Manages the creation of services in protected range.
|
|
9559
|
+
*
|
|
9560
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/111b02111d02?v=0.7.2
|
|
9561
|
+
*/
|
|
9562
|
+
readonly registrar: ServiceId,
|
|
9563
|
+
/** `χ_A`: Manages authorization queue one for each core. */
|
|
9564
|
+
readonly assigners: PerCore<ServiceId>,
|
|
9565
|
+
/** `χ_Z`: Dictionary of services that auto-accumulate every block with their gas limit. */
|
|
9355
9566
|
readonly autoAccumulateServices: readonly AutoAccumulate[],
|
|
9356
9567
|
) {}
|
|
9357
9568
|
}
|
|
@@ -9800,190 +10011,6 @@ declare class SafroleData {
|
|
|
9800
10011
|
) {}
|
|
9801
10012
|
}
|
|
9802
10013
|
|
|
9803
|
-
/**
|
|
9804
|
-
* `B_S`: The basic minimum balance which all services require.
|
|
9805
|
-
*
|
|
9806
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445800445800?v=0.6.7
|
|
9807
|
-
*/
|
|
9808
|
-
declare const BASE_SERVICE_BALANCE = 100n;
|
|
9809
|
-
/**
|
|
9810
|
-
* `B_I`: The additional minimum balance required per item of elective service state.
|
|
9811
|
-
*
|
|
9812
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445000445000?v=0.6.7
|
|
9813
|
-
*/
|
|
9814
|
-
declare const ELECTIVE_ITEM_BALANCE = 10n;
|
|
9815
|
-
/**
|
|
9816
|
-
* `B_L`: The additional minimum balance required per octet of elective service state.
|
|
9817
|
-
*
|
|
9818
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445400445400?v=0.6.7
|
|
9819
|
-
*/
|
|
9820
|
-
declare const ELECTIVE_BYTE_BALANCE = 1n;
|
|
9821
|
-
|
|
9822
|
-
declare const zeroSizeHint: SizeHint = {
|
|
9823
|
-
bytes: 0,
|
|
9824
|
-
isExact: true,
|
|
9825
|
-
};
|
|
9826
|
-
|
|
9827
|
-
/** 0-byte read, return given default value */
|
|
9828
|
-
declare const ignoreValueWithDefault = <T>(defaultValue: T) =>
|
|
9829
|
-
Descriptor.new<T>(
|
|
9830
|
-
"ignoreValue",
|
|
9831
|
-
zeroSizeHint,
|
|
9832
|
-
(_e, _v) => {},
|
|
9833
|
-
(_d) => defaultValue,
|
|
9834
|
-
(_s) => {},
|
|
9835
|
-
);
|
|
9836
|
-
|
|
9837
|
-
/**
|
|
9838
|
-
* Service account details.
|
|
9839
|
-
*
|
|
9840
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/108301108301?v=0.6.7
|
|
9841
|
-
*/
|
|
9842
|
-
declare class ServiceAccountInfo extends WithDebug {
|
|
9843
|
-
static Codec = codec.Class(ServiceAccountInfo, {
|
|
9844
|
-
codeHash: codec.bytes(HASH_SIZE).asOpaque<CodeHash>(),
|
|
9845
|
-
balance: codec.u64,
|
|
9846
|
-
accumulateMinGas: codec.u64.convert((x) => x, tryAsServiceGas),
|
|
9847
|
-
onTransferMinGas: codec.u64.convert((x) => x, tryAsServiceGas),
|
|
9848
|
-
storageUtilisationBytes: codec.u64,
|
|
9849
|
-
gratisStorage: codec.u64,
|
|
9850
|
-
storageUtilisationCount: codec.u32,
|
|
9851
|
-
created: codec.u32.convert((x) => x, tryAsTimeSlot),
|
|
9852
|
-
lastAccumulation: codec.u32.convert((x) => x, tryAsTimeSlot),
|
|
9853
|
-
parentService: codec.u32.convert((x) => x, tryAsServiceId),
|
|
9854
|
-
});
|
|
9855
|
-
|
|
9856
|
-
static create(a: CodecRecord<ServiceAccountInfo>) {
|
|
9857
|
-
return new ServiceAccountInfo(
|
|
9858
|
-
a.codeHash,
|
|
9859
|
-
a.balance,
|
|
9860
|
-
a.accumulateMinGas,
|
|
9861
|
-
a.onTransferMinGas,
|
|
9862
|
-
a.storageUtilisationBytes,
|
|
9863
|
-
a.gratisStorage,
|
|
9864
|
-
a.storageUtilisationCount,
|
|
9865
|
-
a.created,
|
|
9866
|
-
a.lastAccumulation,
|
|
9867
|
-
a.parentService,
|
|
9868
|
-
);
|
|
9869
|
-
}
|
|
9870
|
-
|
|
9871
|
-
/**
|
|
9872
|
-
* `a_t = max(0, BS + BI * a_i + BL * a_o - a_f)`
|
|
9873
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/119e01119e01?v=0.6.7
|
|
9874
|
-
*/
|
|
9875
|
-
static calculateThresholdBalance(items: U32, bytes: U64, gratisStorage: U64): U64 {
|
|
9876
|
-
const storageCost =
|
|
9877
|
-
BASE_SERVICE_BALANCE + ELECTIVE_ITEM_BALANCE * BigInt(items) + ELECTIVE_BYTE_BALANCE * bytes - gratisStorage;
|
|
9878
|
-
|
|
9879
|
-
if (storageCost < 0n) {
|
|
9880
|
-
return tryAsU64(0);
|
|
9881
|
-
}
|
|
9882
|
-
|
|
9883
|
-
if (storageCost >= 2n ** 64n) {
|
|
9884
|
-
return tryAsU64(2n ** 64n - 1n);
|
|
9885
|
-
}
|
|
9886
|
-
|
|
9887
|
-
return tryAsU64(storageCost);
|
|
9888
|
-
}
|
|
9889
|
-
|
|
9890
|
-
private constructor(
|
|
9891
|
-
/** `a_c`: Hash of the service code. */
|
|
9892
|
-
public readonly codeHash: CodeHash,
|
|
9893
|
-
/** `a_b`: Current account balance. */
|
|
9894
|
-
public readonly balance: U64,
|
|
9895
|
-
/** `a_g`: Minimal gas required to execute Accumulate entrypoint. */
|
|
9896
|
-
public readonly accumulateMinGas: ServiceGas,
|
|
9897
|
-
/** `a_m`: Minimal gas required to execute On Transfer entrypoint. */
|
|
9898
|
-
public readonly onTransferMinGas: ServiceGas,
|
|
9899
|
-
/** `a_o`: Total number of octets in storage. */
|
|
9900
|
-
public readonly storageUtilisationBytes: U64,
|
|
9901
|
-
/** `a_f`: Cost-free storage. Decreases both storage item count and total byte size. */
|
|
9902
|
-
public readonly gratisStorage: U64,
|
|
9903
|
-
/** `a_i`: Number of items in storage. */
|
|
9904
|
-
public readonly storageUtilisationCount: U32,
|
|
9905
|
-
/** `a_r`: Creation account time slot. */
|
|
9906
|
-
public readonly created: TimeSlot,
|
|
9907
|
-
/** `a_a`: Most recent accumulation time slot. */
|
|
9908
|
-
public readonly lastAccumulation: TimeSlot,
|
|
9909
|
-
/** `a_p`: Parent service ID. */
|
|
9910
|
-
public readonly parentService: ServiceId,
|
|
9911
|
-
) {
|
|
9912
|
-
super();
|
|
9913
|
-
}
|
|
9914
|
-
}
|
|
9915
|
-
|
|
9916
|
-
declare class PreimageItem extends WithDebug {
|
|
9917
|
-
static Codec = codec.Class(PreimageItem, {
|
|
9918
|
-
hash: codec.bytes(HASH_SIZE).asOpaque<PreimageHash>(),
|
|
9919
|
-
blob: codec.blob,
|
|
9920
|
-
});
|
|
9921
|
-
|
|
9922
|
-
static create({ hash, blob }: CodecRecord<PreimageItem>) {
|
|
9923
|
-
return new PreimageItem(hash, blob);
|
|
9924
|
-
}
|
|
9925
|
-
|
|
9926
|
-
private constructor(
|
|
9927
|
-
readonly hash: PreimageHash,
|
|
9928
|
-
readonly blob: BytesBlob,
|
|
9929
|
-
) {
|
|
9930
|
-
super();
|
|
9931
|
-
}
|
|
9932
|
-
}
|
|
9933
|
-
|
|
9934
|
-
type StorageKey = Opaque<BytesBlob, "storage key">;
|
|
9935
|
-
|
|
9936
|
-
declare class StorageItem extends WithDebug {
|
|
9937
|
-
static Codec = codec.Class(StorageItem, {
|
|
9938
|
-
key: codec.blob.convert(
|
|
9939
|
-
(i) => i,
|
|
9940
|
-
(o) => asOpaqueType(o),
|
|
9941
|
-
),
|
|
9942
|
-
value: codec.blob,
|
|
9943
|
-
});
|
|
9944
|
-
|
|
9945
|
-
static create({ key, value }: CodecRecord<StorageItem>) {
|
|
9946
|
-
return new StorageItem(key, value);
|
|
9947
|
-
}
|
|
9948
|
-
|
|
9949
|
-
private constructor(
|
|
9950
|
-
readonly key: StorageKey,
|
|
9951
|
-
readonly value: BytesBlob,
|
|
9952
|
-
) {
|
|
9953
|
-
super();
|
|
9954
|
-
}
|
|
9955
|
-
}
|
|
9956
|
-
|
|
9957
|
-
declare const MAX_LOOKUP_HISTORY_SLOTS = 3;
|
|
9958
|
-
type LookupHistorySlots = KnownSizeArray<TimeSlot, `0-${typeof MAX_LOOKUP_HISTORY_SLOTS} timeslots`>;
|
|
9959
|
-
declare function tryAsLookupHistorySlots(items: readonly TimeSlot[]): LookupHistorySlots {
|
|
9960
|
-
const knownSize = asKnownSize(items) as LookupHistorySlots;
|
|
9961
|
-
if (knownSize.length > MAX_LOOKUP_HISTORY_SLOTS) {
|
|
9962
|
-
throw new Error(`Lookup history items must contain 0-${MAX_LOOKUP_HISTORY_SLOTS} timeslots.`);
|
|
9963
|
-
}
|
|
9964
|
-
return knownSize;
|
|
9965
|
-
}
|
|
9966
|
-
|
|
9967
|
-
/** https://graypaper.fluffylabs.dev/#/5f542d7/115400115800 */
|
|
9968
|
-
declare class LookupHistoryItem {
|
|
9969
|
-
constructor(
|
|
9970
|
-
public readonly hash: PreimageHash,
|
|
9971
|
-
public readonly length: U32,
|
|
9972
|
-
/**
|
|
9973
|
-
* Preimage availability history as a sequence of time slots.
|
|
9974
|
-
* See PreimageStatus and the following GP fragment for more details.
|
|
9975
|
-
* https://graypaper.fluffylabs.dev/#/5f542d7/11780011a500 */
|
|
9976
|
-
public readonly slots: LookupHistorySlots,
|
|
9977
|
-
) {}
|
|
9978
|
-
|
|
9979
|
-
static isRequested(item: LookupHistoryItem | LookupHistorySlots): boolean {
|
|
9980
|
-
if ("slots" in item) {
|
|
9981
|
-
return item.slots.length === 0;
|
|
9982
|
-
}
|
|
9983
|
-
return item.length === 0;
|
|
9984
|
-
}
|
|
9985
|
-
}
|
|
9986
|
-
|
|
9987
10014
|
declare const codecServiceId: Descriptor<ServiceId> =
|
|
9988
10015
|
Compatibility.isSuite(TestSuite.W3F_DAVXY) || Compatibility.isSuite(TestSuite.JAMDUNA, GpVersion.V0_6_7)
|
|
9989
10016
|
? codec.u32.asOpaque<ServiceId>()
|
|
@@ -11158,8 +11185,9 @@ declare class InMemoryState extends WithDebug implements State, EnumerableState
|
|
|
11158
11185
|
epochRoot: Bytes.zero(BANDERSNATCH_RING_ROOT_BYTES).asOpaque(),
|
|
11159
11186
|
privilegedServices: PrivilegedServices.create({
|
|
11160
11187
|
manager: tryAsServiceId(0),
|
|
11161
|
-
|
|
11162
|
-
|
|
11188
|
+
assigners: tryAsPerCore(new Array(spec.coresCount).fill(tryAsServiceId(0)), spec),
|
|
11189
|
+
delegator: tryAsServiceId(0),
|
|
11190
|
+
registrar: tryAsServiceId(MAX_VALUE),
|
|
11163
11191
|
autoAccumulateServices: [],
|
|
11164
11192
|
}),
|
|
11165
11193
|
accumulationOutputLog: SortedArray.fromArray(accumulationOutputComparator, []),
|
|
@@ -11293,7 +11321,7 @@ declare const index$e_codecPerCore: typeof codecPerCore;
|
|
|
11293
11321
|
declare const index$e_codecServiceId: typeof codecServiceId;
|
|
11294
11322
|
declare const index$e_codecVarGas: typeof codecVarGas;
|
|
11295
11323
|
declare const index$e_codecVarU16: typeof codecVarU16;
|
|
11296
|
-
declare const index$
|
|
11324
|
+
declare const index$e_codecWithVersion: typeof codecWithVersion;
|
|
11297
11325
|
declare const index$e_hashComparator: typeof hashComparator;
|
|
11298
11326
|
declare const index$e_ignoreValueWithDefault: typeof ignoreValueWithDefault;
|
|
11299
11327
|
declare const index$e_serviceDataCodec: typeof serviceDataCodec;
|
|
@@ -11304,7 +11332,7 @@ declare const index$e_tryAsPerCore: typeof tryAsPerCore;
|
|
|
11304
11332
|
declare const index$e_workReportsSortedSetCodec: typeof workReportsSortedSetCodec;
|
|
11305
11333
|
declare const index$e_zeroSizeHint: typeof zeroSizeHint;
|
|
11306
11334
|
declare namespace index$e {
|
|
11307
|
-
export { index$e_AccumulationOutput as AccumulationOutput, index$e_AutoAccumulate as AutoAccumulate, index$e_AvailabilityAssignment as AvailabilityAssignment, index$e_BASE_SERVICE_BALANCE as BASE_SERVICE_BALANCE, index$e_BlockState as BlockState, index$e_CoreStatistics as CoreStatistics, index$e_DisputesRecords as DisputesRecords, index$e_ELECTIVE_BYTE_BALANCE as ELECTIVE_BYTE_BALANCE, index$e_ELECTIVE_ITEM_BALANCE as ELECTIVE_ITEM_BALANCE, index$e_InMemoryService as InMemoryService, index$e_InMemoryState as InMemoryState, index$e_LookupHistoryItem as LookupHistoryItem, index$e_MAX_LOOKUP_HISTORY_SLOTS as MAX_LOOKUP_HISTORY_SLOTS, index$e_PreimageItem as PreimageItem, index$e_PrivilegedServices as PrivilegedServices, index$e_RecentBlocks as RecentBlocks, index$e_RecentBlocksHistory as RecentBlocksHistory, index$e_SafroleData as SafroleData, index$e_SafroleSealingKeysData as SafroleSealingKeysData, index$e_SafroleSealingKeysKind as SafroleSealingKeysKind, index$e_ServiceAccountInfo as ServiceAccountInfo, index$e_ServiceStatistics as ServiceStatistics, index$e_StatisticsData as StatisticsData, index$e_StorageItem as StorageItem, index$e_UpdateError as UpdateError, index$e_UpdatePreimage as UpdatePreimage, index$e_UpdatePreimageKind as UpdatePreimageKind, index$e_UpdateService as UpdateService, index$e_UpdateServiceKind as UpdateServiceKind, index$e_UpdateStorage as UpdateStorage, index$e_UpdateStorageKind as UpdateStorageKind, index$e_ValidatorData as ValidatorData, index$e_ValidatorStatistics as ValidatorStatistics, index$e_accumulationOutputComparator as accumulationOutputComparator, index$e_codecBandersnatchKey as codecBandersnatchKey, index$e_codecPerCore as codecPerCore, index$e_codecServiceId as codecServiceId, index$e_codecVarGas as codecVarGas, index$e_codecVarU16 as codecVarU16, index$
|
|
11335
|
+
export { index$e_AccumulationOutput as AccumulationOutput, index$e_AutoAccumulate as AutoAccumulate, index$e_AvailabilityAssignment as AvailabilityAssignment, index$e_BASE_SERVICE_BALANCE as BASE_SERVICE_BALANCE, index$e_BlockState as BlockState, index$e_CoreStatistics as CoreStatistics, index$e_DisputesRecords as DisputesRecords, index$e_ELECTIVE_BYTE_BALANCE as ELECTIVE_BYTE_BALANCE, index$e_ELECTIVE_ITEM_BALANCE as ELECTIVE_ITEM_BALANCE, index$e_InMemoryService as InMemoryService, index$e_InMemoryState as InMemoryState, index$e_LookupHistoryItem as LookupHistoryItem, index$e_MAX_LOOKUP_HISTORY_SLOTS as MAX_LOOKUP_HISTORY_SLOTS, index$e_PreimageItem as PreimageItem, index$e_PrivilegedServices as PrivilegedServices, index$e_RecentBlocks as RecentBlocks, index$e_RecentBlocksHistory as RecentBlocksHistory, index$e_SafroleData as SafroleData, index$e_SafroleSealingKeysData as SafroleSealingKeysData, index$e_SafroleSealingKeysKind as SafroleSealingKeysKind, index$e_ServiceAccountInfo as ServiceAccountInfo, index$e_ServiceStatistics as ServiceStatistics, index$e_StatisticsData as StatisticsData, index$e_StorageItem as StorageItem, index$e_UpdateError as UpdateError, index$e_UpdatePreimage as UpdatePreimage, index$e_UpdatePreimageKind as UpdatePreimageKind, index$e_UpdateService as UpdateService, index$e_UpdateServiceKind as UpdateServiceKind, index$e_UpdateStorage as UpdateStorage, index$e_UpdateStorageKind as UpdateStorageKind, index$e_ValidatorData as ValidatorData, index$e_ValidatorStatistics as ValidatorStatistics, index$e_accumulationOutputComparator as accumulationOutputComparator, index$e_codecBandersnatchKey as codecBandersnatchKey, index$e_codecPerCore as codecPerCore, index$e_codecServiceId as codecServiceId, index$e_codecVarGas as codecVarGas, index$e_codecVarU16 as codecVarU16, index$e_codecWithVersion as codecWithVersion, index$e_hashComparator as hashComparator, index$e_ignoreValueWithDefault as ignoreValueWithDefault, index$e_serviceDataCodec as serviceDataCodec, index$e_serviceEntriesCodec as serviceEntriesCodec, index$e_sortedSetCodec as sortedSetCodec, index$e_tryAsLookupHistorySlots as tryAsLookupHistorySlots, index$e_tryAsPerCore as tryAsPerCore, index$e_workReportsSortedSetCodec as workReportsSortedSetCodec, index$e_zeroSizeHint as zeroSizeHint };
|
|
11308
11336
|
export type { index$e_BlocksState as BlocksState, index$e_ENTROPY_ENTRIES as ENTROPY_ENTRIES, index$e_EnumerableState as EnumerableState, index$e_FieldNames as FieldNames, index$e_InMemoryStateFields as InMemoryStateFields, index$e_LookupHistorySlots as LookupHistorySlots, index$e_MAX_RECENT_HISTORY as MAX_RECENT_HISTORY, index$e_PerCore as PerCore, index$e_SafroleSealingKeys as SafroleSealingKeys, index$e_Service as Service, index$e_ServiceData as ServiceData, index$e_ServiceEntries as ServiceEntries, index$e_ServicesUpdate as ServicesUpdate, index$e_State as State, index$e_StorageKey as StorageKey, index$e_VALIDATOR_META_BYTES as VALIDATOR_META_BYTES };
|
|
11309
11337
|
}
|
|
11310
11338
|
|
|
@@ -11372,7 +11400,7 @@ declare namespace stateKeys {
|
|
|
11372
11400
|
}
|
|
11373
11401
|
|
|
11374
11402
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3bba033bba03?v=0.7.1 */
|
|
11375
|
-
export function serviceStorage(serviceId: ServiceId, key: StorageKey): StateKey {
|
|
11403
|
+
export function serviceStorage(blake2b: Blake2b, serviceId: ServiceId, key: StorageKey): StateKey {
|
|
11376
11404
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
11377
11405
|
const out = Bytes.zero(HASH_SIZE);
|
|
11378
11406
|
out.raw.set(u32AsLeBytes(tryAsU32(2 ** 32 - 1)), 0);
|
|
@@ -11380,11 +11408,11 @@ declare namespace stateKeys {
|
|
|
11380
11408
|
return legacyServiceNested(serviceId, out);
|
|
11381
11409
|
}
|
|
11382
11410
|
|
|
11383
|
-
return serviceNested(serviceId, tryAsU32(2 ** 32 - 1), key);
|
|
11411
|
+
return serviceNested(blake2b, serviceId, tryAsU32(2 ** 32 - 1), key);
|
|
11384
11412
|
}
|
|
11385
11413
|
|
|
11386
11414
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3bd7033bd703?v=0.7.1 */
|
|
11387
|
-
export function servicePreimage(serviceId: ServiceId, hash: PreimageHash): StateKey {
|
|
11415
|
+
export function servicePreimage(blake2b: Blake2b, serviceId: ServiceId, hash: PreimageHash): StateKey {
|
|
11388
11416
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
11389
11417
|
const out = Bytes.zero(HASH_SIZE);
|
|
11390
11418
|
out.raw.set(u32AsLeBytes(tryAsU32(2 ** 32 - 2)), 0);
|
|
@@ -11392,11 +11420,16 @@ declare namespace stateKeys {
|
|
|
11392
11420
|
return legacyServiceNested(serviceId, out);
|
|
11393
11421
|
}
|
|
11394
11422
|
|
|
11395
|
-
return serviceNested(serviceId, tryAsU32(2 ** 32 - 2), hash);
|
|
11423
|
+
return serviceNested(blake2b, serviceId, tryAsU32(2 ** 32 - 2), hash);
|
|
11396
11424
|
}
|
|
11397
11425
|
|
|
11398
11426
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3b0a043b0a04?v=0.7.1 */
|
|
11399
|
-
export function serviceLookupHistory(
|
|
11427
|
+
export function serviceLookupHistory(
|
|
11428
|
+
blake2b: Blake2b,
|
|
11429
|
+
serviceId: ServiceId,
|
|
11430
|
+
hash: PreimageHash,
|
|
11431
|
+
preimageLength: U32,
|
|
11432
|
+
): StateKey {
|
|
11400
11433
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
11401
11434
|
const doubleHash = blake2b.hashBytes(hash);
|
|
11402
11435
|
const out = Bytes.zero(HASH_SIZE);
|
|
@@ -11405,11 +11438,11 @@ declare namespace stateKeys {
|
|
|
11405
11438
|
return legacyServiceNested(serviceId, out);
|
|
11406
11439
|
}
|
|
11407
11440
|
|
|
11408
|
-
return serviceNested(serviceId, preimageLength, hash);
|
|
11441
|
+
return serviceNested(blake2b, serviceId, preimageLength, hash);
|
|
11409
11442
|
}
|
|
11410
11443
|
|
|
11411
11444
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3b88003b8800?v=0.7.1 */
|
|
11412
|
-
export function serviceNested(serviceId: ServiceId, numberPrefix: U32, hash: BytesBlob): StateKey {
|
|
11445
|
+
export function serviceNested(blake2b: Blake2b, serviceId: ServiceId, numberPrefix: U32, hash: BytesBlob): StateKey {
|
|
11413
11446
|
const inputToHash = BytesBlob.blobFromParts(u32AsLeBytes(numberPrefix), hash.raw);
|
|
11414
11447
|
const newHash = blake2b.hashBytes(inputToHash).raw.subarray(0, 28);
|
|
11415
11448
|
const key = Bytes.zero(HASH_SIZE);
|
|
@@ -11589,24 +11622,26 @@ declare namespace serialize {
|
|
|
11589
11622
|
/** C(255, s): https://graypaper.fluffylabs.dev/#/85129da/383103383103?v=0.6.3 */
|
|
11590
11623
|
export const serviceData = (serviceId: ServiceId) => ({
|
|
11591
11624
|
key: stateKeys.serviceInfo(serviceId),
|
|
11592
|
-
Codec:
|
|
11625
|
+
Codec: Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)
|
|
11626
|
+
? codecWithVersion(ServiceAccountInfo.Codec)
|
|
11627
|
+
: ServiceAccountInfo.Codec,
|
|
11593
11628
|
});
|
|
11594
11629
|
|
|
11595
11630
|
/** https://graypaper.fluffylabs.dev/#/85129da/384803384803?v=0.6.3 */
|
|
11596
|
-
export const serviceStorage = (serviceId: ServiceId, key: StorageKey) => ({
|
|
11597
|
-
key: stateKeys.serviceStorage(serviceId, key),
|
|
11631
|
+
export const serviceStorage = (blake2b: Blake2b, serviceId: ServiceId, key: StorageKey) => ({
|
|
11632
|
+
key: stateKeys.serviceStorage(blake2b, serviceId, key),
|
|
11598
11633
|
Codec: dumpCodec,
|
|
11599
11634
|
});
|
|
11600
11635
|
|
|
11601
11636
|
/** https://graypaper.fluffylabs.dev/#/85129da/385b03385b03?v=0.6.3 */
|
|
11602
|
-
export const servicePreimages = (serviceId: ServiceId, hash: PreimageHash) => ({
|
|
11603
|
-
key: stateKeys.servicePreimage(serviceId, hash),
|
|
11637
|
+
export const servicePreimages = (blake2b: Blake2b, serviceId: ServiceId, hash: PreimageHash) => ({
|
|
11638
|
+
key: stateKeys.servicePreimage(blake2b, serviceId, hash),
|
|
11604
11639
|
Codec: dumpCodec,
|
|
11605
11640
|
});
|
|
11606
11641
|
|
|
11607
11642
|
/** https://graypaper.fluffylabs.dev/#/85129da/387603387603?v=0.6.3 */
|
|
11608
|
-
export const serviceLookupHistory = (serviceId: ServiceId, hash: PreimageHash, len: U32) => ({
|
|
11609
|
-
key: stateKeys.serviceLookupHistory(serviceId, hash, len),
|
|
11643
|
+
export const serviceLookupHistory = (blake2b: Blake2b, serviceId: ServiceId, hash: PreimageHash, len: U32) => ({
|
|
11644
|
+
key: stateKeys.serviceLookupHistory(blake2b, serviceId, hash, len),
|
|
11610
11645
|
Codec: readonlyArray(codec.sequenceVarLen(codec.u32)),
|
|
11611
11646
|
});
|
|
11612
11647
|
}
|
|
@@ -11641,6 +11676,7 @@ declare const EMPTY_BLOB = BytesBlob.empty();
|
|
|
11641
11676
|
/** Serialize given state update into a series of key-value pairs. */
|
|
11642
11677
|
declare function* serializeStateUpdate(
|
|
11643
11678
|
spec: ChainSpec,
|
|
11679
|
+
blake2b: Blake2b,
|
|
11644
11680
|
update: Partial<State & ServicesUpdate>,
|
|
11645
11681
|
): Generator<StateEntryUpdate> {
|
|
11646
11682
|
// first let's serialize all of the simple entries (if present!)
|
|
@@ -11649,9 +11685,9 @@ declare function* serializeStateUpdate(
|
|
|
11649
11685
|
const encode = <T>(codec: Encode<T>, val: T) => Encoder.encodeObject(codec, val, spec);
|
|
11650
11686
|
|
|
11651
11687
|
// then let's proceed with service updates
|
|
11652
|
-
yield* serializeServiceUpdates(update.servicesUpdates, encode);
|
|
11653
|
-
yield* serializePreimages(update.preimages, encode);
|
|
11654
|
-
yield* serializeStorage(update.storage);
|
|
11688
|
+
yield* serializeServiceUpdates(update.servicesUpdates, encode, blake2b);
|
|
11689
|
+
yield* serializePreimages(update.preimages, encode, blake2b);
|
|
11690
|
+
yield* serializeStorage(update.storage, blake2b);
|
|
11655
11691
|
yield* serializeRemovedServices(update.servicesRemoved);
|
|
11656
11692
|
}
|
|
11657
11693
|
|
|
@@ -11663,18 +11699,18 @@ declare function* serializeRemovedServices(servicesRemoved: ServiceId[] | undefi
|
|
|
11663
11699
|
}
|
|
11664
11700
|
}
|
|
11665
11701
|
|
|
11666
|
-
declare function* serializeStorage(storage: UpdateStorage[] | undefined): Generator<StateEntryUpdate> {
|
|
11702
|
+
declare function* serializeStorage(storage: UpdateStorage[] | undefined, blake2b: Blake2b): Generator<StateEntryUpdate> {
|
|
11667
11703
|
for (const { action, serviceId } of storage ?? []) {
|
|
11668
11704
|
switch (action.kind) {
|
|
11669
11705
|
case UpdateStorageKind.Set: {
|
|
11670
11706
|
const key = action.storage.key;
|
|
11671
|
-
const codec = serialize.serviceStorage(serviceId, key);
|
|
11707
|
+
const codec = serialize.serviceStorage(blake2b, serviceId, key);
|
|
11672
11708
|
yield [StateEntryUpdateAction.Insert, codec.key, action.storage.value];
|
|
11673
11709
|
break;
|
|
11674
11710
|
}
|
|
11675
11711
|
case UpdateStorageKind.Remove: {
|
|
11676
11712
|
const key = action.key;
|
|
11677
|
-
const codec = serialize.serviceStorage(serviceId, key);
|
|
11713
|
+
const codec = serialize.serviceStorage(blake2b, serviceId, key);
|
|
11678
11714
|
yield [StateEntryUpdateAction.Remove, codec.key, EMPTY_BLOB];
|
|
11679
11715
|
break;
|
|
11680
11716
|
}
|
|
@@ -11684,16 +11720,20 @@ declare function* serializeStorage(storage: UpdateStorage[] | undefined): Genera
|
|
|
11684
11720
|
}
|
|
11685
11721
|
}
|
|
11686
11722
|
|
|
11687
|
-
declare function* serializePreimages(
|
|
11723
|
+
declare function* serializePreimages(
|
|
11724
|
+
preimages: UpdatePreimage[] | undefined,
|
|
11725
|
+
encode: EncodeFun,
|
|
11726
|
+
blake2b: Blake2b,
|
|
11727
|
+
): Generator<StateEntryUpdate> {
|
|
11688
11728
|
for (const { action, serviceId } of preimages ?? []) {
|
|
11689
11729
|
switch (action.kind) {
|
|
11690
11730
|
case UpdatePreimageKind.Provide: {
|
|
11691
11731
|
const { hash, blob } = action.preimage;
|
|
11692
|
-
const codec = serialize.servicePreimages(serviceId, hash);
|
|
11732
|
+
const codec = serialize.servicePreimages(blake2b, serviceId, hash);
|
|
11693
11733
|
yield [StateEntryUpdateAction.Insert, codec.key, blob];
|
|
11694
11734
|
|
|
11695
11735
|
if (action.slot !== null) {
|
|
11696
|
-
const codec2 = serialize.serviceLookupHistory(serviceId, hash, tryAsU32(blob.length));
|
|
11736
|
+
const codec2 = serialize.serviceLookupHistory(blake2b, serviceId, hash, tryAsU32(blob.length));
|
|
11697
11737
|
yield [
|
|
11698
11738
|
StateEntryUpdateAction.Insert,
|
|
11699
11739
|
codec2.key,
|
|
@@ -11704,16 +11744,16 @@ declare function* serializePreimages(preimages: UpdatePreimage[] | undefined, en
|
|
|
11704
11744
|
}
|
|
11705
11745
|
case UpdatePreimageKind.UpdateOrAdd: {
|
|
11706
11746
|
const { hash, length, slots } = action.item;
|
|
11707
|
-
const codec = serialize.serviceLookupHistory(serviceId, hash, length);
|
|
11747
|
+
const codec = serialize.serviceLookupHistory(blake2b, serviceId, hash, length);
|
|
11708
11748
|
yield [StateEntryUpdateAction.Insert, codec.key, encode(codec.Codec, slots)];
|
|
11709
11749
|
break;
|
|
11710
11750
|
}
|
|
11711
11751
|
case UpdatePreimageKind.Remove: {
|
|
11712
11752
|
const { hash, length } = action;
|
|
11713
|
-
const codec = serialize.servicePreimages(serviceId, hash);
|
|
11753
|
+
const codec = serialize.servicePreimages(blake2b, serviceId, hash);
|
|
11714
11754
|
yield [StateEntryUpdateAction.Remove, codec.key, EMPTY_BLOB];
|
|
11715
11755
|
|
|
11716
|
-
const codec2 = serialize.serviceLookupHistory(serviceId, hash, length);
|
|
11756
|
+
const codec2 = serialize.serviceLookupHistory(blake2b, serviceId, hash, length);
|
|
11717
11757
|
yield [StateEntryUpdateAction.Remove, codec2.key, EMPTY_BLOB];
|
|
11718
11758
|
break;
|
|
11719
11759
|
}
|
|
@@ -11725,6 +11765,7 @@ declare function* serializePreimages(preimages: UpdatePreimage[] | undefined, en
|
|
|
11725
11765
|
declare function* serializeServiceUpdates(
|
|
11726
11766
|
servicesUpdates: UpdateService[] | undefined,
|
|
11727
11767
|
encode: EncodeFun,
|
|
11768
|
+
blake2b: Blake2b,
|
|
11728
11769
|
): Generator<StateEntryUpdate> {
|
|
11729
11770
|
for (const { action, serviceId } of servicesUpdates ?? []) {
|
|
11730
11771
|
// new service being created or updated
|
|
@@ -11734,7 +11775,7 @@ declare function* serializeServiceUpdates(
|
|
|
11734
11775
|
// additional lookup history update
|
|
11735
11776
|
if (action.kind === UpdateServiceKind.Create && action.lookupHistory !== null) {
|
|
11736
11777
|
const { lookupHistory } = action;
|
|
11737
|
-
const codec2 = serialize.serviceLookupHistory(serviceId, lookupHistory.hash, lookupHistory.length);
|
|
11778
|
+
const codec2 = serialize.serviceLookupHistory(blake2b, serviceId, lookupHistory.hash, lookupHistory.length);
|
|
11738
11779
|
yield [StateEntryUpdateAction.Insert, codec2.key, encode(codec2.Codec, lookupHistory.slots)];
|
|
11739
11780
|
}
|
|
11740
11781
|
}
|
|
@@ -11868,8 +11909,8 @@ declare class StateEntries {
|
|
|
11868
11909
|
);
|
|
11869
11910
|
|
|
11870
11911
|
/** Turn in-memory state into it's serialized form. */
|
|
11871
|
-
static serializeInMemory(spec: ChainSpec, state: InMemoryState) {
|
|
11872
|
-
return new StateEntries(convertInMemoryStateToDictionary(spec, state));
|
|
11912
|
+
static serializeInMemory(spec: ChainSpec, blake2b: Blake2b, state: InMemoryState) {
|
|
11913
|
+
return new StateEntries(convertInMemoryStateToDictionary(spec, blake2b, state));
|
|
11873
11914
|
}
|
|
11874
11915
|
|
|
11875
11916
|
/**
|
|
@@ -11924,7 +11965,8 @@ declare class StateEntries {
|
|
|
11924
11965
|
}
|
|
11925
11966
|
|
|
11926
11967
|
/** https://graypaper.fluffylabs.dev/#/68eaa1f/391600391600?v=0.6.4 */
|
|
11927
|
-
getRootHash(): StateRootHash {
|
|
11968
|
+
getRootHash(blake2b: Blake2b): StateRootHash {
|
|
11969
|
+
const blake2bTrieHasher = getBlake2bTrieHasher(blake2b);
|
|
11928
11970
|
const leaves: SortedSet<LeafNode> = SortedSet.fromArray(leafComparator);
|
|
11929
11971
|
for (const [key, value] of this) {
|
|
11930
11972
|
leaves.insert(InMemoryTrie.constructLeaf(blake2bTrieHasher, key.asOpaque(), value));
|
|
@@ -11937,6 +11979,7 @@ declare class StateEntries {
|
|
|
11937
11979
|
/** https://graypaper.fluffylabs.dev/#/68eaa1f/38a50038a500?v=0.6.4 */
|
|
11938
11980
|
declare function convertInMemoryStateToDictionary(
|
|
11939
11981
|
spec: ChainSpec,
|
|
11982
|
+
blake2b: Blake2b,
|
|
11940
11983
|
state: InMemoryState,
|
|
11941
11984
|
): TruncatedHashDictionary<StateKey, BytesBlob> {
|
|
11942
11985
|
const serialized = TruncatedHashDictionary.fromEntries<StateKey, BytesBlob>([]);
|
|
@@ -11969,20 +12012,25 @@ declare function convertInMemoryStateToDictionary(
|
|
|
11969
12012
|
|
|
11970
12013
|
// preimages
|
|
11971
12014
|
for (const preimage of service.data.preimages.values()) {
|
|
11972
|
-
const { key, Codec } = serialize.servicePreimages(serviceId, preimage.hash);
|
|
12015
|
+
const { key, Codec } = serialize.servicePreimages(blake2b, serviceId, preimage.hash);
|
|
11973
12016
|
serialized.set(key, Encoder.encodeObject(Codec, preimage.blob));
|
|
11974
12017
|
}
|
|
11975
12018
|
|
|
11976
12019
|
// storage
|
|
11977
12020
|
for (const storage of service.data.storage.values()) {
|
|
11978
|
-
const { key, Codec } = serialize.serviceStorage(serviceId, storage.key);
|
|
12021
|
+
const { key, Codec } = serialize.serviceStorage(blake2b, serviceId, storage.key);
|
|
11979
12022
|
serialized.set(key, Encoder.encodeObject(Codec, storage.value));
|
|
11980
12023
|
}
|
|
11981
12024
|
|
|
11982
12025
|
// lookup history
|
|
11983
12026
|
for (const lookupHistoryList of service.data.lookupHistory.values()) {
|
|
11984
12027
|
for (const lookupHistory of lookupHistoryList) {
|
|
11985
|
-
const { key, Codec } = serialize.serviceLookupHistory(
|
|
12028
|
+
const { key, Codec } = serialize.serviceLookupHistory(
|
|
12029
|
+
blake2b,
|
|
12030
|
+
serviceId,
|
|
12031
|
+
lookupHistory.hash,
|
|
12032
|
+
lookupHistory.length,
|
|
12033
|
+
);
|
|
11986
12034
|
serialized.set(key, Encoder.encodeObject(Codec, lookupHistory.slots.slice()));
|
|
11987
12035
|
}
|
|
11988
12036
|
}
|
|
@@ -12013,21 +12061,23 @@ declare class SerializedState<T extends SerializedStateBackend = SerializedState
|
|
|
12013
12061
|
implements State, EnumerableState
|
|
12014
12062
|
{
|
|
12015
12063
|
/** Create a state-like object from collection of serialized entries. */
|
|
12016
|
-
static fromStateEntries(spec: ChainSpec, state: StateEntries, recentServices: ServiceId[] = []) {
|
|
12017
|
-
return new SerializedState(spec, state, recentServices);
|
|
12064
|
+
static fromStateEntries(spec: ChainSpec, blake2b: Blake2b, state: StateEntries, recentServices: ServiceId[] = []) {
|
|
12065
|
+
return new SerializedState(spec, blake2b, state, recentServices);
|
|
12018
12066
|
}
|
|
12019
12067
|
|
|
12020
12068
|
/** Create a state-like object backed by some DB. */
|
|
12021
12069
|
static new<T extends SerializedStateBackend>(
|
|
12022
12070
|
spec: ChainSpec,
|
|
12071
|
+
blake2b: Blake2b,
|
|
12023
12072
|
db: T,
|
|
12024
12073
|
recentServices: ServiceId[] = [],
|
|
12025
12074
|
): SerializedState<T> {
|
|
12026
|
-
return new SerializedState(spec, db, recentServices);
|
|
12075
|
+
return new SerializedState(spec, blake2b, db, recentServices);
|
|
12027
12076
|
}
|
|
12028
12077
|
|
|
12029
12078
|
private constructor(
|
|
12030
12079
|
private readonly spec: ChainSpec,
|
|
12080
|
+
private readonly blake2b: Blake2b,
|
|
12031
12081
|
public backend: T,
|
|
12032
12082
|
/** Best-effort list of recently active services. */
|
|
12033
12083
|
private readonly _recentServiceIds: ServiceId[],
|
|
@@ -12058,7 +12108,7 @@ declare class SerializedState<T extends SerializedStateBackend = SerializedState
|
|
|
12058
12108
|
this._recentServiceIds.push(id);
|
|
12059
12109
|
}
|
|
12060
12110
|
|
|
12061
|
-
return new SerializedService(id, serviceData, (key) => this.retrieveOptional(key));
|
|
12111
|
+
return new SerializedService(this.blake2b, id, serviceData, (key) => this.retrieveOptional(key));
|
|
12062
12112
|
}
|
|
12063
12113
|
|
|
12064
12114
|
private retrieve<T>({ key, Codec }: KeyAndCodec<T>, description: string): T {
|
|
@@ -12157,6 +12207,7 @@ declare class SerializedState<T extends SerializedStateBackend = SerializedState
|
|
|
12157
12207
|
/** Service data representation on a serialized state. */
|
|
12158
12208
|
declare class SerializedService implements Service {
|
|
12159
12209
|
constructor(
|
|
12210
|
+
public readonly blake2b: Blake2b,
|
|
12160
12211
|
/** Service id */
|
|
12161
12212
|
public readonly serviceId: ServiceId,
|
|
12162
12213
|
private readonly accountInfo: ServiceAccountInfo,
|
|
@@ -12172,14 +12223,14 @@ declare class SerializedService implements Service {
|
|
|
12172
12223
|
getStorage(rawKey: StorageKey): BytesBlob | null {
|
|
12173
12224
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
12174
12225
|
const SERVICE_ID_BYTES = 4;
|
|
12175
|
-
const serviceIdAndKey =
|
|
12226
|
+
const serviceIdAndKey = safeAllocUint8Array(SERVICE_ID_BYTES + rawKey.length);
|
|
12176
12227
|
serviceIdAndKey.set(u32AsLeBytes(this.serviceId));
|
|
12177
12228
|
serviceIdAndKey.set(rawKey.raw, SERVICE_ID_BYTES);
|
|
12178
|
-
const key: StorageKey = asOpaqueType(BytesBlob.blobFrom(blake2b.hashBytes(serviceIdAndKey).raw));
|
|
12179
|
-
return this.retrieveOptional(serialize.serviceStorage(this.serviceId, key)) ?? null;
|
|
12229
|
+
const key: StorageKey = asOpaqueType(BytesBlob.blobFrom(this.blake2b.hashBytes(serviceIdAndKey).raw));
|
|
12230
|
+
return this.retrieveOptional(serialize.serviceStorage(this.blake2b, this.serviceId, key)) ?? null;
|
|
12180
12231
|
}
|
|
12181
12232
|
|
|
12182
|
-
return this.retrieveOptional(serialize.serviceStorage(this.serviceId, rawKey)) ?? null;
|
|
12233
|
+
return this.retrieveOptional(serialize.serviceStorage(this.blake2b, this.serviceId, rawKey)) ?? null;
|
|
12183
12234
|
}
|
|
12184
12235
|
|
|
12185
12236
|
/**
|
|
@@ -12189,17 +12240,17 @@ declare class SerializedService implements Service {
|
|
|
12189
12240
|
*/
|
|
12190
12241
|
hasPreimage(hash: PreimageHash): boolean {
|
|
12191
12242
|
// TODO [ToDr] consider optimizing to avoid fetching the whole data.
|
|
12192
|
-
return this.retrieveOptional(serialize.servicePreimages(this.serviceId, hash)) !== undefined;
|
|
12243
|
+
return this.retrieveOptional(serialize.servicePreimages(this.blake2b, this.serviceId, hash)) !== undefined;
|
|
12193
12244
|
}
|
|
12194
12245
|
|
|
12195
12246
|
/** Retrieve preimage from the DB. */
|
|
12196
12247
|
getPreimage(hash: PreimageHash): BytesBlob | null {
|
|
12197
|
-
return this.retrieveOptional(serialize.servicePreimages(this.serviceId, hash)) ?? null;
|
|
12248
|
+
return this.retrieveOptional(serialize.servicePreimages(this.blake2b, this.serviceId, hash)) ?? null;
|
|
12198
12249
|
}
|
|
12199
12250
|
|
|
12200
12251
|
/** Retrieve preimage lookup history. */
|
|
12201
12252
|
getLookupHistory(hash: PreimageHash, len: U32): LookupHistorySlots | null {
|
|
12202
|
-
const rawSlots = this.retrieveOptional(serialize.serviceLookupHistory(this.serviceId, hash, len));
|
|
12253
|
+
const rawSlots = this.retrieveOptional(serialize.serviceLookupHistory(this.blake2b, this.serviceId, hash, len));
|
|
12203
12254
|
if (rawSlots === undefined) {
|
|
12204
12255
|
return null;
|
|
12205
12256
|
}
|
|
@@ -12212,9 +12263,9 @@ type KeyAndCodec<T> = {
|
|
|
12212
12263
|
Codec: Decode<T>;
|
|
12213
12264
|
};
|
|
12214
12265
|
|
|
12215
|
-
declare function loadState(spec: ChainSpec, entries: Iterable<[StateKey | TruncatedHash, BytesBlob]>) {
|
|
12266
|
+
declare function loadState(spec: ChainSpec, blake2b: Blake2b, entries: Iterable<[StateKey | TruncatedHash, BytesBlob]>) {
|
|
12216
12267
|
const stateEntries = StateEntries.fromEntriesUnsafe(entries);
|
|
12217
|
-
return SerializedState.fromStateEntries(spec, stateEntries);
|
|
12268
|
+
return SerializedState.fromStateEntries(spec, blake2b, stateEntries);
|
|
12218
12269
|
}
|
|
12219
12270
|
|
|
12220
12271
|
/**
|
|
@@ -12370,7 +12421,8 @@ declare class LeafDb implements SerializedStateBackend {
|
|
|
12370
12421
|
assertNever(val);
|
|
12371
12422
|
}
|
|
12372
12423
|
|
|
12373
|
-
getStateRoot(): StateRootHash {
|
|
12424
|
+
getStateRoot(blake2b: Blake2b): StateRootHash {
|
|
12425
|
+
const blake2bTrieHasher = getBlake2bTrieHasher(blake2b);
|
|
12374
12426
|
return InMemoryTrie.computeStateRoot(blake2bTrieHasher, this.leaves).asOpaque();
|
|
12375
12427
|
}
|
|
12376
12428
|
|
|
@@ -12468,7 +12520,8 @@ declare class InMemoryStates implements StatesDb<InMemoryState> {
|
|
|
12468
12520
|
}
|
|
12469
12521
|
|
|
12470
12522
|
async getStateRoot(state: InMemoryState): Promise<StateRootHash> {
|
|
12471
|
-
|
|
12523
|
+
const blake2b = await Blake2b.createHasher();
|
|
12524
|
+
return StateEntries.serializeInMemory(this.spec, blake2b, state).getRootHash(blake2b);
|
|
12472
12525
|
}
|
|
12473
12526
|
|
|
12474
12527
|
/** Insert a full state into the database. */
|
|
@@ -12573,7 +12626,7 @@ declare function padAndEncodeData(input: BytesBlob) {
|
|
|
12573
12626
|
const paddedLength = Math.ceil(input.length / PIECE_SIZE) * PIECE_SIZE;
|
|
12574
12627
|
let padded = input;
|
|
12575
12628
|
if (input.length !== paddedLength) {
|
|
12576
|
-
padded = BytesBlob.blobFrom(
|
|
12629
|
+
padded = BytesBlob.blobFrom(safeAllocUint8Array(paddedLength));
|
|
12577
12630
|
padded.raw.set(input.raw, 0);
|
|
12578
12631
|
}
|
|
12579
12632
|
return chunkingFunction(padded);
|
|
@@ -12629,7 +12682,7 @@ declare function decodeData(input: FixedSizeArray<[number, BytesBlob], N_CHUNKS_
|
|
|
12629
12682
|
*/
|
|
12630
12683
|
declare function encodePoints(input: Bytes<PIECE_SIZE>): FixedSizeArray<Bytes<POINT_LENGTH>, N_CHUNKS_TOTAL> {
|
|
12631
12684
|
const result: Bytes<POINT_LENGTH>[] = [];
|
|
12632
|
-
const data =
|
|
12685
|
+
const data = safeAllocUint8Array(POINT_ALIGNMENT * N_CHUNKS_REQUIRED);
|
|
12633
12686
|
|
|
12634
12687
|
// add original shards to the result
|
|
12635
12688
|
for (let i = 0; i < N_CHUNKS_REQUIRED; i++) {
|
|
@@ -12649,7 +12702,7 @@ declare function encodePoints(input: Bytes<PIECE_SIZE>): FixedSizeArray<Bytes<PO
|
|
|
12649
12702
|
for (let i = 0; i < N_CHUNKS_REDUNDANCY; i++) {
|
|
12650
12703
|
const pointIndex = i * POINT_ALIGNMENT;
|
|
12651
12704
|
|
|
12652
|
-
const redundancyPoint =
|
|
12705
|
+
const redundancyPoint = safeAllocUint8Array(POINT_LENGTH);
|
|
12653
12706
|
for (let j = 0; j < POINT_LENGTH; j++) {
|
|
12654
12707
|
redundancyPoint[j] = encodedData[pointIndex + j * HALF_POINT_SIZE];
|
|
12655
12708
|
}
|
|
@@ -12669,7 +12722,7 @@ declare function decodePiece(
|
|
|
12669
12722
|
): Bytes<PIECE_SIZE> {
|
|
12670
12723
|
const result = Bytes.zero(PIECE_SIZE);
|
|
12671
12724
|
|
|
12672
|
-
const data =
|
|
12725
|
+
const data = safeAllocUint8Array(N_CHUNKS_REQUIRED * POINT_ALIGNMENT);
|
|
12673
12726
|
const indices = new Uint16Array(input.length);
|
|
12674
12727
|
|
|
12675
12728
|
for (let i = 0; i < N_CHUNKS_REQUIRED; i++) {
|
|
@@ -12796,7 +12849,7 @@ declare function lace<N extends number, K extends number>(input: FixedSizeArray<
|
|
|
12796
12849
|
return BytesBlob.empty();
|
|
12797
12850
|
}
|
|
12798
12851
|
const n = input[0].length;
|
|
12799
|
-
const result = BytesBlob.blobFrom(
|
|
12852
|
+
const result = BytesBlob.blobFrom(safeAllocUint8Array(k * n));
|
|
12800
12853
|
for (let i = 0; i < k; i++) {
|
|
12801
12854
|
const entry = input[i].raw;
|
|
12802
12855
|
for (let j = 0; j < n; j++) {
|
|
@@ -13639,6 +13692,8 @@ declare enum NewServiceError {
|
|
|
13639
13692
|
InsufficientFunds = 0,
|
|
13640
13693
|
/** Service is not privileged to set gratis storage. */
|
|
13641
13694
|
UnprivilegedService = 1,
|
|
13695
|
+
/** Registrar attempting to create a service with already existing id. */
|
|
13696
|
+
RegistrarServiceIdAlreadyTaken = 2,
|
|
13642
13697
|
}
|
|
13643
13698
|
|
|
13644
13699
|
declare enum UpdatePrivilegesError {
|
|
@@ -13704,14 +13759,18 @@ interface PartialState {
|
|
|
13704
13759
|
): Result$2<OK, TransferError>;
|
|
13705
13760
|
|
|
13706
13761
|
/**
|
|
13707
|
-
* Create a new service with given codeHash, length, gas, allowance and
|
|
13762
|
+
* Create a new service with given codeHash, length, gas, allowance, gratisStorage and wantedServiceId.
|
|
13708
13763
|
*
|
|
13709
|
-
* Returns a newly assigned id
|
|
13710
|
-
*
|
|
13764
|
+
* Returns a newly assigned id
|
|
13765
|
+
* or `wantedServiceId` if it's lower than `S`
|
|
13766
|
+
* and parent of that service is `Registrar`.
|
|
13767
|
+
*
|
|
13768
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/2fa9042fc304?v=0.7.2
|
|
13711
13769
|
*
|
|
13712
13770
|
* An error can be returned in case the account does not
|
|
13713
13771
|
* have the required balance
|
|
13714
|
-
* or tries to set gratis storage without being
|
|
13772
|
+
* or tries to set gratis storage without being `Manager`
|
|
13773
|
+
* or `Registrar` tries to set service id thats already taken.
|
|
13715
13774
|
*/
|
|
13716
13775
|
newService(
|
|
13717
13776
|
codeHash: CodeHash,
|
|
@@ -13719,6 +13778,7 @@ interface PartialState {
|
|
|
13719
13778
|
gas: ServiceGas,
|
|
13720
13779
|
allowance: ServiceGas,
|
|
13721
13780
|
gratisStorage: U64,
|
|
13781
|
+
wantedServiceId: U64,
|
|
13722
13782
|
): Result$2<ServiceId, NewServiceError>;
|
|
13723
13783
|
|
|
13724
13784
|
/** Upgrade code of currently running service. */
|
|
@@ -13740,7 +13800,7 @@ interface PartialState {
|
|
|
13740
13800
|
updateAuthorizationQueue(
|
|
13741
13801
|
coreIndex: CoreIndex,
|
|
13742
13802
|
authQueue: FixedSizeArray<Blake2bHash, AUTHORIZATION_QUEUE_SIZE>,
|
|
13743
|
-
|
|
13803
|
+
assigners: ServiceId | null,
|
|
13744
13804
|
): Result$2<OK, UpdatePrivilegesError>;
|
|
13745
13805
|
|
|
13746
13806
|
/**
|
|
@@ -13749,14 +13809,16 @@ interface PartialState {
|
|
|
13749
13809
|
* `m`: manager service (can change privileged services)
|
|
13750
13810
|
* `a`: manages authorization queue
|
|
13751
13811
|
* `v`: manages validator keys
|
|
13752
|
-
* `
|
|
13812
|
+
* `r`: manages create new services in protected id range.
|
|
13813
|
+
* `z`: collection of serviceId -> gas that auto-accumulate every block
|
|
13753
13814
|
*
|
|
13754
13815
|
*/
|
|
13755
13816
|
updatePrivilegedServices(
|
|
13756
13817
|
m: ServiceId | null,
|
|
13757
13818
|
a: PerCore<ServiceId>,
|
|
13758
13819
|
v: ServiceId | null,
|
|
13759
|
-
|
|
13820
|
+
r: ServiceId | null,
|
|
13821
|
+
z: [ServiceId, ServiceGas][],
|
|
13760
13822
|
): Result$2<OK, UpdatePrivilegesError>;
|
|
13761
13823
|
|
|
13762
13824
|
/** Yield accumulation trie result hash. */
|
|
@@ -13868,7 +13930,7 @@ declare class Mask {
|
|
|
13868
13930
|
}
|
|
13869
13931
|
|
|
13870
13932
|
private buildLookupTableForward(mask: BitVec) {
|
|
13871
|
-
const table =
|
|
13933
|
+
const table = safeAllocUint8Array(mask.bitLength);
|
|
13872
13934
|
let lastInstructionOffset = 0;
|
|
13873
13935
|
for (let i = mask.bitLength - 1; i >= 0; i--) {
|
|
13874
13936
|
if (mask.isSet(i)) {
|
|
@@ -14012,7 +14074,7 @@ declare class Registers {
|
|
|
14012
14074
|
private asSigned: BigInt64Array;
|
|
14013
14075
|
private asUnsigned: BigUint64Array;
|
|
14014
14076
|
|
|
14015
|
-
constructor(private readonly bytes =
|
|
14077
|
+
constructor(private readonly bytes = safeAllocUint8Array(NO_OF_REGISTERS << REGISTER_SIZE_SHIFT)) {
|
|
14016
14078
|
check`${bytes.length === NO_OF_REGISTERS << REGISTER_SIZE_SHIFT} Invalid size of registers array.`;
|
|
14017
14079
|
this.asSigned = new BigInt64Array(bytes.buffer, bytes.byteOffset);
|
|
14018
14080
|
this.asUnsigned = new BigUint64Array(bytes.buffer, bytes.byteOffset);
|
|
@@ -17725,7 +17787,7 @@ declare class AccumulationStateUpdate {
|
|
|
17725
17787
|
if (from.privilegedServices !== null) {
|
|
17726
17788
|
update.privilegedServices = PrivilegedServices.create({
|
|
17727
17789
|
...from.privilegedServices,
|
|
17728
|
-
|
|
17790
|
+
assigners: asKnownSize([...from.privilegedServices.assigners]),
|
|
17729
17791
|
});
|
|
17730
17792
|
}
|
|
17731
17793
|
return update;
|
|
@@ -17996,7 +18058,7 @@ declare const HostCallResult = {
|
|
|
17996
18058
|
OOB: tryAsU64(0xffff_ffff_ffff_fffdn), // 2**64 - 3
|
|
17997
18059
|
/** Index unknown. */
|
|
17998
18060
|
WHO: tryAsU64(0xffff_ffff_ffff_fffcn), // 2**64 - 4
|
|
17999
|
-
/** Storage full. */
|
|
18061
|
+
/** Storage full or resource already allocated. */
|
|
18000
18062
|
FULL: tryAsU64(0xffff_ffff_ffff_fffbn), // 2**64 - 5
|
|
18001
18063
|
/** Core index unknown. */
|
|
18002
18064
|
CORE: tryAsU64(0xffff_ffff_ffff_fffan), // 2**64 - 6
|
|
@@ -18004,7 +18066,7 @@ declare const HostCallResult = {
|
|
|
18004
18066
|
CASH: tryAsU64(0xffff_ffff_ffff_fff9n), // 2**64 - 7
|
|
18005
18067
|
/** Gas limit too low. */
|
|
18006
18068
|
LOW: tryAsU64(0xffff_ffff_ffff_fff8n), // 2**64 - 8
|
|
18007
|
-
/** The item is already solicited
|
|
18069
|
+
/** The item is already solicited, cannot be forgotten or the operation is invalid due to privilege level. */
|
|
18008
18070
|
HUH: tryAsU64(0xffff_ffff_ffff_fff7n), // 2**64 - 9
|
|
18009
18071
|
/** The return value indicating general success. */
|
|
18010
18072
|
OK: tryAsU64(0n),
|
|
@@ -18239,7 +18301,7 @@ declare class HostCalls {
|
|
|
18239
18301
|
const maybeAddress = regs.getLowerU32(7);
|
|
18240
18302
|
const maybeLength = regs.getLowerU32(8);
|
|
18241
18303
|
|
|
18242
|
-
const result =
|
|
18304
|
+
const result = safeAllocUint8Array(maybeLength);
|
|
18243
18305
|
const startAddress = tryAsMemoryIndex(maybeAddress);
|
|
18244
18306
|
const loadResult = memory.loadInto(result, startAddress);
|
|
18245
18307
|
|
|
@@ -18678,7 +18740,7 @@ declare class DebuggerAdapter {
|
|
|
18678
18740
|
|
|
18679
18741
|
if (page === null) {
|
|
18680
18742
|
// page wasn't allocated so we return an empty page
|
|
18681
|
-
return
|
|
18743
|
+
return safeAllocUint8Array(PAGE_SIZE);
|
|
18682
18744
|
}
|
|
18683
18745
|
|
|
18684
18746
|
if (page.length === PAGE_SIZE) {
|
|
@@ -18687,7 +18749,7 @@ declare class DebuggerAdapter {
|
|
|
18687
18749
|
}
|
|
18688
18750
|
|
|
18689
18751
|
// page was allocated but it is shorter than PAGE_SIZE so we have to extend it
|
|
18690
|
-
const fullPage =
|
|
18752
|
+
const fullPage = safeAllocUint8Array(PAGE_SIZE);
|
|
18691
18753
|
fullPage.set(page);
|
|
18692
18754
|
return fullPage;
|
|
18693
18755
|
}
|
|
@@ -18880,10 +18942,10 @@ type ENTROPY_BYTES = typeof ENTROPY_BYTES;
|
|
|
18880
18942
|
*
|
|
18881
18943
|
* https://graypaper.fluffylabs.dev/#/579bd12/3b9a013b9a01
|
|
18882
18944
|
*/
|
|
18883
|
-
declare function fisherYatesShuffle<T>(arr: T[], entropy: Bytes<ENTROPY_BYTES>): T[] {
|
|
18945
|
+
declare function fisherYatesShuffle<T>(blake2b: Blake2b, arr: T[], entropy: Bytes<ENTROPY_BYTES>): T[] {
|
|
18884
18946
|
check`${entropy.length === ENTROPY_BYTES} Expected entropy of length ${ENTROPY_BYTES}, got ${entropy.length}`;
|
|
18885
18947
|
const n = arr.length;
|
|
18886
|
-
const randomNumbers = hashToNumberSequence(entropy, arr.length);
|
|
18948
|
+
const randomNumbers = hashToNumberSequence(blake2b, entropy, arr.length);
|
|
18887
18949
|
const result: T[] = new Array<T>(n);
|
|
18888
18950
|
|
|
18889
18951
|
let itemsLeft = n;
|
|
@@ -19055,8 +19117,7 @@ declare const availabilityAssignmentFromJson = json.object<JsonAvailabilityAssig
|
|
|
19055
19117
|
timeout: "number",
|
|
19056
19118
|
},
|
|
19057
19119
|
({ report, timeout }) => {
|
|
19058
|
-
|
|
19059
|
-
return AvailabilityAssignment.create({ workReport: new WithHash(workReportHash, report), timeout });
|
|
19120
|
+
return AvailabilityAssignment.create({ workReport: report, timeout });
|
|
19060
19121
|
},
|
|
19061
19122
|
);
|
|
19062
19123
|
|
|
@@ -19394,8 +19455,9 @@ type JsonStateDump = {
|
|
|
19394
19455
|
tau: State["timeslot"];
|
|
19395
19456
|
chi: {
|
|
19396
19457
|
chi_m: PrivilegedServices["manager"];
|
|
19397
|
-
chi_a: PrivilegedServices["
|
|
19398
|
-
chi_v: PrivilegedServices["
|
|
19458
|
+
chi_a: PrivilegedServices["assigners"];
|
|
19459
|
+
chi_v: PrivilegedServices["delegator"];
|
|
19460
|
+
chi_r?: PrivilegedServices["registrar"];
|
|
19399
19461
|
chi_g: PrivilegedServices["autoAccumulateServices"] | null;
|
|
19400
19462
|
};
|
|
19401
19463
|
pi: JsonStatisticsData;
|
|
@@ -19428,6 +19490,7 @@ declare const fullStateDumpFromJson = (spec: ChainSpec) =>
|
|
|
19428
19490
|
chi_m: "number",
|
|
19429
19491
|
chi_a: json.array("number"),
|
|
19430
19492
|
chi_v: "number",
|
|
19493
|
+
chi_r: json.optional("number"),
|
|
19431
19494
|
chi_g: json.nullable(
|
|
19432
19495
|
json.array({
|
|
19433
19496
|
service: "number",
|
|
@@ -19460,6 +19523,9 @@ declare const fullStateDumpFromJson = (spec: ChainSpec) =>
|
|
|
19460
19523
|
theta,
|
|
19461
19524
|
accounts,
|
|
19462
19525
|
}): InMemoryState => {
|
|
19526
|
+
if (Compatibility.isGreaterOrEqual(GpVersion.V0_7_1) && chi.chi_r === undefined) {
|
|
19527
|
+
throw new Error("Registrar is required in Privileges GP ^0.7.1");
|
|
19528
|
+
}
|
|
19463
19529
|
return InMemoryState.create({
|
|
19464
19530
|
authPools: tryAsPerCore(
|
|
19465
19531
|
alpha.map((perCore) => {
|
|
@@ -19493,8 +19559,9 @@ declare const fullStateDumpFromJson = (spec: ChainSpec) =>
|
|
|
19493
19559
|
timeslot: tau,
|
|
19494
19560
|
privilegedServices: PrivilegedServices.create({
|
|
19495
19561
|
manager: chi.chi_m,
|
|
19496
|
-
|
|
19497
|
-
|
|
19562
|
+
assigners: chi.chi_a,
|
|
19563
|
+
delegator: chi.chi_v,
|
|
19564
|
+
registrar: chi.chi_r ?? tryAsServiceId(2 ** 32 - 1),
|
|
19498
19565
|
autoAccumulateServices: chi.chi_g ?? [],
|
|
19499
19566
|
}),
|
|
19500
19567
|
statistics: JsonStatisticsData.toStatisticsData(spec, pi),
|
|
@@ -19557,7 +19624,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19557
19624
|
constructor(
|
|
19558
19625
|
private readonly context: ChainSpec,
|
|
19559
19626
|
private readonly keccakHasher: KeccakHasher,
|
|
19560
|
-
|
|
19627
|
+
public readonly blake2b: Blake2b,
|
|
19561
19628
|
) {}
|
|
19562
19629
|
|
|
19563
19630
|
/** Concatenates two hashes and hash this concatenation */
|
|
@@ -19571,7 +19638,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19571
19638
|
|
|
19572
19639
|
/** Creates hash from the block header view */
|
|
19573
19640
|
header(header: HeaderView): WithHash<HeaderHash, HeaderView> {
|
|
19574
|
-
return new WithHash(blake2b.hashBytes(header.encoded()
|
|
19641
|
+
return new WithHash(this.blake2b.hashBytes(header.encoded()).asOpaque(), header);
|
|
19575
19642
|
}
|
|
19576
19643
|
|
|
19577
19644
|
/**
|
|
@@ -19585,7 +19652,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19585
19652
|
.view()
|
|
19586
19653
|
.map((g) => g.view())
|
|
19587
19654
|
.map((guarantee) => {
|
|
19588
|
-
const reportHash = blake2b.hashBytes(guarantee.report.encoded()
|
|
19655
|
+
const reportHash = this.blake2b.hashBytes(guarantee.report.encoded()).asOpaque<WorkReportHash>();
|
|
19589
19656
|
return BytesBlob.blobFromParts([
|
|
19590
19657
|
reportHash.raw,
|
|
19591
19658
|
guarantee.slot.encoded().raw,
|
|
@@ -19595,15 +19662,15 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19595
19662
|
|
|
19596
19663
|
const guaranteeBlob = Encoder.encodeObject(codec.sequenceVarLen(dumpCodec), guarantees, this.context);
|
|
19597
19664
|
|
|
19598
|
-
const et = blake2b.hashBytes(extrinsicView.tickets.encoded()
|
|
19599
|
-
const ep = blake2b.hashBytes(extrinsicView.preimages.encoded()
|
|
19600
|
-
const eg = blake2b.hashBytes(guaranteeBlob
|
|
19601
|
-
const ea = blake2b.hashBytes(extrinsicView.assurances.encoded()
|
|
19602
|
-
const ed = blake2b.hashBytes(extrinsicView.disputes.encoded()
|
|
19665
|
+
const et = this.blake2b.hashBytes(extrinsicView.tickets.encoded()).asOpaque<ExtrinsicHash>();
|
|
19666
|
+
const ep = this.blake2b.hashBytes(extrinsicView.preimages.encoded()).asOpaque<ExtrinsicHash>();
|
|
19667
|
+
const eg = this.blake2b.hashBytes(guaranteeBlob).asOpaque<ExtrinsicHash>();
|
|
19668
|
+
const ea = this.blake2b.hashBytes(extrinsicView.assurances.encoded()).asOpaque<ExtrinsicHash>();
|
|
19669
|
+
const ed = this.blake2b.hashBytes(extrinsicView.disputes.encoded()).asOpaque<ExtrinsicHash>();
|
|
19603
19670
|
|
|
19604
19671
|
const encoded = BytesBlob.blobFromParts([et.raw, ep.raw, eg.raw, ea.raw, ed.raw]);
|
|
19605
19672
|
|
|
19606
|
-
return new WithHashAndBytes(blake2b.hashBytes(encoded
|
|
19673
|
+
return new WithHashAndBytes(this.blake2b.hashBytes(encoded).asOpaque(), extrinsicView, encoded);
|
|
19607
19674
|
}
|
|
19608
19675
|
|
|
19609
19676
|
/** Creates hash for given WorkPackage */
|
|
@@ -19614,7 +19681,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19614
19681
|
private encode<T, THash extends OpaqueHash>(codec: Codec<T>, data: T): WithHashAndBytes<THash, T> {
|
|
19615
19682
|
// TODO [ToDr] Use already allocated encoding destination and hash bytes from some arena.
|
|
19616
19683
|
const encoded = Encoder.encodeObject(codec, data, this.context);
|
|
19617
|
-
return new WithHashAndBytes(blake2b.hashBytes(encoded
|
|
19684
|
+
return new WithHashAndBytes(this.blake2b.hashBytes(encoded).asOpaque(), data, encoded);
|
|
19618
19685
|
}
|
|
19619
19686
|
}
|
|
19620
19687
|
|
|
@@ -19635,7 +19702,10 @@ declare enum PreimagesErrorCode {
|
|
|
19635
19702
|
|
|
19636
19703
|
// TODO [SeKo] consider whether this module is the right place to remove expired preimages
|
|
19637
19704
|
declare class Preimages {
|
|
19638
|
-
constructor(
|
|
19705
|
+
constructor(
|
|
19706
|
+
public readonly state: PreimagesState,
|
|
19707
|
+
public readonly blake2b: Blake2b,
|
|
19708
|
+
) {}
|
|
19639
19709
|
|
|
19640
19710
|
integrate(input: PreimagesInput): Result$2<PreimagesStateUpdate, PreimagesErrorCode> {
|
|
19641
19711
|
// make sure lookup extrinsics are sorted and unique
|
|
@@ -19664,7 +19734,7 @@ declare class Preimages {
|
|
|
19664
19734
|
// select preimages for integration
|
|
19665
19735
|
for (const preimage of preimages) {
|
|
19666
19736
|
const { requester, blob } = preimage;
|
|
19667
|
-
const hash: PreimageHash = blake2b.hashBytes(blob).asOpaque();
|
|
19737
|
+
const hash: PreimageHash = this.blake2b.hashBytes(blob).asOpaque();
|
|
19668
19738
|
|
|
19669
19739
|
const service = this.state.getService(requester);
|
|
19670
19740
|
if (service === null) {
|
|
@@ -19695,156 +19765,6 @@ declare class Preimages {
|
|
|
19695
19765
|
}
|
|
19696
19766
|
}
|
|
19697
19767
|
|
|
19698
|
-
declare enum ServiceExecutorError {
|
|
19699
|
-
NoLookup = 0,
|
|
19700
|
-
NoState = 1,
|
|
19701
|
-
NoServiceCode = 2,
|
|
19702
|
-
ServiceCodeMismatch = 3,
|
|
19703
|
-
}
|
|
19704
|
-
|
|
19705
|
-
declare class WorkPackageExecutor {
|
|
19706
|
-
constructor(
|
|
19707
|
-
private readonly blocks: BlocksDb,
|
|
19708
|
-
private readonly state: StatesDb,
|
|
19709
|
-
private readonly hasher: TransitionHasher,
|
|
19710
|
-
) {}
|
|
19711
|
-
|
|
19712
|
-
// TODO [ToDr] this while thing should be triple-checked with the GP.
|
|
19713
|
-
// I'm currently implementing some dirty version for the demo.
|
|
19714
|
-
async executeWorkPackage(pack: WorkPackage): Promise<WorkReport> {
|
|
19715
|
-
const headerHash = pack.context.lookupAnchor;
|
|
19716
|
-
// execute authorisation first or is it already executed and we just need to check it?
|
|
19717
|
-
const authExec = this.getServiceExecutor(
|
|
19718
|
-
// TODO [ToDr] should this be anchor or lookupAnchor?
|
|
19719
|
-
headerHash,
|
|
19720
|
-
pack.authCodeHost,
|
|
19721
|
-
pack.authCodeHash,
|
|
19722
|
-
);
|
|
19723
|
-
|
|
19724
|
-
if (authExec.isError) {
|
|
19725
|
-
// TODO [ToDr] most likely shouldn't be throw.
|
|
19726
|
-
throw new Error(`Could not get authorization executor: ${authExec.error}`);
|
|
19727
|
-
}
|
|
19728
|
-
|
|
19729
|
-
const pvm = authExec.ok;
|
|
19730
|
-
const authGas = tryAsGas(15_000n);
|
|
19731
|
-
const result = await pvm.run(pack.parametrization, authGas);
|
|
19732
|
-
|
|
19733
|
-
if (!result.isEqualTo(pack.authorization)) {
|
|
19734
|
-
throw new Error("Authorization is invalid.");
|
|
19735
|
-
}
|
|
19736
|
-
|
|
19737
|
-
const results: WorkResult[] = [];
|
|
19738
|
-
for (const item of pack.items) {
|
|
19739
|
-
const exec = this.getServiceExecutor(headerHash, item.service, item.codeHash);
|
|
19740
|
-
if (exec.isError) {
|
|
19741
|
-
throw new Error(`Could not get item executor: ${exec.error}`);
|
|
19742
|
-
}
|
|
19743
|
-
const pvm = exec.ok;
|
|
19744
|
-
|
|
19745
|
-
const gasRatio = tryAsServiceGas(3_000n);
|
|
19746
|
-
const ret = await pvm.run(item.payload, tryAsGas(item.refineGasLimit)); // or accumulateGasLimit?
|
|
19747
|
-
results.push(
|
|
19748
|
-
WorkResult.create({
|
|
19749
|
-
serviceId: item.service,
|
|
19750
|
-
codeHash: item.codeHash,
|
|
19751
|
-
payloadHash: blake2b.hashBytes(item.payload),
|
|
19752
|
-
gas: gasRatio,
|
|
19753
|
-
result: new WorkExecResult(WorkExecResultKind.ok, ret),
|
|
19754
|
-
load: WorkRefineLoad.create({
|
|
19755
|
-
gasUsed: tryAsServiceGas(5),
|
|
19756
|
-
importedSegments: tryAsU32(0),
|
|
19757
|
-
exportedSegments: tryAsU32(0),
|
|
19758
|
-
extrinsicSize: tryAsU32(0),
|
|
19759
|
-
extrinsicCount: tryAsU32(0),
|
|
19760
|
-
}),
|
|
19761
|
-
}),
|
|
19762
|
-
);
|
|
19763
|
-
}
|
|
19764
|
-
|
|
19765
|
-
const workPackage = this.hasher.workPackage(pack);
|
|
19766
|
-
const workPackageSpec = WorkPackageSpec.create({
|
|
19767
|
-
hash: workPackage.hash,
|
|
19768
|
-
length: tryAsU32(workPackage.encoded.length),
|
|
19769
|
-
erasureRoot: Bytes.zero(HASH_SIZE),
|
|
19770
|
-
exportsRoot: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
19771
|
-
exportsCount: tryAsU16(0),
|
|
19772
|
-
});
|
|
19773
|
-
const coreIndex = tryAsCoreIndex(0);
|
|
19774
|
-
const authorizerHash = Bytes.fill(HASH_SIZE, 5).asOpaque();
|
|
19775
|
-
|
|
19776
|
-
const workResults = FixedSizeArray.new(results, tryAsWorkItemsCount(results.length));
|
|
19777
|
-
|
|
19778
|
-
return Promise.resolve(
|
|
19779
|
-
WorkReport.create({
|
|
19780
|
-
workPackageSpec,
|
|
19781
|
-
context: pack.context,
|
|
19782
|
-
coreIndex,
|
|
19783
|
-
authorizerHash,
|
|
19784
|
-
authorizationOutput: pack.authorization,
|
|
19785
|
-
segmentRootLookup: [],
|
|
19786
|
-
results: workResults,
|
|
19787
|
-
authorizationGasUsed: tryAsServiceGas(0),
|
|
19788
|
-
}),
|
|
19789
|
-
);
|
|
19790
|
-
}
|
|
19791
|
-
|
|
19792
|
-
getServiceExecutor(
|
|
19793
|
-
lookupAnchor: HeaderHash,
|
|
19794
|
-
serviceId: ServiceId,
|
|
19795
|
-
expectedCodeHash: CodeHash,
|
|
19796
|
-
): Result$2<PvmExecutor, ServiceExecutorError> {
|
|
19797
|
-
const header = this.blocks.getHeader(lookupAnchor);
|
|
19798
|
-
if (header === null) {
|
|
19799
|
-
return Result.error(ServiceExecutorError.NoLookup);
|
|
19800
|
-
}
|
|
19801
|
-
|
|
19802
|
-
const state = this.state.getState(lookupAnchor);
|
|
19803
|
-
if (state === null) {
|
|
19804
|
-
return Result.error(ServiceExecutorError.NoState);
|
|
19805
|
-
}
|
|
19806
|
-
|
|
19807
|
-
const service = state.getService(serviceId);
|
|
19808
|
-
const serviceCodeHash = service?.getInfo().codeHash ?? null;
|
|
19809
|
-
if (serviceCodeHash === null) {
|
|
19810
|
-
return Result.error(ServiceExecutorError.NoServiceCode);
|
|
19811
|
-
}
|
|
19812
|
-
|
|
19813
|
-
if (!serviceCodeHash.isEqualTo(expectedCodeHash)) {
|
|
19814
|
-
return Result.error(ServiceExecutorError.ServiceCodeMismatch);
|
|
19815
|
-
}
|
|
19816
|
-
|
|
19817
|
-
const serviceCode = service?.getPreimage(serviceCodeHash.asOpaque()) ?? null;
|
|
19818
|
-
if (serviceCode === null) {
|
|
19819
|
-
return Result.error(ServiceExecutorError.NoServiceCode);
|
|
19820
|
-
}
|
|
19821
|
-
|
|
19822
|
-
return Result.ok(new PvmExecutor(serviceCode));
|
|
19823
|
-
}
|
|
19824
|
-
}
|
|
19825
|
-
|
|
19826
|
-
declare class PvmExecutor {
|
|
19827
|
-
private readonly pvm: HostCalls;
|
|
19828
|
-
private hostCalls = new HostCallsManager({ missing: new Missing() });
|
|
19829
|
-
private pvmInstanceManager = new PvmInstanceManager(4);
|
|
19830
|
-
|
|
19831
|
-
constructor(private serviceCode: BytesBlob) {
|
|
19832
|
-
this.pvm = new PvmHostCallExtension(this.pvmInstanceManager, this.hostCalls);
|
|
19833
|
-
}
|
|
19834
|
-
|
|
19835
|
-
async run(args: BytesBlob, gas: Gas): Promise<BytesBlob> {
|
|
19836
|
-
const program = Program.fromSpi(this.serviceCode.raw, args.raw, true);
|
|
19837
|
-
|
|
19838
|
-
const result = await this.pvm.runProgram(program.code, 5, gas, program.registers, program.memory);
|
|
19839
|
-
|
|
19840
|
-
if (result.hasMemorySlice()) {
|
|
19841
|
-
return BytesBlob.blobFrom(result.memorySlice);
|
|
19842
|
-
}
|
|
19843
|
-
|
|
19844
|
-
return BytesBlob.empty();
|
|
19845
|
-
}
|
|
19846
|
-
}
|
|
19847
|
-
|
|
19848
19768
|
type index_Preimages = Preimages;
|
|
19849
19769
|
declare const index_Preimages: typeof Preimages;
|
|
19850
19770
|
type index_PreimagesErrorCode = PreimagesErrorCode;
|
|
@@ -19854,10 +19774,8 @@ type index_PreimagesState = PreimagesState;
|
|
|
19854
19774
|
type index_PreimagesStateUpdate = PreimagesStateUpdate;
|
|
19855
19775
|
type index_TransitionHasher = TransitionHasher;
|
|
19856
19776
|
declare const index_TransitionHasher: typeof TransitionHasher;
|
|
19857
|
-
type index_WorkPackageExecutor = WorkPackageExecutor;
|
|
19858
|
-
declare const index_WorkPackageExecutor: typeof WorkPackageExecutor;
|
|
19859
19777
|
declare namespace index {
|
|
19860
|
-
export { index_Preimages as Preimages, index_PreimagesErrorCode as PreimagesErrorCode, index_TransitionHasher as TransitionHasher
|
|
19778
|
+
export { index_Preimages as Preimages, index_PreimagesErrorCode as PreimagesErrorCode, index_TransitionHasher as TransitionHasher };
|
|
19861
19779
|
export type { index_PreimagesInput as PreimagesInput, index_PreimagesState as PreimagesState, index_PreimagesStateUpdate as PreimagesStateUpdate };
|
|
19862
19780
|
}
|
|
19863
19781
|
|