@typeberry/lib 0.5.2 → 0.5.3-5a6cfcc

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.
Files changed (179) hide show
  1. package/package.json +9 -5
  2. package/packages/core/collections/blob-dictionary.d.ts.map +1 -1
  3. package/packages/core/collections/blob-dictionary.js +3 -3
  4. package/packages/core/crypto/bandersnatch.d.ts +2 -1
  5. package/packages/core/crypto/bandersnatch.d.ts.map +1 -1
  6. package/packages/core/crypto/bandersnatch.js +9 -2
  7. package/packages/core/crypto/key-derivation.test.js +8 -7
  8. package/packages/core/hash/hash.d.ts.map +1 -1
  9. package/packages/core/hash/hash.js +1 -0
  10. package/packages/core/networking/certificate.d.ts.map +1 -1
  11. package/packages/core/networking/certificate.js +1 -0
  12. package/packages/core/networking/package.json +1 -1
  13. package/packages/core/networking/setup.d.ts.map +1 -1
  14. package/packages/core/networking/setup.js +16 -12
  15. package/packages/core/numbers/index.d.ts +4 -0
  16. package/packages/core/numbers/index.d.ts.map +1 -1
  17. package/packages/core/numbers/index.js +4 -4
  18. package/packages/core/pvm-host-calls/bin.js +6 -6
  19. package/packages/core/pvm-host-calls/ecalli-io-tracker.d.ts +32 -0
  20. package/packages/core/pvm-host-calls/ecalli-io-tracker.d.ts.map +1 -0
  21. package/packages/core/pvm-host-calls/ecalli-io-tracker.js +14 -0
  22. package/packages/core/pvm-host-calls/ecalli-trace-logger.d.ts +139 -0
  23. package/packages/core/pvm-host-calls/ecalli-trace-logger.d.ts.map +1 -0
  24. package/packages/core/pvm-host-calls/ecalli-trace-logger.js +209 -0
  25. package/packages/core/pvm-host-calls/ecalli-trace-logger.test.d.ts +2 -0
  26. package/packages/core/pvm-host-calls/ecalli-trace-logger.test.d.ts.map +1 -0
  27. package/packages/core/pvm-host-calls/ecalli-trace-logger.test.js +231 -0
  28. package/packages/core/pvm-host-calls/host-call-memory.d.ts +2 -0
  29. package/packages/core/pvm-host-calls/host-call-memory.d.ts.map +1 -1
  30. package/packages/core/pvm-host-calls/host-call-memory.js +12 -2
  31. package/packages/core/pvm-host-calls/host-call-registers.d.ts +6 -0
  32. package/packages/core/pvm-host-calls/host-call-registers.d.ts.map +1 -1
  33. package/packages/core/pvm-host-calls/host-call-registers.js +24 -0
  34. package/packages/core/pvm-host-calls/host-calls-executor.d.ts +37 -0
  35. package/packages/core/pvm-host-calls/host-calls-executor.d.ts.map +1 -0
  36. package/packages/core/pvm-host-calls/host-calls-executor.js +129 -0
  37. package/packages/core/pvm-host-calls/host-calls.d.ts +20 -26
  38. package/packages/core/pvm-host-calls/host-calls.d.ts.map +1 -1
  39. package/packages/core/pvm-host-calls/host-calls.js +40 -112
  40. package/packages/core/pvm-host-calls/index.d.ts +7 -6
  41. package/packages/core/pvm-host-calls/index.d.ts.map +1 -1
  42. package/packages/core/pvm-host-calls/index.js +7 -6
  43. package/packages/core/pvm-host-calls/{interpreter-instance-manager.d.ts → pvm-instance-manager.d.ts} +3 -3
  44. package/packages/core/pvm-host-calls/pvm-instance-manager.d.ts.map +1 -0
  45. package/packages/core/pvm-host-calls/{interpreter-instance-manager.js → pvm-instance-manager.js} +2 -2
  46. package/packages/core/pvm-interpreter/ops/math-consts.d.ts +2 -3
  47. package/packages/core/pvm-interpreter/ops/math-consts.d.ts.map +1 -1
  48. package/packages/core/pvm-interpreter/ops/math-consts.js +2 -3
  49. package/packages/core/pvm-interpreter/ops/math-ops.js +3 -3
  50. package/packages/core/pvm-interpreter/ops/math-utils.js +13 -13
  51. package/packages/core/pvm-interpreter/ops/math-utils.test.js +17 -16
  52. package/packages/core/telemetry/package.json +1 -1
  53. package/packages/extensions/ipc/jamnp/handler.d.ts +5 -4
  54. package/packages/extensions/ipc/jamnp/handler.d.ts.map +1 -1
  55. package/packages/extensions/ipc/jamnp/handler.js +59 -34
  56. package/packages/extensions/ipc/jamnp/stream.d.ts +6 -4
  57. package/packages/extensions/ipc/jamnp/stream.d.ts.map +1 -1
  58. package/packages/jam/block/work-item.d.ts +13 -4
  59. package/packages/jam/block/work-item.d.ts.map +1 -1
  60. package/packages/jam/block/work-result.d.ts +3 -5
  61. package/packages/jam/block/work-result.d.ts.map +1 -1
  62. package/packages/jam/block/work-result.js +6 -0
  63. package/packages/jam/block-json/work-result.d.ts.map +1 -1
  64. package/packages/jam/block-json/work-result.js +6 -6
  65. package/packages/jam/database-lmdb/states.test.js +4 -3
  66. package/packages/jam/executor/index.d.ts +4 -0
  67. package/packages/jam/executor/index.d.ts.map +1 -0
  68. package/packages/jam/executor/index.js +2 -0
  69. package/packages/jam/{transition/accumulate → executor}/pvm-executor.d.ts +19 -16
  70. package/packages/jam/executor/pvm-executor.d.ts.map +1 -0
  71. package/packages/jam/{transition/accumulate → executor}/pvm-executor.js +48 -5
  72. package/packages/jam/in-core/externalities/refine.d.ts +24 -0
  73. package/packages/jam/in-core/externalities/refine.d.ts.map +1 -0
  74. package/packages/jam/in-core/externalities/refine.js +36 -0
  75. package/packages/jam/in-core/in-core.d.ts +60 -0
  76. package/packages/jam/in-core/in-core.d.ts.map +1 -0
  77. package/packages/jam/in-core/in-core.js +294 -0
  78. package/packages/jam/in-core/in-core.test.d.ts +2 -0
  79. package/packages/jam/in-core/in-core.test.d.ts.map +1 -0
  80. package/packages/jam/in-core/in-core.test.js +81 -0
  81. package/packages/jam/in-core/index.d.ts +2 -0
  82. package/packages/jam/in-core/index.d.ts.map +1 -0
  83. package/packages/jam/in-core/index.js +1 -0
  84. package/packages/jam/jam-host-calls/accumulate/bless.test.js +4 -5
  85. package/packages/jam/jamnp-s/peers.d.ts.map +1 -1
  86. package/packages/jam/jamnp-s/peers.js +10 -0
  87. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts +1 -1
  88. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts.map +1 -1
  89. package/packages/jam/jamnp-s/protocol/ce-128-block-request.js +10 -8
  90. package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts.map +1 -1
  91. package/packages/jam/jamnp-s/protocol/ce-129-state-request.js +11 -9
  92. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +3 -3
  93. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
  94. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +2 -2
  95. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +5 -5
  96. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts.map +1 -1
  97. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.js +2 -2
  98. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts.map +1 -1
  99. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.js +8 -6
  100. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts +3 -3
  101. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts.map +1 -1
  102. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.js +2 -2
  103. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.test.js +2 -2
  104. package/packages/jam/jamnp-s/protocol/stream.d.ts +13 -7
  105. package/packages/jam/jamnp-s/protocol/stream.d.ts.map +1 -1
  106. package/packages/jam/jamnp-s/protocol/stream.js +5 -4
  107. package/packages/jam/jamnp-s/protocol/test-utils.d.ts +1 -1
  108. package/packages/jam/jamnp-s/protocol/test-utils.d.ts.map +1 -1
  109. package/packages/jam/jamnp-s/protocol/test-utils.js +9 -12
  110. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts +1 -1
  111. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts.map +1 -1
  112. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.js +1 -1
  113. package/packages/jam/jamnp-s/stream-manager.d.ts.map +1 -1
  114. package/packages/jam/jamnp-s/stream-manager.js +7 -5
  115. package/packages/jam/jamnp-s/stream-manager.test.js +8 -5
  116. package/packages/jam/jamnp-s/tasks/sync.js +1 -1
  117. package/packages/jam/node/jam-config.d.ts +4 -1
  118. package/packages/jam/node/jam-config.d.ts.map +1 -1
  119. package/packages/jam/node/jam-config.js +6 -2
  120. package/packages/jam/node/main-importer.d.ts.map +1 -1
  121. package/packages/jam/node/main-importer.js +3 -1
  122. package/packages/jam/node/main.d.ts.map +1 -1
  123. package/packages/jam/node/main.js +5 -4
  124. package/packages/jam/node/package.json +1 -1
  125. package/packages/jam/rpc-validation/types.d.ts +7 -3
  126. package/packages/jam/rpc-validation/types.d.ts.map +1 -1
  127. package/packages/jam/rpc-validation/validation.d.ts +254 -36
  128. package/packages/jam/rpc-validation/validation.d.ts.map +1 -1
  129. package/packages/jam/rpc-validation/validation.js +20 -2
  130. package/packages/jam/safrole/bandersnatch-vrf.d.ts +2 -0
  131. package/packages/jam/safrole/bandersnatch-vrf.d.ts.map +1 -1
  132. package/packages/jam/safrole/bandersnatch-vrf.js +11 -0
  133. package/packages/jam/safrole/bandersnatch-vrf.test.js +3 -3
  134. package/packages/jam/safrole/bandersnatch-wasm.d.ts +1 -0
  135. package/packages/jam/safrole/bandersnatch-wasm.d.ts.map +1 -1
  136. package/packages/jam/safrole/bandersnatch-wasm.js +8 -5
  137. package/packages/jam/safrole/safrole-seal.d.ts +1 -3
  138. package/packages/jam/safrole/safrole-seal.d.ts.map +1 -1
  139. package/packages/jam/safrole/safrole-seal.js +14 -25
  140. package/packages/jam/safrole/safrole-seal.test.js +4 -10
  141. package/packages/jam/state/in-memory-state.d.ts.map +1 -1
  142. package/packages/jam/state/in-memory-state.js +2 -3
  143. package/packages/jam/state/test.utils.d.ts.map +1 -1
  144. package/packages/jam/state/test.utils.js +2 -3
  145. package/packages/jam/transition/accumulate/accumulate-data.d.ts.map +1 -1
  146. package/packages/jam/transition/accumulate/accumulate-data.js +1 -2
  147. package/packages/jam/transition/accumulate/accumulate-queue.test.js +2 -2
  148. package/packages/jam/transition/accumulate/accumulate-utils.test.js +2 -2
  149. package/packages/jam/transition/accumulate/accumulate.d.ts.map +1 -1
  150. package/packages/jam/transition/accumulate/accumulate.js +8 -13
  151. package/packages/jam/transition/accumulate/accumulate.test.js +2 -2
  152. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.d.ts.map +1 -1
  153. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +1 -2
  154. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.test.js +1 -2
  155. package/packages/jam/transition/accumulate/deferred-transfers.d.ts +1 -1
  156. package/packages/jam/transition/accumulate/deferred-transfers.d.ts.map +1 -1
  157. package/packages/jam/transition/accumulate/deferred-transfers.js +6 -7
  158. package/packages/jam/transition/disputes/disputes.d.ts.map +1 -1
  159. package/packages/jam/transition/disputes/disputes.js +5 -4
  160. package/packages/jam/transition/disputes/disputes.test.data2.js +2 -2
  161. package/packages/jam/transition/externalities/fetch-externalities.d.ts +7 -1
  162. package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
  163. package/packages/jam/transition/externalities/fetch-externalities.js +4 -0
  164. package/packages/jam/transition/externalities/fetch-externalities.test.js +2 -2
  165. package/packages/jam/transition/hasher.test.js +2 -2
  166. package/packages/jam/transition/reports/test.utils.d.ts.map +1 -1
  167. package/packages/jam/transition/reports/test.utils.js +2 -2
  168. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  169. package/packages/workers/block-authorship/main.js +23 -4
  170. package/packages/workers/block-authorship/package.json +1 -1
  171. package/packages/workers/block-authorship/protocol.d.ts +3 -1
  172. package/packages/workers/block-authorship/protocol.d.ts.map +1 -1
  173. package/packages/workers/block-authorship/protocol.js +6 -3
  174. package/packages/workers/importer/package.json +1 -1
  175. package/packages/core/pvm-host-calls/host-calls-manager.d.ts +0 -23
  176. package/packages/core/pvm-host-calls/host-calls-manager.d.ts.map +0 -1
  177. package/packages/core/pvm-host-calls/host-calls-manager.js +0 -44
  178. package/packages/core/pvm-host-calls/interpreter-instance-manager.d.ts.map +0 -1
  179. package/packages/jam/transition/accumulate/pvm-executor.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typeberry/lib",
3
- "version": "0.5.2",
3
+ "version": "0.5.3-5a6cfcc",
4
4
  "description": "Typeberry Library",
5
5
  "main": "./bin/lib/index.js",
6
6
  "types": "./bin/lib/index.d.ts",
@@ -218,8 +218,12 @@
218
218
  "#@typeberry/database/*": "./packages/jam/database/*",
219
219
  "#@typeberry/database-lmdb": "./packages/jam/database-lmdb/index.js",
220
220
  "#@typeberry/database-lmdb/*": "./packages/jam/database-lmdb/*",
221
+ "#@typeberry/executor": "./packages/jam/executor/index.js",
222
+ "#@typeberry/executor/*": "./packages/jam/executor/*",
221
223
  "#@typeberry/fuzz-proto": "./packages/jam/fuzz-proto/index.js",
222
224
  "#@typeberry/fuzz-proto/*": "./packages/jam/fuzz-proto/*",
225
+ "#@typeberry/in-core": "./packages/jam/in-core/index.js",
226
+ "#@typeberry/in-core/*": "./packages/jam/in-core/*",
223
227
  "#@typeberry/jam-host-calls": "./packages/jam/jam-host-calls/index.js",
224
228
  "#@typeberry/jam-host-calls/*": "./packages/jam/jam-host-calls/*",
225
229
  "#@typeberry/jamnp-s": "./packages/jam/jamnp-s/index.js",
@@ -238,6 +242,8 @@
238
242
  "#@typeberry/state-json/*": "./packages/jam/state-json/*",
239
243
  "#@typeberry/state-merkleization": "./packages/jam/state-merkleization/index.js",
240
244
  "#@typeberry/state-merkleization/*": "./packages/jam/state-merkleization/*",
245
+ "#@typeberry/state-vectors": "./packages/jam/state-vectors/index.js",
246
+ "#@typeberry/state-vectors/*": "./packages/jam/state-vectors/*",
241
247
  "#@typeberry/transition": "./packages/jam/transition/index.js",
242
248
  "#@typeberry/transition/*": "./packages/jam/transition/*",
243
249
  "#@typeberry/disputes": "./packages/jam/transition/disputes/index.js",
@@ -253,12 +259,10 @@
253
259
  "#@typeberry/importer": "./packages/workers/importer/index.js",
254
260
  "#@typeberry/importer/*": "./packages/workers/importer/*",
255
261
  "#@typeberry/jam-network": "./packages/workers/jam-network/index.js",
256
- "#@typeberry/jam-network/*": "./packages/workers/jam-network/*",
257
- "#@typeberry/state-vectors": "./packages/jam/state-vectors/index.js",
258
- "#@typeberry/state-vectors/*": "./packages/jam/state-vectors/*"
262
+ "#@typeberry/jam-network/*": "./packages/workers/jam-network/*"
259
263
  },
260
264
  "dependencies": {
261
- "@fluffylabs/anan-as": "^1.1.3",
265
+ "@fluffylabs/anan-as": "^1.1.5",
262
266
  "@noble/ed25519": "2.2.3",
263
267
  "@typeberry/native": "0.0.4-4c0cd28",
264
268
  "hash-wasm": "4.12.0"
@@ -1 +1 @@
1
- {"version":3,"file":"blob-dictionary.d.ts","sourceRoot":"","sources":["../../../../../packages/core/collections/blob-dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAiD,kBAAkB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEhH,0CAA0C;AAC1C,qBAAa,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,CAAE,SAAQ,SAAS;IA8B7C,OAAO,CAAC,gBAAgB;IA7B9C;;;;;;;OAOG;IACH,OAAO,CAAC,IAAI,CAA+B;IAE3C;;;;;OAKG;IACH,OAAO,CAAC,OAAO,CAAiC;IAEhD;;;;;;;;;;OAUG;IACH,SAAS,aAAqB,gBAAgB,EAAE,MAAM;IAItD;;;;;;;;;OASG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,CAAC,kBAAkB,CAAC;IAMpB;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,gBAAgB,SAAI;IAIvD;;;;;;;;;OASG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAO9G;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,WAAW;IAyDnB;;;;;;;;;OASG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAO3B;;;;;;;OAOG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IA8B1B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IASvB;;;;;;OAMG;IACH,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAIjC;;;;;;OAMG;IACF,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAMpC;;;;;;OAMG;IACF,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAM/C;;;;;;;;;;;;;OAaG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAIxD;;;;;;;;;;OAUG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;CAK9C;AAKD;;;;;KAKK;AACL,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAYpD;AAID,KAAK,MAAM,CAAC,EAAE,SAAS,SAAS,IAAI,SAAS,CAAC;AAC9C,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;AAG3B,KAAK,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,IAAI;IAClC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AA+CF,qBAAa,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;IAC9C,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAM;IAEzC,OAAO;IAEP,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAQvC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IASzC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAY3D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;CAGlC"}
1
+ {"version":3,"file":"blob-dictionary.d.ts","sourceRoot":"","sources":["../../../../../packages/core/collections/blob-dictionary.ts"],"names":[],"mappings":"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"}
@@ -172,14 +172,14 @@ export class BlobDictionary extends WithDebug {
172
172
  const pathChunksGenerator = key.chunks(CHUNK_SIZE);
173
173
  let depth = 0;
174
174
  while (node !== undefined) {
175
- const maybePathChunk = pathChunksGenerator.next().value;
176
175
  if (node.children instanceof ListChildren) {
177
- const subkey = BytesBlob.blobFrom(key.raw.subarray(depth * CHUNK_SIZE));
176
+ const subkey = depth === 0 ? key : BytesBlob.blobFrom(key.raw.subarray(depth * CHUNK_SIZE));
178
177
  const child = node.children.find(subkey);
179
178
  if (child !== null) {
180
179
  return child.value;
181
180
  }
182
181
  }
182
+ const maybePathChunk = pathChunksGenerator.next().value;
183
183
  if (maybePathChunk === undefined) {
184
184
  return node.getLeaf()?.value;
185
185
  }
@@ -363,7 +363,7 @@ export class ListChildren {
363
363
  children = [];
364
364
  constructor() { }
365
365
  find(key) {
366
- const result = this.children.find((item) => item[0].isEqualTo(key));
366
+ const result = this.children.find((item) => item[0] === key || item[0].isEqualTo(key));
367
367
  if (result !== undefined) {
368
368
  return result[1];
369
369
  }
@@ -1,5 +1,5 @@
1
1
  import { Bytes } from "#@typeberry/bytes";
2
- import { type Opaque } from "#@typeberry/utils";
2
+ import { OK, type Opaque, Result } from "#@typeberry/utils";
3
3
  /** Bandersnatch public key size. */
4
4
  export declare const BANDERSNATCH_KEY_BYTES = 32;
5
5
  export type BANDERSNATCH_KEY_BYTES = typeof BANDERSNATCH_KEY_BYTES;
@@ -47,4 +47,5 @@ export type BandersnatchProof = Opaque<Bytes<BANDERSNATCH_PROOF_BYTES>, "Banders
47
47
  export type BlsKey = Opaque<Bytes<BLS_KEY_BYTES>, "BlsKey">;
48
48
  /** Derive a Bandersnatch public key from a seed. */
49
49
  export declare function publicKey(seed: Uint8Array): BandersnatchKey;
50
+ export declare function checkNativeBindings(): Result<OK, string>;
50
51
  //# sourceMappingURL=bandersnatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bandersnatch.d.ts","sourceRoot":"","sources":["../../../../../packages/core/crypto/bandersnatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEtD,oCAAoC;AACpC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC;AAEnE,sCAAsC;AACtC,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,MAAM,MAAM,gCAAgC,GAAG,OAAO,gCAAgC,CAAC;AAEvF,wCAAwC;AACxC,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAC;AAE/E,8BAA8B;AAC9B,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,MAAM,MAAM,wBAAwB,GAAG,OAAO,wBAAwB,CAAC;AAEvE,2BAA2B;AAC3B,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC;AAEjD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAEvF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAEvG;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,0BAA0B,CAAC,CAAC;AAEnH;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE5D,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAM3D"}
1
+ {"version":3,"file":"bandersnatch.d.ts","sourceRoot":"","sources":["../../../../../packages/core/crypto/bandersnatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAS,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAElE,oCAAoC;AACpC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC;AAEnE,sCAAsC;AACtC,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,MAAM,MAAM,gCAAgC,GAAG,OAAO,gCAAgC,CAAC;AAEvF,wCAAwC;AACxC,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAC;AAE/E,8BAA8B;AAC9B,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,MAAM,MAAM,wBAAwB,GAAG,OAAO,wBAAwB,CAAC;AAEvE,2BAA2B;AAC3B,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC;AAEjD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAEvF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAEvG;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,0BAA0B,CAAC,CAAC;AAEnH;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE5D,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAM3D;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAMxD"}
@@ -1,6 +1,6 @@
1
1
  import { Bytes } from "#@typeberry/bytes";
2
2
  import { bandersnatch } from "@typeberry/native";
3
- import { check } from "#@typeberry/utils";
3
+ import { check, OK, Result } from "#@typeberry/utils";
4
4
  /** Bandersnatch public key size. */
5
5
  export const BANDERSNATCH_KEY_BYTES = 32;
6
6
  /** Bandersnatch VRF signature size */
@@ -13,7 +13,14 @@ export const BANDERSNATCH_PROOF_BYTES = 784;
13
13
  export const BLS_KEY_BYTES = 144;
14
14
  /** Derive a Bandersnatch public key from a seed. */
15
15
  export function publicKey(seed) {
16
- const key = bandersnatch.derive_public_key(seed);
16
+ const key = bandersnatch.derivePublicKey(seed);
17
17
  check `${key[0] === 0} Invalid Bandersnatch public key derived from seed`;
18
18
  return Bytes.fromBlob(key.subarray(1), BANDERSNATCH_KEY_BYTES).asOpaque();
19
19
  }
20
+ export function checkNativeBindings() {
21
+ if (bandersnatch.isNativeBinding()) {
22
+ return Result.ok(OK);
23
+ }
24
+ const error = "native binding error";
25
+ return Result.error(bandersnatch.getNativeBindingError() ?? error, () => error);
26
+ }
@@ -3,6 +3,7 @@ import { before, describe, it } from "node:test";
3
3
  import { Bytes } from "#@typeberry/bytes";
4
4
  import { Blake2b } from "#@typeberry/hash";
5
5
  import { tryAsU32 } from "#@typeberry/numbers";
6
+ import { deepEqual } from "#@typeberry/utils";
6
7
  import { initWasm } from "./index.js";
7
8
  import { deriveBandersnatchPublicKey, deriveBandersnatchSecretKey, deriveEd25519PublicKey, deriveEd25519SecretKey, SEED_SIZE, trivialSeed, } from "./key-derivation.js";
8
9
  before(initWasm);
@@ -183,42 +184,42 @@ describe("Key Derivation: Bandersnatch public key", () => {
183
184
  const seed = trivialSeed(tryAsU32(0));
184
185
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
185
186
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
186
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("ff71c6c03ff88adb5ed52c9681de1629a54e702fc14729f6b50d2f0a76f185b3").raw, SEED_SIZE).asOpaque());
187
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("ff71c6c03ff88adb5ed52c9681de1629a54e702fc14729f6b50d2f0a76f185b3").raw, SEED_SIZE).asOpaque());
187
188
  });
188
189
  it("should derive from seed: 1", () => {
189
190
  const seed = trivialSeed(tryAsU32(1));
190
191
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
191
192
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
192
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("dee6d555b82024f1ccf8a1e37e60fa60fd40b1958c4bb3006af78647950e1b91").raw, SEED_SIZE).asOpaque());
193
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("dee6d555b82024f1ccf8a1e37e60fa60fd40b1958c4bb3006af78647950e1b91").raw, SEED_SIZE).asOpaque());
193
194
  });
194
195
  it("should derive from seed: 2", () => {
195
196
  const seed = trivialSeed(tryAsU32(2));
196
197
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
197
198
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
198
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("9326edb21e5541717fde24ec085000b28709847b8aab1ac51f84e94b37ca1b66").raw, SEED_SIZE).asOpaque());
199
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("9326edb21e5541717fde24ec085000b28709847b8aab1ac51f84e94b37ca1b66").raw, SEED_SIZE).asOpaque());
199
200
  });
200
201
  it("should derive from seed: 3", () => {
201
202
  const seed = trivialSeed(tryAsU32(3));
202
203
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
203
204
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
204
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("0746846d17469fb2f95ef365efcab9f4e22fa1feb53111c995376be8019981cc").raw, SEED_SIZE).asOpaque());
205
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("0746846d17469fb2f95ef365efcab9f4e22fa1feb53111c995376be8019981cc").raw, SEED_SIZE).asOpaque());
205
206
  });
206
207
  it("should derive from seed: 4", () => {
207
208
  const seed = trivialSeed(tryAsU32(4));
208
209
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
209
210
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
210
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("151e5c8fe2b9d8a606966a79edd2f9e5db47e83947ce368ccba53bf6ba20a40b").raw, SEED_SIZE).asOpaque());
211
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("151e5c8fe2b9d8a606966a79edd2f9e5db47e83947ce368ccba53bf6ba20a40b").raw, SEED_SIZE).asOpaque());
211
212
  });
212
213
  it("should derive from seed: 5", () => {
213
214
  const seed = trivialSeed(tryAsU32(5));
214
215
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
215
216
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
216
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("2105650944fcd101621fd5bb3124c9fd191d114b7ad936c1d79d734f9f21392e").raw, SEED_SIZE).asOpaque());
217
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("2105650944fcd101621fd5bb3124c9fd191d114b7ad936c1d79d734f9f21392e").raw, SEED_SIZE).asOpaque());
217
218
  });
218
219
  it("should derive from seed: f92d...d9d1", () => {
219
220
  const seed = Bytes.fromBlob(Bytes.parseBlobNoPrefix("f92d680ea3f0ac06307795490d8a03c5c0d4572b5e0a8cffec87e1294855d9d1").raw, SEED_SIZE).asOpaque();
220
221
  const bandersnatch_seed = deriveBandersnatchSecretKey(seed, blake2b);
221
222
  const bandersnatch_public_key = deriveBandersnatchPublicKey(bandersnatch_seed);
222
- assert.deepStrictEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("299bdfd8d615aadd9e6c58718f9893a5144d60e897bc9da1f3d73c935715c650").raw, SEED_SIZE).asOpaque());
223
+ deepEqual(bandersnatch_public_key, Bytes.fromBlob(Bytes.parseBlobNoPrefix("299bdfd8d615aadd9e6c58718f9893a5144d60e897bc9da1f3d73c935715c650").raw, SEED_SIZE).asOpaque());
223
224
  });
224
225
  });
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../../packages/core/hash/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAEzC,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAC;AAE7D,4BAA4B;AAC5B,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE1C,sBAAsB;AACtB,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE3C,yBAAyB;AACzB,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE1C,sBAAsB;AACtB,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAEvD,eAAO,MAAM,SAAS,WAAwB,CAAC;AAE/C;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,KAAK,SAAS,UAAU,EAAE,KAAK,CAAE,SAAQ,SAAS;aAEpD,IAAI,EAAE,KAAK;aACX,IAAI,EAAE,KAAK;gBADX,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK;CAI9B;AAED;;GAEG;AACH,qBAAa,gBAAgB,CAAC,KAAK,SAAS,UAAU,EAAE,KAAK,CAAE,SAAQ,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;aAIzE,OAAO,EAAE,SAAS;gBAFlC,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,EACK,OAAO,EAAE,SAAS;CAIrC"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../../packages/core/hash/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAEzC,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAC;AAE7D,4BAA4B;AAC5B,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE1C,sBAAsB;AACtB,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE3C,yBAAyB;AACzB,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE1C,sBAAsB;AACtB,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAEvD,eAAO,MAAM,SAAS,WAAwB,CAAC;AAE/C;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,KAAK,SAAS,UAAU,EAAE,KAAK,CAAE,SAAQ,SAAS;aAGpD,IAAI,EAAE,KAAK;aACX,IAAI,EAAE,KAAK;gBADX,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK;CAI9B;AAED;;GAEG;AACH,qBAAa,gBAAgB,CAAC,KAAK,SAAS,UAAU,EAAE,KAAK,CAAE,SAAQ,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;aAIzE,OAAO,EAAE,SAAS;gBAFlC,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,EACK,OAAO,EAAE,SAAS;CAIrC"}
@@ -19,6 +19,7 @@ export const ZERO_HASH = Bytes.zero(HASH_SIZE);
19
19
  export class WithHash extends WithDebug {
20
20
  hash;
21
21
  data;
22
+ // TODO [ToDr] use static method and make constructor private
22
23
  constructor(hash, data) {
23
24
  super();
24
25
  this.hash = hash;
@@ -1 +1 @@
1
- {"version":3,"file":"certificate.d.ts","sourceRoot":"","sources":["../../../../../packages/core/networking/certificate.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAezC,oBAAY,eAAe;IACzB,aAAa,IAAI;IACjB,UAAU,IAAI;IACd,qBAAqB,IAAI;IACzB,eAAe,IAAI;IACnB,kBAAkB,IAAI;CACvB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,UAAU,CAAC;CACjB,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAwDvG;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IACtD,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC,CAcD;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,mBAQ5D;AAED,wFAAwF;AACxF,wBAAsB,mBAAmB,CAAC,EACxC,MAAM,EACN,cAAc,EACd,aAAa,EACb,iBAAsB,EACtB,gBAAqB,EACrB,GAAgB,GACjB,EAAE;IACD,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,cAAc,CAAC;IAC9B,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACvD,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACtD,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CA6EhC;AAED,wBAAgB,UAAU,CAAC,aAAa,EAAE,SAAS,UAElD;AACD,wBAAgB,UAAU,CAAC,aAAa,EAAE,UAAU,UAGnD;AA4BD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,UAEnD;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,GAAG,cAAc,CAkBpF"}
1
+ {"version":3,"file":"certificate.d.ts","sourceRoot":"","sources":["../../../../../packages/core/networking/certificate.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAezC,oBAAY,eAAe;IACzB,aAAa,IAAI;IACjB,UAAU,IAAI;IACd,qBAAqB,IAAI;IACzB,eAAe,IAAI;IACnB,kBAAkB,IAAI;CACvB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,UAAU,CAAC;CACjB,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAyDvG;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IACtD,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC,CAcD;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,mBAQ5D;AAED,wFAAwF;AACxF,wBAAsB,mBAAmB,CAAC,EACxC,MAAM,EACN,cAAc,EACd,aAAa,EACb,iBAAsB,EACtB,gBAAqB,EACrB,GAAgB,GACjB,EAAE;IACD,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,cAAc,CAAC;IAC9B,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACvD,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACtD,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CA6EhC;AAED,wBAAgB,UAAU,CAAC,aAAa,EAAE,SAAS,UAElD;AACD,wBAAgB,UAAU,CAAC,aAAa,EAAE,UAAU,UAGnD;AA4BD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,UAEnD;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,GAAG,cAAc,CAkBpF"}
@@ -54,6 +54,7 @@ export async function verifyCertificate(certs) {
54
54
  }
55
55
  const key = Buffer.from(jwk.x ?? "", "base64url");
56
56
  if (!xc.verify(xc.publicKey)) {
57
+ logger.log `Certificate validation failed: incorrect signature`;
57
58
  return Result.error(VerifyCertError.IncorrectSignature, () => "Certificate validation failed: incorrect signature");
58
59
  }
59
60
  const publicKey = Bytes.fromBlob(new Uint8Array(key), ED25519_KEY_BYTES);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typeberry/networking",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "QUIC-based p2p networking.",
5
5
  "license": "MPL-2.0",
6
6
  "author": "Fluffy Labs",
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../../packages/core/networking/setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAgBhE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD,sCAAsC;AACtC,MAAM,MAAM,OAAO,GAAG;IACpB,yBAAyB;IACzB,GAAG,EAAE,WAAW,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAQF,qBAAa,IAAI;IACf,6DAA6D;WAChD,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAkKlF"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../../packages/core/networking/setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAiBhE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD,sCAAsC;AACtC,MAAM,MAAM,OAAO,GAAG;IACpB,yBAAyB;IACzB,GAAG,EAAE,WAAW,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAQF,qBAAa,IAAI;IACf,6DAA6D;WAChD,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAsKlF"}
@@ -3,7 +3,7 @@ import { events, QUICClient, QUICServer, QUICSocket } from "@matrixai/quic";
3
3
  import { BytesBlob } from "#@typeberry/bytes";
4
4
  import { Level, Logger } from "#@typeberry/logger";
5
5
  import { now } from "#@typeberry/utils";
6
- import { altNameRaw, certToPEM, ed25519AsJsonWebKeyPair, generateCertificate, privateKeyToPEM, } from "./certificate.js";
6
+ import { altNameRaw, certToPEM, ed25519AsJsonWebKeyPair, generateCertificate, privateKeyToPEM, verifyCertificate, } from "./certificate.js";
7
7
  import { getQuicClientCrypto, getQuicServerCrypto } from "./crypto.js";
8
8
  import * as metrics from "./metrics.js";
9
9
  import { peerVerification } from "./peer-verification.js";
@@ -34,7 +34,6 @@ export class Quic {
34
34
  subjectKeyPair: keyPair,
35
35
  issuerKeyPair: keyPair,
36
36
  });
37
- const lastConnectedPeer = peerVerification();
38
37
  // QUICConfig
39
38
  const config = {
40
39
  keepAliveIntervalTime: 3000,
@@ -43,7 +42,9 @@ export class Quic {
43
42
  cert: certToPEM(cert),
44
43
  key: privKeyPEM,
45
44
  verifyPeer: true,
46
- verifyCallback: lastConnectedPeer.verifyCallback,
45
+ // Server accepts TLS and verifies the certificate in the connection handler
46
+ // (EventQUICServerConnection). Client overrides this with peerVerification() per dial.
47
+ verifyCallback: async () => undefined,
47
48
  };
48
49
  logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
49
50
  // Shared injected UDP socket
@@ -67,27 +68,30 @@ export class Quic {
67
68
  const conn = ev.detail;
68
69
  const peerAddress = `${conn.remoteHost}:${conn.remotePort}`;
69
70
  networkMetrics.recordConnectingIn(peerAddress);
70
- if (lastConnectedPeer.info === null) {
71
- networkMetrics.recordConnectInFailed("no_peer_info");
71
+ // Verify the peer's certificate and extract peer info.
72
+ const remoteCerts = conn.getRemoteCertsChain();
73
+ const verification = await verifyCertificate(remoteCerts);
74
+ if (verification.isError) {
75
+ networkMetrics.recordConnectInFailed("cert_verification_failed");
72
76
  await conn.stop();
73
77
  return;
74
78
  }
75
- if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
79
+ const peerInfo = verification.ok;
80
+ if (peerInfo.key.isEqualTo(key.pubKey)) {
76
81
  logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
77
82
  networkMetrics.recordConnectionRefused(peerAddress);
78
83
  await conn.stop({ isApp: true, errorCode: CloseReason.ConnectionFromOurself });
79
84
  return;
80
85
  }
81
- if (peers.isConnected(lastConnectedPeer.info.id)) {
82
- logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
86
+ if (peers.isConnected(peerInfo.id)) {
87
+ logger.log `🛜 Rejecting duplicate connection with peer ${peerInfo.id} from ${conn.remoteHost}:${conn.remotePort}`;
83
88
  networkMetrics.recordConnectionRefused(peerAddress);
84
- await conn.stop({ isApp: true, errorCode: CloseReason.DuplicateConnection });
89
+ await conn.stop({ isApp: true, errorCode: CloseReason.DuplicateConnection, force: false });
85
90
  return;
86
91
  }
87
92
  logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
88
- newPeer(conn, lastConnectedPeer.info, "in");
89
- networkMetrics.recordConnectedIn(lastConnectedPeer.info.id);
90
- lastConnectedPeer.info = null;
93
+ newPeer(conn, peerInfo, "in");
94
+ networkMetrics.recordConnectedIn(peerInfo.id);
91
95
  await conn.start();
92
96
  });
93
97
  // connecting to a peer
@@ -5,12 +5,16 @@ export type WithBytesRepresentation<Bytes extends number> = {
5
5
  export type FixedSizeNumber<Bytes extends number> = number & WithBytesRepresentation<Bytes>;
6
6
  /** Unsigned integer that can be represented as one byte. */
7
7
  export type U8 = FixedSizeNumber<1>;
8
+ export declare const MAX_VALUE_U8 = 255;
8
9
  /** Unsigned integer that can be represented as two bytes. */
9
10
  export type U16 = FixedSizeNumber<2>;
11
+ export declare const MAX_VALUE_U16 = 65535;
10
12
  /** Unsigned integer that can be represented as 4 bytes. */
11
13
  export type U32 = FixedSizeNumber<4>;
14
+ export declare const MAX_VALUE_U32 = 4294967295;
12
15
  /** Unsigned integer that can be represented as 8 bytes. */
13
16
  export type U64 = bigint & WithBytesRepresentation<8>;
17
+ export declare const MAX_VALUE_U64 = 18446744073709551615n;
14
18
  /** Attempt to cast an input number into U8. */
15
19
  export declare const tryAsU8: (v: number) => U8;
16
20
  /** Check if given number is a valid U8 number. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,MAAM,CAAC;AAE7D,MAAM,MAAM,uBAAuB,CAAC,KAAK,SAAS,MAAM,IAAI;IAC1D,QAAQ,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,CAAC;CAC5C,CAAC;AAKF,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,IAAI,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAE5F,4DAA4D;AAC5D,MAAM,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAEpC,6DAA6D;AAC7D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAErC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAErC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAGtD,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,EAGnC,CAAC;AACF,kDAAkD;AAClD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,EAA8B,CAAC;AAErE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAsC,CAAC;AAE9E,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,GAI7C,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,kBAAkB;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,KAAG,GAG3E,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,GAAG,GAAG,KAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAS7D,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAGxD;AAED,iFAAiF;AACjF,eAAO,MAAM,MAAM,GAAI,GAAG,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,KAAG,GAAoE,CAAC;AAEvH,gFAAgF;AAChF,eAAO,MAAM,MAAM,GAAI,GAAG,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,KAAG,GAAoE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/numbers/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,MAAM,CAAC;AAE7D,MAAM,MAAM,uBAAuB,CAAC,KAAK,SAAS,MAAM,IAAI;IAC1D,QAAQ,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,CAAC;CAC5C,CAAC;AAKF,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,IAAI,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAE5F,4DAA4D;AAC5D,MAAM,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACpC,eAAO,MAAM,YAAY,MAAO,CAAC;AACjC,6DAA6D;AAC7D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACrC,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AACrC,eAAO,MAAM,aAAa,aAAc,CAAC;AACzC,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACtD,eAAO,MAAM,aAAa,wBAAyB,CAAC;AAEpD,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,EAGnC,CAAC;AACF,kDAAkD;AAClD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,EAA8B,CAAC;AAErE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,GAGpC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAsC,CAAC;AAE9E,gDAAgD;AAChD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,GAI7C,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,CAAC,IAAI,GAAgC,CAAC;AAExE,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,kBAAkB;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,KAAG,GAG3E,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,YAAY,GAAI,GAAG,GAAG,KAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAS7D,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;;;EAWtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAGxD;AAED,iFAAiF;AACjF,eAAO,MAAM,MAAM,GAAI,GAAG,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,KAAG,GAAoE,CAAC;AAEvH,gFAAgF;AAChF,eAAO,MAAM,MAAM,GAAI,GAAG,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,KAAG,GAAoE,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { check } from "#@typeberry/utils";
2
2
  const asTypedNumber = (v) => v;
3
- const MAX_VALUE_U8 = 0xff;
4
- const MAX_VALUE_U16 = 0xffff;
5
- const MAX_VALUE_U32 = 0xffff_ffff;
6
- const MAX_VALUE_U64 = 0xffffffffffffffffn;
3
+ export const MAX_VALUE_U8 = 0xff;
4
+ export const MAX_VALUE_U16 = 0xffff;
5
+ export const MAX_VALUE_U32 = 0xffff_ffff;
6
+ export const MAX_VALUE_U64 = 0xffffffffffffffffn;
7
7
  /** Attempt to cast an input number into U8. */
8
8
  export const tryAsU8 = (v) => {
9
9
  check `${isU8(v)} input must have one-byte representation, got ${v}`;
@@ -1,11 +1,11 @@
1
1
  import { PvmBackend } from "#@typeberry/config";
2
2
  import { tryAsGas } from "#@typeberry/pvm-interface";
3
- import { HostCalls } from "./host-calls.js";
4
- import { HostCallsManager, NoopMissing } from "./host-calls-manager.js";
5
- import { InterpreterInstanceManager } from "./interpreter-instance-manager.js";
6
- const hostCalls = new HostCallsManager({ missing: new NoopMissing(), handlers: [] });
7
- const pvmInstanceManager = await InterpreterInstanceManager.new(PvmBackend.BuiltIn);
8
- const pvmHostCallExtension = new HostCalls(pvmInstanceManager, hostCalls);
3
+ import { HostCalls, NoopMissing } from "./host-calls.js";
4
+ import { HostCallsExecutor } from "./host-calls-executor.js";
5
+ import { PvmInstanceManager } from "./pvm-instance-manager.js";
6
+ const hostCalls = new HostCalls({ missing: new NoopMissing(), handlers: [] });
7
+ const pvmInstanceManager = await PvmInstanceManager.new(PvmBackend.BuiltIn);
8
+ const pvmHostCallExtension = new HostCallsExecutor(pvmInstanceManager, hostCalls);
9
9
  const program = new Uint8Array([
10
10
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x1, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xd9, 0x5, 0x12,
11
11
  0x0, 0x0, 0x0, 0x5, 0x11, 0x0, 0x0, 0x0, 0x5, 0xa3, 0x0, 0x0, 0x0, 0x5, 0xc6, 0x0, 0x4, 0x7, 0x13, 0x0, 0x2, 0x11,
@@ -0,0 +1,32 @@
1
+ import type { U32, U64 } from "#@typeberry/numbers";
2
+ import type { RegisterIndex } from "#@typeberry/pvm-interpreter";
3
+ /**
4
+ * Interface for tracking PVM I/O operations during host call execution.
5
+ *
6
+ * Implementations record memory reads/writes and register modifications
7
+ * for debugging, tracing, or replay purposes.
8
+ */
9
+ export interface IoTracker {
10
+ /** Record a register write operation. */
11
+ setReg(idx: number, val: U64): void;
12
+ /** Record a memory read operation. */
13
+ memRead(address: U32, data: Uint8Array): void;
14
+ /** Record a memory write operation. */
15
+ memWrite(address: U32, data: Uint8Array): void;
16
+ /** Clear all recorded operations. */
17
+ clear(): void;
18
+ }
19
+ /** Create a no-op tracker that discards all operations. */
20
+ export declare function noopTracker(): NoopIoTracker;
21
+ /**
22
+ * No-op implementation that discards all tracked operations.
23
+ * Used when I/O tracing is disabled.
24
+ */
25
+ declare class NoopIoTracker implements IoTracker {
26
+ clear(): void;
27
+ setReg(_idx: RegisterIndex, _val: U64): void;
28
+ memRead(_address: U32, _data: Uint8Array): void;
29
+ memWrite(_address: U32, _data: Uint8Array): void;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=ecalli-io-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecalli-io-tracker.d.ts","sourceRoot":"","sources":["../../../../../packages/core/pvm-host-calls/ecalli-io-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACpC,sCAAsC;IACtC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9C,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/C,qCAAqC;IACrC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,kBAE1B;AAED;;;GAGG;AACH,cAAM,aAAc,YAAW,SAAS;IACtC,KAAK,IAAI,IAAI;IACb,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAC5C,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAC/C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;CACjD"}
@@ -0,0 +1,14 @@
1
+ /** Create a no-op tracker that discards all operations. */
2
+ export function noopTracker() {
3
+ return new NoopIoTracker();
4
+ }
5
+ /**
6
+ * No-op implementation that discards all tracked operations.
7
+ * Used when I/O tracing is disabled.
8
+ */
9
+ class NoopIoTracker {
10
+ clear() { }
11
+ setReg(_idx, _val) { }
12
+ memRead(_address, _data) { }
13
+ memWrite(_address, _data) { }
14
+ }
@@ -0,0 +1,139 @@
1
+ import type { U32, U64 } from "#@typeberry/numbers";
2
+ import type { Gas } from "#@typeberry/pvm-interface";
3
+ import type { IoTracker } from "./ecalli-io-tracker.js";
4
+ import type { HostCallIndex } from "./host-call-handler.js";
5
+ import type { HostCallRegisters } from "./host-call-registers.js";
6
+ /**
7
+ * Output function type for IO trace logging.
8
+ * Each call should output a single line.
9
+ */
10
+ export type IoTraceOutput = (line: string) => void;
11
+ /**
12
+ * Ecalli PVM IO Trace Logger.
13
+ *
14
+ * Implements the logging format specified for PVM execution tracing.
15
+ * This format is designed to be:
16
+ * - Human-readable, newline-delimited text
17
+ * - Self-contained for stateless re-execution
18
+ * - Comparable using simple textual diff tools
19
+ *
20
+ * @see https://github.com/tomusdrw/JIPs/pull/2
21
+ */
22
+ export declare class EcalliTraceLogger {
23
+ private readonly output;
24
+ /** Returns a tracker for IO operations. */
25
+ tracker(): IoTraceTracker | null;
26
+ /**
27
+ * Create an IoTraceLogger that outputs to the `ecalli` module logger.
28
+ *
29
+ * Returns `null` if the `ecalli` logger is not configured for at least TRACE level.
30
+ * Enable with: `JAM_LOG=ecalli=trace` or `JAM_LOG=trace`
31
+ */
32
+ static create(): EcalliTraceLogger | null;
33
+ /**
34
+ * Create a no-op IoTraceLogger that discards all output.
35
+ * Used when tracing is disabled.
36
+ */
37
+ static noop(): EcalliTraceLogger;
38
+ static new(output: IoTraceOutput): EcalliTraceLogger;
39
+ private constructor();
40
+ /**
41
+ * Log optional context lines (implementation metadata, execution environment).
42
+ */
43
+ logContext(context: string): void;
44
+ /**
45
+ * Log the program blob being executed and the write data (if any)
46
+ *
47
+ * Format: `program {hex-encoded-program-with-metadata}`
48
+ * Format: `memwrite {hex-encoded-address} len={blob-byte-length} <- {hex-encoded-bytes}`
49
+ */
50
+ logProgram(program: Uint8Array, args: Uint8Array): void;
51
+ /**
52
+ * Log initial execution state (prelude).
53
+ *
54
+ * Format: `start pc={pc} gas={gas} {register-dump}`
55
+ */
56
+ logStart(pc: number, gas: Gas, registers: HostCallRegisters): void;
57
+ /**
58
+ * Log ecalli invocation with register dump.
59
+ *
60
+ * Format: `ecalli={index} pc={pc} gas={gas} {register-dump}`
61
+ */
62
+ logEcalli(index: HostCallIndex, pc: number, gas: Gas, registers: HostCallRegisters): void;
63
+ /**
64
+ * Log memory read operation.
65
+ *
66
+ * Format: `memread {hex-encoded-address} len={blob-byte-length} -> {hex-encoded-data-read}`
67
+ */
68
+ logMemRead(address: number, len: number, data: string): void;
69
+ /**
70
+ * Log memory write operation.
71
+ *
72
+ * Format: `memwrite {hex-encoded-address} len={blob-byte-length} <- {hex-encoded-bytes}`
73
+ */
74
+ logMemWrite(address: number, len: number, data: string): void;
75
+ /**
76
+ * Log register write operation.
77
+ *
78
+ * Format: `setreg r{idx} <- {hex-encoded-value}`
79
+ */
80
+ logSetReg(index: number, value: bigint): void;
81
+ /**
82
+ * Log gas overwrite operation.
83
+ *
84
+ * Format: `setgas <- {gas}`
85
+ */
86
+ logSetGas(gas: Gas): void;
87
+ /**
88
+ * Log all host actions from a single ecalli invocation.
89
+ * Actions are logged in the order specified by JIP-6:
90
+ * 1. Memory reads (sorted by address)
91
+ * 2. Memory writes (sorted by address)
92
+ * 3. Register writes (sorted by index)
93
+ * 4. Gas overwrite
94
+ */
95
+ logHostActions(ioTracker: IoTraceTracker | null, gasBefore: Gas, gasAfter: Gas): void;
96
+ /**
97
+ * Log PANIC termination.
98
+ *
99
+ * Format: `PANIC={argument} pc={pc} gas={gas} {register-dump}`
100
+ */
101
+ logPanic(argument: number, pc: number, gas: Gas, registers: HostCallRegisters): void;
102
+ /**
103
+ * Log OOG (out of gas) termination.
104
+ *
105
+ * Format: `OOG pc={pc} gas={gas} {register-dump}`
106
+ */
107
+ logOog(pc: number, gas: Gas, registers: HostCallRegisters): void;
108
+ /**
109
+ * Log HALT termination.
110
+ *
111
+ * Format: `HALT pc={pc} gas={gas} {register-dump}`
112
+ */
113
+ logHalt(pc: number, gas: Gas, registers: HostCallRegisters): void;
114
+ }
115
+ type MemoryOperation = {
116
+ address: number;
117
+ hex: string;
118
+ len: number;
119
+ };
120
+ /**
121
+ * IoTracker implementation that records all I/O operations for trace logging.
122
+ *
123
+ * Stores memory reads, writes, and register modifications as hex-encoded strings
124
+ * for output via IoTraceLogger.
125
+ */
126
+ export declare class IoTraceTracker implements IoTracker {
127
+ /** Recorded memory read operations (address + hex data + len). */
128
+ reads: MemoryOperation[];
129
+ /** Recorded memory write operations (address + hex data + len). */
130
+ writes: MemoryOperation[];
131
+ /** Recorded register write operations (index -> value). */
132
+ registers: Map<number, U64>;
133
+ setReg(idx: number, val: U64): void;
134
+ memRead(address: U32, data: Uint8Array): void;
135
+ memWrite(address: U32, data: Uint8Array): void;
136
+ clear(): void;
137
+ }
138
+ export {};
139
+ //# sourceMappingURL=ecalli-trace-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecalli-trace-logger.d.ts","sourceRoot":"","sources":["../../../../../packages/core/pvm-host-calls/ecalli-trace-logger.ts"],"names":[],"mappings":"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"}