@typeberry/lib 0.5.3 → 0.5.4-b101fe6
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 +8 -4
- package/packages/core/hash/hash.d.ts.map +1 -1
- package/packages/core/hash/hash.js +1 -0
- package/packages/core/networking/certificate.d.ts.map +1 -1
- package/packages/core/networking/certificate.js +1 -0
- package/packages/core/networking/package.json +1 -1
- package/packages/core/networking/setup.d.ts.map +1 -1
- package/packages/core/networking/setup.js +16 -12
- package/packages/core/numbers/index.d.ts +4 -0
- package/packages/core/numbers/index.d.ts.map +1 -1
- package/packages/core/numbers/index.js +4 -4
- package/packages/core/pvm-host-calls/host-calls-executor.d.ts +23 -17
- package/packages/core/pvm-host-calls/host-calls-executor.d.ts.map +1 -1
- package/packages/core/pvm-host-calls/host-calls-executor.js +23 -31
- package/packages/core/pvm-interpreter/ops/math-consts.d.ts +2 -3
- package/packages/core/pvm-interpreter/ops/math-consts.d.ts.map +1 -1
- package/packages/core/pvm-interpreter/ops/math-consts.js +2 -3
- package/packages/core/pvm-interpreter/ops/math-ops.js +3 -3
- package/packages/core/pvm-interpreter/ops/math-utils.js +13 -13
- package/packages/core/pvm-interpreter/ops/math-utils.test.js +17 -16
- package/packages/core/telemetry/package.json +1 -1
- package/packages/core/utils/compatibility.d.ts +0 -1
- package/packages/core/utils/compatibility.d.ts.map +1 -1
- package/packages/core/utils/compatibility.js +1 -2
- package/packages/core/utils/compatibility.test.js +6 -10
- package/packages/extensions/ipc/jamnp/handler.d.ts +5 -4
- package/packages/extensions/ipc/jamnp/handler.d.ts.map +1 -1
- package/packages/extensions/ipc/jamnp/handler.js +59 -34
- package/packages/extensions/ipc/jamnp/stream.d.ts +6 -4
- package/packages/extensions/ipc/jamnp/stream.d.ts.map +1 -1
- package/packages/jam/block/work-item.d.ts +13 -4
- package/packages/jam/block/work-item.d.ts.map +1 -1
- package/packages/jam/block/work-package.d.ts +3 -1
- package/packages/jam/block/work-package.d.ts.map +1 -1
- package/packages/jam/block/work-package.js +6 -2
- package/packages/jam/block/work-result.d.ts +3 -5
- package/packages/jam/block/work-result.d.ts.map +1 -1
- package/packages/jam/block/work-result.js +6 -0
- package/packages/jam/block-json/block.d.ts +125 -0
- package/packages/jam/block-json/block.d.ts.map +1 -1
- package/packages/jam/block-json/block.js +9 -2
- package/packages/jam/block-json/work-result.d.ts.map +1 -1
- package/packages/jam/block-json/work-result.js +6 -6
- package/packages/jam/database-lmdb/states.test.js +2 -3
- package/packages/jam/executor/index.d.ts +4 -0
- package/packages/jam/executor/index.d.ts.map +1 -0
- package/packages/jam/executor/index.js +2 -0
- package/packages/jam/{transition/accumulate → executor}/pvm-executor.d.ts +19 -16
- package/packages/jam/executor/pvm-executor.d.ts.map +1 -0
- package/packages/jam/{transition/accumulate → executor}/pvm-executor.js +46 -3
- package/packages/jam/fuzz-proto/v1/handler.d.ts +1 -1
- package/packages/jam/fuzz-proto/v1/handler.d.ts.map +1 -1
- package/packages/jam/fuzz-proto/v1/handler.js +43 -19
- package/packages/jam/in-core/externalities/refine.d.ts +24 -0
- package/packages/jam/in-core/externalities/refine.d.ts.map +1 -0
- package/packages/jam/in-core/externalities/refine.js +36 -0
- package/packages/jam/in-core/in-core.d.ts +60 -0
- package/packages/jam/in-core/in-core.d.ts.map +1 -0
- package/packages/jam/in-core/in-core.js +294 -0
- package/packages/jam/in-core/in-core.test.d.ts +2 -0
- package/packages/jam/in-core/in-core.test.d.ts.map +1 -0
- package/packages/jam/in-core/in-core.test.js +81 -0
- package/packages/jam/in-core/index.d.ts +2 -0
- package/packages/jam/in-core/index.d.ts.map +1 -0
- package/packages/jam/in-core/index.js +1 -0
- package/packages/jam/jam-host-calls/accumulate/bless.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/accumulate/bless.js +6 -10
- package/packages/jam/jam-host-calls/accumulate/bless.test.js +32 -73
- package/packages/jam/jam-host-calls/accumulate/new.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/accumulate/new.js +2 -4
- package/packages/jam/jam-host-calls/accumulate/new.test.js +4 -5
- package/packages/jam/jam-host-calls/general/fetch.d.ts +1 -57
- package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/general/fetch.js +6 -29
- package/packages/jam/jam-host-calls/general/fetch.test.js +2 -58
- package/packages/jam/jamnp-s/peers.d.ts.map +1 -1
- package/packages/jam/jamnp-s/peers.js +10 -0
- package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts +1 -1
- package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-128-block-request.js +10 -8
- package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-129-state-request.js +11 -9
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +3 -3
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +2 -2
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +5 -5
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.js +2 -2
- package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.js +8 -6
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts +3 -3
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.js +2 -2
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.test.js +2 -2
- package/packages/jam/jamnp-s/protocol/stream.d.ts +13 -7
- package/packages/jam/jamnp-s/protocol/stream.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/stream.js +5 -4
- package/packages/jam/jamnp-s/protocol/test-utils.d.ts +1 -1
- package/packages/jam/jamnp-s/protocol/test-utils.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/test-utils.js +9 -12
- package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts +1 -1
- package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/up-0-block-announcement.js +1 -1
- package/packages/jam/jamnp-s/stream-manager.d.ts.map +1 -1
- package/packages/jam/jamnp-s/stream-manager.js +7 -5
- package/packages/jam/jamnp-s/stream-manager.test.js +8 -5
- package/packages/jam/jamnp-s/tasks/sync.js +1 -1
- package/packages/jam/node/jam-config.d.ts +4 -1
- package/packages/jam/node/jam-config.d.ts.map +1 -1
- package/packages/jam/node/jam-config.js +6 -2
- package/packages/jam/node/main.d.ts.map +1 -1
- package/packages/jam/node/main.js +5 -4
- package/packages/jam/node/package.json +1 -1
- package/packages/jam/rpc-validation/types.d.ts +7 -3
- package/packages/jam/rpc-validation/types.d.ts.map +1 -1
- package/packages/jam/rpc-validation/validation.d.ts +254 -36
- package/packages/jam/rpc-validation/validation.d.ts.map +1 -1
- package/packages/jam/rpc-validation/validation.js +20 -2
- package/packages/jam/state/in-memory-state.d.ts.map +1 -1
- package/packages/jam/state/in-memory-state.js +2 -3
- package/packages/jam/state/privileged-services.d.ts +1 -1
- package/packages/jam/state/privileged-services.d.ts.map +1 -1
- package/packages/jam/state/privileged-services.js +1 -6
- package/packages/jam/state/service.d.ts +1 -1
- package/packages/jam/state/service.d.ts.map +1 -1
- package/packages/jam/state/statistics.d.ts +0 -8
- package/packages/jam/state/statistics.d.ts.map +1 -1
- package/packages/jam/state/statistics.js +14 -44
- package/packages/jam/state/statistics.test.js +1 -8
- package/packages/jam/state/test.utils.d.ts +1 -1
- package/packages/jam/state/test.utils.d.ts.map +1 -1
- package/packages/jam/state/test.utils.js +6 -25
- package/packages/jam/state-json/accounts.d.ts +10 -0
- package/packages/jam/state-json/accounts.d.ts.map +1 -1
- package/packages/jam/state-json/accounts.js +47 -19
- package/packages/jam/state-json/dump.d.ts.map +1 -1
- package/packages/jam/state-json/dump.js +5 -9
- package/packages/jam/state-json/dump.test.js +2 -10
- package/packages/jam/state-json/statistics.d.ts +1 -1
- package/packages/jam/state-json/statistics.d.ts.map +1 -1
- package/packages/jam/state-json/statistics.js +1 -13
- package/packages/jam/state-merkleization/in-memory-state-codec.d.ts +0 -2
- package/packages/jam/state-merkleization/in-memory-state-codec.d.ts.map +1 -1
- package/packages/jam/state-merkleization/serialize.d.ts +4 -4
- package/packages/jam/state-merkleization/serialize.d.ts.map +1 -1
- package/packages/jam/state-merkleization/serialize.js +5 -8
- package/packages/jam/state-merkleization/serialized-state-view.d.ts.map +1 -1
- package/packages/jam/state-merkleization/state-entries.test.js +1 -7
- package/packages/jam/state-vectors/index.d.ts +377 -5
- package/packages/jam/state-vectors/index.d.ts.map +1 -1
- package/packages/jam/state-vectors/index.js +3 -3
- package/packages/jam/transition/accumulate/accumulate-data.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulate-data.js +1 -2
- package/packages/jam/transition/accumulate/accumulate-queue.test.js +2 -2
- package/packages/jam/transition/accumulate/accumulate-state.d.ts +1 -2
- package/packages/jam/transition/accumulate/accumulate-state.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulate-utils.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulate-utils.js +2 -6
- package/packages/jam/transition/accumulate/accumulate-utils.test.js +4 -6
- package/packages/jam/transition/accumulate/accumulate.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulate.js +19 -33
- package/packages/jam/transition/accumulate/accumulate.test.js +2 -2
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +1 -2
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.test.js +1 -2
- package/packages/jam/transition/accumulate/index.d.ts +0 -1
- package/packages/jam/transition/accumulate/index.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/index.js +0 -1
- package/packages/jam/transition/chain-stf.d.ts +3 -5
- package/packages/jam/transition/chain-stf.d.ts.map +1 -1
- package/packages/jam/transition/chain-stf.js +5 -29
- package/packages/jam/transition/disputes/disputes.test.data2.js +2 -2
- package/packages/jam/transition/externalities/accumulate-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/accumulate-externalities.js +22 -49
- package/packages/jam/transition/externalities/accumulate-externalities.test.js +8 -72
- package/packages/jam/transition/externalities/fetch-externalities.d.ts +8 -21
- package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/fetch-externalities.js +5 -53
- package/packages/jam/transition/externalities/fetch-externalities.test.js +201 -114
- package/packages/jam/transition/hasher.test.js +2 -2
- package/packages/jam/transition/reports/error.d.ts +3 -1
- package/packages/jam/transition/reports/error.d.ts.map +1 -1
- package/packages/jam/transition/reports/error.js +2 -0
- package/packages/jam/transition/reports/test.utils.d.ts.map +1 -1
- package/packages/jam/transition/reports/test.utils.js +2 -2
- package/packages/jam/transition/reports/verify-basic.d.ts.map +1 -1
- package/packages/jam/transition/reports/verify-basic.js +10 -0
- package/packages/jam/transition/reports/verify-basic.test.js +29 -0
- package/packages/jam/transition/statistics.d.ts +0 -7
- package/packages/jam/transition/statistics.d.ts.map +1 -1
- package/packages/jam/transition/statistics.js +2 -11
- package/packages/jam/transition/statistics.test.js +0 -40
- package/packages/workers/block-authorship/main.d.ts.map +1 -1
- package/packages/workers/block-authorship/main.js +23 -4
- package/packages/workers/block-authorship/package.json +1 -1
- package/packages/workers/block-authorship/protocol.d.ts +3 -1
- package/packages/workers/block-authorship/protocol.d.ts.map +1 -1
- package/packages/workers/block-authorship/protocol.js +6 -3
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +0 -1
- package/packages/workers/importer/package.json +1 -1
- package/packages/jam/transition/accumulate/deferred-transfers.d.ts +0 -36
- package/packages/jam/transition/accumulate/deferred-transfers.d.ts.map +0 -1
- package/packages/jam/transition/accumulate/deferred-transfers.js +0 -95
- package/packages/jam/transition/accumulate/pvm-executor.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
3
|
import { tryAsServiceGas, tryAsServiceId } from "#@typeberry/block";
|
|
4
|
-
import { WorkExecResult
|
|
4
|
+
import { WorkExecResult } from "#@typeberry/block/work-result.js";
|
|
5
5
|
import { Bytes, BytesBlob } from "#@typeberry/bytes";
|
|
6
6
|
import { codec, Encoder } from "#@typeberry/codec";
|
|
7
7
|
import { fullChainSpec, tinyChainSpec } from "#@typeberry/config";
|
|
@@ -10,7 +10,7 @@ import { TRANSFER_MEMO_BYTES } from "#@typeberry/jam-host-calls/externalities/pa
|
|
|
10
10
|
import { PendingTransfer } from "#@typeberry/jam-host-calls/externalities/pending-transfer.js";
|
|
11
11
|
import { tryAsU64 } from "#@typeberry/numbers";
|
|
12
12
|
import { Operand } from "../accumulate/operand.js";
|
|
13
|
-
import { FetchExternalities } from "./fetch-externalities.js";
|
|
13
|
+
import { FetchExternalities, TRANSFER_OR_OPERAND, TransferOperandKind, } from "./fetch-externalities.js";
|
|
14
14
|
describe("fetch-externalities", () => {
|
|
15
15
|
const prepareOperands = (length) => {
|
|
16
16
|
const operands = [];
|
|
@@ -21,7 +21,7 @@ describe("fetch-externalities", () => {
|
|
|
21
21
|
exportsRoot: Bytes.fill(HASH_SIZE, i + 2).asOpaque(),
|
|
22
22
|
hash: Bytes.fill(HASH_SIZE, i + 4).asOpaque(),
|
|
23
23
|
payloadHash: Bytes.fill(HASH_SIZE, i + 5).asOpaque(),
|
|
24
|
-
result:
|
|
24
|
+
result: WorkExecResult.ok(BytesBlob.empty()),
|
|
25
25
|
gas: tryAsServiceGas(1_000),
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
@@ -40,17 +40,30 @@ describe("fetch-externalities", () => {
|
|
|
40
40
|
}
|
|
41
41
|
return transfers;
|
|
42
42
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
// allTransfersAndOperands: transfers first, then operands
|
|
44
|
+
const toAllTransfersAndOperands = (operands, transfers) => {
|
|
45
|
+
return [
|
|
46
|
+
...transfers.map((t) => ({ kind: TransferOperandKind.TRANSFER, value: t })),
|
|
47
|
+
...operands.map((o) => ({ kind: TransferOperandKind.OPERAND, value: o })),
|
|
48
|
+
];
|
|
49
|
+
};
|
|
50
|
+
// oneTransferOrOperand: operands first (index < operands.length), then transfers
|
|
51
|
+
const toOneTransferOrOperandAt = (operands, transfers, index) => {
|
|
52
|
+
if (index >= operands.length + transfers.length) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
if (index < operands.length) {
|
|
56
|
+
return { kind: TransferOperandKind.OPERAND, value: operands[index] };
|
|
57
|
+
}
|
|
58
|
+
return { kind: TransferOperandKind.TRANSFER, value: transfers[index - operands.length] };
|
|
59
|
+
};
|
|
60
|
+
const encodeOneTransferOrOperand = (item, chainSpec) => {
|
|
61
|
+
if (item === null) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return Encoder.encodeObject(TRANSFER_OR_OPERAND, item, chainSpec);
|
|
52
65
|
};
|
|
53
|
-
const
|
|
66
|
+
const prepareAccumulateData = ({ chainSpec, operands, entropy, transfers, }) => {
|
|
54
67
|
const defaultChainSpec = tinyChainSpec;
|
|
55
68
|
const defaultEntropy = Bytes.zero(HASH_SIZE).asOpaque();
|
|
56
69
|
const defaultOperands = [];
|
|
@@ -60,108 +73,182 @@ describe("fetch-externalities", () => {
|
|
|
60
73
|
operands: operands ?? defaultOperands,
|
|
61
74
|
transfers: transfers ?? defaultTransfers,
|
|
62
75
|
};
|
|
63
|
-
return FetchExternalities.
|
|
76
|
+
return FetchExternalities.createForAccumulate(fetchData, chainSpec ?? defaultChainSpec);
|
|
64
77
|
};
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
78
|
+
const prepareRefineData = ({ chainSpec } = {}) => {
|
|
79
|
+
const defaultChainSpec = tinyChainSpec;
|
|
80
|
+
return FetchExternalities.createForRefine({ entropy: undefined }, chainSpec ?? defaultChainSpec);
|
|
81
|
+
};
|
|
82
|
+
describe("Accumulate", () => {
|
|
83
|
+
it("should return different constants for different chain specs", () => {
|
|
84
|
+
const tinyFetchExternalities = prepareAccumulateData({ chainSpec: tinyChainSpec });
|
|
85
|
+
const fullFetchExternalities = prepareAccumulateData({ chainSpec: fullChainSpec });
|
|
86
|
+
const tinyConstants = tinyFetchExternalities.constants();
|
|
87
|
+
const fullConstants = fullFetchExternalities.constants();
|
|
88
|
+
assert.notStrictEqual(tinyConstants.length, 0);
|
|
89
|
+
assert.notStrictEqual(fullConstants.length, 0);
|
|
90
|
+
assert.notDeepStrictEqual(tinyConstants, fullConstants);
|
|
91
|
+
});
|
|
92
|
+
it("should return entropy hash", () => {
|
|
93
|
+
const expectedEntropy = Bytes.fill(HASH_SIZE, 5).asOpaque();
|
|
94
|
+
const fetchExternalities = prepareAccumulateData({ entropy: expectedEntropy });
|
|
95
|
+
const entropy = fetchExternalities.entropy();
|
|
96
|
+
assert.deepStrictEqual(entropy, expectedEntropy);
|
|
97
|
+
});
|
|
98
|
+
it("should return all transfers and operands", () => {
|
|
99
|
+
const operands = prepareOperands(3);
|
|
100
|
+
const transfers = prepareTransfers(2);
|
|
101
|
+
const chainSpec = tinyChainSpec;
|
|
102
|
+
const expected = toAllTransfersAndOperands(operands, transfers);
|
|
103
|
+
const encodedExpected = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), expected, chainSpec);
|
|
104
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
105
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
106
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
107
|
+
});
|
|
108
|
+
it("should return empty encoded sequence when no transfers and no operands", () => {
|
|
109
|
+
const chainSpec = tinyChainSpec;
|
|
110
|
+
const encodedExpected = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), [], chainSpec);
|
|
111
|
+
const fetchExternalities = prepareAccumulateData({ operands: [], transfers: [], chainSpec });
|
|
112
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
113
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
114
|
+
});
|
|
115
|
+
it("should return one operand by index", () => {
|
|
116
|
+
const operands = prepareOperands(3);
|
|
117
|
+
const transfers = prepareTransfers(2);
|
|
118
|
+
const chainSpec = tinyChainSpec;
|
|
119
|
+
const encodedExpected = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, 0), chainSpec);
|
|
120
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
121
|
+
// Operands come first (indices 0..2), then transfers (indices 3..4)
|
|
122
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(0));
|
|
123
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
124
|
+
});
|
|
125
|
+
it("should return one transfer by index", () => {
|
|
126
|
+
const operands = prepareOperands(3);
|
|
127
|
+
const transfers = prepareTransfers(2);
|
|
128
|
+
const chainSpec = tinyChainSpec;
|
|
129
|
+
const encodedExpected = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, 3), chainSpec);
|
|
130
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
131
|
+
// Transfers start after operands, so index 3 is the first transfer
|
|
132
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(3));
|
|
133
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
134
|
+
});
|
|
135
|
+
it("should return null when index is out of bounds", () => {
|
|
136
|
+
const operands = prepareOperands(3);
|
|
137
|
+
const transfers = prepareTransfers(2);
|
|
138
|
+
const chainSpec = tinyChainSpec;
|
|
139
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
140
|
+
// Total items: 3 operands + 2 transfers = 5, so index 5 is out of bounds
|
|
141
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(5));
|
|
142
|
+
assert.strictEqual(result, null);
|
|
143
|
+
});
|
|
144
|
+
it("should return null when index is far out of bounds", () => {
|
|
145
|
+
const operands = prepareOperands(3);
|
|
146
|
+
const transfers = prepareTransfers(2);
|
|
147
|
+
const chainSpec = tinyChainSpec;
|
|
148
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
149
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(153));
|
|
150
|
+
assert.strictEqual(result, null);
|
|
151
|
+
});
|
|
152
|
+
it("should have consistent encoding between all and one", () => {
|
|
153
|
+
const operands = prepareOperands(2);
|
|
154
|
+
const transfers = prepareTransfers(2);
|
|
155
|
+
const chainSpec = tinyChainSpec;
|
|
156
|
+
const allItems = toAllTransfersAndOperands(operands, transfers);
|
|
157
|
+
const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
|
|
158
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
159
|
+
const all = fetchExternalities.allTransfersAndOperands();
|
|
160
|
+
assert.deepStrictEqual(all, encodedAll);
|
|
161
|
+
for (let i = 0; i < operands.length + transfers.length; i++) {
|
|
162
|
+
const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
|
|
163
|
+
const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, i), chainSpec);
|
|
164
|
+
assert.deepStrictEqual(one, encodedOne, `Mismatch at index ${i}`);
|
|
165
|
+
}
|
|
166
|
+
const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(operands.length + transfers.length));
|
|
167
|
+
assert.strictEqual(outOfRange, null);
|
|
168
|
+
});
|
|
169
|
+
it("should handle only operands without transfers", () => {
|
|
170
|
+
const operands = prepareOperands(5);
|
|
171
|
+
const chainSpec = tinyChainSpec;
|
|
172
|
+
const allItems = toAllTransfersAndOperands(operands, []);
|
|
173
|
+
const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
|
|
174
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers: [], chainSpec });
|
|
175
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
176
|
+
assert.deepStrictEqual(result, encodedAll);
|
|
177
|
+
for (let i = 0; i < operands.length; i++) {
|
|
178
|
+
const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
|
|
179
|
+
const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, [], i), chainSpec);
|
|
180
|
+
assert.deepStrictEqual(one, encodedOne, `Mismatch at operand index ${i}`);
|
|
181
|
+
}
|
|
182
|
+
const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(operands.length));
|
|
183
|
+
assert.strictEqual(outOfRange, null);
|
|
184
|
+
});
|
|
185
|
+
it("should handle only transfers without operands", () => {
|
|
186
|
+
const transfers = prepareTransfers(5);
|
|
187
|
+
const chainSpec = tinyChainSpec;
|
|
188
|
+
const allItems = toAllTransfersAndOperands([], transfers);
|
|
189
|
+
const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
|
|
190
|
+
const fetchExternalities = prepareAccumulateData({ operands: [], transfers, chainSpec });
|
|
191
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
192
|
+
assert.deepStrictEqual(result, encodedAll);
|
|
193
|
+
for (let i = 0; i < transfers.length; i++) {
|
|
194
|
+
const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
|
|
195
|
+
const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt([], transfers, i), chainSpec);
|
|
196
|
+
assert.deepStrictEqual(one, encodedOne, `Mismatch at transfer index ${i}`);
|
|
197
|
+
}
|
|
198
|
+
const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(transfers.length));
|
|
199
|
+
assert.strictEqual(outOfRange, null);
|
|
200
|
+
});
|
|
201
|
+
it("should return null for unimplemented methods", () => {
|
|
202
|
+
const fetchExternalities = prepareAccumulateData({});
|
|
203
|
+
assert.strictEqual(fetchExternalities.authorizerTrace(), null);
|
|
204
|
+
assert.strictEqual(fetchExternalities.workItemExtrinsic(null, tryAsU64(0)), null);
|
|
205
|
+
assert.strictEqual(fetchExternalities.workItemImport(null, tryAsU64(0)), null);
|
|
206
|
+
assert.strictEqual(fetchExternalities.workPackage(), null);
|
|
207
|
+
assert.strictEqual(fetchExternalities.authorizer(), null);
|
|
208
|
+
assert.strictEqual(fetchExternalities.authorizationToken(), null);
|
|
209
|
+
assert.strictEqual(fetchExternalities.refineContext(), null);
|
|
210
|
+
assert.strictEqual(fetchExternalities.allWorkItems(), null);
|
|
211
|
+
assert.strictEqual(fetchExternalities.oneWorkItem(tryAsU64(0)), null);
|
|
212
|
+
assert.strictEqual(fetchExternalities.workItemPayload(tryAsU64(0)), null);
|
|
213
|
+
});
|
|
156
214
|
});
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
215
|
+
describe("Refine", () => {
|
|
216
|
+
it("should return different constants for different chain specs", () => {
|
|
217
|
+
const tinyFetchExternalities = prepareRefineData({ chainSpec: tinyChainSpec });
|
|
218
|
+
const fullFetchExternalities = prepareRefineData({ chainSpec: fullChainSpec });
|
|
219
|
+
const tinyConstants = tinyFetchExternalities.constants();
|
|
220
|
+
const fullConstants = fullFetchExternalities.constants();
|
|
221
|
+
assert.notStrictEqual(tinyConstants.length, 0);
|
|
222
|
+
assert.notStrictEqual(fullConstants.length, 0);
|
|
223
|
+
assert.notDeepStrictEqual(tinyConstants, fullConstants);
|
|
224
|
+
});
|
|
225
|
+
it("should return null entropy", () => {
|
|
226
|
+
const fetchExternalities = prepareRefineData();
|
|
227
|
+
const entropy = fetchExternalities.entropy();
|
|
228
|
+
assert.strictEqual(entropy, null);
|
|
229
|
+
});
|
|
230
|
+
it("should return null for allTransfersAndOperands", () => {
|
|
231
|
+
const fetchExternalities = prepareRefineData();
|
|
232
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
233
|
+
assert.strictEqual(result, null);
|
|
234
|
+
});
|
|
235
|
+
it("should return null for oneTransferOrOperand", () => {
|
|
236
|
+
const fetchExternalities = prepareRefineData();
|
|
237
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(0));
|
|
238
|
+
assert.strictEqual(result, null);
|
|
239
|
+
});
|
|
240
|
+
it("should return null for unimplemented methods", () => {
|
|
241
|
+
const fetchExternalities = prepareRefineData();
|
|
242
|
+
assert.strictEqual(fetchExternalities.authorizerTrace(), null);
|
|
243
|
+
assert.strictEqual(fetchExternalities.workItemExtrinsic(null, tryAsU64(0)), null);
|
|
244
|
+
assert.strictEqual(fetchExternalities.workItemImport(null, tryAsU64(0)), null);
|
|
245
|
+
assert.strictEqual(fetchExternalities.workPackage(), null);
|
|
246
|
+
assert.strictEqual(fetchExternalities.authorizer(), null);
|
|
247
|
+
assert.strictEqual(fetchExternalities.authorizationToken(), null);
|
|
248
|
+
assert.strictEqual(fetchExternalities.refineContext(), null);
|
|
249
|
+
assert.strictEqual(fetchExternalities.allWorkItems(), null);
|
|
250
|
+
assert.strictEqual(fetchExternalities.oneWorkItem(tryAsU64(0)), null);
|
|
251
|
+
assert.strictEqual(fetchExternalities.workItemPayload(tryAsU64(0)), null);
|
|
252
|
+
});
|
|
166
253
|
});
|
|
167
254
|
});
|
|
@@ -4,7 +4,7 @@ import { Credential, ReportGuarantee } from "#@typeberry/block/guarantees.js";
|
|
|
4
4
|
import { RefineContext, WorkPackageInfo } from "#@typeberry/block/refine-context.js";
|
|
5
5
|
import { SignedTicket, tryAsTicketAttempt } from "#@typeberry/block/tickets.js";
|
|
6
6
|
import { WorkPackageSpec, WorkReport } from "#@typeberry/block/work-report.js";
|
|
7
|
-
import { WorkExecResult,
|
|
7
|
+
import { WorkExecResult, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
|
|
8
8
|
import { Bytes, BytesBlob } from "#@typeberry/bytes";
|
|
9
9
|
import { Decoder, Encoder } from "#@typeberry/codec";
|
|
10
10
|
import { asKnownSize } from "#@typeberry/collections";
|
|
@@ -77,7 +77,7 @@ describe("TransitionHasher", () => {
|
|
|
77
77
|
importedSegments: tryAsU32(result.refine_load.imports),
|
|
78
78
|
}),
|
|
79
79
|
payloadHash: Bytes.parseBytes(result.payload_hash, HASH_SIZE).asOpaque(),
|
|
80
|
-
result:
|
|
80
|
+
result: WorkExecResult.ok(BytesBlob.parseBlob(result.result.ok)),
|
|
81
81
|
serviceId: tryAsServiceId(result.service_id),
|
|
82
82
|
}))),
|
|
83
83
|
segmentRootLookup: report.segment_root_lookup.map((l) => WorkPackageInfo.create(l)),
|
|
@@ -47,6 +47,8 @@ export declare enum ReportsError {
|
|
|
47
47
|
/** Size of authorizer output and all work-item successful output blobs is too big. */
|
|
48
48
|
WorkReportTooBig = 22,
|
|
49
49
|
/** Contains guarantee from validator that is proven to be an offender. */
|
|
50
|
-
BannedValidator = 23
|
|
50
|
+
BannedValidator = 23,
|
|
51
|
+
/** Number of work items/results is invalid. */
|
|
52
|
+
InvalidWorkItemsCount = 24
|
|
51
53
|
}
|
|
52
54
|
//# sourceMappingURL=error.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/error.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,oBAAY,YAAY;IACtB,gEAAgE;IAChE,YAAY,IAAI;IAChB,8DAA8D;IAC9D,gBAAgB,IAAI;IACpB,0CAA0C;IAC1C,qBAAqB,IAAI;IACzB,gDAAgD;IAChD,sBAAsB,IAAI;IAC1B,oDAAoD;IACpD,mBAAmB,IAAI;IACvB,0DAA0D;IAC1D,2BAA2B,IAAI;IAC/B,gEAAgE;IAChE,eAAe,IAAI;IACnB,mEAAmE;IACnE,WAAW,IAAI;IACf,kDAAkD;IAClD,eAAe,IAAI;IACnB,yBAAyB;IACzB,YAAY,IAAI;IAChB,wDAAwD;IACxD,WAAW,KAAK;IAChB,yFAAyF;IACzF,iBAAiB,KAAK;IACtB,gEAAgE;IAChE,gBAAgB,KAAK;IACrB,wFAAwF;IACxF,YAAY,KAAK;IACjB,qCAAqC;IACrC,eAAe,KAAK;IACpB,qEAAqE;IACrE,gBAAgB,KAAK;IACrB,gEAAgE;IAChE,iBAAiB,KAAK;IACtB,4CAA4C;IAC5C,oBAAoB,KAAK;IACzB,oFAAoF;IACpF,oBAAoB,KAAK;IACzB,wFAAwF;IACxF,mBAAmB,KAAK;IACxB,2FAA2F;IAC3F,wBAAwB,KAAK;IAC7B,2CAA2C;IAC3C,YAAY,KAAK;IACjB,sFAAsF;IACtF,gBAAgB,KAAK;IACrB,0EAA0E;IAC1E,eAAe,KAAK;
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/error.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,oBAAY,YAAY;IACtB,gEAAgE;IAChE,YAAY,IAAI;IAChB,8DAA8D;IAC9D,gBAAgB,IAAI;IACpB,0CAA0C;IAC1C,qBAAqB,IAAI;IACzB,gDAAgD;IAChD,sBAAsB,IAAI;IAC1B,oDAAoD;IACpD,mBAAmB,IAAI;IACvB,0DAA0D;IAC1D,2BAA2B,IAAI;IAC/B,gEAAgE;IAChE,eAAe,IAAI;IACnB,mEAAmE;IACnE,WAAW,IAAI;IACf,kDAAkD;IAClD,eAAe,IAAI;IACnB,yBAAyB;IACzB,YAAY,IAAI;IAChB,wDAAwD;IACxD,WAAW,KAAK;IAChB,yFAAyF;IACzF,iBAAiB,KAAK;IACtB,gEAAgE;IAChE,gBAAgB,KAAK;IACrB,wFAAwF;IACxF,YAAY,KAAK;IACjB,qCAAqC;IACrC,eAAe,KAAK;IACpB,qEAAqE;IACrE,gBAAgB,KAAK;IACrB,gEAAgE;IAChE,iBAAiB,KAAK;IACtB,4CAA4C;IAC5C,oBAAoB,KAAK;IACzB,oFAAoF;IACpF,oBAAoB,KAAK;IACzB,wFAAwF;IACxF,mBAAmB,KAAK;IACxB,2FAA2F;IAC3F,wBAAwB,KAAK;IAC7B,2CAA2C;IAC3C,YAAY,KAAK;IACjB,sFAAsF;IACtF,gBAAgB,KAAK;IACrB,0EAA0E;IAC1E,eAAe,KAAK;IACpB,+CAA+C;IAC/C,qBAAqB,KAAK;CAC3B"}
|
|
@@ -49,4 +49,6 @@ export var ReportsError;
|
|
|
49
49
|
ReportsError[ReportsError["WorkReportTooBig"] = 22] = "WorkReportTooBig";
|
|
50
50
|
/** Contains guarantee from validator that is proven to be an offender. */
|
|
51
51
|
ReportsError[ReportsError["BannedValidator"] = 23] = "BannedValidator";
|
|
52
|
+
/** Number of work items/results is invalid. */
|
|
53
|
+
ReportsError[ReportsError["InvalidWorkItemsCount"] = 24] = "InvalidWorkItemsCount";
|
|
52
54
|
})(ReportsError || (ReportsError = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/test.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,QAAQ,EAOd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,UAAU,EAEV,KAAK,uBAAuB,EAE5B,eAAe,EAChB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAiB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE/G,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAI7D,OAAO,EAAe,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,KAAK,EAAqB,uBAAuB,EAAW,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EACL,sBAAsB,EAEtB,eAAe,EACf,aAAa,EAIb,aAAa,EACd,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,eAAO,MAAM,OAAO,iHAAyB,CAAC;AAE9C,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;IAC5B,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,UAAU,GACX,EAAE,iBAAiB,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"test.utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/test.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { Credential, GuaranteesExtrinsicBounds, guaranteesExtrinsicCodec, Report
|
|
|
4
4
|
import { RefineContext } from "#@typeberry/block/refine-context.js";
|
|
5
5
|
import { testWorkReportHex } from "#@typeberry/block/test-helpers.js";
|
|
6
6
|
import { WorkReport } from "#@typeberry/block/work-report.js";
|
|
7
|
-
import { WorkExecResult,
|
|
7
|
+
import { WorkExecResult, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
|
|
8
8
|
import { Bytes, BytesBlob } from "#@typeberry/bytes";
|
|
9
9
|
import { codec, Decoder } from "#@typeberry/codec";
|
|
10
10
|
import { asKnownSize, FixedSizeArray, HashDictionary } from "#@typeberry/collections";
|
|
@@ -41,7 +41,7 @@ export function newWorkReport({ core, authorizer, anchorBlock, stateRoot, beefyR
|
|
|
41
41
|
codeHash: x.codeHash,
|
|
42
42
|
payloadHash: x.payloadHash,
|
|
43
43
|
gas: x.gas,
|
|
44
|
-
result: resultSize !== undefined ?
|
|
44
|
+
result: resultSize !== undefined ? WorkExecResult.ok(Bytes.fill(resultSize, 0)) : x.result,
|
|
45
45
|
load: WorkRefineLoad.create({
|
|
46
46
|
gasUsed: tryAsServiceGas(5),
|
|
47
47
|
importedSegments: tryAsU32(0),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-basic.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/verify-basic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"verify-basic.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/verify-basic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAG9E,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAe,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CA8D3F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MAX_REPORT_DEPENDENCIES } from "#@typeberry/block/gp-constants.js";
|
|
2
|
+
import { isWorkItemsCount, MAX_NUMBER_OF_WORK_ITEMS, MIN_NUMBER_OF_WORK_ITEMS } from "#@typeberry/block/work-package.js";
|
|
2
3
|
import { WorkExecResultKind } from "#@typeberry/block/work-result.js";
|
|
3
4
|
import { OK, Result } from "#@typeberry/utils";
|
|
4
5
|
import { ReportsError } from "./error.js";
|
|
@@ -11,6 +12,15 @@ export const MAX_WORK_REPORT_SIZE_BYTES = 48 * 2 ** 10;
|
|
|
11
12
|
export function verifyReportsBasic(input) {
|
|
12
13
|
for (const guarantee of input) {
|
|
13
14
|
const reportView = guarantee.view().report.view();
|
|
15
|
+
/**
|
|
16
|
+
* Make sure number of results is within correct range.
|
|
17
|
+
*/
|
|
18
|
+
if (!isWorkItemsCount(reportView.results.view().length)) {
|
|
19
|
+
return Result.error(ReportsError.InvalidWorkItemsCount, () => `Number of work results is invalid.
|
|
20
|
+
Got: ${reportView.results.view().length},
|
|
21
|
+
expected between ${MIN_NUMBER_OF_WORK_ITEMS} and ${MAX_NUMBER_OF_WORK_ITEMS}
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
14
24
|
/**
|
|
15
25
|
* We limit the sum of the number of items in the
|
|
16
26
|
* segment-root lookup dictionary and the number of
|
|
@@ -2,8 +2,10 @@ import { describe, it } from "node:test";
|
|
|
2
2
|
import { tryAsTimeSlot } from "#@typeberry/block";
|
|
3
3
|
import { ReportGuarantee } from "#@typeberry/block/guarantees.js";
|
|
4
4
|
import { Bytes } from "#@typeberry/bytes";
|
|
5
|
+
import { FixedSizeArray } from "#@typeberry/collections";
|
|
5
6
|
import { tinyChainSpec } from "#@typeberry/config";
|
|
6
7
|
import { HASH_SIZE } from "#@typeberry/hash";
|
|
8
|
+
import { tryAsU8 } from "#@typeberry/numbers";
|
|
7
9
|
import { asOpaqueType, deepEqual, OK } from "#@typeberry/utils";
|
|
8
10
|
import { ReportsError } from "./error.js";
|
|
9
11
|
import { guaranteesAsView, newCredential, newWorkReport } from "./test.utils.js";
|
|
@@ -44,6 +46,33 @@ describe("Reports.verifyReportsBasic", () => {
|
|
|
44
46
|
details: () => "Work report at 0 too big. Got 0 + 49153, max: 49152",
|
|
45
47
|
});
|
|
46
48
|
});
|
|
49
|
+
it("should reject if report has invalid number of work results (0)", () => {
|
|
50
|
+
// Create a minimal work report with 0 results by manually constructing it
|
|
51
|
+
const emptyResults = FixedSizeArray.new([], tryAsU8(0));
|
|
52
|
+
const report = newWorkReport({ core: 0 });
|
|
53
|
+
// Bypass the type system to set 0 results
|
|
54
|
+
const invalidReport = {
|
|
55
|
+
...report,
|
|
56
|
+
results: emptyResults,
|
|
57
|
+
};
|
|
58
|
+
const guarantees = guaranteesAsView(tinyChainSpec, [
|
|
59
|
+
ReportGuarantee.create({
|
|
60
|
+
slot: tryAsTimeSlot(10),
|
|
61
|
+
report: invalidReport,
|
|
62
|
+
credentials: asOpaqueType([0, 3].map((x) => newCredential(x))),
|
|
63
|
+
}),
|
|
64
|
+
]);
|
|
65
|
+
const result = verifyReportsBasic(guarantees);
|
|
66
|
+
deepEqual(result, {
|
|
67
|
+
isOk: false,
|
|
68
|
+
isError: true,
|
|
69
|
+
error: ReportsError.InvalidWorkItemsCount,
|
|
70
|
+
details: () => `Number of work results is invalid.
|
|
71
|
+
Got: 0,
|
|
72
|
+
expected between 1 and 16
|
|
73
|
+
`,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
47
76
|
it("should verify correctly", () => {
|
|
48
77
|
const guarantees = guaranteesAsView(tinyChainSpec, [
|
|
49
78
|
ReportGuarantee.create({
|
|
@@ -27,13 +27,6 @@ export type Input = {
|
|
|
27
27
|
* https://graypaper.fluffylabs.dev/#/cc517d7/171f05171f05?v=0.6.5
|
|
28
28
|
*/
|
|
29
29
|
accumulationStatistics: Map<ServiceId, CountAndGasUsed>;
|
|
30
|
-
/**
|
|
31
|
-
* `X`: Deffered transfer statistics
|
|
32
|
-
* TODO [MaSo] Use fields from accumulation.
|
|
33
|
-
*
|
|
34
|
-
* https://graypaper.fluffylabs.dev/#/cc517d7/18dd0018dd00?v=0.6.5
|
|
35
|
-
*/
|
|
36
|
-
transferStatistics: Map<ServiceId, CountAndGasUsed>;
|
|
37
30
|
reporters: readonly Ed25519Key[];
|
|
38
31
|
currentValidatorData: State["currentValidatorData"];
|
|
39
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/transition/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EAIb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAqB,KAAK,KAAK,EAAuC,MAAM,kBAAkB,CAAC;AAGtG,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACxD
|
|
1
|
+
{"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/transition/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EAIb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAqB,KAAK,KAAK,EAAuC,MAAM,kBAAkB,CAAC;AAGtG,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACxD,SAAS,EAAE,SAAS,UAAU,EAAE,CAAC;IACjC,oBAAoB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG;IACrE;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;CAC9D,CAAC;AAEF,sCAAsC;AACtC,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAExE,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,SAAS;aACV,KAAK,EAAE,eAAe;gBADrB,SAAS,EAAE,SAAS,EACrB,KAAK,EAAE,eAAe;IAGxC,OAAO,CAAC,aAAa;IAyBrB,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IAe5B,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IA+B5B,sEAAsE;IACtE,OAAO,CAAC,6BAA6B;IAoBrC;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,qBAAqB;CAwIhD"}
|
|
@@ -96,7 +96,7 @@ export class Statistics {
|
|
|
96
96
|
*
|
|
97
97
|
* https://graypaper.fluffylabs.dev/#/cc517d7/195f04195f04?v=0.6.5
|
|
98
98
|
*/
|
|
99
|
-
collectServiceIds(preimages, workResults, accumulationKeys
|
|
99
|
+
collectServiceIds(preimages, workResults, accumulationKeys) {
|
|
100
100
|
const serviceIds = new Set();
|
|
101
101
|
for (const preimage of preimages) {
|
|
102
102
|
serviceIds.add(preimage.requester);
|
|
@@ -107,9 +107,6 @@ export class Statistics {
|
|
|
107
107
|
for (const serviceId of accumulationKeys) {
|
|
108
108
|
serviceIds.add(serviceId);
|
|
109
109
|
}
|
|
110
|
-
for (const serviceId of transferKeys) {
|
|
111
|
-
serviceIds.add(serviceId);
|
|
112
|
-
}
|
|
113
110
|
return serviceIds;
|
|
114
111
|
}
|
|
115
112
|
/**
|
|
@@ -195,7 +192,7 @@ export class Statistics {
|
|
|
195
192
|
}
|
|
196
193
|
/** Update services statistics */
|
|
197
194
|
services.clear();
|
|
198
|
-
const serviceIds = this.collectServiceIds(extrinsic.preimages, incomingReports.flatMap((wr) => wr.results), input.accumulationStatistics.keys()
|
|
195
|
+
const serviceIds = this.collectServiceIds(extrinsic.preimages, incomingReports.flatMap((wr) => wr.results), input.accumulationStatistics.keys());
|
|
199
196
|
for (const serviceId of serviceIds) {
|
|
200
197
|
const workResults = incomingReports.flatMap((wr) => wr.results.filter((r) => r.serviceId === serviceId));
|
|
201
198
|
const { gasUsed, imported, extrinsicCount, extrinsicSize, exported } = this.calculateRefineScore(workResults);
|
|
@@ -205,10 +202,6 @@ export class Statistics {
|
|
|
205
202
|
count: tryAsU32(0),
|
|
206
203
|
gasUsed: tryAsServiceGas(0n),
|
|
207
204
|
};
|
|
208
|
-
const { count: transfersCount, gasUsed: transfersGasUsed } = input.transferStatistics.get(serviceId) ?? {
|
|
209
|
-
count: tryAsU32(0),
|
|
210
|
-
gasUsed: tryAsServiceGas(0n),
|
|
211
|
-
};
|
|
212
205
|
/**
|
|
213
206
|
* Service statistics are tracked only per-block basis, so we override previous values.
|
|
214
207
|
* https://graypaper.fluffylabs.dev/#/cc517d7/190201190501?v=0.6.5
|
|
@@ -226,8 +219,6 @@ export class Statistics {
|
|
|
226
219
|
serviceStatistics.providedSize = providedSize;
|
|
227
220
|
serviceStatistics.accumulateCount = accumulatedCount;
|
|
228
221
|
serviceStatistics.accumulateGasUsed = accumulatedGasUsed;
|
|
229
|
-
serviceStatistics.onTransfersCount = transfersCount;
|
|
230
|
-
serviceStatistics.onTransfersGasUsed = transfersGasUsed;
|
|
231
222
|
services.set(serviceId, serviceStatistics);
|
|
232
223
|
}
|
|
233
224
|
/** Update state */
|