@typeberry/lib 0.5.10-6cb1bd5 → 0.5.10-7338c21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/core/codec/encoder.d.ts +1 -1
- package/packages/core/codec/encoder.d.ts.map +1 -1
- package/packages/core/codec/encoder.js +3 -2
- package/packages/core/pvm-interface/pvm.d.ts +2 -0
- package/packages/core/pvm-interface/pvm.d.ts.map +1 -1
- package/packages/jam/block/work-package.d.ts +7 -7
- package/packages/jam/block/work-package.d.ts.map +1 -1
- package/packages/jam/block/work-package.js +12 -12
- package/packages/jam/executor/pvm-executor.d.ts +9 -2
- package/packages/jam/executor/pvm-executor.d.ts.map +1 -1
- package/packages/jam/executor/pvm-executor.js +15 -0
- package/packages/jam/in-core/externalities/refine.d.ts +18 -8
- package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
- package/packages/jam/in-core/externalities/refine.js +86 -7
- package/packages/jam/in-core/externalities/refine.test.js +167 -2
- package/packages/jam/in-core/in-core.d.ts +7 -22
- package/packages/jam/in-core/in-core.d.ts.map +1 -1
- package/packages/jam/in-core/in-core.js +16 -186
- package/packages/jam/in-core/in-core.test.js +47 -15
- package/packages/jam/in-core/is-authorized.d.ts +33 -0
- package/packages/jam/in-core/is-authorized.d.ts.map +1 -0
- package/packages/jam/in-core/is-authorized.js +72 -0
- package/packages/jam/in-core/is-authorized.test.d.ts +2 -0
- package/packages/jam/in-core/is-authorized.test.d.ts.map +1 -0
- package/packages/jam/in-core/is-authorized.test.js +125 -0
- package/packages/jam/in-core/refine.d.ts +34 -0
- package/packages/jam/in-core/refine.d.ts.map +1 -0
- package/packages/jam/in-core/refine.js +176 -0
- package/packages/jam/in-core/refine.test.d.ts +2 -0
- package/packages/jam/in-core/refine.test.d.ts.map +1 -0
- package/packages/jam/in-core/refine.test.js +6 -0
- package/packages/jam/jam-host-calls/accumulate/bless.js +9 -9
- package/packages/jam/jam-host-calls/externalities/partial-state.d.ts +1 -1
- package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts +1 -1
- package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/general/fetch.d.ts +164 -103
- package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/general/fetch.js +117 -23
- package/packages/jam/jam-host-calls/general/fetch.test.js +100 -66
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +2 -2
- package/packages/jam/transition/accumulate/accumulate.js +2 -2
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +48 -39
- package/packages/jam/transition/externalities/accumulate-externalities.d.ts +2 -2
- package/packages/jam/transition/externalities/accumulate-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/accumulate-externalities.js +20 -7
- package/packages/jam/transition/externalities/accumulate-externalities.test.js +74 -4
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts +19 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts.map +1 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.js +45 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts +2 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts.map +1 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.js +192 -0
- package/packages/jam/transition/externalities/fetch-externalities.d.ts +3 -39
- package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/fetch-externalities.js +2 -88
- package/packages/jam/transition/externalities/index.d.ts +3 -0
- package/packages/jam/transition/externalities/index.d.ts.map +1 -1
- package/packages/jam/transition/externalities/index.js +3 -0
- package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts +22 -0
- package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts.map +1 -0
- package/packages/jam/transition/externalities/is-authorized-fetch-externalities.js +41 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts +23 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts.map +1 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.js +56 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts +2 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts.map +1 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.test.js +32 -0
- package/packages/jam/transition/externalities/fetch-externalities.test.d.ts +0 -2
- package/packages/jam/transition/externalities/fetch-externalities.test.d.ts.map +0 -1
- package/packages/jam/transition/externalities/fetch-externalities.test.js +0 -254
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type CodeHash, type CoreIndex, type ServiceGas, type ServiceId } from "#@typeberry/block";
|
|
2
|
+
import type { AuthorizerHash } from "#@typeberry/block/refine-context.js";
|
|
3
|
+
import { BytesBlob } from "#@typeberry/bytes";
|
|
4
|
+
import type { ChainSpec, PvmBackend } from "#@typeberry/config";
|
|
5
|
+
import type { Blake2b } from "#@typeberry/hash";
|
|
6
|
+
import type { State } from "#@typeberry/state";
|
|
7
|
+
import { Result } from "#@typeberry/utils";
|
|
8
|
+
export declare enum AuthorizationError {
|
|
9
|
+
/** BAD: authorizer code not found (service or preimage missing). */
|
|
10
|
+
CodeNotFound = 0,
|
|
11
|
+
/** BIG: authorizer code exceeds W_A limit. */
|
|
12
|
+
CodeTooBig = 1,
|
|
13
|
+
/** PANIC/OOG: PVM execution failed. */
|
|
14
|
+
PvmFailed = 2
|
|
15
|
+
}
|
|
16
|
+
export type AuthorizationOk = {
|
|
17
|
+
authorizerHash: AuthorizerHash;
|
|
18
|
+
authorizationGasUsed: ServiceGas;
|
|
19
|
+
authorizationOutput: BytesBlob;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* IsAuthorized PVM invocation (Psi_I).
|
|
23
|
+
*
|
|
24
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/2e64002e6400?v=0.7.2
|
|
25
|
+
*/
|
|
26
|
+
export declare class IsAuthorized {
|
|
27
|
+
private readonly chainSpec;
|
|
28
|
+
private readonly pvmBackend;
|
|
29
|
+
private readonly blake2b;
|
|
30
|
+
constructor(chainSpec: ChainSpec, pvmBackend: PvmBackend, blake2b: Blake2b);
|
|
31
|
+
invoke(state: State, coreIndex: CoreIndex, authToken: BytesBlob, authCodeHost: ServiceId, authCodeHash: CodeHash, authConfiguration: BytesBlob): Promise<Result<AuthorizationOk, AuthorizationError>>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=is-authorized.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-authorized.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/is-authorized.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAmB,MAAM,kBAAkB,CAAC;AAEnH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,oBAAY,kBAAkB;IAC5B,oEAAoE;IACpE,YAAY,IAAI;IAChB,8CAA8C;IAC9C,UAAU,IAAI;IACd,uCAAuC;IACvC,SAAS,IAAI;CACd;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,oBAAoB,EAAE,UAAU,CAAC;IACjC,mBAAmB,EAAE,SAAS,CAAC;CAChC,CAAC;AAMF;;;;GAIG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAG7B,MAAM,CACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,SAAS,EACvB,YAAY,EAAE,QAAQ,EACtB,iBAAiB,EAAE,SAAS,GAC3B,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;CA+DxD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { tryAsServiceGas } from "#@typeberry/block";
|
|
2
|
+
import { G_I, W_A } from "#@typeberry/block/gp-constants.js";
|
|
3
|
+
import { BytesBlob } from "#@typeberry/bytes";
|
|
4
|
+
import { codec, Encoder } from "#@typeberry/codec";
|
|
5
|
+
import { PvmExecutor, ReturnStatus } from "#@typeberry/executor";
|
|
6
|
+
import { IsAuthorizedFetchExternalities } from "#@typeberry/transition/externalities/is-authorized-fetch-externalities.js";
|
|
7
|
+
import { Result } from "#@typeberry/utils";
|
|
8
|
+
export var AuthorizationError;
|
|
9
|
+
(function (AuthorizationError) {
|
|
10
|
+
/** BAD: authorizer code not found (service or preimage missing). */
|
|
11
|
+
AuthorizationError[AuthorizationError["CodeNotFound"] = 0] = "CodeNotFound";
|
|
12
|
+
/** BIG: authorizer code exceeds W_A limit. */
|
|
13
|
+
AuthorizationError[AuthorizationError["CodeTooBig"] = 1] = "CodeTooBig";
|
|
14
|
+
/** PANIC/OOG: PVM execution failed. */
|
|
15
|
+
AuthorizationError[AuthorizationError["PvmFailed"] = 2] = "PvmFailed";
|
|
16
|
+
})(AuthorizationError || (AuthorizationError = {}));
|
|
17
|
+
const AUTH_ARGS_CODEC = codec.object({
|
|
18
|
+
coreIndex: codec.u16,
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* IsAuthorized PVM invocation (Psi_I).
|
|
22
|
+
*
|
|
23
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/2e64002e6400?v=0.7.2
|
|
24
|
+
*/
|
|
25
|
+
export class IsAuthorized {
|
|
26
|
+
chainSpec;
|
|
27
|
+
pvmBackend;
|
|
28
|
+
blake2b;
|
|
29
|
+
constructor(chainSpec, pvmBackend, blake2b) {
|
|
30
|
+
this.chainSpec = chainSpec;
|
|
31
|
+
this.pvmBackend = pvmBackend;
|
|
32
|
+
this.blake2b = blake2b;
|
|
33
|
+
}
|
|
34
|
+
async invoke(state, coreIndex, authToken, authCodeHost, authCodeHash, authConfiguration) {
|
|
35
|
+
// Look up the authorizer code from the auth code host service
|
|
36
|
+
const service = state.getService(authCodeHost);
|
|
37
|
+
// https://graypaper.fluffylabs.dev/#/ab2cdbd/2eca002eca00?v=0.7.2
|
|
38
|
+
if (service === null) {
|
|
39
|
+
return Result.error(AuthorizationError.CodeNotFound, () => `Auth code host service ${authCodeHost} not found in state.`);
|
|
40
|
+
}
|
|
41
|
+
const code = service.getPreimage(authCodeHash.asOpaque());
|
|
42
|
+
if (code === null) {
|
|
43
|
+
return Result.error(AuthorizationError.CodeNotFound, () => `Auth code preimage ${authCodeHash} not found in service ${authCodeHost}.`);
|
|
44
|
+
}
|
|
45
|
+
// BIG: code exceeds W_A
|
|
46
|
+
// https://graypaper.fluffylabs.dev/#/ab2cdbd/2ed6002ed600?v=0.7.2
|
|
47
|
+
if (code.length > W_A) {
|
|
48
|
+
return Result.error(AuthorizationError.CodeTooBig, () => `Auth code is too big: ${code.length} bytes vs ${W_A} max.`);
|
|
49
|
+
}
|
|
50
|
+
// Prepare fetch externalities and executor
|
|
51
|
+
const fetchExternalities = new IsAuthorizedFetchExternalities(this.chainSpec, {
|
|
52
|
+
authToken,
|
|
53
|
+
authConfiguration,
|
|
54
|
+
});
|
|
55
|
+
const executor = await PvmExecutor.createIsAuthorizedExecutor(authCodeHost, code, { fetchExternalities }, this.pvmBackend);
|
|
56
|
+
const args = Encoder.encodeObject(AUTH_ARGS_CODEC, {
|
|
57
|
+
coreIndex,
|
|
58
|
+
});
|
|
59
|
+
// Run PVM with gas budget G_I
|
|
60
|
+
const gasLimit = tryAsServiceGas(G_I);
|
|
61
|
+
const execResult = await executor.run(args, gasLimit);
|
|
62
|
+
if (execResult.status !== ReturnStatus.OK) {
|
|
63
|
+
return Result.error(AuthorizationError.PvmFailed, () => `IsAuthorized PVM ${ReturnStatus[execResult.status]} (gas used: ${execResult.consumedGas}).`);
|
|
64
|
+
}
|
|
65
|
+
// Compute authorizer hash: H(code_hash ++ configuration)
|
|
66
|
+
// https://graypaper.fluffylabs.dev/#/ab2cdbd/1b81011b8401?v=0.7.2
|
|
67
|
+
const authorizerHash = this.blake2b.hashBlobs([authCodeHash, authConfiguration]);
|
|
68
|
+
const authorizationOutput = BytesBlob.blobFrom(execResult.memorySlice);
|
|
69
|
+
const authorizationGasUsed = tryAsServiceGas(execResult.consumedGas);
|
|
70
|
+
return Result.ok({ authorizerHash, authorizationGasUsed, authorizationOutput });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-authorized.test.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/is-authorized.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { before, describe, it } from "node:test";
|
|
5
|
+
import { tryAsCoreIndex, tryAsServiceGas, tryAsServiceId, tryAsTimeSlot } from "#@typeberry/block";
|
|
6
|
+
import { Bytes, BytesBlob } from "#@typeberry/bytes";
|
|
7
|
+
import { HashDictionary } from "#@typeberry/collections";
|
|
8
|
+
import { PvmBackend, tinyChainSpec } from "#@typeberry/config";
|
|
9
|
+
import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
|
|
10
|
+
import { tryAsU32, tryAsU64 } from "#@typeberry/numbers";
|
|
11
|
+
import { InMemoryService, InMemoryState, PreimageItem, ServiceAccountInfo } from "#@typeberry/state";
|
|
12
|
+
import { AuthorizationError, IsAuthorized } from "./is-authorized.js";
|
|
13
|
+
let blake2b;
|
|
14
|
+
before(async () => {
|
|
15
|
+
blake2b = await Blake2b.createHasher();
|
|
16
|
+
});
|
|
17
|
+
// Load the authorizer PVM fixture.
|
|
18
|
+
// This authorizer checks that authToken === authConfiguration and returns "Auth=<token>".
|
|
19
|
+
// https://github.com/tomusdrw/as-lan/blob/main/examples/authorizer/assembly/authorize.ts
|
|
20
|
+
const AUTHORIZER_PVM = BytesBlob.blobFrom(readFileSync(resolve(import.meta.dirname, "fixtures/authorizer.pvm")));
|
|
21
|
+
const AUTH_SERVICE_ID = tryAsServiceId(42);
|
|
22
|
+
function createService(serviceId, codeHash, code) {
|
|
23
|
+
return new InMemoryService(serviceId, {
|
|
24
|
+
info: ServiceAccountInfo.create({
|
|
25
|
+
codeHash: codeHash.asOpaque(),
|
|
26
|
+
balance: tryAsU64(10_000_000_000),
|
|
27
|
+
accumulateMinGas: tryAsServiceGas(0n),
|
|
28
|
+
onTransferMinGas: tryAsServiceGas(0n),
|
|
29
|
+
storageUtilisationBytes: tryAsU64(0),
|
|
30
|
+
storageUtilisationCount: tryAsU32(0),
|
|
31
|
+
gratisStorage: tryAsU64(0),
|
|
32
|
+
created: tryAsTimeSlot(0),
|
|
33
|
+
lastAccumulation: tryAsTimeSlot(0),
|
|
34
|
+
parentService: tryAsServiceId(0),
|
|
35
|
+
}),
|
|
36
|
+
preimages: HashDictionary.fromEntries([PreimageItem.create({ hash: codeHash.asOpaque(), blob: code })].map((x) => [x.hash, x])),
|
|
37
|
+
lookupHistory: HashDictionary.fromEntries([]),
|
|
38
|
+
storage: new Map(),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
describe("IsAuthorized", () => {
|
|
42
|
+
const spec = tinyChainSpec;
|
|
43
|
+
function getAuthCodeHash() {
|
|
44
|
+
return blake2b.hashBytes(AUTHORIZER_PVM).asOpaque();
|
|
45
|
+
}
|
|
46
|
+
function createStateWithService(codeHash, code) {
|
|
47
|
+
return InMemoryState.partial(spec, {
|
|
48
|
+
timeslot: tryAsTimeSlot(16),
|
|
49
|
+
services: new Map([[AUTH_SERVICE_ID, createService(AUTH_SERVICE_ID, codeHash, code)]]),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
it("should authorize when token matches configuration", async () => {
|
|
53
|
+
const authCodeHash = getAuthCodeHash();
|
|
54
|
+
const state = createStateWithService(authCodeHash, AUTHORIZER_PVM);
|
|
55
|
+
const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
|
|
56
|
+
const token = BytesBlob.blobFromString("hello");
|
|
57
|
+
const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), token, AUTH_SERVICE_ID, authCodeHash, token);
|
|
58
|
+
assert.strictEqual(result.isOk, true, `Expected OK but got error: ${result.isError ? result.details() : ""}`);
|
|
59
|
+
// Verify the authorization output starts with "Auth=<hello>"
|
|
60
|
+
const outputStr = Buffer.from(result.ok.authorizationOutput.raw).toString("utf8");
|
|
61
|
+
assert.ok(outputStr.startsWith("Auth=<hello>"), `Expected "Auth=<hello>" prefix but got "${outputStr.slice(0, 30)}"`);
|
|
62
|
+
// Verify the authorizer hash is H(code_hash ++ configuration)
|
|
63
|
+
const expectedHash = blake2b.hashBlobs([authCodeHash, token]);
|
|
64
|
+
assert.ok(result.ok.authorizerHash.isEqualTo(expectedHash), "authorizerHash should be H(code_hash || config)");
|
|
65
|
+
// Verify gas was consumed
|
|
66
|
+
assert.ok(Number(result.ok.authorizationGasUsed) > 0, "should have consumed some gas");
|
|
67
|
+
});
|
|
68
|
+
it("should authorize with empty token and configuration", async () => {
|
|
69
|
+
const authCodeHash = getAuthCodeHash();
|
|
70
|
+
const state = createStateWithService(authCodeHash, AUTHORIZER_PVM);
|
|
71
|
+
const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
|
|
72
|
+
const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.empty(), AUTH_SERVICE_ID, authCodeHash, BytesBlob.empty());
|
|
73
|
+
assert.strictEqual(result.isOk, true, `Expected OK but got error: ${result.isError ? result.details() : ""}`);
|
|
74
|
+
const outputStr = Buffer.from(result.ok.authorizationOutput.raw).toString("utf8");
|
|
75
|
+
assert.ok(outputStr.startsWith("Auth=<>"), `Expected "Auth=<>" prefix but got "${outputStr.slice(0, 30)}"`);
|
|
76
|
+
});
|
|
77
|
+
it("should fail when token does not match configuration", async () => {
|
|
78
|
+
const authCodeHash = getAuthCodeHash();
|
|
79
|
+
const state = createStateWithService(authCodeHash, AUTHORIZER_PVM);
|
|
80
|
+
const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
|
|
81
|
+
const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.blobFromString("wrong"), AUTH_SERVICE_ID, authCodeHash, BytesBlob.blobFromString("right"));
|
|
82
|
+
assert.strictEqual(result.isError, true);
|
|
83
|
+
assert.strictEqual(result.error, AuthorizationError.PvmFailed);
|
|
84
|
+
});
|
|
85
|
+
it("should fail when auth code host service is missing", async () => {
|
|
86
|
+
const authCodeHash = getAuthCodeHash();
|
|
87
|
+
const state = InMemoryState.partial(spec, {
|
|
88
|
+
timeslot: tryAsTimeSlot(16),
|
|
89
|
+
services: new Map(),
|
|
90
|
+
});
|
|
91
|
+
const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
|
|
92
|
+
const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.empty(), AUTH_SERVICE_ID, authCodeHash, BytesBlob.empty());
|
|
93
|
+
assert.strictEqual(result.isError, true);
|
|
94
|
+
assert.strictEqual(result.error, AuthorizationError.CodeNotFound);
|
|
95
|
+
});
|
|
96
|
+
it("should fail when auth code preimage is missing", async () => {
|
|
97
|
+
const authCodeHash = getAuthCodeHash();
|
|
98
|
+
// Service exists but with no preimages
|
|
99
|
+
const emptyService = new InMemoryService(AUTH_SERVICE_ID, {
|
|
100
|
+
info: ServiceAccountInfo.create({
|
|
101
|
+
codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
102
|
+
balance: tryAsU64(0),
|
|
103
|
+
accumulateMinGas: tryAsServiceGas(0n),
|
|
104
|
+
onTransferMinGas: tryAsServiceGas(0n),
|
|
105
|
+
storageUtilisationBytes: tryAsU64(0),
|
|
106
|
+
storageUtilisationCount: tryAsU32(0),
|
|
107
|
+
gratisStorage: tryAsU64(0),
|
|
108
|
+
created: tryAsTimeSlot(0),
|
|
109
|
+
lastAccumulation: tryAsTimeSlot(0),
|
|
110
|
+
parentService: tryAsServiceId(0),
|
|
111
|
+
}),
|
|
112
|
+
preimages: HashDictionary.fromEntries([]),
|
|
113
|
+
lookupHistory: HashDictionary.fromEntries([]),
|
|
114
|
+
storage: new Map(),
|
|
115
|
+
});
|
|
116
|
+
const state = InMemoryState.partial(spec, {
|
|
117
|
+
timeslot: tryAsTimeSlot(16),
|
|
118
|
+
services: new Map([[AUTH_SERVICE_ID, emptyService]]),
|
|
119
|
+
});
|
|
120
|
+
const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
|
|
121
|
+
const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.empty(), AUTH_SERVICE_ID, authCodeHash, BytesBlob.empty());
|
|
122
|
+
assert.strictEqual(result.isError, true);
|
|
123
|
+
assert.strictEqual(result.error, AuthorizationError.CodeNotFound);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type CoreIndex, type Segment, type SegmentIndex, type ServiceGas } from "#@typeberry/block";
|
|
2
|
+
import type { WorkPackageHash } from "#@typeberry/block/refine-context.js";
|
|
3
|
+
import type { WorkItem, WorkItemExtrinsic } from "#@typeberry/block/work-item.js";
|
|
4
|
+
import { WorkExecResult, WorkResult } from "#@typeberry/block/work-result.js";
|
|
5
|
+
import type { KnownSizeArray } from "#@typeberry/collections";
|
|
6
|
+
import type { ChainSpec, PvmBackend } from "#@typeberry/config";
|
|
7
|
+
import { type ReturnValue } from "#@typeberry/executor";
|
|
8
|
+
import { type Blake2b } from "#@typeberry/hash";
|
|
9
|
+
import type { State } from "#@typeberry/state";
|
|
10
|
+
export type RefineItemResult = {
|
|
11
|
+
result: WorkResult;
|
|
12
|
+
exports: readonly Segment[];
|
|
13
|
+
};
|
|
14
|
+
export type PerWorkItem<T> = KnownSizeArray<T, "for each work item">;
|
|
15
|
+
export type ImportedSegment = {
|
|
16
|
+
index: SegmentIndex;
|
|
17
|
+
data: Segment;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Refine PVM invocation (Psi_R).
|
|
21
|
+
*
|
|
22
|
+
* Executes a single work item's refinement logic.
|
|
23
|
+
*/
|
|
24
|
+
export declare class Refine {
|
|
25
|
+
private readonly chainSpec;
|
|
26
|
+
private readonly pvmBackend;
|
|
27
|
+
private readonly blake2b;
|
|
28
|
+
constructor(chainSpec: ChainSpec, pvmBackend: PvmBackend, blake2b: Blake2b);
|
|
29
|
+
invoke(state: State, lookupState: State, idx: number, item: WorkItem, allImports: PerWorkItem<ImportedSegment[]>, allExtrinsics: PerWorkItem<WorkItemExtrinsic[]>, coreIndex: CoreIndex, workPackageHash: WorkPackageHash, exportOffset: number): Promise<RefineItemResult>;
|
|
30
|
+
static extractWorkResult(execResult: ReturnValue<ServiceGas>): WorkExecResult;
|
|
31
|
+
private getServiceCode;
|
|
32
|
+
private createRefineExternalities;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=refine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/refine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,cAAc,EAAsC,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAGjH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAA+D,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAE,KAAK,OAAO,EAAa,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAyBF;;;;GAIG;AACH,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAG7B,MAAM,CACV,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,KAAK,EAClB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,EAC1C,aAAa,EAAE,WAAW,CAAC,iBAAiB,EAAE,CAAC,EAC/C,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC;IA0F5B,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;IAiB5D,OAAO,CAAC,cAAc;IAyCtB,OAAO,CAAC,yBAAyB;CAsBlC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { tryAsCoreIndex, tryAsServiceGas, } from "#@typeberry/block";
|
|
2
|
+
import { W_C } from "#@typeberry/block/gp-constants.js";
|
|
3
|
+
import { WorkExecResult, WorkExecResultKind, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
|
|
4
|
+
import { BytesBlob } from "#@typeberry/bytes";
|
|
5
|
+
import { codec, Encoder } from "#@typeberry/codec";
|
|
6
|
+
import { PvmExecutor, ReturnStatus } from "#@typeberry/executor";
|
|
7
|
+
import { HASH_SIZE } from "#@typeberry/hash";
|
|
8
|
+
import { tryAsU32 } from "#@typeberry/numbers";
|
|
9
|
+
import { RefineFetchExternalities } from "#@typeberry/transition/externalities/refine-fetch-externalities.js";
|
|
10
|
+
import { assertNever, Result } from "#@typeberry/utils";
|
|
11
|
+
import { RefineExternalitiesImpl } from "./externalities/refine.js";
|
|
12
|
+
var ServiceCodeError;
|
|
13
|
+
(function (ServiceCodeError) {
|
|
14
|
+
/** Service id is not found in the state. */
|
|
15
|
+
ServiceCodeError[ServiceCodeError["ServiceNotFound"] = 0] = "ServiceNotFound";
|
|
16
|
+
/** Expected service code does not match the state one. */
|
|
17
|
+
ServiceCodeError[ServiceCodeError["ServiceCodeMismatch"] = 1] = "ServiceCodeMismatch";
|
|
18
|
+
/** Code preimage missing. */
|
|
19
|
+
ServiceCodeError[ServiceCodeError["ServiceCodeMissing"] = 2] = "ServiceCodeMissing";
|
|
20
|
+
/** Code blob is too big. */
|
|
21
|
+
ServiceCodeError[ServiceCodeError["ServiceCodeTooBig"] = 3] = "ServiceCodeTooBig";
|
|
22
|
+
})(ServiceCodeError || (ServiceCodeError = {}));
|
|
23
|
+
/** https://graypaper.fluffylabs.dev/#/ab2cdbd/2ffe002ffe00?v=0.7.2 */
|
|
24
|
+
const REFINE_ARGS_CODEC = codec.object({
|
|
25
|
+
core: codec.varU32.convert((x) => tryAsU32(x), (x) => tryAsCoreIndex(x)),
|
|
26
|
+
workItemIndex: codec.varU32,
|
|
27
|
+
serviceId: codec.varU32.asOpaque(),
|
|
28
|
+
payloadLength: codec.varU32,
|
|
29
|
+
packageHash: codec.bytes(HASH_SIZE).asOpaque(),
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Refine PVM invocation (Psi_R).
|
|
33
|
+
*
|
|
34
|
+
* Executes a single work item's refinement logic.
|
|
35
|
+
*/
|
|
36
|
+
export class Refine {
|
|
37
|
+
chainSpec;
|
|
38
|
+
pvmBackend;
|
|
39
|
+
blake2b;
|
|
40
|
+
constructor(chainSpec, pvmBackend, blake2b) {
|
|
41
|
+
this.chainSpec = chainSpec;
|
|
42
|
+
this.pvmBackend = pvmBackend;
|
|
43
|
+
this.blake2b = blake2b;
|
|
44
|
+
}
|
|
45
|
+
async invoke(state, lookupState, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash, exportOffset) {
|
|
46
|
+
const payloadHash = this.blake2b.hashBytes(item.payload);
|
|
47
|
+
const baseResult = {
|
|
48
|
+
serviceId: item.service,
|
|
49
|
+
codeHash: item.codeHash,
|
|
50
|
+
payloadHash,
|
|
51
|
+
gas: item.refineGasLimit,
|
|
52
|
+
};
|
|
53
|
+
const imports = allImports[idx];
|
|
54
|
+
const extrinsics = allExtrinsics[idx];
|
|
55
|
+
const baseLoad = {
|
|
56
|
+
importedSegments: tryAsU32(imports.length),
|
|
57
|
+
extrinsicCount: tryAsU32(extrinsics.length),
|
|
58
|
+
extrinsicSize: tryAsU32(extrinsics.reduce((acc, x) => acc + x.length, 0)),
|
|
59
|
+
};
|
|
60
|
+
const maybeCode = this.getServiceCode(state, idx, item);
|
|
61
|
+
if (maybeCode.isError) {
|
|
62
|
+
const error = maybeCode.error === ServiceCodeError.ServiceCodeTooBig
|
|
63
|
+
? WorkExecResultKind.codeOversize
|
|
64
|
+
: WorkExecResultKind.badCode;
|
|
65
|
+
return {
|
|
66
|
+
exports: [],
|
|
67
|
+
result: WorkResult.create({
|
|
68
|
+
...baseResult,
|
|
69
|
+
result: WorkExecResult.error(error),
|
|
70
|
+
load: WorkRefineLoad.create({
|
|
71
|
+
...baseLoad,
|
|
72
|
+
gasUsed: tryAsServiceGas(item.refineGasLimit),
|
|
73
|
+
exportedSegments: tryAsU32(0),
|
|
74
|
+
}),
|
|
75
|
+
}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const code = maybeCode.ok;
|
|
79
|
+
const externalities = this.createRefineExternalities({
|
|
80
|
+
payload: item.payload,
|
|
81
|
+
imports: allImports,
|
|
82
|
+
extrinsics: allExtrinsics,
|
|
83
|
+
currentServiceId: item.service,
|
|
84
|
+
lookupState,
|
|
85
|
+
exportOffset,
|
|
86
|
+
});
|
|
87
|
+
const executor = await PvmExecutor.createRefineExecutor(item.service, code, externalities, this.pvmBackend);
|
|
88
|
+
const args = Encoder.encodeObject(REFINE_ARGS_CODEC, {
|
|
89
|
+
serviceId: item.service,
|
|
90
|
+
core: coreIndex,
|
|
91
|
+
workItemIndex: tryAsU32(idx),
|
|
92
|
+
payloadLength: tryAsU32(item.payload.length),
|
|
93
|
+
packageHash: workPackageHash,
|
|
94
|
+
});
|
|
95
|
+
const execResult = await executor.run(args, item.refineGasLimit);
|
|
96
|
+
const exports = externalities.refine.getExportedSegments();
|
|
97
|
+
if (exports.length !== item.exportCount) {
|
|
98
|
+
return {
|
|
99
|
+
exports: [],
|
|
100
|
+
result: WorkResult.create({
|
|
101
|
+
...baseResult,
|
|
102
|
+
result: WorkExecResult.error(WorkExecResultKind.incorrectNumberOfExports),
|
|
103
|
+
load: WorkRefineLoad.create({
|
|
104
|
+
...baseLoad,
|
|
105
|
+
gasUsed: tryAsServiceGas(item.refineGasLimit),
|
|
106
|
+
exportedSegments: tryAsU32(0),
|
|
107
|
+
}),
|
|
108
|
+
}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const result = Refine.extractWorkResult(execResult);
|
|
112
|
+
return {
|
|
113
|
+
exports,
|
|
114
|
+
result: WorkResult.create({
|
|
115
|
+
...baseResult,
|
|
116
|
+
result,
|
|
117
|
+
load: WorkRefineLoad.create({
|
|
118
|
+
...baseLoad,
|
|
119
|
+
gasUsed: tryAsServiceGas(execResult.consumedGas),
|
|
120
|
+
exportedSegments: tryAsU32(exports.length),
|
|
121
|
+
}),
|
|
122
|
+
}),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
static extractWorkResult(execResult) {
|
|
126
|
+
if (execResult.status === ReturnStatus.OK) {
|
|
127
|
+
const slice = execResult.memorySlice;
|
|
128
|
+
// TODO [ToDr] Verify the output size and change digestTooBig?
|
|
129
|
+
return WorkExecResult.ok(BytesBlob.blobFrom(slice));
|
|
130
|
+
}
|
|
131
|
+
switch (execResult.status) {
|
|
132
|
+
case ReturnStatus.OOG:
|
|
133
|
+
return WorkExecResult.error(WorkExecResultKind.outOfGas);
|
|
134
|
+
case ReturnStatus.PANIC:
|
|
135
|
+
return WorkExecResult.error(WorkExecResultKind.panic);
|
|
136
|
+
default:
|
|
137
|
+
assertNever(execResult);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
getServiceCode(state, idx, item) {
|
|
141
|
+
const serviceId = item.service;
|
|
142
|
+
const service = state.getService(serviceId);
|
|
143
|
+
// TODO [ToDr] GP link
|
|
144
|
+
// missing service
|
|
145
|
+
if (service === null) {
|
|
146
|
+
return Result.error(ServiceCodeError.ServiceNotFound, () => `[i:${idx}] Service ${serviceId} is missing in state.`);
|
|
147
|
+
}
|
|
148
|
+
// TODO [ToDr] GP link
|
|
149
|
+
// TODO [ToDr] shall we rather use the old codehash instead
|
|
150
|
+
if (!service.getInfo().codeHash.isEqualTo(item.codeHash)) {
|
|
151
|
+
return Result.error(ServiceCodeError.ServiceCodeMismatch, () => `[i:${idx}] Service ${serviceId} has invalid code hash. Ours: ${service.getInfo().codeHash}, expected: ${item.codeHash}`);
|
|
152
|
+
}
|
|
153
|
+
const code = service.getPreimage(item.codeHash.asOpaque());
|
|
154
|
+
if (code === null) {
|
|
155
|
+
return Result.error(ServiceCodeError.ServiceCodeMissing, () => `[i:${idx}] Code ${item.codeHash} for service ${serviceId} was not found.`);
|
|
156
|
+
}
|
|
157
|
+
if (code.length > W_C) {
|
|
158
|
+
return Result.error(ServiceCodeError.ServiceCodeTooBig, () => `[i:${idx}] Code ${item.codeHash} for service ${serviceId} is too big! ${code.length} bytes vs ${W_C} bytes max.`);
|
|
159
|
+
}
|
|
160
|
+
return Result.ok(code);
|
|
161
|
+
}
|
|
162
|
+
createRefineExternalities(args) {
|
|
163
|
+
// TODO [ToDr] Pass all required fetch data
|
|
164
|
+
const fetchExternalities = new RefineFetchExternalities(this.chainSpec);
|
|
165
|
+
const refine = RefineExternalitiesImpl.create({
|
|
166
|
+
currentServiceId: args.currentServiceId,
|
|
167
|
+
lookupState: args.lookupState,
|
|
168
|
+
exportOffset: args.exportOffset,
|
|
169
|
+
pvmBackend: this.pvmBackend,
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
fetchExternalities,
|
|
173
|
+
refine,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.test.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/refine.test.ts"],"names":[],"mappings":""}
|
|
@@ -34,8 +34,8 @@ export class Bless {
|
|
|
34
34
|
async execute(_gas, regs, memory) {
|
|
35
35
|
// `m`: manager service (can change privileged services)
|
|
36
36
|
const manager = getServiceId(regs.get(IN_OUT_REG));
|
|
37
|
-
// `a`:
|
|
38
|
-
const
|
|
37
|
+
// `a`: mem pointer for collection of auth queue assigners (one per core)
|
|
38
|
+
const assignersPtr = regs.get(8);
|
|
39
39
|
// `v`: manages validator keys
|
|
40
40
|
const delegator = getServiceId(regs.get(9));
|
|
41
41
|
// `r`: manages creation of new services with id within protected range
|
|
@@ -67,29 +67,29 @@ export class Bless {
|
|
|
67
67
|
}
|
|
68
68
|
// https://graypaper.fluffylabs.dev/#/7e6ff6a/367200367200?v=0.6.7
|
|
69
69
|
const res = safeAllocUint8Array(tryAsExactBytes(codec.u32.sizeHint) * this.chainSpec.coresCount);
|
|
70
|
-
const
|
|
71
|
-
const memoryReadResult = memory.loadInto(res,
|
|
70
|
+
const assignersDecoder = Decoder.fromBlob(res);
|
|
71
|
+
const memoryReadResult = memory.loadInto(res, assignersPtr);
|
|
72
72
|
if (memoryReadResult.isError) {
|
|
73
73
|
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, v: ${delegator}, r: ${registrar}, ${lazyInspect(autoAccumulate)}) <- PANIC`;
|
|
74
74
|
return PvmExecution.Panic;
|
|
75
75
|
}
|
|
76
76
|
// `a`
|
|
77
|
-
const
|
|
78
|
-
const updateResult = this.partialState.updatePrivilegedServices(manager,
|
|
77
|
+
const assigners = tryAsPerCore(assignersDecoder.sequenceFixLen(codec.u32.asOpaque(), this.chainSpec.coresCount), this.chainSpec);
|
|
78
|
+
const updateResult = this.partialState.updatePrivilegedServices(manager, assigners, delegator, registrar, autoAccumulate);
|
|
79
79
|
if (updateResult.isOk) {
|
|
80
|
-
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, a: [${
|
|
80
|
+
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, a: [${assigners}], v: ${delegator}, r: ${registrar}, ${lazyInspect(autoAccumulate)}) <- OK`;
|
|
81
81
|
regs.set(IN_OUT_REG, HostCallResult.OK);
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
84
84
|
const e = updateResult.error;
|
|
85
85
|
// NOTE: `UpdatePrivilegesError.UnprivilegedService` won't happen in 0.7.1+
|
|
86
86
|
if (e === UpdatePrivilegesError.UnprivilegedService) {
|
|
87
|
-
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, a: [${
|
|
87
|
+
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, a: [${assigners}], v: ${delegator}, r: ${registrar}, ${lazyInspect(autoAccumulate)}) <- HUH`;
|
|
88
88
|
regs.set(IN_OUT_REG, HostCallResult.HUH);
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
91
91
|
if (e === UpdatePrivilegesError.InvalidServiceId) {
|
|
92
|
-
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, a: [${
|
|
92
|
+
logger.trace `[${this.currentServiceId}] BLESS(m: ${manager}, a: [${assigners}], v: ${delegator}, r: ${registrar}, ${lazyInspect(autoAccumulate)}) <- WHO`;
|
|
93
93
|
regs.set(IN_OUT_REG, HostCallResult.WHO);
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
@@ -185,7 +185,7 @@ export interface PartialState {
|
|
|
185
185
|
* Update priviliged services and their gas.
|
|
186
186
|
*
|
|
187
187
|
* `m`: manager service (can change privileged services)
|
|
188
|
-
* `a`:
|
|
188
|
+
* `a`: per-core manager of authorization queue
|
|
189
189
|
* `v`: manages validator keys
|
|
190
190
|
* `r`: manages create new services in protected id range.
|
|
191
191
|
* `z`: collection of serviceId -> gas that auto-accumulate every block
|
|
@@ -84,7 +84,7 @@ export type SegmentExportError = typeof SegmentExportError;
|
|
|
84
84
|
export interface RefineExternalities {
|
|
85
85
|
/** Get the segments exported during this work item's refinement. */
|
|
86
86
|
getExportedSegments(): readonly Segment[];
|
|
87
|
-
/** Forget a previously started nested VM.
|
|
87
|
+
/** Forget a previously started nested VM. Return its current program counter.*/
|
|
88
88
|
machineExpunge(machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>>;
|
|
89
89
|
/** Set given range of pages as non-accessible and re-initialize them with zeros. */
|
|
90
90
|
machineVoidPages(machineIndex: MachineId, pageStart: U64, pageCount: U64): Promise<Result<OK, ZeroVoidError>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refine-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jam-host-calls/externalities/refine-externalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+DAA+D,CAAC;AACzG,OAAO,EAAgB,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;AAChE,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,cAA2C,CAAC;AAErG,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;AACtD,qDAAqD;AACrD,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,SAAsC,CAAC;AAE3F,qBAAa,eAAe;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;CAS7E;AAED,MAAM,MAAM,aAAa,GACrB;IACE,MAAM,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC;CACpB,GACD;IACE,MAAM,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC;CACd,GACD;IACE,MAAM,EAAE,OAAO,MAAM,CAAC,EAAE,GAAG,OAAO,MAAM,CAAC,IAAI,GAAG,OAAO,MAAM,CAAC,KAAK,GAAG,OAAO,MAAM,CAAC,GAAG,CAAC;CACzF,CAAC;AAEN,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,iBAAiB,CAAC;CAC9B,CAAC;AAEF,kEAAkE;AAClE,oBAAY,eAAe;IACzB,kDAAkD;IAClD,IAAI,IAAI;IACR,iDAAiD;IACjD,QAAQ,IAAI;IACZ,kDAAkD;IAClD,SAAS,IAAI;IACb,mDAAmD;IACnD,IAAI,IAAI;IACR,oDAAoD;IACpD,KAAK,IAAI;CACV;AAED,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,eAAe,GAAG,IACG,CAAC;AAE7E,iEAAiE;AACjE,oBAAY,aAAa;IACvB,yBAAyB;IACzB,eAAe,IAAI;IACnB,8BAA8B;IAC9B,oBAAoB,IAAI;IACxB,4CAA4C;IAC5C,SAAS,IAAI;CACd;AAED,oBAAY,aAAa;IACvB,4CAA4C;IAC5C,SAAS,IAAI;IACb,sDAAsD;IACtD,WAAW,IAAI;CAChB;AAED,oBAAY,UAAU;IACpB,4CAA4C;IAC5C,SAAS,IAAI;IACb,gCAAgC;IAChC,gBAAgB,IAAI;IACpB,2FAA2F;IAC3F,WAAW,IAAI;CAChB;AAED,kCAAkC;AAClC,eAAO,MAAM,cAAc,eAAqC,CAAC;AACjE,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC;AAEnD,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,eAAgD,CAAC;AAChF,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,mBAAmB,IAAI,SAAS,OAAO,EAAE,CAAC;IAE1C,
|
|
1
|
+
{"version":3,"file":"refine-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jam-host-calls/externalities/refine-externalities.ts"],"names":[],"mappings":"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"}
|