@typeberry/lib 0.1.3-462ca77 → 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 +613 -1336
- package/index.d.ts +501 -598
- package/index.js +612 -1335
- 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:
|
|
@@ -587,8 +589,12 @@ declare function deepEqual<T>(
|
|
|
587
589
|
const aKey = `${a.key}`;
|
|
588
590
|
const bKey = `${b.key}`;
|
|
589
591
|
|
|
590
|
-
if (aKey < bKey)
|
|
591
|
-
|
|
592
|
+
if (aKey < bKey) {
|
|
593
|
+
return -1;
|
|
594
|
+
}
|
|
595
|
+
if (bKey < aKey) {
|
|
596
|
+
return 1;
|
|
597
|
+
}
|
|
592
598
|
return 0;
|
|
593
599
|
});
|
|
594
600
|
};
|
|
@@ -3476,6 +3482,99 @@ declare namespace index$q {
|
|
|
3476
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 };
|
|
3477
3483
|
}
|
|
3478
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
|
+
|
|
3479
3578
|
/**
|
|
3480
3579
|
* Size of the output of the hash functions.
|
|
3481
3580
|
*
|
|
@@ -3531,144 +3630,46 @@ declare class WithHashAndBytes<THash extends OpaqueHash, TData> extends WithHash
|
|
|
3531
3630
|
}
|
|
3532
3631
|
}
|
|
3533
3632
|
|
|
3534
|
-
|
|
3535
|
-
interface HashAllocator {
|
|
3536
|
-
/** Return a new hash destination. */
|
|
3537
|
-
emptyHash(): OpaqueHash;
|
|
3538
|
-
}
|
|
3539
|
-
|
|
3540
|
-
/** The simplest allocator returning just a fresh copy of bytes each time. */
|
|
3541
|
-
declare class SimpleAllocator implements HashAllocator {
|
|
3542
|
-
emptyHash(): OpaqueHash {
|
|
3543
|
-
return Bytes.zero(HASH_SIZE);
|
|
3544
|
-
}
|
|
3545
|
-
}
|
|
3546
|
-
|
|
3547
|
-
/** An allocator that works by allocating larger (continuous) pages of memory. */
|
|
3548
|
-
declare class PageAllocator implements HashAllocator {
|
|
3549
|
-
private page: Uint8Array = safeAllocUint8Array(0);
|
|
3550
|
-
private currentHash = 0;
|
|
3551
|
-
|
|
3552
|
-
// TODO [ToDr] Benchmark the performance!
|
|
3553
|
-
constructor(private readonly hashesPerPage: number) {
|
|
3554
|
-
check`${hashesPerPage > 0 && hashesPerPage >>> 0 === hashesPerPage} Expected a non-zero integer.`;
|
|
3555
|
-
this.resetPage();
|
|
3556
|
-
}
|
|
3633
|
+
declare const zero$1 = Bytes.zero(HASH_SIZE);
|
|
3557
3634
|
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
this.page = safeAllocUint8Array(pageSizeBytes);
|
|
3635
|
+
declare class Blake2b {
|
|
3636
|
+
static async createHasher() {
|
|
3637
|
+
return new Blake2b(await createBLAKE2b(HASH_SIZE * 8));
|
|
3562
3638
|
}
|
|
3563
3639
|
|
|
3564
|
-
|
|
3565
|
-
const startIdx = this.currentHash * HASH_SIZE;
|
|
3566
|
-
const endIdx = startIdx + HASH_SIZE;
|
|
3640
|
+
private constructor(private readonly hasher: IHasher) {}
|
|
3567
3641
|
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
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();
|
|
3571
3650
|
}
|
|
3572
3651
|
|
|
3573
|
-
|
|
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();
|
|
3574
3657
|
}
|
|
3575
|
-
}
|
|
3576
3658
|
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
|
|
3583
|
-
*/
|
|
3584
|
-
declare function hashBlobs$1<H extends Blake2bHash>(
|
|
3585
|
-
r: (BytesBlob | Uint8Array)[],
|
|
3586
|
-
allocator: HashAllocator = defaultAllocator,
|
|
3587
|
-
): H {
|
|
3588
|
-
const out = allocator.emptyHash();
|
|
3589
|
-
if (r.length === 0) {
|
|
3590
|
-
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();
|
|
3591
3665
|
}
|
|
3592
3666
|
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3667
|
+
/** Convert given string into bytes and hash it. */
|
|
3668
|
+
hashString(str: string) {
|
|
3669
|
+
return this.hashBytes(BytesBlob.blobFromString(str));
|
|
3596
3670
|
}
|
|
3597
|
-
hasher?.digest(out.raw);
|
|
3598
|
-
return out.asOpaque();
|
|
3599
|
-
}
|
|
3600
|
-
|
|
3601
|
-
/** Hash given blob of bytes. */
|
|
3602
|
-
declare function hashBytes(blob: BytesBlob | Uint8Array, allocator: HashAllocator = defaultAllocator): Blake2bHash {
|
|
3603
|
-
const hasher = blake2b(HASH_SIZE);
|
|
3604
|
-
const bytes = blob instanceof BytesBlob ? blob.raw : blob;
|
|
3605
|
-
hasher?.update(bytes);
|
|
3606
|
-
const out = allocator.emptyHash();
|
|
3607
|
-
hasher?.digest(out.raw);
|
|
3608
|
-
return out;
|
|
3609
|
-
}
|
|
3610
|
-
|
|
3611
|
-
/** Convert given string into bytes and hash it. */
|
|
3612
|
-
declare function hashString(str: string, allocator: HashAllocator = defaultAllocator) {
|
|
3613
|
-
return hashBytes(BytesBlob.blobFromString(str), allocator);
|
|
3614
3671
|
}
|
|
3615
3672
|
|
|
3616
|
-
declare const blake2b_hashBytes: typeof hashBytes;
|
|
3617
|
-
declare const blake2b_hashString: typeof hashString;
|
|
3618
|
-
declare namespace blake2b {
|
|
3619
|
-
export {
|
|
3620
|
-
hashBlobs$1 as hashBlobs,
|
|
3621
|
-
blake2b_hashBytes as hashBytes,
|
|
3622
|
-
blake2b_hashString as hashString,
|
|
3623
|
-
};
|
|
3624
|
-
}
|
|
3625
|
-
|
|
3626
|
-
type ITypedArray = Uint8Array | Uint16Array | Uint32Array;
|
|
3627
|
-
type IDataType = string | Buffer | ITypedArray;
|
|
3628
|
-
|
|
3629
|
-
type IHasher = {
|
|
3630
|
-
/**
|
|
3631
|
-
* Initializes hash state to default value
|
|
3632
|
-
*/
|
|
3633
|
-
init: () => IHasher;
|
|
3634
|
-
/**
|
|
3635
|
-
* Updates the hash content with the given data
|
|
3636
|
-
*/
|
|
3637
|
-
update: (data: IDataType) => IHasher;
|
|
3638
|
-
/**
|
|
3639
|
-
* Calculates the hash of all of the data passed to be hashed with hash.update().
|
|
3640
|
-
* Defaults to hexadecimal string
|
|
3641
|
-
* @param outputType If outputType is "binary", it returns Uint8Array. Otherwise it
|
|
3642
|
-
* returns hexadecimal string
|
|
3643
|
-
*/
|
|
3644
|
-
digest: {
|
|
3645
|
-
(outputType: "binary"): Uint8Array;
|
|
3646
|
-
(outputType?: "hex"): string;
|
|
3647
|
-
};
|
|
3648
|
-
/**
|
|
3649
|
-
* Save the current internal state of the hasher for later resumption with load().
|
|
3650
|
-
* Cannot be called before .init() or after .digest()
|
|
3651
|
-
*
|
|
3652
|
-
* Note that this state can include arbitrary information about the value being hashed (e.g.
|
|
3653
|
-
* could include N plaintext bytes from the value), so needs to be treated as being as
|
|
3654
|
-
* sensitive as the input value itself.
|
|
3655
|
-
*/
|
|
3656
|
-
save: () => Uint8Array;
|
|
3657
|
-
/**
|
|
3658
|
-
* Resume a state that was created by save(). If this state was not created by a
|
|
3659
|
-
* compatible build of hash-wasm, an exception will be thrown.
|
|
3660
|
-
*/
|
|
3661
|
-
load: (state: Uint8Array) => IHasher;
|
|
3662
|
-
/**
|
|
3663
|
-
* Block size in bytes
|
|
3664
|
-
*/
|
|
3665
|
-
blockSize: number;
|
|
3666
|
-
/**
|
|
3667
|
-
* Digest size in bytes
|
|
3668
|
-
*/
|
|
3669
|
-
digestSize: number;
|
|
3670
|
-
};
|
|
3671
|
-
|
|
3672
3673
|
declare class KeccakHasher {
|
|
3673
3674
|
static async create(): Promise<KeccakHasher> {
|
|
3674
3675
|
return new KeccakHasher(await createKeccak(256));
|
|
@@ -3696,15 +3697,15 @@ declare namespace keccak {
|
|
|
3696
3697
|
};
|
|
3697
3698
|
}
|
|
3698
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;
|
|
3699
3705
|
type index$p_Blake2bHash = Blake2bHash;
|
|
3700
3706
|
type index$p_HASH_SIZE = HASH_SIZE;
|
|
3701
|
-
type index$p_HashAllocator = HashAllocator;
|
|
3702
3707
|
type index$p_KeccakHash = KeccakHash;
|
|
3703
3708
|
type index$p_OpaqueHash = OpaqueHash;
|
|
3704
|
-
type index$p_PageAllocator = PageAllocator;
|
|
3705
|
-
declare const index$p_PageAllocator: typeof PageAllocator;
|
|
3706
|
-
type index$p_SimpleAllocator = SimpleAllocator;
|
|
3707
|
-
declare const index$p_SimpleAllocator: typeof SimpleAllocator;
|
|
3708
3709
|
type index$p_TRUNCATED_HASH_SIZE = TRUNCATED_HASH_SIZE;
|
|
3709
3710
|
type index$p_TruncatedHash = TruncatedHash;
|
|
3710
3711
|
type index$p_WithHash<THash extends OpaqueHash, TData> = WithHash<THash, TData>;
|
|
@@ -3712,12 +3713,10 @@ declare const index$p_WithHash: typeof WithHash;
|
|
|
3712
3713
|
type index$p_WithHashAndBytes<THash extends OpaqueHash, TData> = WithHashAndBytes<THash, TData>;
|
|
3713
3714
|
declare const index$p_WithHashAndBytes: typeof WithHashAndBytes;
|
|
3714
3715
|
declare const index$p_ZERO_HASH: typeof ZERO_HASH;
|
|
3715
|
-
declare const index$p_blake2b: typeof blake2b;
|
|
3716
|
-
declare const index$p_defaultAllocator: typeof defaultAllocator;
|
|
3717
3716
|
declare const index$p_keccak: typeof keccak;
|
|
3718
3717
|
declare namespace index$p {
|
|
3719
|
-
export { index$
|
|
3720
|
-
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 };
|
|
3721
3720
|
}
|
|
3722
3721
|
|
|
3723
3722
|
/** Immutable view of the `HashDictionary`. */
|
|
@@ -4494,6 +4493,8 @@ declare class TruncatedHashDictionary<T extends OpaqueHash, V> {
|
|
|
4494
4493
|
}
|
|
4495
4494
|
}
|
|
4496
4495
|
|
|
4496
|
+
type index$o_ArrayView<T> = ArrayView<T>;
|
|
4497
|
+
declare const index$o_ArrayView: typeof ArrayView;
|
|
4497
4498
|
type index$o_FixedSizeArray<T, N extends number> = FixedSizeArray<T, N>;
|
|
4498
4499
|
declare const index$o_FixedSizeArray: typeof FixedSizeArray;
|
|
4499
4500
|
type index$o_HashDictionary<K extends OpaqueHash, V> = HashDictionary<K, V>;
|
|
@@ -4521,7 +4522,7 @@ type index$o_TruncatedHashDictionary<T extends OpaqueHash, V> = TruncatedHashDic
|
|
|
4521
4522
|
declare const index$o_TruncatedHashDictionary: typeof TruncatedHashDictionary;
|
|
4522
4523
|
declare const index$o_asKnownSize: typeof asKnownSize;
|
|
4523
4524
|
declare namespace index$o {
|
|
4524
|
-
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 };
|
|
4525
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 };
|
|
4526
4527
|
}
|
|
4527
4528
|
|
|
@@ -4840,22 +4841,16 @@ declare function trivialSeed(s: U32): KeySeed {
|
|
|
4840
4841
|
* Derives a Ed25519 secret key from a seed.
|
|
4841
4842
|
* https://github.com/polkadot-fellows/JIPs/blob/7048f79edf4f4eb8bfe6fb42e6bbf61900f44c65/JIP-5.md#derivation-method
|
|
4842
4843
|
*/
|
|
4843
|
-
declare function deriveEd25519SecretKey(
|
|
4844
|
-
|
|
4845
|
-
allocator: SimpleAllocator = new SimpleAllocator(),
|
|
4846
|
-
): Ed25519SecretSeed {
|
|
4847
|
-
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();
|
|
4848
4846
|
}
|
|
4849
4847
|
|
|
4850
4848
|
/**
|
|
4851
4849
|
* Derives a Bandersnatch secret key from a seed.
|
|
4852
4850
|
* https://github.com/polkadot-fellows/JIPs/blob/7048f79edf4f4eb8bfe6fb42e6bbf61900f44c65/JIP-5.md#derivation-method
|
|
4853
4851
|
*/
|
|
4854
|
-
declare function deriveBandersnatchSecretKey(
|
|
4855
|
-
|
|
4856
|
-
allocator: SimpleAllocator = new SimpleAllocator(),
|
|
4857
|
-
): BandersnatchSecretSeed {
|
|
4858
|
-
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();
|
|
4859
4854
|
}
|
|
4860
4855
|
|
|
4861
4856
|
/**
|
|
@@ -9126,21 +9121,6 @@ declare function accumulationOutputComparator(a: AccumulationOutput, b: Accumula
|
|
|
9126
9121
|
return Ordering.Equal;
|
|
9127
9122
|
}
|
|
9128
9123
|
|
|
9129
|
-
declare const codecWithHash = <T, V, H extends OpaqueHash>(val: Descriptor<T, V>): Descriptor<WithHash<H, T>, V> =>
|
|
9130
|
-
Descriptor.withView(
|
|
9131
|
-
val.name,
|
|
9132
|
-
val.sizeHint,
|
|
9133
|
-
(e, elem) => val.encode(e, elem.data),
|
|
9134
|
-
(d): WithHash<H, T> => {
|
|
9135
|
-
const decoder2 = d.clone();
|
|
9136
|
-
const encoded = val.skipEncoded(decoder2);
|
|
9137
|
-
const hash = blake2b.hashBytes(encoded);
|
|
9138
|
-
return new WithHash(hash.asOpaque(), val.decode(d));
|
|
9139
|
-
},
|
|
9140
|
-
val.skip,
|
|
9141
|
-
val.View,
|
|
9142
|
-
);
|
|
9143
|
-
|
|
9144
9124
|
/**
|
|
9145
9125
|
* Assignment of particular work report to a core.
|
|
9146
9126
|
*
|
|
@@ -9151,7 +9131,7 @@ declare const codecWithHash = <T, V, H extends OpaqueHash>(val: Descriptor<T, V>
|
|
|
9151
9131
|
*/
|
|
9152
9132
|
declare class AvailabilityAssignment extends WithDebug {
|
|
9153
9133
|
static Codec = codec.Class(AvailabilityAssignment, {
|
|
9154
|
-
workReport:
|
|
9134
|
+
workReport: WorkReport.Codec,
|
|
9155
9135
|
timeout: codec.u32.asOpaque<TimeSlot>(),
|
|
9156
9136
|
});
|
|
9157
9137
|
|
|
@@ -9161,7 +9141,7 @@ declare class AvailabilityAssignment extends WithDebug {
|
|
|
9161
9141
|
|
|
9162
9142
|
private constructor(
|
|
9163
9143
|
/** Work report assigned to a core. */
|
|
9164
|
-
public readonly workReport:
|
|
9144
|
+
public readonly workReport: WorkReport,
|
|
9165
9145
|
/** Time slot at which the report becomes obsolete. */
|
|
9166
9146
|
public readonly timeout: TimeSlot,
|
|
9167
9147
|
) {
|
|
@@ -9265,8 +9245,6 @@ declare function hashComparator<V extends OpaqueHash>(a: V, b: V) {
|
|
|
9265
9245
|
return a.compare(b);
|
|
9266
9246
|
}
|
|
9267
9247
|
|
|
9268
|
-
// TODO [ToDr] Not sure where these should live yet :(
|
|
9269
|
-
|
|
9270
9248
|
/**
|
|
9271
9249
|
* `J`: The maximum sum of dependency items in a work-report.
|
|
9272
9250
|
*
|
|
@@ -9320,6 +9298,215 @@ declare class NotYetAccumulatedReport extends WithDebug {
|
|
|
9320
9298
|
}
|
|
9321
9299
|
}
|
|
9322
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
|
+
|
|
9323
9510
|
/** Dictionary entry of services that auto-accumulate every block. */
|
|
9324
9511
|
declare class AutoAccumulate {
|
|
9325
9512
|
static Codec = codec.Class(AutoAccumulate, {
|
|
@@ -9340,33 +9527,42 @@ declare class AutoAccumulate {
|
|
|
9340
9527
|
}
|
|
9341
9528
|
|
|
9342
9529
|
/**
|
|
9343
|
-
* https://graypaper.fluffylabs.dev/#/
|
|
9530
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/114402114402?v=0.7.2
|
|
9344
9531
|
*/
|
|
9345
9532
|
declare class PrivilegedServices {
|
|
9533
|
+
/** https://graypaper.fluffylabs.dev/#/ab2cdbd/3bbd023bcb02?v=0.7.2 */
|
|
9346
9534
|
static Codec = codec.Class(PrivilegedServices, {
|
|
9347
9535
|
manager: codec.u32.asOpaque<ServiceId>(),
|
|
9348
|
-
|
|
9349
|
-
|
|
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)),
|
|
9350
9541
|
autoAccumulateServices: readonlyArray(codec.sequenceVarLen(AutoAccumulate.Codec)),
|
|
9351
9542
|
});
|
|
9352
9543
|
|
|
9353
|
-
static create(
|
|
9354
|
-
return new PrivilegedServices(manager,
|
|
9544
|
+
static create(a: CodecRecord<PrivilegedServices>) {
|
|
9545
|
+
return new PrivilegedServices(a.manager, a.delegator, a.registrar, a.assigners, a.autoAccumulateServices);
|
|
9355
9546
|
}
|
|
9356
9547
|
|
|
9357
9548
|
private constructor(
|
|
9358
9549
|
/**
|
|
9359
|
-
*
|
|
9360
|
-
* the service able to effect an alteration of χ from block to block,
|
|
9550
|
+
* `χ_M`: Manages alteration of χ from block to block,
|
|
9361
9551
|
* as well as bestow services with storage deposit credits.
|
|
9362
|
-
* https://graypaper.fluffylabs.dev/#/
|
|
9552
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/111502111902?v=0.7.2
|
|
9363
9553
|
*/
|
|
9364
9554
|
readonly manager: ServiceId,
|
|
9365
|
-
/**
|
|
9366
|
-
readonly
|
|
9367
|
-
/**
|
|
9368
|
-
|
|
9369
|
-
|
|
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. */
|
|
9370
9566
|
readonly autoAccumulateServices: readonly AutoAccumulate[],
|
|
9371
9567
|
) {}
|
|
9372
9568
|
}
|
|
@@ -9815,190 +10011,6 @@ declare class SafroleData {
|
|
|
9815
10011
|
) {}
|
|
9816
10012
|
}
|
|
9817
10013
|
|
|
9818
|
-
/**
|
|
9819
|
-
* `B_S`: The basic minimum balance which all services require.
|
|
9820
|
-
*
|
|
9821
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445800445800?v=0.6.7
|
|
9822
|
-
*/
|
|
9823
|
-
declare const BASE_SERVICE_BALANCE = 100n;
|
|
9824
|
-
/**
|
|
9825
|
-
* `B_I`: The additional minimum balance required per item of elective service state.
|
|
9826
|
-
*
|
|
9827
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445000445000?v=0.6.7
|
|
9828
|
-
*/
|
|
9829
|
-
declare const ELECTIVE_ITEM_BALANCE = 10n;
|
|
9830
|
-
/**
|
|
9831
|
-
* `B_L`: The additional minimum balance required per octet of elective service state.
|
|
9832
|
-
*
|
|
9833
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/445400445400?v=0.6.7
|
|
9834
|
-
*/
|
|
9835
|
-
declare const ELECTIVE_BYTE_BALANCE = 1n;
|
|
9836
|
-
|
|
9837
|
-
declare const zeroSizeHint: SizeHint = {
|
|
9838
|
-
bytes: 0,
|
|
9839
|
-
isExact: true,
|
|
9840
|
-
};
|
|
9841
|
-
|
|
9842
|
-
/** 0-byte read, return given default value */
|
|
9843
|
-
declare const ignoreValueWithDefault = <T>(defaultValue: T) =>
|
|
9844
|
-
Descriptor.new<T>(
|
|
9845
|
-
"ignoreValue",
|
|
9846
|
-
zeroSizeHint,
|
|
9847
|
-
(_e, _v) => {},
|
|
9848
|
-
(_d) => defaultValue,
|
|
9849
|
-
(_s) => {},
|
|
9850
|
-
);
|
|
9851
|
-
|
|
9852
|
-
/**
|
|
9853
|
-
* Service account details.
|
|
9854
|
-
*
|
|
9855
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/108301108301?v=0.6.7
|
|
9856
|
-
*/
|
|
9857
|
-
declare class ServiceAccountInfo extends WithDebug {
|
|
9858
|
-
static Codec = codec.Class(ServiceAccountInfo, {
|
|
9859
|
-
codeHash: codec.bytes(HASH_SIZE).asOpaque<CodeHash>(),
|
|
9860
|
-
balance: codec.u64,
|
|
9861
|
-
accumulateMinGas: codec.u64.convert((x) => x, tryAsServiceGas),
|
|
9862
|
-
onTransferMinGas: codec.u64.convert((x) => x, tryAsServiceGas),
|
|
9863
|
-
storageUtilisationBytes: codec.u64,
|
|
9864
|
-
gratisStorage: codec.u64,
|
|
9865
|
-
storageUtilisationCount: codec.u32,
|
|
9866
|
-
created: codec.u32.convert((x) => x, tryAsTimeSlot),
|
|
9867
|
-
lastAccumulation: codec.u32.convert((x) => x, tryAsTimeSlot),
|
|
9868
|
-
parentService: codec.u32.convert((x) => x, tryAsServiceId),
|
|
9869
|
-
});
|
|
9870
|
-
|
|
9871
|
-
static create(a: CodecRecord<ServiceAccountInfo>) {
|
|
9872
|
-
return new ServiceAccountInfo(
|
|
9873
|
-
a.codeHash,
|
|
9874
|
-
a.balance,
|
|
9875
|
-
a.accumulateMinGas,
|
|
9876
|
-
a.onTransferMinGas,
|
|
9877
|
-
a.storageUtilisationBytes,
|
|
9878
|
-
a.gratisStorage,
|
|
9879
|
-
a.storageUtilisationCount,
|
|
9880
|
-
a.created,
|
|
9881
|
-
a.lastAccumulation,
|
|
9882
|
-
a.parentService,
|
|
9883
|
-
);
|
|
9884
|
-
}
|
|
9885
|
-
|
|
9886
|
-
/**
|
|
9887
|
-
* `a_t = max(0, BS + BI * a_i + BL * a_o - a_f)`
|
|
9888
|
-
* https://graypaper.fluffylabs.dev/#/7e6ff6a/119e01119e01?v=0.6.7
|
|
9889
|
-
*/
|
|
9890
|
-
static calculateThresholdBalance(items: U32, bytes: U64, gratisStorage: U64): U64 {
|
|
9891
|
-
const storageCost =
|
|
9892
|
-
BASE_SERVICE_BALANCE + ELECTIVE_ITEM_BALANCE * BigInt(items) + ELECTIVE_BYTE_BALANCE * bytes - gratisStorage;
|
|
9893
|
-
|
|
9894
|
-
if (storageCost < 0n) {
|
|
9895
|
-
return tryAsU64(0);
|
|
9896
|
-
}
|
|
9897
|
-
|
|
9898
|
-
if (storageCost >= 2n ** 64n) {
|
|
9899
|
-
return tryAsU64(2n ** 64n - 1n);
|
|
9900
|
-
}
|
|
9901
|
-
|
|
9902
|
-
return tryAsU64(storageCost);
|
|
9903
|
-
}
|
|
9904
|
-
|
|
9905
|
-
private constructor(
|
|
9906
|
-
/** `a_c`: Hash of the service code. */
|
|
9907
|
-
public readonly codeHash: CodeHash,
|
|
9908
|
-
/** `a_b`: Current account balance. */
|
|
9909
|
-
public readonly balance: U64,
|
|
9910
|
-
/** `a_g`: Minimal gas required to execute Accumulate entrypoint. */
|
|
9911
|
-
public readonly accumulateMinGas: ServiceGas,
|
|
9912
|
-
/** `a_m`: Minimal gas required to execute On Transfer entrypoint. */
|
|
9913
|
-
public readonly onTransferMinGas: ServiceGas,
|
|
9914
|
-
/** `a_o`: Total number of octets in storage. */
|
|
9915
|
-
public readonly storageUtilisationBytes: U64,
|
|
9916
|
-
/** `a_f`: Cost-free storage. Decreases both storage item count and total byte size. */
|
|
9917
|
-
public readonly gratisStorage: U64,
|
|
9918
|
-
/** `a_i`: Number of items in storage. */
|
|
9919
|
-
public readonly storageUtilisationCount: U32,
|
|
9920
|
-
/** `a_r`: Creation account time slot. */
|
|
9921
|
-
public readonly created: TimeSlot,
|
|
9922
|
-
/** `a_a`: Most recent accumulation time slot. */
|
|
9923
|
-
public readonly lastAccumulation: TimeSlot,
|
|
9924
|
-
/** `a_p`: Parent service ID. */
|
|
9925
|
-
public readonly parentService: ServiceId,
|
|
9926
|
-
) {
|
|
9927
|
-
super();
|
|
9928
|
-
}
|
|
9929
|
-
}
|
|
9930
|
-
|
|
9931
|
-
declare class PreimageItem extends WithDebug {
|
|
9932
|
-
static Codec = codec.Class(PreimageItem, {
|
|
9933
|
-
hash: codec.bytes(HASH_SIZE).asOpaque<PreimageHash>(),
|
|
9934
|
-
blob: codec.blob,
|
|
9935
|
-
});
|
|
9936
|
-
|
|
9937
|
-
static create({ hash, blob }: CodecRecord<PreimageItem>) {
|
|
9938
|
-
return new PreimageItem(hash, blob);
|
|
9939
|
-
}
|
|
9940
|
-
|
|
9941
|
-
private constructor(
|
|
9942
|
-
readonly hash: PreimageHash,
|
|
9943
|
-
readonly blob: BytesBlob,
|
|
9944
|
-
) {
|
|
9945
|
-
super();
|
|
9946
|
-
}
|
|
9947
|
-
}
|
|
9948
|
-
|
|
9949
|
-
type StorageKey = Opaque<BytesBlob, "storage key">;
|
|
9950
|
-
|
|
9951
|
-
declare class StorageItem extends WithDebug {
|
|
9952
|
-
static Codec = codec.Class(StorageItem, {
|
|
9953
|
-
key: codec.blob.convert(
|
|
9954
|
-
(i) => i,
|
|
9955
|
-
(o) => asOpaqueType(o),
|
|
9956
|
-
),
|
|
9957
|
-
value: codec.blob,
|
|
9958
|
-
});
|
|
9959
|
-
|
|
9960
|
-
static create({ key, value }: CodecRecord<StorageItem>) {
|
|
9961
|
-
return new StorageItem(key, value);
|
|
9962
|
-
}
|
|
9963
|
-
|
|
9964
|
-
private constructor(
|
|
9965
|
-
readonly key: StorageKey,
|
|
9966
|
-
readonly value: BytesBlob,
|
|
9967
|
-
) {
|
|
9968
|
-
super();
|
|
9969
|
-
}
|
|
9970
|
-
}
|
|
9971
|
-
|
|
9972
|
-
declare const MAX_LOOKUP_HISTORY_SLOTS = 3;
|
|
9973
|
-
type LookupHistorySlots = KnownSizeArray<TimeSlot, `0-${typeof MAX_LOOKUP_HISTORY_SLOTS} timeslots`>;
|
|
9974
|
-
declare function tryAsLookupHistorySlots(items: readonly TimeSlot[]): LookupHistorySlots {
|
|
9975
|
-
const knownSize = asKnownSize(items) as LookupHistorySlots;
|
|
9976
|
-
if (knownSize.length > MAX_LOOKUP_HISTORY_SLOTS) {
|
|
9977
|
-
throw new Error(`Lookup history items must contain 0-${MAX_LOOKUP_HISTORY_SLOTS} timeslots.`);
|
|
9978
|
-
}
|
|
9979
|
-
return knownSize;
|
|
9980
|
-
}
|
|
9981
|
-
|
|
9982
|
-
/** https://graypaper.fluffylabs.dev/#/5f542d7/115400115800 */
|
|
9983
|
-
declare class LookupHistoryItem {
|
|
9984
|
-
constructor(
|
|
9985
|
-
public readonly hash: PreimageHash,
|
|
9986
|
-
public readonly length: U32,
|
|
9987
|
-
/**
|
|
9988
|
-
* Preimage availability history as a sequence of time slots.
|
|
9989
|
-
* See PreimageStatus and the following GP fragment for more details.
|
|
9990
|
-
* https://graypaper.fluffylabs.dev/#/5f542d7/11780011a500 */
|
|
9991
|
-
public readonly slots: LookupHistorySlots,
|
|
9992
|
-
) {}
|
|
9993
|
-
|
|
9994
|
-
static isRequested(item: LookupHistoryItem | LookupHistorySlots): boolean {
|
|
9995
|
-
if ("slots" in item) {
|
|
9996
|
-
return item.slots.length === 0;
|
|
9997
|
-
}
|
|
9998
|
-
return item.length === 0;
|
|
9999
|
-
}
|
|
10000
|
-
}
|
|
10001
|
-
|
|
10002
10014
|
declare const codecServiceId: Descriptor<ServiceId> =
|
|
10003
10015
|
Compatibility.isSuite(TestSuite.W3F_DAVXY) || Compatibility.isSuite(TestSuite.JAMDUNA, GpVersion.V0_6_7)
|
|
10004
10016
|
? codec.u32.asOpaque<ServiceId>()
|
|
@@ -11173,8 +11185,9 @@ declare class InMemoryState extends WithDebug implements State, EnumerableState
|
|
|
11173
11185
|
epochRoot: Bytes.zero(BANDERSNATCH_RING_ROOT_BYTES).asOpaque(),
|
|
11174
11186
|
privilegedServices: PrivilegedServices.create({
|
|
11175
11187
|
manager: tryAsServiceId(0),
|
|
11176
|
-
|
|
11177
|
-
|
|
11188
|
+
assigners: tryAsPerCore(new Array(spec.coresCount).fill(tryAsServiceId(0)), spec),
|
|
11189
|
+
delegator: tryAsServiceId(0),
|
|
11190
|
+
registrar: tryAsServiceId(MAX_VALUE),
|
|
11178
11191
|
autoAccumulateServices: [],
|
|
11179
11192
|
}),
|
|
11180
11193
|
accumulationOutputLog: SortedArray.fromArray(accumulationOutputComparator, []),
|
|
@@ -11308,7 +11321,7 @@ declare const index$e_codecPerCore: typeof codecPerCore;
|
|
|
11308
11321
|
declare const index$e_codecServiceId: typeof codecServiceId;
|
|
11309
11322
|
declare const index$e_codecVarGas: typeof codecVarGas;
|
|
11310
11323
|
declare const index$e_codecVarU16: typeof codecVarU16;
|
|
11311
|
-
declare const index$
|
|
11324
|
+
declare const index$e_codecWithVersion: typeof codecWithVersion;
|
|
11312
11325
|
declare const index$e_hashComparator: typeof hashComparator;
|
|
11313
11326
|
declare const index$e_ignoreValueWithDefault: typeof ignoreValueWithDefault;
|
|
11314
11327
|
declare const index$e_serviceDataCodec: typeof serviceDataCodec;
|
|
@@ -11319,7 +11332,7 @@ declare const index$e_tryAsPerCore: typeof tryAsPerCore;
|
|
|
11319
11332
|
declare const index$e_workReportsSortedSetCodec: typeof workReportsSortedSetCodec;
|
|
11320
11333
|
declare const index$e_zeroSizeHint: typeof zeroSizeHint;
|
|
11321
11334
|
declare namespace index$e {
|
|
11322
|
-
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 };
|
|
11323
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 };
|
|
11324
11337
|
}
|
|
11325
11338
|
|
|
@@ -11387,7 +11400,7 @@ declare namespace stateKeys {
|
|
|
11387
11400
|
}
|
|
11388
11401
|
|
|
11389
11402
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3bba033bba03?v=0.7.1 */
|
|
11390
|
-
export function serviceStorage(serviceId: ServiceId, key: StorageKey): StateKey {
|
|
11403
|
+
export function serviceStorage(blake2b: Blake2b, serviceId: ServiceId, key: StorageKey): StateKey {
|
|
11391
11404
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
11392
11405
|
const out = Bytes.zero(HASH_SIZE);
|
|
11393
11406
|
out.raw.set(u32AsLeBytes(tryAsU32(2 ** 32 - 1)), 0);
|
|
@@ -11395,11 +11408,11 @@ declare namespace stateKeys {
|
|
|
11395
11408
|
return legacyServiceNested(serviceId, out);
|
|
11396
11409
|
}
|
|
11397
11410
|
|
|
11398
|
-
return serviceNested(serviceId, tryAsU32(2 ** 32 - 1), key);
|
|
11411
|
+
return serviceNested(blake2b, serviceId, tryAsU32(2 ** 32 - 1), key);
|
|
11399
11412
|
}
|
|
11400
11413
|
|
|
11401
11414
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3bd7033bd703?v=0.7.1 */
|
|
11402
|
-
export function servicePreimage(serviceId: ServiceId, hash: PreimageHash): StateKey {
|
|
11415
|
+
export function servicePreimage(blake2b: Blake2b, serviceId: ServiceId, hash: PreimageHash): StateKey {
|
|
11403
11416
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
11404
11417
|
const out = Bytes.zero(HASH_SIZE);
|
|
11405
11418
|
out.raw.set(u32AsLeBytes(tryAsU32(2 ** 32 - 2)), 0);
|
|
@@ -11407,11 +11420,16 @@ declare namespace stateKeys {
|
|
|
11407
11420
|
return legacyServiceNested(serviceId, out);
|
|
11408
11421
|
}
|
|
11409
11422
|
|
|
11410
|
-
return serviceNested(serviceId, tryAsU32(2 ** 32 - 2), hash);
|
|
11423
|
+
return serviceNested(blake2b, serviceId, tryAsU32(2 ** 32 - 2), hash);
|
|
11411
11424
|
}
|
|
11412
11425
|
|
|
11413
11426
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3b0a043b0a04?v=0.7.1 */
|
|
11414
|
-
export function serviceLookupHistory(
|
|
11427
|
+
export function serviceLookupHistory(
|
|
11428
|
+
blake2b: Blake2b,
|
|
11429
|
+
serviceId: ServiceId,
|
|
11430
|
+
hash: PreimageHash,
|
|
11431
|
+
preimageLength: U32,
|
|
11432
|
+
): StateKey {
|
|
11415
11433
|
if (Compatibility.isLessThan(GpVersion.V0_6_7)) {
|
|
11416
11434
|
const doubleHash = blake2b.hashBytes(hash);
|
|
11417
11435
|
const out = Bytes.zero(HASH_SIZE);
|
|
@@ -11420,11 +11438,11 @@ declare namespace stateKeys {
|
|
|
11420
11438
|
return legacyServiceNested(serviceId, out);
|
|
11421
11439
|
}
|
|
11422
11440
|
|
|
11423
|
-
return serviceNested(serviceId, preimageLength, hash);
|
|
11441
|
+
return serviceNested(blake2b, serviceId, preimageLength, hash);
|
|
11424
11442
|
}
|
|
11425
11443
|
|
|
11426
11444
|
/** https://graypaper.fluffylabs.dev/#/1c979cb/3b88003b8800?v=0.7.1 */
|
|
11427
|
-
export function serviceNested(serviceId: ServiceId, numberPrefix: U32, hash: BytesBlob): StateKey {
|
|
11445
|
+
export function serviceNested(blake2b: Blake2b, serviceId: ServiceId, numberPrefix: U32, hash: BytesBlob): StateKey {
|
|
11428
11446
|
const inputToHash = BytesBlob.blobFromParts(u32AsLeBytes(numberPrefix), hash.raw);
|
|
11429
11447
|
const newHash = blake2b.hashBytes(inputToHash).raw.subarray(0, 28);
|
|
11430
11448
|
const key = Bytes.zero(HASH_SIZE);
|
|
@@ -11604,24 +11622,26 @@ declare namespace serialize {
|
|
|
11604
11622
|
/** C(255, s): https://graypaper.fluffylabs.dev/#/85129da/383103383103?v=0.6.3 */
|
|
11605
11623
|
export const serviceData = (serviceId: ServiceId) => ({
|
|
11606
11624
|
key: stateKeys.serviceInfo(serviceId),
|
|
11607
|
-
Codec:
|
|
11625
|
+
Codec: Compatibility.isGreaterOrEqual(GpVersion.V0_7_1)
|
|
11626
|
+
? codecWithVersion(ServiceAccountInfo.Codec)
|
|
11627
|
+
: ServiceAccountInfo.Codec,
|
|
11608
11628
|
});
|
|
11609
11629
|
|
|
11610
11630
|
/** https://graypaper.fluffylabs.dev/#/85129da/384803384803?v=0.6.3 */
|
|
11611
|
-
export const serviceStorage = (serviceId: ServiceId, key: StorageKey) => ({
|
|
11612
|
-
key: stateKeys.serviceStorage(serviceId, key),
|
|
11631
|
+
export const serviceStorage = (blake2b: Blake2b, serviceId: ServiceId, key: StorageKey) => ({
|
|
11632
|
+
key: stateKeys.serviceStorage(blake2b, serviceId, key),
|
|
11613
11633
|
Codec: dumpCodec,
|
|
11614
11634
|
});
|
|
11615
11635
|
|
|
11616
11636
|
/** https://graypaper.fluffylabs.dev/#/85129da/385b03385b03?v=0.6.3 */
|
|
11617
|
-
export const servicePreimages = (serviceId: ServiceId, hash: PreimageHash) => ({
|
|
11618
|
-
key: stateKeys.servicePreimage(serviceId, hash),
|
|
11637
|
+
export const servicePreimages = (blake2b: Blake2b, serviceId: ServiceId, hash: PreimageHash) => ({
|
|
11638
|
+
key: stateKeys.servicePreimage(blake2b, serviceId, hash),
|
|
11619
11639
|
Codec: dumpCodec,
|
|
11620
11640
|
});
|
|
11621
11641
|
|
|
11622
11642
|
/** https://graypaper.fluffylabs.dev/#/85129da/387603387603?v=0.6.3 */
|
|
11623
|
-
export const serviceLookupHistory = (serviceId: ServiceId, hash: PreimageHash, len: U32) => ({
|
|
11624
|
-
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),
|
|
11625
11645
|
Codec: readonlyArray(codec.sequenceVarLen(codec.u32)),
|
|
11626
11646
|
});
|
|
11627
11647
|
}
|
|
@@ -11656,6 +11676,7 @@ declare const EMPTY_BLOB = BytesBlob.empty();
|
|
|
11656
11676
|
/** Serialize given state update into a series of key-value pairs. */
|
|
11657
11677
|
declare function* serializeStateUpdate(
|
|
11658
11678
|
spec: ChainSpec,
|
|
11679
|
+
blake2b: Blake2b,
|
|
11659
11680
|
update: Partial<State & ServicesUpdate>,
|
|
11660
11681
|
): Generator<StateEntryUpdate> {
|
|
11661
11682
|
// first let's serialize all of the simple entries (if present!)
|
|
@@ -11664,9 +11685,9 @@ declare function* serializeStateUpdate(
|
|
|
11664
11685
|
const encode = <T>(codec: Encode<T>, val: T) => Encoder.encodeObject(codec, val, spec);
|
|
11665
11686
|
|
|
11666
11687
|
// then let's proceed with service updates
|
|
11667
|
-
yield* serializeServiceUpdates(update.servicesUpdates, encode);
|
|
11668
|
-
yield* serializePreimages(update.preimages, encode);
|
|
11669
|
-
yield* serializeStorage(update.storage);
|
|
11688
|
+
yield* serializeServiceUpdates(update.servicesUpdates, encode, blake2b);
|
|
11689
|
+
yield* serializePreimages(update.preimages, encode, blake2b);
|
|
11690
|
+
yield* serializeStorage(update.storage, blake2b);
|
|
11670
11691
|
yield* serializeRemovedServices(update.servicesRemoved);
|
|
11671
11692
|
}
|
|
11672
11693
|
|
|
@@ -11678,18 +11699,18 @@ declare function* serializeRemovedServices(servicesRemoved: ServiceId[] | undefi
|
|
|
11678
11699
|
}
|
|
11679
11700
|
}
|
|
11680
11701
|
|
|
11681
|
-
declare function* serializeStorage(storage: UpdateStorage[] | undefined): Generator<StateEntryUpdate> {
|
|
11702
|
+
declare function* serializeStorage(storage: UpdateStorage[] | undefined, blake2b: Blake2b): Generator<StateEntryUpdate> {
|
|
11682
11703
|
for (const { action, serviceId } of storage ?? []) {
|
|
11683
11704
|
switch (action.kind) {
|
|
11684
11705
|
case UpdateStorageKind.Set: {
|
|
11685
11706
|
const key = action.storage.key;
|
|
11686
|
-
const codec = serialize.serviceStorage(serviceId, key);
|
|
11707
|
+
const codec = serialize.serviceStorage(blake2b, serviceId, key);
|
|
11687
11708
|
yield [StateEntryUpdateAction.Insert, codec.key, action.storage.value];
|
|
11688
11709
|
break;
|
|
11689
11710
|
}
|
|
11690
11711
|
case UpdateStorageKind.Remove: {
|
|
11691
11712
|
const key = action.key;
|
|
11692
|
-
const codec = serialize.serviceStorage(serviceId, key);
|
|
11713
|
+
const codec = serialize.serviceStorage(blake2b, serviceId, key);
|
|
11693
11714
|
yield [StateEntryUpdateAction.Remove, codec.key, EMPTY_BLOB];
|
|
11694
11715
|
break;
|
|
11695
11716
|
}
|
|
@@ -11699,16 +11720,20 @@ declare function* serializeStorage(storage: UpdateStorage[] | undefined): Genera
|
|
|
11699
11720
|
}
|
|
11700
11721
|
}
|
|
11701
11722
|
|
|
11702
|
-
declare function* serializePreimages(
|
|
11723
|
+
declare function* serializePreimages(
|
|
11724
|
+
preimages: UpdatePreimage[] | undefined,
|
|
11725
|
+
encode: EncodeFun,
|
|
11726
|
+
blake2b: Blake2b,
|
|
11727
|
+
): Generator<StateEntryUpdate> {
|
|
11703
11728
|
for (const { action, serviceId } of preimages ?? []) {
|
|
11704
11729
|
switch (action.kind) {
|
|
11705
11730
|
case UpdatePreimageKind.Provide: {
|
|
11706
11731
|
const { hash, blob } = action.preimage;
|
|
11707
|
-
const codec = serialize.servicePreimages(serviceId, hash);
|
|
11732
|
+
const codec = serialize.servicePreimages(blake2b, serviceId, hash);
|
|
11708
11733
|
yield [StateEntryUpdateAction.Insert, codec.key, blob];
|
|
11709
11734
|
|
|
11710
11735
|
if (action.slot !== null) {
|
|
11711
|
-
const codec2 = serialize.serviceLookupHistory(serviceId, hash, tryAsU32(blob.length));
|
|
11736
|
+
const codec2 = serialize.serviceLookupHistory(blake2b, serviceId, hash, tryAsU32(blob.length));
|
|
11712
11737
|
yield [
|
|
11713
11738
|
StateEntryUpdateAction.Insert,
|
|
11714
11739
|
codec2.key,
|
|
@@ -11719,16 +11744,16 @@ declare function* serializePreimages(preimages: UpdatePreimage[] | undefined, en
|
|
|
11719
11744
|
}
|
|
11720
11745
|
case UpdatePreimageKind.UpdateOrAdd: {
|
|
11721
11746
|
const { hash, length, slots } = action.item;
|
|
11722
|
-
const codec = serialize.serviceLookupHistory(serviceId, hash, length);
|
|
11747
|
+
const codec = serialize.serviceLookupHistory(blake2b, serviceId, hash, length);
|
|
11723
11748
|
yield [StateEntryUpdateAction.Insert, codec.key, encode(codec.Codec, slots)];
|
|
11724
11749
|
break;
|
|
11725
11750
|
}
|
|
11726
11751
|
case UpdatePreimageKind.Remove: {
|
|
11727
11752
|
const { hash, length } = action;
|
|
11728
|
-
const codec = serialize.servicePreimages(serviceId, hash);
|
|
11753
|
+
const codec = serialize.servicePreimages(blake2b, serviceId, hash);
|
|
11729
11754
|
yield [StateEntryUpdateAction.Remove, codec.key, EMPTY_BLOB];
|
|
11730
11755
|
|
|
11731
|
-
const codec2 = serialize.serviceLookupHistory(serviceId, hash, length);
|
|
11756
|
+
const codec2 = serialize.serviceLookupHistory(blake2b, serviceId, hash, length);
|
|
11732
11757
|
yield [StateEntryUpdateAction.Remove, codec2.key, EMPTY_BLOB];
|
|
11733
11758
|
break;
|
|
11734
11759
|
}
|
|
@@ -11740,6 +11765,7 @@ declare function* serializePreimages(preimages: UpdatePreimage[] | undefined, en
|
|
|
11740
11765
|
declare function* serializeServiceUpdates(
|
|
11741
11766
|
servicesUpdates: UpdateService[] | undefined,
|
|
11742
11767
|
encode: EncodeFun,
|
|
11768
|
+
blake2b: Blake2b,
|
|
11743
11769
|
): Generator<StateEntryUpdate> {
|
|
11744
11770
|
for (const { action, serviceId } of servicesUpdates ?? []) {
|
|
11745
11771
|
// new service being created or updated
|
|
@@ -11749,7 +11775,7 @@ declare function* serializeServiceUpdates(
|
|
|
11749
11775
|
// additional lookup history update
|
|
11750
11776
|
if (action.kind === UpdateServiceKind.Create && action.lookupHistory !== null) {
|
|
11751
11777
|
const { lookupHistory } = action;
|
|
11752
|
-
const codec2 = serialize.serviceLookupHistory(serviceId, lookupHistory.hash, lookupHistory.length);
|
|
11778
|
+
const codec2 = serialize.serviceLookupHistory(blake2b, serviceId, lookupHistory.hash, lookupHistory.length);
|
|
11753
11779
|
yield [StateEntryUpdateAction.Insert, codec2.key, encode(codec2.Codec, lookupHistory.slots)];
|
|
11754
11780
|
}
|
|
11755
11781
|
}
|
|
@@ -11883,8 +11909,8 @@ declare class StateEntries {
|
|
|
11883
11909
|
);
|
|
11884
11910
|
|
|
11885
11911
|
/** Turn in-memory state into it's serialized form. */
|
|
11886
|
-
static serializeInMemory(spec: ChainSpec, state: InMemoryState) {
|
|
11887
|
-
return new StateEntries(convertInMemoryStateToDictionary(spec, state));
|
|
11912
|
+
static serializeInMemory(spec: ChainSpec, blake2b: Blake2b, state: InMemoryState) {
|
|
11913
|
+
return new StateEntries(convertInMemoryStateToDictionary(spec, blake2b, state));
|
|
11888
11914
|
}
|
|
11889
11915
|
|
|
11890
11916
|
/**
|
|
@@ -11939,7 +11965,8 @@ declare class StateEntries {
|
|
|
11939
11965
|
}
|
|
11940
11966
|
|
|
11941
11967
|
/** https://graypaper.fluffylabs.dev/#/68eaa1f/391600391600?v=0.6.4 */
|
|
11942
|
-
getRootHash(): StateRootHash {
|
|
11968
|
+
getRootHash(blake2b: Blake2b): StateRootHash {
|
|
11969
|
+
const blake2bTrieHasher = getBlake2bTrieHasher(blake2b);
|
|
11943
11970
|
const leaves: SortedSet<LeafNode> = SortedSet.fromArray(leafComparator);
|
|
11944
11971
|
for (const [key, value] of this) {
|
|
11945
11972
|
leaves.insert(InMemoryTrie.constructLeaf(blake2bTrieHasher, key.asOpaque(), value));
|
|
@@ -11952,6 +11979,7 @@ declare class StateEntries {
|
|
|
11952
11979
|
/** https://graypaper.fluffylabs.dev/#/68eaa1f/38a50038a500?v=0.6.4 */
|
|
11953
11980
|
declare function convertInMemoryStateToDictionary(
|
|
11954
11981
|
spec: ChainSpec,
|
|
11982
|
+
blake2b: Blake2b,
|
|
11955
11983
|
state: InMemoryState,
|
|
11956
11984
|
): TruncatedHashDictionary<StateKey, BytesBlob> {
|
|
11957
11985
|
const serialized = TruncatedHashDictionary.fromEntries<StateKey, BytesBlob>([]);
|
|
@@ -11984,20 +12012,25 @@ declare function convertInMemoryStateToDictionary(
|
|
|
11984
12012
|
|
|
11985
12013
|
// preimages
|
|
11986
12014
|
for (const preimage of service.data.preimages.values()) {
|
|
11987
|
-
const { key, Codec } = serialize.servicePreimages(serviceId, preimage.hash);
|
|
12015
|
+
const { key, Codec } = serialize.servicePreimages(blake2b, serviceId, preimage.hash);
|
|
11988
12016
|
serialized.set(key, Encoder.encodeObject(Codec, preimage.blob));
|
|
11989
12017
|
}
|
|
11990
12018
|
|
|
11991
12019
|
// storage
|
|
11992
12020
|
for (const storage of service.data.storage.values()) {
|
|
11993
|
-
const { key, Codec } = serialize.serviceStorage(serviceId, storage.key);
|
|
12021
|
+
const { key, Codec } = serialize.serviceStorage(blake2b, serviceId, storage.key);
|
|
11994
12022
|
serialized.set(key, Encoder.encodeObject(Codec, storage.value));
|
|
11995
12023
|
}
|
|
11996
12024
|
|
|
11997
12025
|
// lookup history
|
|
11998
12026
|
for (const lookupHistoryList of service.data.lookupHistory.values()) {
|
|
11999
12027
|
for (const lookupHistory of lookupHistoryList) {
|
|
12000
|
-
const { key, Codec } = serialize.serviceLookupHistory(
|
|
12028
|
+
const { key, Codec } = serialize.serviceLookupHistory(
|
|
12029
|
+
blake2b,
|
|
12030
|
+
serviceId,
|
|
12031
|
+
lookupHistory.hash,
|
|
12032
|
+
lookupHistory.length,
|
|
12033
|
+
);
|
|
12001
12034
|
serialized.set(key, Encoder.encodeObject(Codec, lookupHistory.slots.slice()));
|
|
12002
12035
|
}
|
|
12003
12036
|
}
|
|
@@ -12028,21 +12061,23 @@ declare class SerializedState<T extends SerializedStateBackend = SerializedState
|
|
|
12028
12061
|
implements State, EnumerableState
|
|
12029
12062
|
{
|
|
12030
12063
|
/** Create a state-like object from collection of serialized entries. */
|
|
12031
|
-
static fromStateEntries(spec: ChainSpec, state: StateEntries, recentServices: ServiceId[] = []) {
|
|
12032
|
-
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);
|
|
12033
12066
|
}
|
|
12034
12067
|
|
|
12035
12068
|
/** Create a state-like object backed by some DB. */
|
|
12036
12069
|
static new<T extends SerializedStateBackend>(
|
|
12037
12070
|
spec: ChainSpec,
|
|
12071
|
+
blake2b: Blake2b,
|
|
12038
12072
|
db: T,
|
|
12039
12073
|
recentServices: ServiceId[] = [],
|
|
12040
12074
|
): SerializedState<T> {
|
|
12041
|
-
return new SerializedState(spec, db, recentServices);
|
|
12075
|
+
return new SerializedState(spec, blake2b, db, recentServices);
|
|
12042
12076
|
}
|
|
12043
12077
|
|
|
12044
12078
|
private constructor(
|
|
12045
12079
|
private readonly spec: ChainSpec,
|
|
12080
|
+
private readonly blake2b: Blake2b,
|
|
12046
12081
|
public backend: T,
|
|
12047
12082
|
/** Best-effort list of recently active services. */
|
|
12048
12083
|
private readonly _recentServiceIds: ServiceId[],
|
|
@@ -12073,7 +12108,7 @@ declare class SerializedState<T extends SerializedStateBackend = SerializedState
|
|
|
12073
12108
|
this._recentServiceIds.push(id);
|
|
12074
12109
|
}
|
|
12075
12110
|
|
|
12076
|
-
return new SerializedService(id, serviceData, (key) => this.retrieveOptional(key));
|
|
12111
|
+
return new SerializedService(this.blake2b, id, serviceData, (key) => this.retrieveOptional(key));
|
|
12077
12112
|
}
|
|
12078
12113
|
|
|
12079
12114
|
private retrieve<T>({ key, Codec }: KeyAndCodec<T>, description: string): T {
|
|
@@ -12172,6 +12207,7 @@ declare class SerializedState<T extends SerializedStateBackend = SerializedState
|
|
|
12172
12207
|
/** Service data representation on a serialized state. */
|
|
12173
12208
|
declare class SerializedService implements Service {
|
|
12174
12209
|
constructor(
|
|
12210
|
+
public readonly blake2b: Blake2b,
|
|
12175
12211
|
/** Service id */
|
|
12176
12212
|
public readonly serviceId: ServiceId,
|
|
12177
12213
|
private readonly accountInfo: ServiceAccountInfo,
|
|
@@ -12190,11 +12226,11 @@ declare class SerializedService implements Service {
|
|
|
12190
12226
|
const serviceIdAndKey = safeAllocUint8Array(SERVICE_ID_BYTES + rawKey.length);
|
|
12191
12227
|
serviceIdAndKey.set(u32AsLeBytes(this.serviceId));
|
|
12192
12228
|
serviceIdAndKey.set(rawKey.raw, SERVICE_ID_BYTES);
|
|
12193
|
-
const key: StorageKey = asOpaqueType(BytesBlob.blobFrom(blake2b.hashBytes(serviceIdAndKey).raw));
|
|
12194
|
-
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;
|
|
12195
12231
|
}
|
|
12196
12232
|
|
|
12197
|
-
return this.retrieveOptional(serialize.serviceStorage(this.serviceId, rawKey)) ?? null;
|
|
12233
|
+
return this.retrieveOptional(serialize.serviceStorage(this.blake2b, this.serviceId, rawKey)) ?? null;
|
|
12198
12234
|
}
|
|
12199
12235
|
|
|
12200
12236
|
/**
|
|
@@ -12204,17 +12240,17 @@ declare class SerializedService implements Service {
|
|
|
12204
12240
|
*/
|
|
12205
12241
|
hasPreimage(hash: PreimageHash): boolean {
|
|
12206
12242
|
// TODO [ToDr] consider optimizing to avoid fetching the whole data.
|
|
12207
|
-
return this.retrieveOptional(serialize.servicePreimages(this.serviceId, hash)) !== undefined;
|
|
12243
|
+
return this.retrieveOptional(serialize.servicePreimages(this.blake2b, this.serviceId, hash)) !== undefined;
|
|
12208
12244
|
}
|
|
12209
12245
|
|
|
12210
12246
|
/** Retrieve preimage from the DB. */
|
|
12211
12247
|
getPreimage(hash: PreimageHash): BytesBlob | null {
|
|
12212
|
-
return this.retrieveOptional(serialize.servicePreimages(this.serviceId, hash)) ?? null;
|
|
12248
|
+
return this.retrieveOptional(serialize.servicePreimages(this.blake2b, this.serviceId, hash)) ?? null;
|
|
12213
12249
|
}
|
|
12214
12250
|
|
|
12215
12251
|
/** Retrieve preimage lookup history. */
|
|
12216
12252
|
getLookupHistory(hash: PreimageHash, len: U32): LookupHistorySlots | null {
|
|
12217
|
-
const rawSlots = this.retrieveOptional(serialize.serviceLookupHistory(this.serviceId, hash, len));
|
|
12253
|
+
const rawSlots = this.retrieveOptional(serialize.serviceLookupHistory(this.blake2b, this.serviceId, hash, len));
|
|
12218
12254
|
if (rawSlots === undefined) {
|
|
12219
12255
|
return null;
|
|
12220
12256
|
}
|
|
@@ -12227,9 +12263,9 @@ type KeyAndCodec<T> = {
|
|
|
12227
12263
|
Codec: Decode<T>;
|
|
12228
12264
|
};
|
|
12229
12265
|
|
|
12230
|
-
declare function loadState(spec: ChainSpec, entries: Iterable<[StateKey | TruncatedHash, BytesBlob]>) {
|
|
12266
|
+
declare function loadState(spec: ChainSpec, blake2b: Blake2b, entries: Iterable<[StateKey | TruncatedHash, BytesBlob]>) {
|
|
12231
12267
|
const stateEntries = StateEntries.fromEntriesUnsafe(entries);
|
|
12232
|
-
return SerializedState.fromStateEntries(spec, stateEntries);
|
|
12268
|
+
return SerializedState.fromStateEntries(spec, blake2b, stateEntries);
|
|
12233
12269
|
}
|
|
12234
12270
|
|
|
12235
12271
|
/**
|
|
@@ -12385,7 +12421,8 @@ declare class LeafDb implements SerializedStateBackend {
|
|
|
12385
12421
|
assertNever(val);
|
|
12386
12422
|
}
|
|
12387
12423
|
|
|
12388
|
-
getStateRoot(): StateRootHash {
|
|
12424
|
+
getStateRoot(blake2b: Blake2b): StateRootHash {
|
|
12425
|
+
const blake2bTrieHasher = getBlake2bTrieHasher(blake2b);
|
|
12389
12426
|
return InMemoryTrie.computeStateRoot(blake2bTrieHasher, this.leaves).asOpaque();
|
|
12390
12427
|
}
|
|
12391
12428
|
|
|
@@ -12483,7 +12520,8 @@ declare class InMemoryStates implements StatesDb<InMemoryState> {
|
|
|
12483
12520
|
}
|
|
12484
12521
|
|
|
12485
12522
|
async getStateRoot(state: InMemoryState): Promise<StateRootHash> {
|
|
12486
|
-
|
|
12523
|
+
const blake2b = await Blake2b.createHasher();
|
|
12524
|
+
return StateEntries.serializeInMemory(this.spec, blake2b, state).getRootHash(blake2b);
|
|
12487
12525
|
}
|
|
12488
12526
|
|
|
12489
12527
|
/** Insert a full state into the database. */
|
|
@@ -13654,6 +13692,8 @@ declare enum NewServiceError {
|
|
|
13654
13692
|
InsufficientFunds = 0,
|
|
13655
13693
|
/** Service is not privileged to set gratis storage. */
|
|
13656
13694
|
UnprivilegedService = 1,
|
|
13695
|
+
/** Registrar attempting to create a service with already existing id. */
|
|
13696
|
+
RegistrarServiceIdAlreadyTaken = 2,
|
|
13657
13697
|
}
|
|
13658
13698
|
|
|
13659
13699
|
declare enum UpdatePrivilegesError {
|
|
@@ -13719,14 +13759,18 @@ interface PartialState {
|
|
|
13719
13759
|
): Result$2<OK, TransferError>;
|
|
13720
13760
|
|
|
13721
13761
|
/**
|
|
13722
|
-
* 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.
|
|
13723
13763
|
*
|
|
13724
|
-
* Returns a newly assigned id
|
|
13725
|
-
*
|
|
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
|
|
13726
13769
|
*
|
|
13727
13770
|
* An error can be returned in case the account does not
|
|
13728
13771
|
* have the required balance
|
|
13729
|
-
* 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.
|
|
13730
13774
|
*/
|
|
13731
13775
|
newService(
|
|
13732
13776
|
codeHash: CodeHash,
|
|
@@ -13734,6 +13778,7 @@ interface PartialState {
|
|
|
13734
13778
|
gas: ServiceGas,
|
|
13735
13779
|
allowance: ServiceGas,
|
|
13736
13780
|
gratisStorage: U64,
|
|
13781
|
+
wantedServiceId: U64,
|
|
13737
13782
|
): Result$2<ServiceId, NewServiceError>;
|
|
13738
13783
|
|
|
13739
13784
|
/** Upgrade code of currently running service. */
|
|
@@ -13755,7 +13800,7 @@ interface PartialState {
|
|
|
13755
13800
|
updateAuthorizationQueue(
|
|
13756
13801
|
coreIndex: CoreIndex,
|
|
13757
13802
|
authQueue: FixedSizeArray<Blake2bHash, AUTHORIZATION_QUEUE_SIZE>,
|
|
13758
|
-
|
|
13803
|
+
assigners: ServiceId | null,
|
|
13759
13804
|
): Result$2<OK, UpdatePrivilegesError>;
|
|
13760
13805
|
|
|
13761
13806
|
/**
|
|
@@ -13764,14 +13809,16 @@ interface PartialState {
|
|
|
13764
13809
|
* `m`: manager service (can change privileged services)
|
|
13765
13810
|
* `a`: manages authorization queue
|
|
13766
13811
|
* `v`: manages validator keys
|
|
13767
|
-
* `
|
|
13812
|
+
* `r`: manages create new services in protected id range.
|
|
13813
|
+
* `z`: collection of serviceId -> gas that auto-accumulate every block
|
|
13768
13814
|
*
|
|
13769
13815
|
*/
|
|
13770
13816
|
updatePrivilegedServices(
|
|
13771
13817
|
m: ServiceId | null,
|
|
13772
13818
|
a: PerCore<ServiceId>,
|
|
13773
13819
|
v: ServiceId | null,
|
|
13774
|
-
|
|
13820
|
+
r: ServiceId | null,
|
|
13821
|
+
z: [ServiceId, ServiceGas][],
|
|
13775
13822
|
): Result$2<OK, UpdatePrivilegesError>;
|
|
13776
13823
|
|
|
13777
13824
|
/** Yield accumulation trie result hash. */
|
|
@@ -17740,7 +17787,7 @@ declare class AccumulationStateUpdate {
|
|
|
17740
17787
|
if (from.privilegedServices !== null) {
|
|
17741
17788
|
update.privilegedServices = PrivilegedServices.create({
|
|
17742
17789
|
...from.privilegedServices,
|
|
17743
|
-
|
|
17790
|
+
assigners: asKnownSize([...from.privilegedServices.assigners]),
|
|
17744
17791
|
});
|
|
17745
17792
|
}
|
|
17746
17793
|
return update;
|
|
@@ -18011,7 +18058,7 @@ declare const HostCallResult = {
|
|
|
18011
18058
|
OOB: tryAsU64(0xffff_ffff_ffff_fffdn), // 2**64 - 3
|
|
18012
18059
|
/** Index unknown. */
|
|
18013
18060
|
WHO: tryAsU64(0xffff_ffff_ffff_fffcn), // 2**64 - 4
|
|
18014
|
-
/** Storage full. */
|
|
18061
|
+
/** Storage full or resource already allocated. */
|
|
18015
18062
|
FULL: tryAsU64(0xffff_ffff_ffff_fffbn), // 2**64 - 5
|
|
18016
18063
|
/** Core index unknown. */
|
|
18017
18064
|
CORE: tryAsU64(0xffff_ffff_ffff_fffan), // 2**64 - 6
|
|
@@ -18019,7 +18066,7 @@ declare const HostCallResult = {
|
|
|
18019
18066
|
CASH: tryAsU64(0xffff_ffff_ffff_fff9n), // 2**64 - 7
|
|
18020
18067
|
/** Gas limit too low. */
|
|
18021
18068
|
LOW: tryAsU64(0xffff_ffff_ffff_fff8n), // 2**64 - 8
|
|
18022
|
-
/** The item is already solicited
|
|
18069
|
+
/** The item is already solicited, cannot be forgotten or the operation is invalid due to privilege level. */
|
|
18023
18070
|
HUH: tryAsU64(0xffff_ffff_ffff_fff7n), // 2**64 - 9
|
|
18024
18071
|
/** The return value indicating general success. */
|
|
18025
18072
|
OK: tryAsU64(0n),
|
|
@@ -18895,10 +18942,10 @@ type ENTROPY_BYTES = typeof ENTROPY_BYTES;
|
|
|
18895
18942
|
*
|
|
18896
18943
|
* https://graypaper.fluffylabs.dev/#/579bd12/3b9a013b9a01
|
|
18897
18944
|
*/
|
|
18898
|
-
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[] {
|
|
18899
18946
|
check`${entropy.length === ENTROPY_BYTES} Expected entropy of length ${ENTROPY_BYTES}, got ${entropy.length}`;
|
|
18900
18947
|
const n = arr.length;
|
|
18901
|
-
const randomNumbers = hashToNumberSequence(entropy, arr.length);
|
|
18948
|
+
const randomNumbers = hashToNumberSequence(blake2b, entropy, arr.length);
|
|
18902
18949
|
const result: T[] = new Array<T>(n);
|
|
18903
18950
|
|
|
18904
18951
|
let itemsLeft = n;
|
|
@@ -19070,8 +19117,7 @@ declare const availabilityAssignmentFromJson = json.object<JsonAvailabilityAssig
|
|
|
19070
19117
|
timeout: "number",
|
|
19071
19118
|
},
|
|
19072
19119
|
({ report, timeout }) => {
|
|
19073
|
-
|
|
19074
|
-
return AvailabilityAssignment.create({ workReport: new WithHash(workReportHash, report), timeout });
|
|
19120
|
+
return AvailabilityAssignment.create({ workReport: report, timeout });
|
|
19075
19121
|
},
|
|
19076
19122
|
);
|
|
19077
19123
|
|
|
@@ -19409,8 +19455,9 @@ type JsonStateDump = {
|
|
|
19409
19455
|
tau: State["timeslot"];
|
|
19410
19456
|
chi: {
|
|
19411
19457
|
chi_m: PrivilegedServices["manager"];
|
|
19412
|
-
chi_a: PrivilegedServices["
|
|
19413
|
-
chi_v: PrivilegedServices["
|
|
19458
|
+
chi_a: PrivilegedServices["assigners"];
|
|
19459
|
+
chi_v: PrivilegedServices["delegator"];
|
|
19460
|
+
chi_r?: PrivilegedServices["registrar"];
|
|
19414
19461
|
chi_g: PrivilegedServices["autoAccumulateServices"] | null;
|
|
19415
19462
|
};
|
|
19416
19463
|
pi: JsonStatisticsData;
|
|
@@ -19443,6 +19490,7 @@ declare const fullStateDumpFromJson = (spec: ChainSpec) =>
|
|
|
19443
19490
|
chi_m: "number",
|
|
19444
19491
|
chi_a: json.array("number"),
|
|
19445
19492
|
chi_v: "number",
|
|
19493
|
+
chi_r: json.optional("number"),
|
|
19446
19494
|
chi_g: json.nullable(
|
|
19447
19495
|
json.array({
|
|
19448
19496
|
service: "number",
|
|
@@ -19475,6 +19523,9 @@ declare const fullStateDumpFromJson = (spec: ChainSpec) =>
|
|
|
19475
19523
|
theta,
|
|
19476
19524
|
accounts,
|
|
19477
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
|
+
}
|
|
19478
19529
|
return InMemoryState.create({
|
|
19479
19530
|
authPools: tryAsPerCore(
|
|
19480
19531
|
alpha.map((perCore) => {
|
|
@@ -19508,8 +19559,9 @@ declare const fullStateDumpFromJson = (spec: ChainSpec) =>
|
|
|
19508
19559
|
timeslot: tau,
|
|
19509
19560
|
privilegedServices: PrivilegedServices.create({
|
|
19510
19561
|
manager: chi.chi_m,
|
|
19511
|
-
|
|
19512
|
-
|
|
19562
|
+
assigners: chi.chi_a,
|
|
19563
|
+
delegator: chi.chi_v,
|
|
19564
|
+
registrar: chi.chi_r ?? tryAsServiceId(2 ** 32 - 1),
|
|
19513
19565
|
autoAccumulateServices: chi.chi_g ?? [],
|
|
19514
19566
|
}),
|
|
19515
19567
|
statistics: JsonStatisticsData.toStatisticsData(spec, pi),
|
|
@@ -19572,7 +19624,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19572
19624
|
constructor(
|
|
19573
19625
|
private readonly context: ChainSpec,
|
|
19574
19626
|
private readonly keccakHasher: KeccakHasher,
|
|
19575
|
-
|
|
19627
|
+
public readonly blake2b: Blake2b,
|
|
19576
19628
|
) {}
|
|
19577
19629
|
|
|
19578
19630
|
/** Concatenates two hashes and hash this concatenation */
|
|
@@ -19586,7 +19638,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19586
19638
|
|
|
19587
19639
|
/** Creates hash from the block header view */
|
|
19588
19640
|
header(header: HeaderView): WithHash<HeaderHash, HeaderView> {
|
|
19589
|
-
return new WithHash(blake2b.hashBytes(header.encoded()
|
|
19641
|
+
return new WithHash(this.blake2b.hashBytes(header.encoded()).asOpaque(), header);
|
|
19590
19642
|
}
|
|
19591
19643
|
|
|
19592
19644
|
/**
|
|
@@ -19600,7 +19652,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19600
19652
|
.view()
|
|
19601
19653
|
.map((g) => g.view())
|
|
19602
19654
|
.map((guarantee) => {
|
|
19603
|
-
const reportHash = blake2b.hashBytes(guarantee.report.encoded()
|
|
19655
|
+
const reportHash = this.blake2b.hashBytes(guarantee.report.encoded()).asOpaque<WorkReportHash>();
|
|
19604
19656
|
return BytesBlob.blobFromParts([
|
|
19605
19657
|
reportHash.raw,
|
|
19606
19658
|
guarantee.slot.encoded().raw,
|
|
@@ -19610,15 +19662,15 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19610
19662
|
|
|
19611
19663
|
const guaranteeBlob = Encoder.encodeObject(codec.sequenceVarLen(dumpCodec), guarantees, this.context);
|
|
19612
19664
|
|
|
19613
|
-
const et = blake2b.hashBytes(extrinsicView.tickets.encoded()
|
|
19614
|
-
const ep = blake2b.hashBytes(extrinsicView.preimages.encoded()
|
|
19615
|
-
const eg = blake2b.hashBytes(guaranteeBlob
|
|
19616
|
-
const ea = blake2b.hashBytes(extrinsicView.assurances.encoded()
|
|
19617
|
-
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>();
|
|
19618
19670
|
|
|
19619
19671
|
const encoded = BytesBlob.blobFromParts([et.raw, ep.raw, eg.raw, ea.raw, ed.raw]);
|
|
19620
19672
|
|
|
19621
|
-
return new WithHashAndBytes(blake2b.hashBytes(encoded
|
|
19673
|
+
return new WithHashAndBytes(this.blake2b.hashBytes(encoded).asOpaque(), extrinsicView, encoded);
|
|
19622
19674
|
}
|
|
19623
19675
|
|
|
19624
19676
|
/** Creates hash for given WorkPackage */
|
|
@@ -19629,7 +19681,7 @@ declare class TransitionHasher implements MmrHasher<KeccakHash> {
|
|
|
19629
19681
|
private encode<T, THash extends OpaqueHash>(codec: Codec<T>, data: T): WithHashAndBytes<THash, T> {
|
|
19630
19682
|
// TODO [ToDr] Use already allocated encoding destination and hash bytes from some arena.
|
|
19631
19683
|
const encoded = Encoder.encodeObject(codec, data, this.context);
|
|
19632
|
-
return new WithHashAndBytes(blake2b.hashBytes(encoded
|
|
19684
|
+
return new WithHashAndBytes(this.blake2b.hashBytes(encoded).asOpaque(), data, encoded);
|
|
19633
19685
|
}
|
|
19634
19686
|
}
|
|
19635
19687
|
|
|
@@ -19650,7 +19702,10 @@ declare enum PreimagesErrorCode {
|
|
|
19650
19702
|
|
|
19651
19703
|
// TODO [SeKo] consider whether this module is the right place to remove expired preimages
|
|
19652
19704
|
declare class Preimages {
|
|
19653
|
-
constructor(
|
|
19705
|
+
constructor(
|
|
19706
|
+
public readonly state: PreimagesState,
|
|
19707
|
+
public readonly blake2b: Blake2b,
|
|
19708
|
+
) {}
|
|
19654
19709
|
|
|
19655
19710
|
integrate(input: PreimagesInput): Result$2<PreimagesStateUpdate, PreimagesErrorCode> {
|
|
19656
19711
|
// make sure lookup extrinsics are sorted and unique
|
|
@@ -19679,7 +19734,7 @@ declare class Preimages {
|
|
|
19679
19734
|
// select preimages for integration
|
|
19680
19735
|
for (const preimage of preimages) {
|
|
19681
19736
|
const { requester, blob } = preimage;
|
|
19682
|
-
const hash: PreimageHash = blake2b.hashBytes(blob).asOpaque();
|
|
19737
|
+
const hash: PreimageHash = this.blake2b.hashBytes(blob).asOpaque();
|
|
19683
19738
|
|
|
19684
19739
|
const service = this.state.getService(requester);
|
|
19685
19740
|
if (service === null) {
|
|
@@ -19710,156 +19765,6 @@ declare class Preimages {
|
|
|
19710
19765
|
}
|
|
19711
19766
|
}
|
|
19712
19767
|
|
|
19713
|
-
declare enum ServiceExecutorError {
|
|
19714
|
-
NoLookup = 0,
|
|
19715
|
-
NoState = 1,
|
|
19716
|
-
NoServiceCode = 2,
|
|
19717
|
-
ServiceCodeMismatch = 3,
|
|
19718
|
-
}
|
|
19719
|
-
|
|
19720
|
-
declare class WorkPackageExecutor {
|
|
19721
|
-
constructor(
|
|
19722
|
-
private readonly blocks: BlocksDb,
|
|
19723
|
-
private readonly state: StatesDb,
|
|
19724
|
-
private readonly hasher: TransitionHasher,
|
|
19725
|
-
) {}
|
|
19726
|
-
|
|
19727
|
-
// TODO [ToDr] this while thing should be triple-checked with the GP.
|
|
19728
|
-
// I'm currently implementing some dirty version for the demo.
|
|
19729
|
-
async executeWorkPackage(pack: WorkPackage): Promise<WorkReport> {
|
|
19730
|
-
const headerHash = pack.context.lookupAnchor;
|
|
19731
|
-
// execute authorisation first or is it already executed and we just need to check it?
|
|
19732
|
-
const authExec = this.getServiceExecutor(
|
|
19733
|
-
// TODO [ToDr] should this be anchor or lookupAnchor?
|
|
19734
|
-
headerHash,
|
|
19735
|
-
pack.authCodeHost,
|
|
19736
|
-
pack.authCodeHash,
|
|
19737
|
-
);
|
|
19738
|
-
|
|
19739
|
-
if (authExec.isError) {
|
|
19740
|
-
// TODO [ToDr] most likely shouldn't be throw.
|
|
19741
|
-
throw new Error(`Could not get authorization executor: ${authExec.error}`);
|
|
19742
|
-
}
|
|
19743
|
-
|
|
19744
|
-
const pvm = authExec.ok;
|
|
19745
|
-
const authGas = tryAsGas(15_000n);
|
|
19746
|
-
const result = await pvm.run(pack.parametrization, authGas);
|
|
19747
|
-
|
|
19748
|
-
if (!result.isEqualTo(pack.authorization)) {
|
|
19749
|
-
throw new Error("Authorization is invalid.");
|
|
19750
|
-
}
|
|
19751
|
-
|
|
19752
|
-
const results: WorkResult[] = [];
|
|
19753
|
-
for (const item of pack.items) {
|
|
19754
|
-
const exec = this.getServiceExecutor(headerHash, item.service, item.codeHash);
|
|
19755
|
-
if (exec.isError) {
|
|
19756
|
-
throw new Error(`Could not get item executor: ${exec.error}`);
|
|
19757
|
-
}
|
|
19758
|
-
const pvm = exec.ok;
|
|
19759
|
-
|
|
19760
|
-
const gasRatio = tryAsServiceGas(3_000n);
|
|
19761
|
-
const ret = await pvm.run(item.payload, tryAsGas(item.refineGasLimit)); // or accumulateGasLimit?
|
|
19762
|
-
results.push(
|
|
19763
|
-
WorkResult.create({
|
|
19764
|
-
serviceId: item.service,
|
|
19765
|
-
codeHash: item.codeHash,
|
|
19766
|
-
payloadHash: blake2b.hashBytes(item.payload),
|
|
19767
|
-
gas: gasRatio,
|
|
19768
|
-
result: new WorkExecResult(WorkExecResultKind.ok, ret),
|
|
19769
|
-
load: WorkRefineLoad.create({
|
|
19770
|
-
gasUsed: tryAsServiceGas(5),
|
|
19771
|
-
importedSegments: tryAsU32(0),
|
|
19772
|
-
exportedSegments: tryAsU32(0),
|
|
19773
|
-
extrinsicSize: tryAsU32(0),
|
|
19774
|
-
extrinsicCount: tryAsU32(0),
|
|
19775
|
-
}),
|
|
19776
|
-
}),
|
|
19777
|
-
);
|
|
19778
|
-
}
|
|
19779
|
-
|
|
19780
|
-
const workPackage = this.hasher.workPackage(pack);
|
|
19781
|
-
const workPackageSpec = WorkPackageSpec.create({
|
|
19782
|
-
hash: workPackage.hash,
|
|
19783
|
-
length: tryAsU32(workPackage.encoded.length),
|
|
19784
|
-
erasureRoot: Bytes.zero(HASH_SIZE),
|
|
19785
|
-
exportsRoot: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
19786
|
-
exportsCount: tryAsU16(0),
|
|
19787
|
-
});
|
|
19788
|
-
const coreIndex = tryAsCoreIndex(0);
|
|
19789
|
-
const authorizerHash = Bytes.fill(HASH_SIZE, 5).asOpaque();
|
|
19790
|
-
|
|
19791
|
-
const workResults = FixedSizeArray.new(results, tryAsWorkItemsCount(results.length));
|
|
19792
|
-
|
|
19793
|
-
return Promise.resolve(
|
|
19794
|
-
WorkReport.create({
|
|
19795
|
-
workPackageSpec,
|
|
19796
|
-
context: pack.context,
|
|
19797
|
-
coreIndex,
|
|
19798
|
-
authorizerHash,
|
|
19799
|
-
authorizationOutput: pack.authorization,
|
|
19800
|
-
segmentRootLookup: [],
|
|
19801
|
-
results: workResults,
|
|
19802
|
-
authorizationGasUsed: tryAsServiceGas(0),
|
|
19803
|
-
}),
|
|
19804
|
-
);
|
|
19805
|
-
}
|
|
19806
|
-
|
|
19807
|
-
getServiceExecutor(
|
|
19808
|
-
lookupAnchor: HeaderHash,
|
|
19809
|
-
serviceId: ServiceId,
|
|
19810
|
-
expectedCodeHash: CodeHash,
|
|
19811
|
-
): Result$2<PvmExecutor, ServiceExecutorError> {
|
|
19812
|
-
const header = this.blocks.getHeader(lookupAnchor);
|
|
19813
|
-
if (header === null) {
|
|
19814
|
-
return Result.error(ServiceExecutorError.NoLookup);
|
|
19815
|
-
}
|
|
19816
|
-
|
|
19817
|
-
const state = this.state.getState(lookupAnchor);
|
|
19818
|
-
if (state === null) {
|
|
19819
|
-
return Result.error(ServiceExecutorError.NoState);
|
|
19820
|
-
}
|
|
19821
|
-
|
|
19822
|
-
const service = state.getService(serviceId);
|
|
19823
|
-
const serviceCodeHash = service?.getInfo().codeHash ?? null;
|
|
19824
|
-
if (serviceCodeHash === null) {
|
|
19825
|
-
return Result.error(ServiceExecutorError.NoServiceCode);
|
|
19826
|
-
}
|
|
19827
|
-
|
|
19828
|
-
if (!serviceCodeHash.isEqualTo(expectedCodeHash)) {
|
|
19829
|
-
return Result.error(ServiceExecutorError.ServiceCodeMismatch);
|
|
19830
|
-
}
|
|
19831
|
-
|
|
19832
|
-
const serviceCode = service?.getPreimage(serviceCodeHash.asOpaque()) ?? null;
|
|
19833
|
-
if (serviceCode === null) {
|
|
19834
|
-
return Result.error(ServiceExecutorError.NoServiceCode);
|
|
19835
|
-
}
|
|
19836
|
-
|
|
19837
|
-
return Result.ok(new PvmExecutor(serviceCode));
|
|
19838
|
-
}
|
|
19839
|
-
}
|
|
19840
|
-
|
|
19841
|
-
declare class PvmExecutor {
|
|
19842
|
-
private readonly pvm: HostCalls;
|
|
19843
|
-
private hostCalls = new HostCallsManager({ missing: new Missing() });
|
|
19844
|
-
private pvmInstanceManager = new PvmInstanceManager(4);
|
|
19845
|
-
|
|
19846
|
-
constructor(private serviceCode: BytesBlob) {
|
|
19847
|
-
this.pvm = new PvmHostCallExtension(this.pvmInstanceManager, this.hostCalls);
|
|
19848
|
-
}
|
|
19849
|
-
|
|
19850
|
-
async run(args: BytesBlob, gas: Gas): Promise<BytesBlob> {
|
|
19851
|
-
const program = Program.fromSpi(this.serviceCode.raw, args.raw, true);
|
|
19852
|
-
|
|
19853
|
-
const result = await this.pvm.runProgram(program.code, 5, gas, program.registers, program.memory);
|
|
19854
|
-
|
|
19855
|
-
if (result.hasMemorySlice()) {
|
|
19856
|
-
return BytesBlob.blobFrom(result.memorySlice);
|
|
19857
|
-
}
|
|
19858
|
-
|
|
19859
|
-
return BytesBlob.empty();
|
|
19860
|
-
}
|
|
19861
|
-
}
|
|
19862
|
-
|
|
19863
19768
|
type index_Preimages = Preimages;
|
|
19864
19769
|
declare const index_Preimages: typeof Preimages;
|
|
19865
19770
|
type index_PreimagesErrorCode = PreimagesErrorCode;
|
|
@@ -19869,10 +19774,8 @@ type index_PreimagesState = PreimagesState;
|
|
|
19869
19774
|
type index_PreimagesStateUpdate = PreimagesStateUpdate;
|
|
19870
19775
|
type index_TransitionHasher = TransitionHasher;
|
|
19871
19776
|
declare const index_TransitionHasher: typeof TransitionHasher;
|
|
19872
|
-
type index_WorkPackageExecutor = WorkPackageExecutor;
|
|
19873
|
-
declare const index_WorkPackageExecutor: typeof WorkPackageExecutor;
|
|
19874
19777
|
declare namespace index {
|
|
19875
|
-
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 };
|
|
19876
19779
|
export type { index_PreimagesInput as PreimagesInput, index_PreimagesState as PreimagesState, index_PreimagesStateUpdate as PreimagesStateUpdate };
|
|
19877
19780
|
}
|
|
19878
19781
|
|