@zkasm/zkevm-rom 0.0.1-security → 6.0.1

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.

Potentially problematic release.


This version of @zkasm/zkevm-rom might be problematic. Click here for more details.

Files changed (232) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.github/CODEOWNERS +14 -0
  3. package/.github/ISSUE_TEMPLATE/bug.yml +38 -0
  4. package/.github/ISSUE_TEMPLATE/feature.yml +26 -0
  5. package/.github/ISSUE_TEMPLATE/question.yml +26 -0
  6. package/.github/workflows/main.yaml +40 -0
  7. package/LICENSE +636 -0
  8. package/README.md +23 -5
  9. package/audits/Hexens_Polygon_zkEVM_PUBLIC_27.02.23.pdf +0 -0
  10. package/audits/Polygon-zkEVM-Public-v1.1-verichains-19-03-2024.pdf +0 -0
  11. package/audits/zkEVM-ROM-upgrade-1-Spearbit-30-May.pdf +0 -0
  12. package/audits/zkEVM-ROM-upgrade-2-Spearbit-21-August.pdf +0 -0
  13. package/audits/zkEVM-engagement-1-Spearbit-27-March.pdf +0 -0
  14. package/audits/zkEVM-engagement-2-Spearbit-27-March.pdf +0 -0
  15. package/audits/zkEVM-engagement-3-Spearbit-6-April.pdf +0 -0
  16. package/counters/README.md +45 -0
  17. package/counters/counters-executor.js +80 -0
  18. package/counters/countersConstants.zkasm +370 -0
  19. package/counters/endIncludes.zkasm +18 -0
  20. package/counters/initIncludes.zkasm +2 -0
  21. package/counters/tests/MLOAD32.zkasm +27 -0
  22. package/counters/tests/MLOADX.zkasm +30 -0
  23. package/counters/tests/MSTORE32.zkasm +32 -0
  24. package/counters/tests/MSTOREX.zkasm +36 -0
  25. package/counters/tests/SHLarith.zkasm +28 -0
  26. package/counters/tests/SHLarithBit.zkasm +28 -0
  27. package/counters/tests/SHRarith.zkasm +28 -0
  28. package/counters/tests/SHRarithBit.zkasm +28 -0
  29. package/counters/tests/abs.zkasm +29 -0
  30. package/counters/tests/addBatchHashByteByByte.zkasm +31 -0
  31. package/counters/tests/computeGasSendCall.zkasm +30 -0
  32. package/counters/tests/divArith.zkasm +27 -0
  33. package/counters/tests/expAD.zkasm +30 -0
  34. package/counters/tests/getLenBits.zkasm +30 -0
  35. package/counters/tests/getLenBytes.zkasm +32 -0
  36. package/counters/tests/isEmptyAccount.zkasm +30 -0
  37. package/counters/tests/mulARITH.zkasm +28 -0
  38. package/counters/tests/offsetUtil.zkasm +29 -0
  39. package/counters/tests/opADDMOD.zkasm +28 -0
  40. package/counters/tests/opAdd.zkasm +27 -0
  41. package/counters/tests/opBLOCKHASH.zkasm +28 -0
  42. package/counters/tests/opCALL.zkasm +41 -0
  43. package/counters/tests/opCALLCODE.zkasm +41 -0
  44. package/counters/tests/opCALLDATACOPY.zkasm +28 -0
  45. package/counters/tests/opCALLDATALOAD.zkasm +27 -0
  46. package/counters/tests/opCODECOPY.zkasm +28 -0
  47. package/counters/tests/opCREATE.zkasm +35 -0
  48. package/counters/tests/opCREATE2.zkasm +35 -0
  49. package/counters/tests/opDELEGATECALL.zkasm +35 -0
  50. package/counters/tests/opDIV.zkasm +27 -0
  51. package/counters/tests/opEXP.zkasm +29 -0
  52. package/counters/tests/opEXTCODECOPY.zkasm +29 -0
  53. package/counters/tests/opMOD.zkasm +27 -0
  54. package/counters/tests/opMUL.zkasm +27 -0
  55. package/counters/tests/opMULMOD.zkasm +28 -0
  56. package/counters/tests/opRETURN.zkasm +32 -0
  57. package/counters/tests/opRETURNDATACOPY.zkasm +29 -0
  58. package/counters/tests/opREVERT.zkasm +32 -0
  59. package/counters/tests/opSDIV.zkasm +28 -0
  60. package/counters/tests/opSHA3.zkasm +28 -0
  61. package/counters/tests/opSIGNEXTEND.zkasm +27 -0
  62. package/counters/tests/opSMOD.zkasm +28 -0
  63. package/counters/tests/opSTATICCALL.zkasm +35 -0
  64. package/counters/tests/opSUB.zkasm +27 -0
  65. package/counters/tests/saveMem.zkasm +31 -0
  66. package/docs/opcode-cost-zk-counters.md +315 -0
  67. package/docs/usage-ecrecover.md +51 -0
  68. package/index.js +43 -0
  69. package/main/block-info.zkasm +204 -0
  70. package/main/constants.zkasm +145 -0
  71. package/main/ecrecover/addFpEc.zkasm +31 -0
  72. package/main/ecrecover/checkSqrtFpEc.zkasm +1558 -0
  73. package/main/ecrecover/constEc.zkasm +13 -0
  74. package/main/ecrecover/ecrecover.zkasm +280 -0
  75. package/main/ecrecover/invFnEc.zkasm +44 -0
  76. package/main/ecrecover/invFpEc.zkasm +45 -0
  77. package/main/ecrecover/mulFnEc.zkasm +36 -0
  78. package/main/ecrecover/mulFpEc.zkasm +36 -0
  79. package/main/ecrecover/mulPointEc.zkasm +311 -0
  80. package/main/ecrecover/sqFpEc.zkasm +38 -0
  81. package/main/ecrecover/sqrtFpEc.zkasm +70 -0
  82. package/main/end.zkasm +4 -0
  83. package/main/l2-tx-hash.zkasm +159 -0
  84. package/main/load-change-l2-block-utils.zkasm +11 -0
  85. package/main/load-change-l2-block.zkasm +28 -0
  86. package/main/load-tx-rlp-utils.zkasm +72 -0
  87. package/main/load-tx-rlp.zkasm +431 -0
  88. package/main/main.zkasm +237 -0
  89. package/main/map-opcodes.zkasm +274 -0
  90. package/main/modexp/array_lib/array_add_AGTB.zkasm +123 -0
  91. package/main/modexp/array_lib/array_add_short.zkasm +85 -0
  92. package/main/modexp/array_lib/array_div.zkasm +215 -0
  93. package/main/modexp/array_lib/array_div_long.zkasm +284 -0
  94. package/main/modexp/array_lib/array_div_short.zkasm +222 -0
  95. package/main/modexp/array_lib/array_mul.zkasm +97 -0
  96. package/main/modexp/array_lib/array_mul_long.zkasm +156 -0
  97. package/main/modexp/array_lib/array_mul_short.zkasm +127 -0
  98. package/main/modexp/array_lib/array_square.zkasm +246 -0
  99. package/main/modexp/array_lib/unused/array_add.zkasm +100 -0
  100. package/main/modexp/array_lib/unused/array_is_odd.zkasm +23 -0
  101. package/main/modexp/array_lib/unused/array_is_one.zkasm +33 -0
  102. package/main/modexp/array_lib/unused/array_is_zero.zkasm +34 -0
  103. package/main/modexp/array_lib/unused/array_sub_AGTB.zkasm +111 -0
  104. package/main/modexp/array_lib/unused/array_unshift.zkasm +37 -0
  105. package/main/modexp/array_lib/utils/array_compare.zkasm +82 -0
  106. package/main/modexp/array_lib/utils/array_trim.zkasm +49 -0
  107. package/main/modexp/constants.zkasm +5 -0
  108. package/main/modexp/modexp.zkasm +296 -0
  109. package/main/modexp/modexp_utils.zkasm +230 -0
  110. package/main/opcodes/arithmetic.zkasm +357 -0
  111. package/main/opcodes/block.zkasm +163 -0
  112. package/main/opcodes/calldata-returndata-code.zkasm +619 -0
  113. package/main/opcodes/comparison.zkasm +446 -0
  114. package/main/opcodes/context-information.zkasm +169 -0
  115. package/main/opcodes/create-terminate-context.zkasm +1011 -0
  116. package/main/opcodes/crypto.zkasm +96 -0
  117. package/main/opcodes/flow-control.zkasm +126 -0
  118. package/main/opcodes/logs.zkasm +193 -0
  119. package/main/opcodes/stack-operations.zkasm +658 -0
  120. package/main/opcodes/storage-memory.zkasm +313 -0
  121. package/main/pairings/BN254/addPointBN254.zkasm +245 -0
  122. package/main/pairings/BN254/ecAdd.zkasm +312 -0
  123. package/main/pairings/BN254/ecMul.zkasm +159 -0
  124. package/main/pairings/BN254/escalarMulBN254.zkasm +155 -0
  125. package/main/pairings/BN254/lineDiffPointsBN254.zkasm +83 -0
  126. package/main/pairings/BN254/lineSamePointsBN254.zkasm +96 -0
  127. package/main/pairings/FP12BN254/CYCLOFP12BN254/compressFp12BN254.zkasm +49 -0
  128. package/main/pairings/FP12BN254/CYCLOFP12BN254/decompressFp12BN254.zkasm +236 -0
  129. package/main/pairings/FP12BN254/CYCLOFP12BN254/expByXCompCycloFp12BN254.zkasm +444 -0
  130. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCompCycloFp12BN254.zkasm +212 -0
  131. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCycloFp12BN254.zkasm +228 -0
  132. package/main/pairings/FP12BN254/CYCLOFP12BN254/xBinDecompBN254.zkasm +64 -0
  133. package/main/pairings/FP12BN254/frob2Fp12BN254.zkasm +80 -0
  134. package/main/pairings/FP12BN254/frob3Fp12BN254.zkasm +96 -0
  135. package/main/pairings/FP12BN254/frobFp12BN254.zkasm +96 -0
  136. package/main/pairings/FP12BN254/inverseFp12BN254.zkasm +289 -0
  137. package/main/pairings/FP12BN254/mulFp12BN254.zkasm +408 -0
  138. package/main/pairings/FP12BN254/sparseMulAFp12BN254.zkasm +296 -0
  139. package/main/pairings/FP12BN254/sparseMulBFp12BN254.zkasm +291 -0
  140. package/main/pairings/FP12BN254/squareFp12BN254.zkasm +376 -0
  141. package/main/pairings/FP2BN254/addFp2BN254.zkasm +19 -0
  142. package/main/pairings/FP2BN254/escalarMulFp2BN254.zkasm +20 -0
  143. package/main/pairings/FP2BN254/invFp2BN254.zkasm +66 -0
  144. package/main/pairings/FP2BN254/mulFp2BN254.zkasm +19 -0
  145. package/main/pairings/FP2BN254/squareFp2BN254.zkasm +21 -0
  146. package/main/pairings/FP2BN254/subFp2BN254.zkasm +19 -0
  147. package/main/pairings/FP4BN254/squareFp4BN254.zkasm +76 -0
  148. package/main/pairings/FP6BN254/addFp6BN254.zkasm +59 -0
  149. package/main/pairings/FP6BN254/escalarMulFp6BN254.zkasm +51 -0
  150. package/main/pairings/FP6BN254/inverseFp6BN254.zkasm +208 -0
  151. package/main/pairings/FP6BN254/mulFp6BN254.zkasm +201 -0
  152. package/main/pairings/FP6BN254/sparseMulAFp6BN254.zkasm +65 -0
  153. package/main/pairings/FP6BN254/sparseMulBFp6BN254.zkasm +134 -0
  154. package/main/pairings/FP6BN254/sparseMulCFp6BN254.zkasm +128 -0
  155. package/main/pairings/FP6BN254/squareFp6BN254.zkasm +147 -0
  156. package/main/pairings/FP6BN254/subFp6BN254.zkasm +59 -0
  157. package/main/pairings/FPBN254/addFpBN254.zkasm +29 -0
  158. package/main/pairings/FPBN254/invFpBN254.zkasm +55 -0
  159. package/main/pairings/FPBN254/mulFpBN254.zkasm +29 -0
  160. package/main/pairings/FPBN254/reduceFpBN254.zkasm +25 -0
  161. package/main/pairings/FPBN254/squareFpBN254.zkasm +31 -0
  162. package/main/pairings/FPBN254/subFpBN254.zkasm +36 -0
  163. package/main/pairings/FRBN254/reduceFrBN254.zkasm +25 -0
  164. package/main/pairings/constants.zkasm +62 -0
  165. package/main/pairings/ecPairing.zkasm +244 -0
  166. package/main/pairings/finalExpBN254.zkasm +2095 -0
  167. package/main/pairings/halfPairingBN254.zkasm +428 -0
  168. package/main/pairings/loopLengthBN254.zkasm +75 -0
  169. package/main/pairings/millerLoopBN254.zkasm +741 -0
  170. package/main/pairings/pairingBN254.zkasm +481 -0
  171. package/main/pairings/unused/addFp12BN254.zkasm +130 -0
  172. package/main/pairings/unused/expByXCycloFp12BN254.zkasm +411 -0
  173. package/main/pairings/unused/expFp12BN254.zkasm +333 -0
  174. package/main/pairings/unused/subFp12BN254.zkasm +130 -0
  175. package/main/pairings/unused/xPseudoBinDecompBN254.zkasm +68 -0
  176. package/main/pairings/utilsTests/expCycloFp12BN254.zkasm +334 -0
  177. package/main/precompiled/end.zkasm +42 -0
  178. package/main/precompiled/identity.zkasm +99 -0
  179. package/main/precompiled/pre-ecAdd.zkasm +84 -0
  180. package/main/precompiled/pre-ecMul.zkasm +82 -0
  181. package/main/precompiled/pre-ecPairing.zkasm +72 -0
  182. package/main/precompiled/pre-ecrecover.zkasm +71 -0
  183. package/main/precompiled/pre-modexp.zkasm +367 -0
  184. package/main/precompiled/pre-sha2-256.zkasm +125 -0
  185. package/main/precompiled/revert-precompiled.zkasm +25 -0
  186. package/main/precompiled/selector.zkasm +77 -0
  187. package/main/process-change-l2-block.zkasm +147 -0
  188. package/main/process-tx.zkasm +587 -0
  189. package/main/tables/2-exp.zkasm +260 -0
  190. package/main/touched.zkasm +118 -0
  191. package/main/utils.zkasm +2335 -0
  192. package/main/vars.zkasm +117 -0
  193. package/package.json +62 -3
  194. package/test/bytes-length.zkasm +39 -0
  195. package/test/ecrecover.zkasm +538 -0
  196. package/test/lt4-test.zkasm +38 -0
  197. package/test/mstorex.zkasm +191 -0
  198. package/test/opcalldatacopy.ignore.zkasm +331 -0
  199. package/test/performance/read-push.zkasm +71 -0
  200. package/test/read-push.zkasm +304 -0
  201. package/test/testArrayArith.zkasm +1099 -0
  202. package/test/testArrayUtils.zkasm +335 -0
  203. package/test/testCycloFp12ArithBN254.zkasm +548 -0
  204. package/test/testEcAdd.zkasm +252 -0
  205. package/test/testEcMul.zkasm +231 -0
  206. package/test/testEcPairing.zkasm +436 -0
  207. package/test/testFinalExpBn254.zkasm +139 -0
  208. package/test/testFp12ArithBN254.zkasm +692 -0
  209. package/test/testFp2ArithBN254.zkasm +185 -0
  210. package/test/testFp4ArithBN254.zkasm +128 -0
  211. package/test/testFp6ArithBN254.zkasm +260 -0
  212. package/test/testFpArithBN254.zkasm +159 -0
  213. package/test/testFrArithBN254.zkasm +113 -0
  214. package/test/testHalfPairingBN254.zkasm +285 -0
  215. package/test/testModExp.zkasm +586 -0
  216. package/test/testModExpReturn.zkasm +81 -0
  217. package/test/testPairingBN254.zkasm +463 -0
  218. package/test/testPointArithBN254.zkasm +270 -0
  219. package/test/testSHA256.zkasm +27 -0
  220. package/test/touched-assert.zkasm +59 -0
  221. package/test/utils-expAD.zkasm +48 -0
  222. package/test/utils-getLenBytes.zkasm +36 -0
  223. package/tools/audit-tools/registry-op-checker.js +71 -0
  224. package/tools/get-not-used-labels.js +31 -0
  225. package/tools/helpers/helpers.js +47 -0
  226. package/tools/modexp-utils/README.md +5 -0
  227. package/tools/modexp-utils/modexp-test-gen.js +168 -0
  228. package/tools/modexp-utils/modexp-test-int.sage +37 -0
  229. package/tools/parallel-testing/checker.sh +6 -0
  230. package/tools/parallel-testing/gen-parallel-tests.js +78 -0
  231. package/tools/parallel-testing/parallel-tests-sample/sample.test.js +136 -0
  232. package/tools/run-tests-zkasm.js +83 -0
@@ -0,0 +1,357 @@
1
+
2
+ /**
3
+ * @link [https://www.evm.codes/#01?fork=berlin]
4
+ * @zk-counters
5
+ * - 20 steps
6
+ * - 1 binary
7
+ * @process-opcode
8
+ * - stack input: [a, b]
9
+ * - stack output: [a + b]
10
+ */
11
+ opADD:
12
+ ; checks zk-counters
13
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
14
+ %MAX_CNT_BINARY - CNT_BINARY - 1 :JMPN(outOfCountersBinary)
15
+
16
+ ; check stack underflow
17
+ SP - 2 :JMPN(stackUnderflow)
18
+
19
+ ; check out-of-gas
20
+ GAS - %GAS_FASTEST_STEP => GAS :JMPN(outOfGas)
21
+
22
+ ; read two items from the stack
23
+ SP - 1 => SP
24
+ $ => A :MLOAD(SP--) ; [a => A]
25
+ $ => B :MLOAD(SP) ; [b => B]
26
+
27
+ ; call binary:add state machine and push to the stack
28
+ $ :ADD, MSTORE(SP++), JMP(readCode)
29
+
30
+ /**
31
+ * @link [https://www.evm.codes/#02?fork=berlin]
32
+ * @zk-counters
33
+ * - 20 steps
34
+ * @process-opcode
35
+ * - stack input: [a, b]
36
+ * - stack output: [a * b]
37
+ */
38
+ opMUL:
39
+ ; checks zk-counters
40
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
41
+
42
+ ; check stack underflow
43
+ SP - 2 :JMPN(stackUnderflow)
44
+
45
+ ; check out-of-gas
46
+ GAS - %GAS_FAST_STEP => GAS :JMPN(outOfGas)
47
+
48
+ SP - 1 => SP
49
+ $ => A :MLOAD(SP--); [a => A]
50
+ $ => B :MLOAD(SP); [b => B]
51
+ ; Mul operation with Arith
52
+ A :MSTORE(arithA)
53
+ B :MSTORE(arithB), CALL(mulARITH); in: [arithA, arithB] out: [arithRes1: arithA*arithB]
54
+ $ => E :MLOAD(arithRes1)
55
+ E :MSTORE(SP++), JMP(readCode); [a * b(E) => SP]
56
+
57
+ /**
58
+ * @link [https://www.evm.codes/#03?fork=berlin]
59
+ * @zk-counters
60
+ * - 20 steps
61
+ * - 1 binary
62
+ * @process-opcode
63
+ * - stack input: [a, b]
64
+ * - stack output: [a - b]
65
+ */
66
+ opSUB:
67
+ ; checks zk-counters
68
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
69
+ %MAX_CNT_BINARY - CNT_BINARY - 1 :JMPN(outOfCountersBinary)
70
+ ; check stack underflow
71
+ SP - 2 :JMPN(stackUnderflow)
72
+ ; check out-of-gas
73
+ GAS - %GAS_FASTEST_STEP => GAS :JMPN(outOfGas)
74
+ SP - 1 => SP
75
+ $ => A :MLOAD(SP--); [a => A]
76
+ $ => B :MLOAD(SP); [b => B]
77
+ $ => E :SUB
78
+ E :MSTORE(SP++), JMP(readCode); [a - b(E) => SP]
79
+
80
+ /**
81
+ * @link [https://www.evm.codes/#04?fork=berlin]
82
+ * @zk-counters
83
+ * - 20 steps
84
+ * @process-opcode
85
+ * - stack input: [a, b]
86
+ * - stack output: [a / b]
87
+ */
88
+ opDIV:
89
+ ; checks zk-counters
90
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
91
+
92
+ ; check stack underflow
93
+ SP - 2 :JMPN(stackUnderflow)
94
+ ; check out-of-gas
95
+ GAS - %GAS_FAST_STEP => GAS :JMPN(outOfGas)
96
+
97
+ SP - 1 => SP
98
+ $ => E :MLOAD(SP--); [a => E]
99
+ $ => A :MLOAD(SP); [b => A]
100
+ ; Div operation with Arith
101
+ E :MSTORE(arithA)
102
+ A :MSTORE(arithB), CALL(divARITH); in: [arithA, arithB] out: [arithRes1: arithA/arithB, arithRes2: arithA%arithB]
103
+ $ => B :MLOAD(arithRes1)
104
+ B :MSTORE(SP++), JMP(readCode); [a / b(B) => SP]
105
+
106
+ /**
107
+ * @link [https://www.evm.codes/#05?fork=berlin]
108
+ * @zk-counters
109
+ * - 50 steps
110
+ * - 1 binary
111
+ * @process-opcode
112
+ * - stack input: [a, b]
113
+ * - stack output: [a / b]
114
+ */
115
+ opSDIV:
116
+ ; checks zk-counters
117
+ %MAX_CNT_STEPS - STEP - 50 :JMPN(outOfCountersStep)
118
+ %MAX_CNT_BINARY - CNT_BINARY - 1 :JMPN(outOfCountersBinary)
119
+ ; check stack underflow
120
+ SP - 2 :JMPN(stackUnderflow)
121
+ ; check out-of-gas
122
+ GAS - %GAS_FAST_STEP => GAS :JMPN(outOfGas)
123
+
124
+ SP - 1 => SP
125
+ $ => A :MLOAD(SP--), CALL(abs); [a => A]; in: [A: number] out: [A: |A|, B: Sign of A [1 if negative, 0 positive]]
126
+ A => E
127
+ B => C
128
+ $ => A :MLOAD(SP), CALL(abs); [b => A]; in: [A: number] out: [A: |A|, B: Sign of A [1 if negative, 0 positive]]
129
+ ; if is neg (different signs => C != B), jump to sdivneg
130
+ C - B :JMPNZ(SDIVNeg)
131
+ E :MSTORE(arithA)
132
+ A :MSTORE(arithB), CALL(divARITH); in: [arithA, arithB] out: [arithRes1: arithA/arithB, arithRes2: arithA%arithB]
133
+ $ => B :MLOAD(arithRes1)
134
+ B :MSTORE(SP++), JMP(readCode); [a / b(B) => SP]
135
+
136
+ SDIVNeg:
137
+ E :MSTORE(arithA)
138
+ A :MSTORE(arithB), CALL(divARITH); in: [arithA, arithB] out: [arithRes1: arithA/arithB, arithRes2: arithA%arithB]
139
+ $ => B :MLOAD(arithRes1)
140
+ 0 => A
141
+ $ => A :SUB; A - B => A
142
+ A :MSTORE(SP++), JMP(readCode); [a / b(A) => SP]
143
+
144
+ /**
145
+ * @link [https://www.evm.codes/#06?fork=berlin]
146
+ * @zk-counters
147
+ * - 20 steps
148
+ * @process-opcode
149
+ * - stack input: [a, b]
150
+ * - stack output: [a % b]
151
+ */
152
+ opMOD:
153
+ ; checks zk-counters
154
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
155
+ ; check stack underflow
156
+ SP - 2 :JMPN(stackUnderflow)
157
+ ; check out-of-gas
158
+ GAS - %GAS_FAST_STEP => GAS :JMPN(outOfGas)
159
+ SP - 1 => SP
160
+ $ => E :MLOAD(SP--); [a => E]
161
+ $ => A :MLOAD(SP); [b => A]
162
+ ; Mod operation with Arith
163
+ E :MSTORE(arithA)
164
+ A :MSTORE(arithB), CALL(divARITH); in: [arithA, arithB] out: [arithRes1: arithA/arithB, arithRes2: arithA%arithB]
165
+ $ => C :MLOAD(arithRes2)
166
+ C :MSTORE(SP++), JMP(readCode); [a % b(C) => SP]
167
+
168
+ /**
169
+ * @link [https://www.evm.codes/#07?fork=berlin]
170
+ * @zk-counters
171
+ * - 20 steps
172
+ * - 1 binary
173
+ * @process-opcode
174
+ * - stack input: [a, b]
175
+ * - stack output: [a % b]
176
+ */
177
+ opSMOD:
178
+ ; checks zk-counters
179
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
180
+ %MAX_CNT_BINARY - CNT_BINARY - 1 :JMPN(outOfCountersBinary)
181
+ ; check stack underflow
182
+ SP - 2 :JMPN(stackUnderflow)
183
+ ; check out-of-gas
184
+ GAS - %GAS_FAST_STEP => GAS :JMPN(outOfGas)
185
+ SP - 1 => SP
186
+ $ => A :MLOAD(SP--), CALL(abs); [a => A]; in: [A: number] out: [A: |A|, B: Sign of A [1 if negative, 0 positive]]
187
+ A => E
188
+ B => C
189
+ $ => A :MLOAD(SP), CALL(abs); [b => A]; in: [A: number] out: [A: |A|, B: Sign of A [1 if negative, 0 positive]]
190
+ ; Div operation with Arith
191
+ E :MSTORE(arithA)
192
+ A :MSTORE(arithB), CALL(divARITH); in: [arithA, arithB] out: [arithRes1: arithA/arithB, arithRes2: arithA%arithB]
193
+ $ => B :MLOAD(arithRes2)
194
+ ; if a is negative, jump to smodNeg
195
+ -C :JMPN(opSMODNeg)
196
+ B :MSTORE(SP++), JMP(readCode); [a % b(C) => SP]
197
+
198
+ opSMODNeg:
199
+ 0 => A
200
+ $ => A :SUB; A - B => A
201
+ A :MSTORE(SP++), JMP(readCode); [a % b(C) => SP]
202
+
203
+ /**
204
+ * @link [https://www.evm.codes/#08?fork=berlin]
205
+ * @zk-counters
206
+ * - 80 steps
207
+ * - 3 binary
208
+ * - 1 arith
209
+ * @process-opcode
210
+ * - stack input: [a, b, N]
211
+ * - stack output: [(a + b) % N]
212
+ */
213
+ opADDMOD:
214
+ ; checks zk-counters
215
+ %MAX_CNT_STEPS - STEP - 80 :JMPN(outOfCountersStep)
216
+ %MAX_CNT_BINARY - CNT_BINARY - 3 :JMPN(outOfCountersBinary)
217
+ %MAX_CNT_ARITH - CNT_ARITH - 1 :JMPN(outOfCountersArith)
218
+ ; check out-of-gas
219
+ GAS - %GAS_MID_STEP => GAS :JMPN(outOfGas)
220
+ ; check stack underflow
221
+ SP - 3 :JMPN(stackUnderflow)
222
+ SP - 1 => SP
223
+ $ => A :MLOAD(SP--); [a => A]
224
+ $ => B :MLOAD(SP--); [b => B]
225
+ ; Add operation with Arith
226
+ $${var _addMod = A + B}
227
+
228
+ 1 => D
229
+ $ => A :ADD, JMPC(AddModJumpCarry) ; or arith
230
+ 0 => D
231
+
232
+ AddModJumpCarry:
233
+ ; Store sumResult on E
234
+ A => E
235
+ $ => A :MLOAD(SP); [N => A]
236
+ 2 => B
237
+ $ :LT, JMPC(zeroOneAddMod)
238
+ ; k: Max should be (2^256 -1) * 2 / 2 --> smaller than 2^256
239
+ ${_addMod / A} => B
240
+ ; addModResult
241
+ ${_addMod % A} => C
242
+ ; k * N + addModResult = D*2^256 + sumResult
243
+ ; B * A + C = D*2^256 + E
244
+ ; Check addModResult is less than modulus
245
+ E :ARITH
246
+ A => B ; modulus
247
+ C => A ; addModResult
248
+ $ => A :LT
249
+ 1 :ASSERT
250
+ C :MSTORE(SP++), JMP(readCode); [(a + b) % N => SP]
251
+
252
+ zeroOneAddMod:
253
+ 0 :MSTORE(SP++), JMP(readCode); [0 => SP]
254
+
255
+ /**
256
+ * @link [https://www.evm.codes/#09?fork=berlin]
257
+ * @zk-counters
258
+ * - 20 steps
259
+ * @process-opcode
260
+ * - stack input: [a, b, N]
261
+ * - stack output: [(a * b) % N]
262
+ */
263
+ opMULMOD:
264
+ ; checks zk-counters
265
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
266
+ ; check stack underflow
267
+ SP - 3 :JMPN(stackUnderflow)
268
+ ; check out-of-gas
269
+ GAS - %GAS_MID_STEP => GAS :JMPN(outOfGas)
270
+ SP - 1 => SP
271
+
272
+ $ => A :MLOAD(SP--); [a => A]
273
+ $ => B :MLOAD(SP--); [b => B]
274
+ $ => C :MLOAD(SP); [N => C]
275
+ zkPC+1 => RR :JMP(utilMULMOD); in: [A, B, C] out: [C: (A * B) % C]
276
+ C :MSTORE(SP++), JMP(readCode); [C => SP]
277
+
278
+ /**
279
+ * @link [https://www.evm.codes/#0A?fork=berlin]
280
+ * @zk-counters
281
+ * - 20 steps
282
+ * @process-opcode
283
+ * - stack input: [a, exp]
284
+ * - stack output: [a ** exp]
285
+ */
286
+
287
+ opEXP:
288
+ ; checks zk-counters
289
+ %MAX_CNT_STEPS - STEP - 20 :JMPN(outOfCountersStep)
290
+
291
+ ; check stack underflow
292
+ SP - 2 :JMPN(stackUnderflow)
293
+ SP - 1 => SP
294
+
295
+ ; check out-of-gas
296
+ $ => C :MLOAD(SP--); [a => C]
297
+ $ => B :MLOAD(SP); [exp => B]
298
+
299
+ ; check out-of-gas
300
+ :CALL(getLenBytes) ; in: [B: number] out: [A: byte length of B]
301
+ GAS - %GAS_SLOW_STEP - %EXP_BYTE_GAS * A => GAS :JMPN(outOfGas)
302
+
303
+ ; compute exponentiation
304
+ B => D
305
+ C => A
306
+ zkPC+1 => RR :JMP(expAD) ; in: [A, D] out: [A: A ** D]
307
+ A :MSTORE(SP++), JMP(readCode) ; [a ** exp => SP]
308
+
309
+ /**
310
+ * @link [https://www.evm.codes/#0B?fork=berlin]
311
+ * @zk-counters
312
+ * - 100 steps
313
+ * - 6 binary
314
+ * @process-opcode
315
+ * - stack input: [b,x]
316
+ * - stack output: [y]
317
+ */
318
+ opSIGNEXTEND: ; following this impl https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/evm/opcodes/functions.ts#L193
319
+ ; checks zk-counters
320
+ %MAX_CNT_STEPS - STEP - 100 :JMPN(outOfCountersStep)
321
+ %MAX_CNT_BINARY - CNT_BINARY - 6 :JMPN(outOfCountersBinary)
322
+ ; check stack underflow
323
+ SP - 2 :JMPN(stackUnderflow)
324
+ ; check out-of-gas
325
+ GAS - %GAS_FAST_STEP => GAS :JMPN(outOfGas)
326
+ SP - 1 => SP
327
+ $ => B :MLOAD(SP--); [b => B]
328
+ $ => D :MLOAD(SP); [x => D]
329
+ 30 => A
330
+ ; if signByte is 31 or more, means basically let the number as it is
331
+ $ :LT, JMPC(opSIGNEXTENDEnd)
332
+ B * 8 + 7 => D, RR; B is less than 31, no need for binary
333
+ :CALL(@exp_num + RR)
334
+ B => A
335
+ $ => D :MLOAD(SP); [x => D]
336
+ ;Store mask
337
+ 1 => B
338
+ $ => C :SUB ; mask
339
+
340
+ D => B ; number to convert
341
+ $ => B :AND ; check sign bit
342
+ 0 => A
343
+ ; If 0 means the sign bit was 0 --> positive
344
+ $ :EQ, JMPC(opSIGNEXTENDPositive)
345
+ C => A ; mask
346
+ %MAX_UINT_256 => B
347
+ $ => B :XOR ; not mask
348
+ D => A
349
+ $ => D :OR, JMP(opSIGNEXTENDEnd)
350
+
351
+ opSIGNEXTENDPositive:
352
+ C => B
353
+ D => A
354
+ $ => D :AND
355
+
356
+ opSIGNEXTENDEnd:
357
+ D :MSTORE(SP++), JMP(readCode); [D => SP]
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @link [https://www.evm.codes/#40?fork=berlin]
3
+ * @zk-counters
4
+ * - %MAX_CNT_POSEIDON_SLOAD_SSTORE poseidon
5
+ * - 1 keccak
6
+ * - 100 steps
7
+ * @process-opcode
8
+ * - stack input: [blockNumber]
9
+ * - stack output: [hash]
10
+ */
11
+ opBLOCKHASH:
12
+ ; checks zk-counters
13
+ %MAX_CNT_POSEIDON_G - CNT_POSEIDON_G - %MAX_CNT_POSEIDON_SLOAD_SSTORE :JMPN(outOfCountersPoseidon)
14
+ $ => A :MLOAD(cntKeccakPreProcess)
15
+ %MAX_CNT_KECCAK_F - CNT_KECCAK_F - A - 1 :JMPN(outOfCountersKeccak)
16
+ %MAX_CNT_STEPS - STEP - 100 :JMPN(outOfCountersStep)
17
+
18
+ ; check stack underflow
19
+ SP - 1 => SP :JMPN(stackUnderflow)
20
+
21
+ ; check out-of-gas
22
+ GAS - %GAS_EXT_STEP => GAS :JMPN(outOfGas)
23
+
24
+ $ => B :MLOAD(SP) ; [blockNumber => B]
25
+ ; If block number does not exist in the smart contract system, it will return 0
26
+
27
+ ; Create key for the batch hash mapping key
28
+ ; set bytes length to D
29
+ 32 => D
30
+ ; A new hash with position 0 is started
31
+ 0 => HASHPOS
32
+ $ => E :MLOAD(lastHashKIdUsed)
33
+ E+1 => E :MSTORE(lastHashKIdUsed)
34
+ B :HASHK(E)
35
+ %STATE_ROOT_STORAGE_POS :HASHK(E)
36
+ HASHPOS :HASHKLEN(E)
37
+ ; blockhash key = hash(blockNumber, STATE_ROOT_STORAGE_POS)
38
+ $ => C :HASHKDIGEST(E)
39
+ %ADDRESS_SYSTEM => A
40
+ ; set key for smt storage query
41
+ %SMT_KEY_SC_STORAGE => B
42
+ ; storage value in E
43
+ $ => E :SLOAD
44
+ ; store result value in the stack
45
+ E :MSTORE(SP++), JMP(readCode); [hash(E) => SP]
46
+
47
+ /**
48
+ * @link [https://www.evm.codes/#41?fork=berlin]
49
+ * @zk-counters
50
+ * - 10 steps
51
+ * @process-opcode
52
+ * - stack input: []
53
+ * - stack output: [address]
54
+ */
55
+ opCOINBASE:
56
+ ; checks zk-counters
57
+ %MAX_CNT_STEPS - STEP - 10 :JMPN(outOfCountersStep)
58
+
59
+ ; check out-of-gas
60
+ GAS-%GAS_QUICK_STEP => GAS :JMPN(outOfGas)
61
+
62
+ $ => A :MLOAD(sequencerAddr)
63
+ A :MSTORE(SP++); [coinbase address => SP]
64
+ ; check stack overflow
65
+ %MAX_STACK_SIZE - SP :JMPN(stackOverflow, readCode)
66
+
67
+ /**
68
+ * @link [https://www.evm.codes/#42?fork=berlin]
69
+ * @zk-counters
70
+ * - 10 steps
71
+ * @process-opcode
72
+ * - stack input: []
73
+ * - stack output: [timestamp]
74
+ */
75
+ opTIMESTAMP:
76
+ ; checks zk-counters
77
+ %MAX_CNT_STEPS - STEP - 10 :JMPN(outOfCountersStep)
78
+
79
+ ; check out-of-gas
80
+ GAS-%GAS_QUICK_STEP => GAS :JMPN(outOfGas)
81
+ $ => A :MLOAD(timestamp)
82
+ A :MSTORE(SP++); [timestamp => SP]
83
+ ; check stack overflow
84
+ %MAX_STACK_SIZE - SP :JMPN(stackOverflow, readCode)
85
+
86
+ /**
87
+ * @link [https://www.evm.codes/#43?fork=berlin]
88
+ * @zk-counters
89
+ * - 10 steps
90
+ * @process-opcode
91
+ * - stack input: []
92
+ * - stack output: [blockNumber]
93
+ */
94
+ opNUMBER:
95
+ ; checks zk-counters
96
+ %MAX_CNT_STEPS - STEP - 10 :JMPN(outOfCountersStep)
97
+
98
+ ; check out-of-gas
99
+ GAS - %GAS_QUICK_STEP => GAS :JMPN(outOfGas)
100
+ ; Get current block number
101
+ $ => A :MLOAD(blockNum)
102
+ A :MSTORE(SP++); [blockNumber => SP]
103
+ ; check stack overflow
104
+ %MAX_STACK_SIZE - SP :JMPN(stackOverflow, readCode)
105
+
106
+ /**
107
+ * @link [https://www.evm.codes/#44?fork=berlin]
108
+ * @zk-counters
109
+ * - 10 steps
110
+ * @process-opcode
111
+ * - stack input: []
112
+ * - stack output: [difficulty]
113
+ */
114
+ opDIFFICULTY:
115
+ ; checks zk-counters
116
+ %MAX_CNT_STEPS - STEP - 10 :JMPN(outOfCountersStep)
117
+
118
+ ; check out-of-gas
119
+ GAS-%GAS_QUICK_STEP => GAS :JMPN(outOfGas)
120
+ ; No difficulty, always 0
121
+ %BATCH_DIFFICULTY => A
122
+ A :MSTORE(SP++); [difficulty => SP]
123
+ ; check stack overflow
124
+ %MAX_STACK_SIZE - SP :JMPN(stackOverflow, readCode)
125
+
126
+ /**
127
+ * @link [https://www.evm.codes/#45?fork=berlin]
128
+ * @zk-counters
129
+ * - 10 steps
130
+ * @process-opcode
131
+ * - stack input: []
132
+ * - stack output: [gasLimit]
133
+ */
134
+ opGASLIMIT:
135
+ ; checks zk-counters
136
+ %MAX_CNT_STEPS - STEP - 10 :JMPN(outOfCountersStep)
137
+
138
+ ; check out-of-gas
139
+ GAS-%GAS_QUICK_STEP => GAS :JMPN(outOfGas)
140
+ ; constant block gas limit
141
+ %BLOCK_GAS_LIMIT => A
142
+ A :MSTORE(SP++); [gasLimit => SP]
143
+ ; check stack overflow
144
+ %MAX_STACK_SIZE - SP :JMPN(stackOverflow, readCode)
145
+
146
+ /**
147
+ * @link [https://www.evm.codes/#46?fork=berlin]
148
+ * @zk-counters
149
+ * - 10 steps
150
+ * @process-opcode
151
+ * - stack input: []
152
+ * - stack output: [chainId]
153
+ */
154
+ opCHAINID:
155
+ ; checks zk-counters
156
+ %MAX_CNT_STEPS - STEP - 10 :JMPN(outOfCountersStep)
157
+
158
+ ; check out-of-gas
159
+ GAS-%GAS_QUICK_STEP => GAS :JMPN(outOfGas)
160
+ $ => A :MLOAD(chainID)
161
+ A :MSTORE(SP++); [chainId => SP]
162
+ ; check stack overflow
163
+ %MAX_STACK_SIZE - SP :JMPN(stackOverflow, readCode)