浏览代码

add mimc hash function

narodnik 5 年之前
父节点
当前提交
ae181b1da3
共有 10 个文件被更改,包括 850 次插入6 次删除
  1. 6 0
      Cargo.toml
  2. 60 0
      proofs/mimc.psm
  3. 322 0
      proofs/mimc_constants.psm
  4. 5 0
      run_mimc.sh
  5. 6 4
      scripts/preprocess.py
  6. 5 1
      scripts/vm.py
  7. 4 1
      scripts/vm_export_rust.py
  8. 327 0
      src/mimc_constants.rs
  9. 20 0
      src/vm.rs
  10. 95 0
      src/zkmimc.rs

+ 6 - 0
Cargo.toml

@@ -24,6 +24,8 @@ rand_xorshift = "0.2"
 blake2s_simd = "0.5"
 bitvec = "0.18"
 
+hex = "0.4.2"
+
 [[bin]]
 name = "sha256"
 path = "src/sha256.rs"
@@ -76,3 +78,7 @@ path = "src/jubjub.rs"
 name = "bits"
 path = "src/bits.rs"
 
+[[bin]]
+name = "zkmimc"
+path = "src/zkmimc.rs"
+

+ 60 - 0
proofs/mimc.psm

@@ -0,0 +1,60 @@
+{% include 'mimc_constants.psm' %}
+
+contract mimc
+    param left_0
+    param right
+
+    {# Jinja cannot set variables inside loops so use this hack #}
+    {% set ns = namespace(right="right") %}
+
+    {% for i in range(322) %}
+        # Each round perform these steps:
+        # xL, xR := xR + (xL + Ci)^3, xL
+
+        local mimc_const
+        load mimc_const mimc_constant_{{i}}
+
+        private tmp_{{i}}
+        set tmp_{{i}} left_{{i}}
+        add tmp_{{i}} mimc_const
+        square tmp_{{i}}
+
+        lc0_add left_{{i}}
+        lc0_add_one_coeff mimc_constant_{{i}}
+        lc1_add left_{{i}}
+        lc1_add_one_coeff mimc_constant_{{i}}
+        lc2_add tmp_{{i}}
+        enforce
+
+        # new_xL = xR + (xL + Ci)^3
+        # new_xL = xR + tmp * (xL + Ci)
+        # new_xL - xR = tmp * (xL + Ci)
+        private left_{{i+1}}
+        set left_{{i+1}} left_{{i}}
+        add left_{{i+1}} mimc_const
+        mul left_{{i+1}} tmp_{{i}}
+        add left_{{i+1}} {{ns.right}}
+
+        lc0_add tmp_{{i}}
+        lc1_add left_{{i}}
+        lc1_add_one_coeff mimc_constant_{{i}}
+        lc2_add left_{{i+1}}
+        lc2_sub {{ns.right}}
+        enforce
+
+        # xR = xL
+        # right_{{i+1}} = left_{{i}}
+        {% set ns.right = "left_" + i|string %}
+
+        # xL = new_xL
+    {% endfor %}
+
+    public hash_result
+    set hash_result left_322
+
+    lc0_add left_322
+    lc1_add_one
+    lc2_add hash_result
+    enforce
+end
+

+ 322 - 0
proofs/mimc_constants.psm

@@ -0,0 +1,322 @@
+constant mimc_constant_0   0x4699afdd3f9ce9916eaffcfbef597c5009ae9d3209c3b15feb6928a4a8d4b59e
+constant mimc_constant_1   0x41e2431761fee4a40b468524d91b3d64590b3c242de10d18f55f0c5e3883ef02
+constant mimc_constant_2   0x5a04a1ea758bf1cc1140fcec1ce2c9d68da53d6cf7ee8dfeedfb2ee45db08c27
+constant mimc_constant_3   0x2e4b930078e93e73581d7b71120a8e8b9627955a0aabf139bbfa5feceaab2e3b
+constant mimc_constant_4   0x6a9db69e4fd0a3f94402cf22076bd18300c344c69bf665542129ad887f0030ab
+constant mimc_constant_5   0x4458f2de4e16ce2ead3fe9dd164cca36d2b70a25e71f55cf0c51ca553a4f83ad
+constant mimc_constant_6   0x04f539ab6ea2d344049219c720a16c4e6033f8360b124519fdbb6d441428143b
+constant mimc_constant_7   0x6b9c7b12a4b3cf92e2f2b386426058709573f9abdf1bcc5411dacd7ea0eaf8f3
+constant mimc_constant_8   0x4375e3120921697155b3ea15c32b9412adce3a8ff8e28e1b8c95935cc71ad853
+constant mimc_constant_9   0x041854bb643e9e5e5d8aa6e828dc4c732c8fa24192a160f40da85737372c5d0c
+constant mimc_constant_10  0x65d9cc7ab2a2060d198d66310a902bddeeb7f5150173190036d2fae68de1c2b9
+constant mimc_constant_11  0x1e7d2b472c6a40254a228b0543aff318084e7f6152617a6cf7fc405d917bfc37
+constant mimc_constant_12  0x35293381012ebaf649d8c6db4e4d5e594bd114c99c234ddff7b9b5f6f8a9ec36
+constant mimc_constant_13  0x3a50794418ac54a1467578ed61e34d8be5d52c5f188f42955fe8d5e257ad3e89
+constant mimc_constant_14  0x446d905f60110dbd51129896a63a0e34bb0502101ad6311998ad2dfd74818277
+constant mimc_constant_15  0x3eee70356bab144c54b5fc1095f9bce59c727a57a5582dcbbd5c3afc3c61ceca
+constant mimc_constant_16  0x40b08ae056833e12c82f7e15e2dc72febc15d3275b51ec70afaffa6ce8bbb3d0
+constant mimc_constant_17  0x205923e6eb137869a552b4857bb64f946c912f3335a94291ebb8b29ecd3e6034
+constant mimc_constant_18  0x2a6aebced756f7e33c466bca2169ba24c471a088c8363fe0a966a223fd3b59ea
+constant mimc_constant_19  0x566efaf4e022036a8e073fd9812376888ac9f37c794daebe3fa77b1a87bf109e
+constant mimc_constant_20  0x1ee814f2660e7272712d588477e458c06f8f06950402e97c542d3682ad5f9aed
+constant mimc_constant_21  0x257fe0ace4965622be247dba9185f108707f4ab16c910c03c565afab43b0fb4f
+constant mimc_constant_22  0x43e156f0cad02ff6b763645c97663ab72229bb0a34f975681359797ccd58093c
+constant mimc_constant_23  0x317f43b78cc26f0332a3ec3ec187332d4de0f2baf04f62fe76bee9b11256130b
+constant mimc_constant_24  0x076ca6cd23830e3b3ece767b774e1b2243408098a7c5b816e7c616cb88f6b916
+constant mimc_constant_25  0x14e30a644f034c72cf40b1bc790200c2e8ab3e750e38f3fb0160188e817e4560
+constant mimc_constant_26  0x02eb02bfbac795a497a0882d66b718bb23de64f9fe7644179ddd3241cc407942
+constant mimc_constant_27  0x644f175cf6f2268d451e5188e467c508bc91d870646de9297911be2aedf26daf
+constant mimc_constant_28  0x14aef8f4f5499a0387e521a1c6064094590f149c52fb99e37b583434ca6bd46c
+constant mimc_constant_29  0x2ddc7c6bba8895913f3deee128bc63b5e34797274de80da775c4a0c810ac60e6
+constant mimc_constant_30  0x46adc33428a63a20459699183272b14797a5a7d1d66079701d214bced9a4be71
+constant mimc_constant_31  0x552847d9a2a5b03f726b277ba01ad61c0e28114667e7a9e11229b83224f74349
+constant mimc_constant_32  0x624921e44f5811f76c06ab74a11ad56e5241e4c597e9d172ee3c862bf6d4b1fd
+constant mimc_constant_33  0x506af906fab5f9407ee71824d72dfcd99115c5a2eb53b55a1d5877910a645282
+constant mimc_constant_34  0x514ddde7e75b27ae6f31efb7375bc209dcdd0ab4c277ee0f8b362cb5211def31
+constant mimc_constant_35  0x2e3be2e2a10f8e24b411902d9578d44e2a4a5042036ecc397e1cc5ab88e76329
+constant mimc_constant_36  0x61755a2f6a9729a3bd8d21aea98f4cf885aa1751a714e251a517395711674bf5
+constant mimc_constant_37  0x68f8f91713d81c2a6d601411447e944c27f7a1862855b940ef3521cbf4074e96
+constant mimc_constant_38  0x32e6b3dfaa0162846620ace97838a93f48999b5bbc078964687c795a9e5b71a0
+constant mimc_constant_39  0x3c783bf0caa35bd381603b9e3aa5dbcc4ed4fc93b03d69a49fa15286a6374f8d
+constant mimc_constant_40  0x4a3f322f033de27244d79dd5c6c2f34d84c24c917ce95cfb6458d72124280e70
+constant mimc_constant_41  0x3ee0abb7af79168e05566994017fade2d69bdb55c4253f996362b73d49f3f70e
+constant mimc_constant_42  0x15498a06e80c6060320e9a01292ee1a805c2aafd7b92f76b5f5e8be515e0a3b3
+constant mimc_constant_43  0x02424410de65455350831f5b1c3554626f6bbf373ed0f627b42f0d3ec2fdd487
+constant mimc_constant_44  0x5886da407f6014665272b45d213cb388987503398d407732f278c9a35267622d
+constant mimc_constant_45  0x15f6180f287d2ef5d9d057dc18eb7df732d97632bfb31e93ac065dcf0c67fd40
+constant mimc_constant_46  0x65f5dc85c9660f184a09ee768ae9af0f62911af31920d3b5c49ac0360d261441
+constant mimc_constant_47  0x65751a6bbccb0ea7fd79fe7231d03d2f14ec6a24c5d9c4a77d1a86acf3d027a9
+constant mimc_constant_48  0x4c21c6990442cb96b2ca684c9d427dc41090447248378f50b4de15b616f1f133
+constant mimc_constant_49  0x34cde97ef5c2459e29dbad8324fbefa5097f744f737cc59ad2681e49dfa43f99
+constant mimc_constant_50  0x5df3e3787510f9e2b32beb2fdf76fc6d646b3fb94d4ede65309762fc515ffb55
+constant mimc_constant_51  0x30394778b396dd8191e78cb7627636eb82b15b0de788c1e2db2788b05caedd8b
+constant mimc_constant_52  0x695a64cc6953c658f40c1c2666715790410e302d3d902fcb809924896c2d1f4e
+constant mimc_constant_53  0x6a4fe5863990f4b4d588841b0e52c4dc7a8c4644edfec7c721ab66b162ec5de9
+constant mimc_constant_54  0x62e4428cb1856ae809589806e5e7869ab0fb818d6c0a696d94ee616fe549400e
+constant mimc_constant_55  0x0b1e8a6d6581c13b6888d0bd9816bda3695f917d03510d9b42452f3501e3d55a
+constant mimc_constant_56  0x5e5a2b767f853d0f0bf0e3cae872fb942065db112cb48a12dbce3ce4da28aa87
+constant mimc_constant_57  0x2c1c59e21a9741edbaf1e5a275c573bbeb395c6a79abdd0e532e000298dc8c00
+constant mimc_constant_58  0x25d648572388935cac47095b4f38b3ebe6519766a0d03bf7de9b4368b7bc1b58
+constant mimc_constant_59  0x475a00fdc58c8a7092cae8942af520dd5e0f476dc469f0c3e908da68be55e6ff
+constant mimc_constant_60  0x3fe62baf8e0a5286b0055e16e712ad06d233fa71fb374557d4c3d585e33dd37b
+constant mimc_constant_61  0x54d74923f593c55659f92b34bf5c05a400187e143850173786c8a1dd2f3a1283
+constant mimc_constant_62  0x6aa3afe84262b6c5bc8994a2c0e66a64a534904efcf47ead067fa09cd2d58a6a
+constant mimc_constant_63  0x2069d079cd963cec28ccac413172576ace57da0b4ab502c11289fff6ff2de6eb
+constant mimc_constant_64  0x364b3a05a8b1271aa61d5894b51a445c5896e86a535869b70e56e1e0f7f49f42
+constant mimc_constant_65  0x1c904753197233afda76661025e67f6a8e7a5c209292e151a7f34119397c281f
+constant mimc_constant_66  0x45f6d1ed8bc4395ccc6cfc90a1cf5f636248e966d82d040d795014f5d184b3ac
+constant mimc_constant_67  0x1bdbb396d84fe4c8b5b230e1c925e9f0f5f88faea9b713b319c7c11c307cbdbe
+constant mimc_constant_68  0x347c35497a65e93d8f4ec06c1546991841fd680868e145849195e38ef783d1a4
+constant mimc_constant_69  0x1d9c23cb0d4a20c384d629c6e706ebaf12fe0fc4eb0860c8175e687742e941cc
+constant mimc_constant_70  0x59378cc30bc5948d66a6f1671e84e2e9ef342e0e3dd682015d93f96a68159f3a
+constant mimc_constant_71  0x59992c34faff2238e03be3d6e87086a427e6eef2c5647a690363a9ddc0c82d67
+constant mimc_constant_72  0x60b13d9cae9b2504ca982c50b14ee5a628d40832bab95108e6640b9a8ef8a853
+constant mimc_constant_73  0x4cea35b5ebf7d7956c0c592d4238051c37bdb8bcb4c08fa29239ffaff00793bf
+constant mimc_constant_74  0x25344d0db88e9df26d216c287ddc36a958ba1e4d4c05a9cd59715de870d47e36
+constant mimc_constant_75  0x19a1c0a1f3aa80db57b014a2dad65eecf645fcd442a09b97e78d044a50ba58c3
+constant mimc_constant_76  0x32a6b9ba275d0204fd0e3de5fed3eac823aa8ce0ef5eca627fe92030e4506fe3
+constant mimc_constant_77  0x4e4f1056e9e3b8861117ba8bba1a1c37e784ef9e1358473aa55156e3b1523dff
+constant mimc_constant_78  0x710f51f9f3866ab261df0fad6ad3986f75d9990bf7776f4e4775f9c8f95045c2
+constant mimc_constant_79  0x48623d21c816d6a47a6339d9bda7ff31f2b32b8491c72967b93f2734ec37f64d
+constant mimc_constant_80  0x69aae3a126e0625c52d05e8c98ea912f56a582419cef7f13f31be66ec14bd43c
+constant mimc_constant_81  0x2f7264fc97a0ff9188c506d5df4bf3d4f28cb1d12fa2767e18d023f8a7e907b0
+constant mimc_constant_82  0x54bf8632b89211a06bbf9c0ee5ba2328b1f2cbc1892b76282599c0fb432d761d
+constant mimc_constant_83  0x0deb44dd3e20b34cfb473944f4f8f07b4d337da0fc18021777c983bf3e4e7f44
+constant mimc_constant_84  0x37a108a7b9e612231e21f0b4c7186163e3cc59325cbb17a39e1e25b4c4345dba
+constant mimc_constant_85  0x317515ddac6dcb33a4ac68d4c02c6d93d147b61cd892474292258ebceaf5ce83
+constant mimc_constant_86  0x38e225b4f524fa89f414976687473eb4c5f3edfe983dbdd07d3e8486f3b93c0a
+constant mimc_constant_87  0x636b27e505a14fb8362beb2e436582db991e3089e6edaeb9aaba3d67f58c8c60
+constant mimc_constant_88  0x28fd1afb8cf1e9c7594b5b8d6b50ff1f81aa19f211c5c271f2181836158bb625
+constant mimc_constant_89  0x1a8cf4f8569d80ca7d878d7a76d959956ac5e7edb37fbcfd2f5d130e3841dbc0
+constant mimc_constant_90  0x2cfbffcc25a0a01ab7cd1e700030d0e363ac170dd000397fa83d107a6d12bd54
+constant mimc_constant_91  0x325355d6824f71f550b102c6fa6c8c129de58d325174c5981c562e606a58c55f
+constant mimc_constant_92  0x1716f66b4ad2388a23ce111dd5ff7c04d4478dd81930050fdf0c4a90fcd6d381
+constant mimc_constant_93  0x02992cefec8ee9bef9602858d51c87a2c4180d9fe0c02e6c6003531010793572
+constant mimc_constant_94  0x2132b3fd309dd69a9f3c39b450534d857721dd5a2bcb23b479a29b08e8f8551e
+constant mimc_constant_95  0x369986658b8e7e4f990fd6fc09b99a056d81ee47c7a9e46b4109d8af0956678c
+constant mimc_constant_96  0x25e00309f0c3097a6500df9ed5587ec128b20a97379814b4a0522f7e775a4548
+constant mimc_constant_97  0x529a8ecdddfb500c68b664f7303dad768da802c29a933801b2199cf74a3470f5
+constant mimc_constant_98  0x3cf98a6dc8290785ede38da9455dbd28a64a1bda35a48d6c6b1b35ba6df3268b
+constant mimc_constant_99  0x127401f379aa992d492782910baee0fb331b3e9c1a66492c9b002a37999f356a
+constant mimc_constant_100 0x449dabe3e12e7b495e0421de157acbd4b3852cb824bba7171c8e3da565e3f95e
+constant mimc_constant_101 0x410d1d4fb041736101f5468ebdfd9380f2066593534339bc419f35d530c92cd7
+constant mimc_constant_102 0x09747f87db187d67e7881e1b64345754ec9bc9ec353e9b055bc377f1618ef17e
+constant mimc_constant_103 0x5fec471449175525c56b18200dd8ab96b2f9ee383849545628f0ceff76f631d8
+constant mimc_constant_104 0x0c7e402c723170d5dc5f15e229f4bacc5eb50b34dbfb6129215ee662288e159c
+constant mimc_constant_105 0x158896654586f5c3a34808ef7ab93def61fc9257d5b7631ed6869259a45d1d01
+constant mimc_constant_106 0x57ab3eab90ec38cfb23625e7110948e4b56e38a1ccc2cfffc344876d28aceddd
+constant mimc_constant_107 0x08d08f8650f5ca7bf03aad9a80ae09c697327a131827a9c2aec67d1d9f58064e
+constant mimc_constant_108 0x273607089f1e9c2b99812e032dfb62c359438c76556a15692a3de02b8c13df4d
+constant mimc_constant_109 0x55bf5cd5a1a89d7e3d1d274cc5b1b765e42a9eab5cfd32148c1633550ecfffce
+constant mimc_constant_110 0x5c4f6e0acb889fbb573583767535e95bc537641769c35063c0bd3a65812ade57
+constant mimc_constant_111 0x581faa1d0a57ef947001fd8e57eee26e645d15eebedb7ebb1d85581968544ca6
+constant mimc_constant_112 0x48b77ab45f5fb6d615bd759a6661097bb8a3b5c27ba35f1b127d2ee12f043bc4
+constant mimc_constant_113 0x590618389009da43c679b6254ae4cc86dbfa397981f4dff30e064e07bfdc9eab
+constant mimc_constant_114 0x3ef9bd95ccaa3c577ab98d3fad87fe69953bbbba6c8bbca0301a6c88e9bed8e6
+constant mimc_constant_115 0x2bc1dd87795feb2a5e8d98759371592ba7147ee4c2a3473d18c496ebe3721216
+constant mimc_constant_116 0x620ba5be31e353f1f3c72a4380f32c016f0746f5446f9e1743fb01fe6994051e
+constant mimc_constant_117 0x151d0bcf972db311553ef8da672b1c861d118e9b78da632d24c49d4a0fa177b7
+constant mimc_constant_118 0x01f1bda7ed65ad241d6fa13d8c5cb40cc335a0b2a31b433f2c65cb01e8dad5bc
+constant mimc_constant_119 0x4aec58578fdfd5e59d18063bdcc69086dae303518f5155facdc2824878862c53
+constant mimc_constant_120 0x1ca2d39cd13b6c690faf2be3da4d4517e28244fbf9ca0f8f4d80565205fb86f2
+constant mimc_constant_121 0x72432f39b454d6457ffae81f2e843df03c1526920384c50136beca0627f9054a
+constant mimc_constant_122 0x1910c2e6bb35a12e22ec46cd0db6185f352bf3581cf46d2f9c494daf8d94b993
+constant mimc_constant_123 0x4e47d6f9080e682d34ae07d5886c29869d16324c468782bea9c62334b583251f
+constant mimc_constant_124 0x3240024a0dd08da0c135caf8114ea8d333ab181e94a3a01edabb760a64adcee4
+constant mimc_constant_125 0x1669aabbd01c4541575f150981af0cf9a196e0b98908af53ea14b81734ecce5a
+constant mimc_constant_126 0x316aa08fd611919a73b60dc2b3175b3843f17035d71b9edf2f72c32850629574
+constant mimc_constant_127 0x4919d1e48c28eb1d36a689d8a5826c4ae4cd4e84a8347a9c9238b825a0b53a8e
+constant mimc_constant_128 0x4572211d4d1c8257d142ff2335eea65ccbf3177a982fed00931410f3bdf08c19
+constant mimc_constant_129 0x5d2d04f110bb9a50adf25427b232870f2be2307685f19df47f9b2f1bae984a04
+constant mimc_constant_130 0x472609c977c6854de75985c9154f70a7fda1843a38f10dd4985ab8dc353ad5a7
+constant mimc_constant_131 0x5c2ba4f8bec80b52e65afbe7b2ff41ad73542275e40acba8730403e9e33c7697
+constant mimc_constant_132 0x267614d22d526f429346fb2e9dcc4930880971780e85ef44a199feabe2b48227
+constant mimc_constant_133 0x1110d3da8ece3e4eda99c2d63f6724779af505b9527f0b191b34b5bfabbf5584
+constant mimc_constant_134 0x68fc77023c046909572d302630c6508922cbc03e6c6d9a05108bc8db71e045ff
+constant mimc_constant_135 0x1b6630a5ab959106f3951689fcbc6a757c97511d08a3d4652b8ee7eab820d575
+constant mimc_constant_136 0x2e34a9c19201971c6cffc366e7955b33d0b7dc59fbaf87cadeb8d0c099cfb541
+constant mimc_constant_137 0x060bd11957a053af7aec4b2c2caf7e227512d9e856552e5cf6f4ed4b04753bec
+constant mimc_constant_138 0x0d8a6987303d76b12f97eaeacfd783401ffef6ac2e994182eaa93843300385ae
+constant mimc_constant_139 0x0e9b15bfa73141c59edc9d11ec4ee316525ba53c4b91e4f1a8adb8d372e91dff
+constant mimc_constant_140 0x55215d958a6afccf90247026efb61dd9bae318cd31ad27746b227de8873add8c
+constant mimc_constant_141 0x4ccb674b94da03efd3404a424a422d42fd4f3a8b9f73de3aa7377e728400e797
+constant mimc_constant_142 0x256f31bdb0e0cad47ec44da9bdd1fc146d0284f1d71c596e12b0c690e202d1c4
+constant mimc_constant_143 0x60797d9977e8cf8484240c0ac4d3703818c096db8d61ca640bab83ea4e675919
+constant mimc_constant_144 0x57fd867a56f6fba130d5cd80d1aa2562ca3bdb6956892c0f66e8d9bbe1fe49e7
+constant mimc_constant_145 0x09115f248d518063beb8d89c11115a6b53ac2927b2eeb0c50b50b3e82c314e5e
+constant mimc_constant_146 0x6a10f8ecb4e14465b19148ae366be2452b809596eec80f4913a2240e5e89c98d
+constant mimc_constant_147 0x0399008978536884058e8b36c86b622d5da6cde04ceabb591fe8057153f6c7b2
+constant mimc_constant_148 0x2c7ba50ad84ce603d8206950a09277dbf59da814c5b5119763a208953d946812
+constant mimc_constant_149 0x02a697c90f23766d5fde4b61101665b865375243f1bde57522bcb4bcda33804d
+constant mimc_constant_150 0x3bba46c732127685e3a7c6963ec063f961bfa23dce70af06fbbdba02d295aa8a
+constant mimc_constant_151 0x206c47de6dfd8600586a42f98aea1284742671c605e7a274a306e188015e031d
+constant mimc_constant_152 0x608a94a91f8e4e1b0adf94c1af4992b0176fc84d8d79b881ec02d2613f4d9083
+constant mimc_constant_153 0x28f906b6e3e6d01ac90251789b81001bb5d96ec2f55be04354b37bd7211c8731
+constant mimc_constant_154 0x25c66f7f7c9db885d9f7d7b64bd555f7e2e939878a6f1f1056c0c5af008949a7
+constant mimc_constant_155 0x4992f08ef5816859cd16e02a367e55fb073cc08ba19fce061e83288caba6e308
+constant mimc_constant_156 0x432fd05cdbd6ce762396cc6b88f6db33f0e6daa1e4faf602a599575fe797979d
+constant mimc_constant_157 0x4961bcdf4ad6da150ed71fe78f84c9faaa28e63e378af83aedd33870e337c362
+constant mimc_constant_158 0x4d1025421a43054ecb8eab1d4ed666a8cfc7b3e1d3f5243bd945032b7ae19a1b
+constant mimc_constant_159 0x0eb68c99851461def5baf569dff154f8ac4591e8ad194f641dc5fcfbc157c07d
+constant mimc_constant_160 0x256cd6ef41e108838bc52d51af281be02ad6c5d2a3e6f49f2cb864bcf2397447
+constant mimc_constant_161 0x0df82b76b04d8813711f92ed2bc6dda5f32e4778b5f1b328bd3b2a3b82928645
+constant mimc_constant_162 0x73397a58cf55ae9d2b14647125725f053dc0a9d5d5599f67955b8b8ceb8c43d8
+constant mimc_constant_163 0x352a6762b6764cd234a5e7e24e1beaed50618b691be9e40d4b15813d6023439a
+constant mimc_constant_164 0x4ebe36c93f3561edd31170f6775e38889598f0b40a3a2967882b60c6bcf8d6f6
+constant mimc_constant_165 0x4af798462ebca10935795dcb09770d98e2a93bc25a99af876c1f080fdf04047e
+constant mimc_constant_166 0x6f9acbad33e5d972376f1f67457fb5565582c0cc233006fe51942c48479a3c9f
+constant mimc_constant_167 0x395558ce9453ad4999a1d87585bc88b08731882ae0ffbbec886db1cc3fc7ee62
+constant mimc_constant_168 0x17b48a7db220b2b4e4a3e9139168f050056e71049e4080ded3949222d3915dd2
+constant mimc_constant_169 0x13266faaffcb6e011f73a4065bb1f7bdc373571d1b9c0210674f4f9d18cdbf3f
+constant mimc_constant_170 0x0edbbed85597c4beb59685811f7f3c0ce807083c032e6c71e5869004bb37c93d
+constant mimc_constant_171 0x64a7409e0e833df31fb574e1c12f764ecf0e3d335cc53afcdc22ac13d7a81da8
+constant mimc_constant_172 0x730fbba0d85d06eabf3f517d4826457bacb2fa8c2f24168c1b026ada9eca5bf5
+constant mimc_constant_173 0x1ffdde6d216f269f8d25efca3b28590416ea7340d92df2c02d111e30302ba020
+constant mimc_constant_174 0x6551f0ba88e2b256f61e052c2ed98e5253fb7791614da7f7f10f9db1dbace96f
+constant mimc_constant_175 0x5a40abaaa2542543cd1710bab187798b01f6c7d93395e3a1cdaed5b8866018e9
+constant mimc_constant_176 0x7021fa2631484663ef5e14124c49b3078b460d77c9972b9f3aa8fe7bed79bed6
+constant mimc_constant_177 0x28e1b47a74ed1328c9cf0188bcce0e6bc8e32d808ad91d62d747382141e7c439
+constant mimc_constant_178 0x267bb1817a59e83c9cb67f740cb31fccde2ae0f6dc49745f826267f78136bc5a
+constant mimc_constant_179 0x6f2a6bdaf2152c1368e51b4d1ae3ce48bb8a62e00d92f2f9f21393c691243aee
+constant mimc_constant_180 0x00cd4b3d36b639b44a828c3dfe8e8da68a7cccaf7063fa92877683c0e5080869
+constant mimc_constant_181 0x3e8e056dee60929e925fdcd2395a9959202ef71b82a638fd1e3decba9051d016
+constant mimc_constant_182 0x651baeb3fea106c59cefec6a9c8973347a481a75b04f547d8d2f63a1ced57161
+constant mimc_constant_183 0x1e6ea48da02249378957d446d9603e4a1e0efd343426933d0cf5a1400148f654
+constant mimc_constant_184 0x5eb2faa76b282614614ae97db1e0bb722146ac8230739cf9abb35058ae7f6363
+constant mimc_constant_185 0x6400a9ba34a8ce081b7755a5241338c78c10c07ff6cc97ac94f29b23775922f3
+constant mimc_constant_186 0x5c475b1284568d5c55fae4840fd5bf9b9f8041fb4c75f3fd902681d97d4b09d2
+constant mimc_constant_187 0x037e3fa79fcab75541fe4ceed6404d2a89228694646835e0422fb558477fb128
+constant mimc_constant_188 0x39186a11b8693a21684796f4dd227523ac2782d6d23330d8287d77e19f106923
+constant mimc_constant_189 0x44b4264d680b2bfa7081436798dce5bc3b20bedf250dfb2103abdde5b3f24eb2
+constant mimc_constant_190 0x01fd3211afd7ab17103dd5a181b91982d83e69f9df9568ed132db65c23bfba2d
+constant mimc_constant_191 0x66bd19f66bf63ef557cd87c638d6a97f2853a284307ff04392e61b7a68e56b12
+constant mimc_constant_192 0x09e3ea8c3c87110454cb0045179ac850f74285652c6854351682cd1706b54f88
+constant mimc_constant_193 0x22b7ffce8814457850e403085d0f725dc72396144565f4542d5bf826f4627106
+constant mimc_constant_194 0x255b1285cd235b83bbdc8032f637a74bc8b33a798e2751969ebe67c593b578bb
+constant mimc_constant_195 0x5b568413938daa1acec17d776af723451fc067e63ed8a24d58cefc27ef7feca9
+constant mimc_constant_196 0x4fc38e950b447f3040484e58a7d106386da69400c9292640014886e33eb7596f
+constant mimc_constant_197 0x044e95a76627fade400c813061a56bd38ae137734ac1b7b11fce4a12eed6bb68
+constant mimc_constant_198 0x129d3939b05352392ee46921665e027d3cb9c9857f0b2f161bb1f0fdd58a74bf
+constant mimc_constant_199 0x327b98a9fc847d6b6d54a175aaed3678172d615d37cf1c4448c9d4588a2eb7c7
+constant mimc_constant_200 0x63675e996ad78bc6725b923b4cbeacf40f7d4b85bf38fd8b5ed0f63424779ab5
+constant mimc_constant_201 0x7374af204d7432c7954dbbd12ed973b79fd0a6d7109061ffd10ecb2f6942d5fd
+constant mimc_constant_202 0x0fdf70b408b29ce4bb3ef9a02c333ba7789fffbf2b17dc2ef4dce8714ada06a8
+constant mimc_constant_203 0x4373b306976a59fbd07f82bb44c4ee4e4a11806801960c5c18f32f7679321d3c
+constant mimc_constant_204 0x1b218fbc57953d8d44ab45c19993b223939a121a1e6bf87b4ca549e06699880a
+constant mimc_constant_205 0x09b95f647fc4e11ed6a4757be6287d3f4d6bbdc6da8173da072d7a5d046862b1
+constant mimc_constant_206 0x1def7155ba82eebd07611e2dd694a49dac9085004c1b4e9de2b4f0bf40c063fd
+constant mimc_constant_207 0x38921799f2fae22e5dc387e3b63a8d4d2210ad60690f61cce190bad2a304c035
+constant mimc_constant_208 0x2cfc11979ac028eea6636015cd2241a9ca2b9256bcdbae2f89df853751f63589
+constant mimc_constant_209 0x21e602b39eade2ce622e3da4c76124a5f9b2580296037a33f88044895aa8562c
+constant mimc_constant_210 0x25c9a818e3691a8d36cc881eed8513110fbcd2c855270ae265cc4a53283e2f4e
+constant mimc_constant_211 0x6d17e4bdef0620c74ce13ee9b219e49bf2c8ac57cb1882bca03c64ec7c7c69fc
+constant mimc_constant_212 0x2285fe01b02e1cb4331c2e86272f10d7e7daeac3d368b914e9115d832aab4e12
+constant mimc_constant_213 0x3fb801cc1a5264babd7f35a65091d15eb9b47a6f06ab9422defafaee4cd35a84
+constant mimc_constant_214 0x5b2ae60ec46971d3b3535743c3ab4d99f07ee2f551bfb2212ecfc7120169c8eb
+constant mimc_constant_215 0x5322e28426199923aab00dcb5aa2c0c92690628e69ddbeaa8a9e0b92e4d84aa4
+constant mimc_constant_216 0x1db225ddf28a651a6f809533078dfc8a006d4b76b59afde3d3356c7f26bf1ac2
+constant mimc_constant_217 0x600fcc0f370b76ed88186364efc8d0435ba4efe84abd6b2573e87e213cb405dc
+constant mimc_constant_218 0x007c21ae6a4471fb33141d353cb73f3769ee63d78cbc5d7e6a8c1bdb7cf3eb4f
+constant mimc_constant_219 0x17520db9848586770ced86adfca305209a0884592720f70eb91f9e3a22c23a94
+constant mimc_constant_220 0x3db8aeed94f87b37fc9cfee7a7c027605bec03af4965b840a8942b89fef39ecf
+constant mimc_constant_221 0x10b3102359b66388bf079dd2f30d8131ec4da41bf159fae392838a9708e1cfc9
+constant mimc_constant_222 0x0c9f537a5a0efc930019893a3fbd46c5e2a85b78b22b4bb60c0c1ec2da334a07
+constant mimc_constant_223 0x165f9cb0313efaf5a0636141f39c3ff22089c0f9c494ebc40e9e8060b84f149f
+constant mimc_constant_224 0x001879a49e2e539bf9e9c713416f517ee14f6e510a9cafb9a321fef9ca23ed49
+constant mimc_constant_225 0x32e53a1e65305675144ebd5bb49bdcf81879daab30fff361eba5cfef952184a3
+constant mimc_constant_226 0x51b4edb20a2bbb2daf144d4ab3b72a5a4cc956d9bd9e2ba5017c2163928118c3
+constant mimc_constant_227 0x140c9db4c384a0e3757a41ae5005b2557148cb3c190ab7101059053039d655ed
+constant mimc_constant_228 0x1737e47c806e74be09d8f7daf7c9d12ede33929f5152eda6c8c008064cfc1be3
+constant mimc_constant_229 0x23f3501123499df44f5cd31b08fa1338be61194a023c9101a41ce7518acddcdd
+constant mimc_constant_230 0x68dcbacbeb6727e3b47ef3a6291421496a78d81a645f2451c2cd89818715329b
+constant mimc_constant_231 0x2f1dd4d3ce3e7b49d67a4bca9ba8b5b64ee37a20496ddbc302aa8c1bed9b2fbf
+constant mimc_constant_232 0x2b5427a54294793e926c0ed030eff8b5020801ae8a46b1d7cecc49d01d2cd4a1
+constant mimc_constant_233 0x1bcdebbdce2545485d5db25d9776f7bdc31dc799c61cb726e20e0071e939e4c4
+constant mimc_constant_234 0x6021616995863e2b6fb9015892f2f361b60656bf1998239aa471d4c698564e9f
+constant mimc_constant_235 0x4816704f77b55fba8188d9424143ffd7b015587467072992b2482e9bacd4f072
+constant mimc_constant_236 0x60aad5cbecde71eae3fb3e8355137d5890f2947227093bacd23291a731720e79
+constant mimc_constant_237 0x5bff651adb907adde66b4a4810173bb8cc0cc618e6698e236979750865b68466
+constant mimc_constant_238 0x4dc639d5986ad912fc2632704ad03b039c6982fccad820b16ce2e519de54dcb0
+constant mimc_constant_239 0x1780c0f66f7afefb6b32a019956b2a209224b9eeba8a643a222f7355214be300
+constant mimc_constant_240 0x6d23740f70b21671e66d9bb35d7387b017dd56c78b65973db44e5479567c27a0
+constant mimc_constant_241 0x1784ada0fe2211721dff5b63c46ddbd0cc2a7161e42f24b26b10cf0a807398c9
+constant mimc_constant_242 0x3721b5cbdc714dc02db737a41bac0ad9dfd640229e4ef73c780f2abc7907a101
+constant mimc_constant_243 0x6777e0e8612172897bde7e5e4d7edafdfac32f855d07b645ef0a2c2b6815d7bd
+constant mimc_constant_244 0x5430480105f06250a915e429d5436268eeff94a54606848883d84eece231db3a
+constant mimc_constant_245 0x5b06f0578c8e419abaf9365b1e0e4605a270d831b886b1310c2b30830f70aa05
+constant mimc_constant_246 0x064faf1daa9415f3bf666dccf10e96a660e3c3e08945cecfad74bcf656a09b63
+constant mimc_constant_247 0x5a7cf453cdc309e004ac0d4b161686c9497ddd5333302ce1ac689d3cd3f15fe8
+constant mimc_constant_248 0x3d1cdaba6330736b0b9c17a27d3f31b58ea7b0aa1a46faa5cbc191faef9e41ef
+constant mimc_constant_249 0x59c894b434302a88c78f3438263ff4a3f82f27af2f086958497b75ba9ede3267
+constant mimc_constant_250 0x4f96eab2814accfe7cc529624df63fd4d9d3932ecace112a52d488ebd64f86a9
+constant mimc_constant_251 0x5c3395a99f651f587c1e9f88fb32ffde50f312874219daec0f67f604ba56f55a
+constant mimc_constant_252 0x10bc86369a85dae2cbcb60d1a110675555b1f29f01af909d0b0a452fd6f8aa0a
+constant mimc_constant_253 0x025c11c9d5846be858ed85b2706718d0859b14b5e6afafc50e5b7cab9390e88d
+constant mimc_constant_254 0x6a0df7099df32bbf845516682d8b2c40d5b238bab4493508146ec7da5280b31d
+constant mimc_constant_255 0x15dee1455b9289a97a4fb4561cd05cc4eaac7f45e2098e6db369c4e38780a898
+constant mimc_constant_256 0x6b00cd849365b050f85b3bcb73dc91ae063ed60360b053ccecd4ea226f5d3480
+constant mimc_constant_257 0x36ba01e51f6cce897b12718e2947d0ded1b43f1ad65045d9e80792cc0d2afbcf
+constant mimc_constant_258 0x705ec3f8f1bdd15381e69d0241b37349e11963b509f73dde27e4d00f7173e9d2
+constant mimc_constant_259 0x00259c2c2a277983602c80547343f0037a7a3c7edfdf98a1ffd16bea20204aa2
+constant mimc_constant_260 0x07ba65993dc66a3359f96e202f8408f9367d24e37a83164c622f682ef4d113d0
+constant mimc_constant_261 0x56324ef5c5a36793bc76d0c2a38e6ae35916ab04bc072325036d9e832981518d
+constant mimc_constant_262 0x3cdc6e8fc9101d4e6be6b5fb368a3911ac13c4090ea7da9f345cd5f7ae7b1e6c
+constant mimc_constant_263 0x3fe62a321b08da7f8f6cd2080867b98b6c9f54bf910bac77db5a71da68b18270
+constant mimc_constant_264 0x53915ca5503403181327eea9143a99782e31f1636a324a946882376fb9d07681
+constant mimc_constant_265 0x45ec1e9c297bdd973aec556197b1168f8a55b0d7bb0519b5db479f95d11cd045
+constant mimc_constant_266 0x7310ab366f789b5264f16fd563b6dd31462f3e352a92fbb5e2357a9fbb9a1f16
+constant mimc_constant_267 0x739ebe2484fabba7b18d7f3a213bb9d3bb2d78a8c05f41515aa20533b933cc2e
+constant mimc_constant_268 0x048f8d7f23612a95c09d90137f7a4d87e340a1e83ec3c94284d6784ea8006423
+constant mimc_constant_269 0x49a59faf4bbf57ee29b5e186bb0008a4ec74c8fdb7ea8fe7e1aa46bc40873b50
+constant mimc_constant_270 0x5cf260d13f5da4870855a40e71d4effda202f310a955db2d140e9317e4238998
+constant mimc_constant_271 0x38c2eba027b51ab146dc61e33b7403789b63641a5cba018829e3dfc9336cbcb8
+constant mimc_constant_272 0x1f90a83ada4e0d548c8beea8f902f4bdd8466948161fe2760a0127f44a0edea8
+constant mimc_constant_273 0x6b65cc39e2d766f83e8f6f59fd5e40290bf8b887c99da8c166417d5a9cae1444
+constant mimc_constant_274 0x1da9f1f317f97e9c6132dc6808def44d32daa0c2dbcffe580d8f35b85400ccc3
+constant mimc_constant_275 0x3df94f558d1e935080d48183a3e742f6be2992f5aea51387f01c90219e980fa2
+constant mimc_constant_276 0x59974c89246e978cbee6e84478252843235f550eb7ba45324d4a7ea572ca7e2b
+constant mimc_constant_277 0x094be891b94edbc55530775ac31dd8f5ac0d1e2462579c158ce2f28843a2e9b2
+constant mimc_constant_278 0x02c997879aff55f85e9e19e36a32758b868a0504ff0cb4a704fabdb897f308bd
+constant mimc_constant_279 0x090a6946efff80828d498845e43aebaf02f19cc8a5459db7b12952e4924e1fd1
+constant mimc_constant_280 0x3cf7d767a121eb81462c2731ee18da4f5579e007ed7e198ed9c74d0e4122d247
+constant mimc_constant_281 0x4dafcb7ed415b248c5f169092d29b0f5d213e599e2bf15ade507d9ae2c9d764d
+constant mimc_constant_282 0x5204fb985e7a86bb77fd705bf71787c4a09b97e7729318e6828a422f70aabcea
+constant mimc_constant_283 0x0e1b38375d5ded933a6c9d7512ade1e96679651be670f381f875dd62c7279827
+constant mimc_constant_284 0x6b612638db66a469241a60b7222956ca0364f2d77ea8849aeb99fad2a0b5637f
+constant mimc_constant_285 0x3626c1544bd18d8a9bde32d6210aa6179839b1ebefb87fdb914d3735db50f92e
+constant mimc_constant_286 0x222fd118f0cc69ef015f43fdd95a4db3fc08eec734f4cd3fce78e73348373e03
+constant mimc_constant_287 0x369885b7348e2be8c21dce937e248cc6c390c703a09dddbb88b39bbfb3fa2943
+constant mimc_constant_288 0x0794753806f2502ff43f7b8c4990e446c37677a49f78e0a8e38622a23c34eb60
+constant mimc_constant_289 0x4b9b69b8b54c2ba38a23c409263b2ea543ba2082b6fded12c3c9b9dc754c4202
+constant mimc_constant_290 0x06fae323404cc19a099fb298803a76737720c25913e21f38a75f1c8e63a96b9c
+constant mimc_constant_291 0x50461e3977f12ec2de486071fc3924cd1aef82a6bc9fbde215eaddee6780de1d
+constant mimc_constant_292 0x5ff12618767830d17a759dadc62c40221cc848ef84da8cd91b76e5ca59ccaa37
+constant mimc_constant_293 0x6b7bdeac8d4dc989219510a928aa2e2a8995f4aba16e9f59d85e88ae3f6f5f5f
+constant mimc_constant_294 0x5fbc48469f2e94eaee4ce3cc7af5c45f27a6532f0b7d8aaad76e61091a319ecd
+constant mimc_constant_295 0x024ec0f964b1ce01b08352c231662c238c623cd66a2da4ef330debc7323dba8e
+constant mimc_constant_296 0x0dfd978f5c1e804bd89e9d579edb44c49335296cd5948420d7650775cf88fc0c
+constant mimc_constant_297 0x57ecafcf80a257780a9bbac3793c3e772fde0c88d6ce8e39399c7eb0a7e76d6a
+constant mimc_constant_298 0x705b423e84afdccba45b0286397d1a29896cc1dc3fb41721e9e14942a2c13db6
+constant mimc_constant_299 0x61efd69d156931b397d7aebd87d6c7599f6a5e2925cb7d8891fd751b7757c486
+constant mimc_constant_300 0x5b0a8e0bc9d55850e65cb119b6b43abd5eda13de38ffd6e45130a6b2c7184251
+constant mimc_constant_301 0x2ee9eb134a2f83e93bb4b09c71da3e7810d9a2bd01acaacf70fc7b43ccc2fec6
+constant mimc_constant_302 0x136a3734420b9a29249f23e3292d871653540c3a86fdfbdbb655596aac99d0ce
+constant mimc_constant_303 0x11ea5a840d53c0f0eaa111e6f43d953cdadcddedd8b7658d82266fd0897cd71a
+constant mimc_constant_304 0x51a4d6a93c09813a72f272b043ef5cf88fe27eeadb2065cb75c95620874ea281
+constant mimc_constant_305 0x00b698d1b30b8486b7fb7cafdae54bb93ac182be3623f1feffa7edc12486d4e8
+constant mimc_constant_306 0x22386f894f2a9326c7ab4cfbceae435cb69f3e359ee49946dc566f242f4238de
+constant mimc_constant_307 0x636d98aea6cb6afe50fd1e96bb8bfdf18a9d54a87e66fd79e3dff80abda98c18
+constant mimc_constant_308 0x067a4de70930459165ff7d84a0dc375adb145ac07e67eb0e1fadebd4e2610eeb
+constant mimc_constant_309 0x64721850463f2d1dfe148e429e472914d67d9867409de6c39150225106d4d425
+constant mimc_constant_310 0x6c87827aa64247be6bb132c49e271a6e23c54c8334f2c3eca5551b4ae5260f05
+constant mimc_constant_311 0x65cbbc751ea4f5e7956628b8645708187b37f2d65c6c297a5854355256de476e
+constant mimc_constant_312 0x6bf24b343856b4066e2835b1fe3e5d16496a36f41386c2afd44d001ba886fdc7
+constant mimc_constant_313 0x41d82825d409ab7c996773b516f6720e34cbfdebdc9c069fa579dcea11ef44f6
+constant mimc_constant_314 0x45f741f2e9481a85b86467ab30d363fd0328e33d53fce6b39286c2494ee7bd28
+constant mimc_constant_315 0x6c06f72d4e071f9c1ddca4f9ea231853f6d8c5e9b7418e9c564c995912d19c18
+constant mimc_constant_316 0x154f9ecfb65370a8b59a12cd736348aead2e59a7e3701d20a669bec15363fe62
+constant mimc_constant_317 0x0c4d910fbd3b57be6d6680e8d2db47c1454712b240b78468cb764702be5c1aec
+constant mimc_constant_318 0x0e1ac575e1125f5ee86da3342018bc4f3c1e2310148043d5074eb4ee22fc55b6
+constant mimc_constant_319 0x273531c7d0d03d8f97b722ef1f0c324dac39f804e0222202f7502946647ef332
+constant mimc_constant_320 0x101464d19cf380958e5aef1084736db89f4cb131033ae670f6de0a5cf9d92b73
+constant mimc_constant_321 0x597cdd384abdad1beccc73fb39f74a18eb44d056951d602c2ef6ef6448fc5626

+ 5 - 0
run_mimc.sh

@@ -0,0 +1,5 @@
+#!/bin/bash -x
+python scripts/preprocess.py proofs/mimc.psm > /tmp/mimc.psm
+python scripts/vm.py --rust /tmp/mimc.psm > src/zkmimc_contract.rs
+cargo run --release --bin zkmimc
+

+ 6 - 4
scripts/preprocess.py

@@ -1,14 +1,16 @@
+import os.path
 import sys
-from jinja2 import Template
+from jinja2 import Environment, FileSystemLoader, Template
 
 def main(argv):
     if len(argv) != 2:
         print("error: missing arg", file=sys.stderr)
         return -1
 
-    input = open(argv[1]).read()
-
-    template = Template(input)
+    path = argv[1]
+    dirname, filename = os.path.dirname(path), os.path.basename(path)
+    env = Environment(loader = FileSystemLoader([dirname]))
+    template = env.get_template(filename)
     print(template.render())
 
     return 0

+ 5 - 1
scripts/vm.py

@@ -15,6 +15,7 @@ op_commands = {
     "sub": 2,
     "divide": 2,
     "double": 1,
+    "square": 1,
     "unpack_bits": 3,
     "load": 2,
     "local": 1,
@@ -33,6 +34,9 @@ constraint_commands = {
     "lc0_add_coeff": 2,
     "lc1_add_coeff": 2,
     "lc2_add_coeff": 2,
+    "lc0_add_one_coeff": 1,
+    "lc1_add_one_coeff": 1,
+    "lc2_add_one_coeff": 1,
     "lc0_add_bits": 1,
     "lc1_add_bits": 1,
     "lc2_add_bits": 1,
@@ -71,7 +75,7 @@ class Line:
     def args(self):
         if not self.is_empty():
             return None
-        return self.text.split(" ")[1:]
+        return self.text.split()[1:]
 
 def clean(contents):
     # Split input into lines

+ 4 - 1
scripts/vm_export_rust.py

@@ -84,7 +84,10 @@ pub fn load_zkvm() -> ZKVirtualMachine {
             args = constraint.args[:]
             if (constraint.command == "lc0_add_coeff" or
                 constraint.command == "lc1_add_coeff" or
-                constraint.command == "lc2_add_coeff"):
+                constraint.command == "lc2_add_coeff" or
+                constraint.command == "lc0_add_one_coeff" or
+                constraint.command == "lc1_add_one_coeff" or
+                constraint.command == "lc2_add_one_coeff"):
                 args[0] = args[0][0]
             args_part = ", ".join(str(index) for index in args)
             args_part = "(%s)" % args_part

+ 327 - 0
src/mimc_constants.rs

@@ -0,0 +1,327 @@
+pub fn mimc_constants() -> Vec<&'static str> {
+    vec![
+"4699afdd3f9ce9916eaffcfbef597c5009ae9d3209c3b15feb6928a4a8d4b59e",
+"41e2431761fee4a40b468524d91b3d64590b3c242de10d18f55f0c5e3883ef02",
+"5a04a1ea758bf1cc1140fcec1ce2c9d68da53d6cf7ee8dfeedfb2ee45db08c27",
+"2e4b930078e93e73581d7b71120a8e8b9627955a0aabf139bbfa5feceaab2e3b",
+"6a9db69e4fd0a3f94402cf22076bd18300c344c69bf665542129ad887f0030ab",
+"4458f2de4e16ce2ead3fe9dd164cca36d2b70a25e71f55cf0c51ca553a4f83ad",
+"04f539ab6ea2d344049219c720a16c4e6033f8360b124519fdbb6d441428143b",
+"6b9c7b12a4b3cf92e2f2b386426058709573f9abdf1bcc5411dacd7ea0eaf8f3",
+"4375e3120921697155b3ea15c32b9412adce3a8ff8e28e1b8c95935cc71ad853",
+"041854bb643e9e5e5d8aa6e828dc4c732c8fa24192a160f40da85737372c5d0c",
+"65d9cc7ab2a2060d198d66310a902bddeeb7f5150173190036d2fae68de1c2b9",
+"1e7d2b472c6a40254a228b0543aff318084e7f6152617a6cf7fc405d917bfc37",
+"35293381012ebaf649d8c6db4e4d5e594bd114c99c234ddff7b9b5f6f8a9ec36",
+"3a50794418ac54a1467578ed61e34d8be5d52c5f188f42955fe8d5e257ad3e89",
+"446d905f60110dbd51129896a63a0e34bb0502101ad6311998ad2dfd74818277",
+"3eee70356bab144c54b5fc1095f9bce59c727a57a5582dcbbd5c3afc3c61ceca",
+"40b08ae056833e12c82f7e15e2dc72febc15d3275b51ec70afaffa6ce8bbb3d0",
+"205923e6eb137869a552b4857bb64f946c912f3335a94291ebb8b29ecd3e6034",
+"2a6aebced756f7e33c466bca2169ba24c471a088c8363fe0a966a223fd3b59ea",
+"566efaf4e022036a8e073fd9812376888ac9f37c794daebe3fa77b1a87bf109e",
+"1ee814f2660e7272712d588477e458c06f8f06950402e97c542d3682ad5f9aed",
+"257fe0ace4965622be247dba9185f108707f4ab16c910c03c565afab43b0fb4f",
+"43e156f0cad02ff6b763645c97663ab72229bb0a34f975681359797ccd58093c",
+"317f43b78cc26f0332a3ec3ec187332d4de0f2baf04f62fe76bee9b11256130b",
+"076ca6cd23830e3b3ece767b774e1b2243408098a7c5b816e7c616cb88f6b916",
+"14e30a644f034c72cf40b1bc790200c2e8ab3e750e38f3fb0160188e817e4560",
+"02eb02bfbac795a497a0882d66b718bb23de64f9fe7644179ddd3241cc407942",
+"644f175cf6f2268d451e5188e467c508bc91d870646de9297911be2aedf26daf",
+"14aef8f4f5499a0387e521a1c6064094590f149c52fb99e37b583434ca6bd46c",
+"2ddc7c6bba8895913f3deee128bc63b5e34797274de80da775c4a0c810ac60e6",
+"46adc33428a63a20459699183272b14797a5a7d1d66079701d214bced9a4be71",
+"552847d9a2a5b03f726b277ba01ad61c0e28114667e7a9e11229b83224f74349",
+"624921e44f5811f76c06ab74a11ad56e5241e4c597e9d172ee3c862bf6d4b1fd",
+"506af906fab5f9407ee71824d72dfcd99115c5a2eb53b55a1d5877910a645282",
+"514ddde7e75b27ae6f31efb7375bc209dcdd0ab4c277ee0f8b362cb5211def31",
+"2e3be2e2a10f8e24b411902d9578d44e2a4a5042036ecc397e1cc5ab88e76329",
+"61755a2f6a9729a3bd8d21aea98f4cf885aa1751a714e251a517395711674bf5",
+"68f8f91713d81c2a6d601411447e944c27f7a1862855b940ef3521cbf4074e96",
+"32e6b3dfaa0162846620ace97838a93f48999b5bbc078964687c795a9e5b71a0",
+"3c783bf0caa35bd381603b9e3aa5dbcc4ed4fc93b03d69a49fa15286a6374f8d",
+"4a3f322f033de27244d79dd5c6c2f34d84c24c917ce95cfb6458d72124280e70",
+"3ee0abb7af79168e05566994017fade2d69bdb55c4253f996362b73d49f3f70e",
+"15498a06e80c6060320e9a01292ee1a805c2aafd7b92f76b5f5e8be515e0a3b3",
+"02424410de65455350831f5b1c3554626f6bbf373ed0f627b42f0d3ec2fdd487",
+"5886da407f6014665272b45d213cb388987503398d407732f278c9a35267622d",
+"15f6180f287d2ef5d9d057dc18eb7df732d97632bfb31e93ac065dcf0c67fd40",
+"65f5dc85c9660f184a09ee768ae9af0f62911af31920d3b5c49ac0360d261441",
+"65751a6bbccb0ea7fd79fe7231d03d2f14ec6a24c5d9c4a77d1a86acf3d027a9",
+"4c21c6990442cb96b2ca684c9d427dc41090447248378f50b4de15b616f1f133",
+"34cde97ef5c2459e29dbad8324fbefa5097f744f737cc59ad2681e49dfa43f99",
+"5df3e3787510f9e2b32beb2fdf76fc6d646b3fb94d4ede65309762fc515ffb55",
+"30394778b396dd8191e78cb7627636eb82b15b0de788c1e2db2788b05caedd8b",
+"695a64cc6953c658f40c1c2666715790410e302d3d902fcb809924896c2d1f4e",
+"6a4fe5863990f4b4d588841b0e52c4dc7a8c4644edfec7c721ab66b162ec5de9",
+"62e4428cb1856ae809589806e5e7869ab0fb818d6c0a696d94ee616fe549400e",
+"0b1e8a6d6581c13b6888d0bd9816bda3695f917d03510d9b42452f3501e3d55a",
+"5e5a2b767f853d0f0bf0e3cae872fb942065db112cb48a12dbce3ce4da28aa87",
+"2c1c59e21a9741edbaf1e5a275c573bbeb395c6a79abdd0e532e000298dc8c00",
+"25d648572388935cac47095b4f38b3ebe6519766a0d03bf7de9b4368b7bc1b58",
+"475a00fdc58c8a7092cae8942af520dd5e0f476dc469f0c3e908da68be55e6ff",
+"3fe62baf8e0a5286b0055e16e712ad06d233fa71fb374557d4c3d585e33dd37b",
+"54d74923f593c55659f92b34bf5c05a400187e143850173786c8a1dd2f3a1283",
+"6aa3afe84262b6c5bc8994a2c0e66a64a534904efcf47ead067fa09cd2d58a6a",
+"2069d079cd963cec28ccac413172576ace57da0b4ab502c11289fff6ff2de6eb",
+"364b3a05a8b1271aa61d5894b51a445c5896e86a535869b70e56e1e0f7f49f42",
+"1c904753197233afda76661025e67f6a8e7a5c209292e151a7f34119397c281f",
+"45f6d1ed8bc4395ccc6cfc90a1cf5f636248e966d82d040d795014f5d184b3ac",
+"1bdbb396d84fe4c8b5b230e1c925e9f0f5f88faea9b713b319c7c11c307cbdbe",
+"347c35497a65e93d8f4ec06c1546991841fd680868e145849195e38ef783d1a4",
+"1d9c23cb0d4a20c384d629c6e706ebaf12fe0fc4eb0860c8175e687742e941cc",
+"59378cc30bc5948d66a6f1671e84e2e9ef342e0e3dd682015d93f96a68159f3a",
+"59992c34faff2238e03be3d6e87086a427e6eef2c5647a690363a9ddc0c82d67",
+"60b13d9cae9b2504ca982c50b14ee5a628d40832bab95108e6640b9a8ef8a853",
+"4cea35b5ebf7d7956c0c592d4238051c37bdb8bcb4c08fa29239ffaff00793bf",
+"25344d0db88e9df26d216c287ddc36a958ba1e4d4c05a9cd59715de870d47e36",
+"19a1c0a1f3aa80db57b014a2dad65eecf645fcd442a09b97e78d044a50ba58c3",
+"32a6b9ba275d0204fd0e3de5fed3eac823aa8ce0ef5eca627fe92030e4506fe3",
+"4e4f1056e9e3b8861117ba8bba1a1c37e784ef9e1358473aa55156e3b1523dff",
+"710f51f9f3866ab261df0fad6ad3986f75d9990bf7776f4e4775f9c8f95045c2",
+"48623d21c816d6a47a6339d9bda7ff31f2b32b8491c72967b93f2734ec37f64d",
+"69aae3a126e0625c52d05e8c98ea912f56a582419cef7f13f31be66ec14bd43c",
+"2f7264fc97a0ff9188c506d5df4bf3d4f28cb1d12fa2767e18d023f8a7e907b0",
+"54bf8632b89211a06bbf9c0ee5ba2328b1f2cbc1892b76282599c0fb432d761d",
+"0deb44dd3e20b34cfb473944f4f8f07b4d337da0fc18021777c983bf3e4e7f44",
+"37a108a7b9e612231e21f0b4c7186163e3cc59325cbb17a39e1e25b4c4345dba",
+"317515ddac6dcb33a4ac68d4c02c6d93d147b61cd892474292258ebceaf5ce83",
+"38e225b4f524fa89f414976687473eb4c5f3edfe983dbdd07d3e8486f3b93c0a",
+"636b27e505a14fb8362beb2e436582db991e3089e6edaeb9aaba3d67f58c8c60",
+"28fd1afb8cf1e9c7594b5b8d6b50ff1f81aa19f211c5c271f2181836158bb625",
+"1a8cf4f8569d80ca7d878d7a76d959956ac5e7edb37fbcfd2f5d130e3841dbc0",
+"2cfbffcc25a0a01ab7cd1e700030d0e363ac170dd000397fa83d107a6d12bd54",
+"325355d6824f71f550b102c6fa6c8c129de58d325174c5981c562e606a58c55f",
+"1716f66b4ad2388a23ce111dd5ff7c04d4478dd81930050fdf0c4a90fcd6d381",
+"02992cefec8ee9bef9602858d51c87a2c4180d9fe0c02e6c6003531010793572",
+"2132b3fd309dd69a9f3c39b450534d857721dd5a2bcb23b479a29b08e8f8551e",
+"369986658b8e7e4f990fd6fc09b99a056d81ee47c7a9e46b4109d8af0956678c",
+"25e00309f0c3097a6500df9ed5587ec128b20a97379814b4a0522f7e775a4548",
+"529a8ecdddfb500c68b664f7303dad768da802c29a933801b2199cf74a3470f5",
+"3cf98a6dc8290785ede38da9455dbd28a64a1bda35a48d6c6b1b35ba6df3268b",
+"127401f379aa992d492782910baee0fb331b3e9c1a66492c9b002a37999f356a",
+"449dabe3e12e7b495e0421de157acbd4b3852cb824bba7171c8e3da565e3f95e",
+"410d1d4fb041736101f5468ebdfd9380f2066593534339bc419f35d530c92cd7",
+"09747f87db187d67e7881e1b64345754ec9bc9ec353e9b055bc377f1618ef17e",
+"5fec471449175525c56b18200dd8ab96b2f9ee383849545628f0ceff76f631d8",
+"0c7e402c723170d5dc5f15e229f4bacc5eb50b34dbfb6129215ee662288e159c",
+"158896654586f5c3a34808ef7ab93def61fc9257d5b7631ed6869259a45d1d01",
+"57ab3eab90ec38cfb23625e7110948e4b56e38a1ccc2cfffc344876d28aceddd",
+"08d08f8650f5ca7bf03aad9a80ae09c697327a131827a9c2aec67d1d9f58064e",
+"273607089f1e9c2b99812e032dfb62c359438c76556a15692a3de02b8c13df4d",
+"55bf5cd5a1a89d7e3d1d274cc5b1b765e42a9eab5cfd32148c1633550ecfffce",
+"5c4f6e0acb889fbb573583767535e95bc537641769c35063c0bd3a65812ade57",
+"581faa1d0a57ef947001fd8e57eee26e645d15eebedb7ebb1d85581968544ca6",
+"48b77ab45f5fb6d615bd759a6661097bb8a3b5c27ba35f1b127d2ee12f043bc4",
+"590618389009da43c679b6254ae4cc86dbfa397981f4dff30e064e07bfdc9eab",
+"3ef9bd95ccaa3c577ab98d3fad87fe69953bbbba6c8bbca0301a6c88e9bed8e6",
+"2bc1dd87795feb2a5e8d98759371592ba7147ee4c2a3473d18c496ebe3721216",
+"620ba5be31e353f1f3c72a4380f32c016f0746f5446f9e1743fb01fe6994051e",
+"151d0bcf972db311553ef8da672b1c861d118e9b78da632d24c49d4a0fa177b7",
+"01f1bda7ed65ad241d6fa13d8c5cb40cc335a0b2a31b433f2c65cb01e8dad5bc",
+"4aec58578fdfd5e59d18063bdcc69086dae303518f5155facdc2824878862c53",
+"1ca2d39cd13b6c690faf2be3da4d4517e28244fbf9ca0f8f4d80565205fb86f2",
+"72432f39b454d6457ffae81f2e843df03c1526920384c50136beca0627f9054a",
+"1910c2e6bb35a12e22ec46cd0db6185f352bf3581cf46d2f9c494daf8d94b993",
+"4e47d6f9080e682d34ae07d5886c29869d16324c468782bea9c62334b583251f",
+"3240024a0dd08da0c135caf8114ea8d333ab181e94a3a01edabb760a64adcee4",
+"1669aabbd01c4541575f150981af0cf9a196e0b98908af53ea14b81734ecce5a",
+"316aa08fd611919a73b60dc2b3175b3843f17035d71b9edf2f72c32850629574",
+"4919d1e48c28eb1d36a689d8a5826c4ae4cd4e84a8347a9c9238b825a0b53a8e",
+"4572211d4d1c8257d142ff2335eea65ccbf3177a982fed00931410f3bdf08c19",
+"5d2d04f110bb9a50adf25427b232870f2be2307685f19df47f9b2f1bae984a04",
+"472609c977c6854de75985c9154f70a7fda1843a38f10dd4985ab8dc353ad5a7",
+"5c2ba4f8bec80b52e65afbe7b2ff41ad73542275e40acba8730403e9e33c7697",
+"267614d22d526f429346fb2e9dcc4930880971780e85ef44a199feabe2b48227",
+"1110d3da8ece3e4eda99c2d63f6724779af505b9527f0b191b34b5bfabbf5584",
+"68fc77023c046909572d302630c6508922cbc03e6c6d9a05108bc8db71e045ff",
+"1b6630a5ab959106f3951689fcbc6a757c97511d08a3d4652b8ee7eab820d575",
+"2e34a9c19201971c6cffc366e7955b33d0b7dc59fbaf87cadeb8d0c099cfb541",
+"060bd11957a053af7aec4b2c2caf7e227512d9e856552e5cf6f4ed4b04753bec",
+"0d8a6987303d76b12f97eaeacfd783401ffef6ac2e994182eaa93843300385ae",
+"0e9b15bfa73141c59edc9d11ec4ee316525ba53c4b91e4f1a8adb8d372e91dff",
+"55215d958a6afccf90247026efb61dd9bae318cd31ad27746b227de8873add8c",
+"4ccb674b94da03efd3404a424a422d42fd4f3a8b9f73de3aa7377e728400e797",
+"256f31bdb0e0cad47ec44da9bdd1fc146d0284f1d71c596e12b0c690e202d1c4",
+"60797d9977e8cf8484240c0ac4d3703818c096db8d61ca640bab83ea4e675919",
+"57fd867a56f6fba130d5cd80d1aa2562ca3bdb6956892c0f66e8d9bbe1fe49e7",
+"09115f248d518063beb8d89c11115a6b53ac2927b2eeb0c50b50b3e82c314e5e",
+"6a10f8ecb4e14465b19148ae366be2452b809596eec80f4913a2240e5e89c98d",
+"0399008978536884058e8b36c86b622d5da6cde04ceabb591fe8057153f6c7b2",
+"2c7ba50ad84ce603d8206950a09277dbf59da814c5b5119763a208953d946812",
+"02a697c90f23766d5fde4b61101665b865375243f1bde57522bcb4bcda33804d",
+"3bba46c732127685e3a7c6963ec063f961bfa23dce70af06fbbdba02d295aa8a",
+"206c47de6dfd8600586a42f98aea1284742671c605e7a274a306e188015e031d",
+"608a94a91f8e4e1b0adf94c1af4992b0176fc84d8d79b881ec02d2613f4d9083",
+"28f906b6e3e6d01ac90251789b81001bb5d96ec2f55be04354b37bd7211c8731",
+"25c66f7f7c9db885d9f7d7b64bd555f7e2e939878a6f1f1056c0c5af008949a7",
+"4992f08ef5816859cd16e02a367e55fb073cc08ba19fce061e83288caba6e308",
+"432fd05cdbd6ce762396cc6b88f6db33f0e6daa1e4faf602a599575fe797979d",
+"4961bcdf4ad6da150ed71fe78f84c9faaa28e63e378af83aedd33870e337c362",
+"4d1025421a43054ecb8eab1d4ed666a8cfc7b3e1d3f5243bd945032b7ae19a1b",
+"0eb68c99851461def5baf569dff154f8ac4591e8ad194f641dc5fcfbc157c07d",
+"256cd6ef41e108838bc52d51af281be02ad6c5d2a3e6f49f2cb864bcf2397447",
+"0df82b76b04d8813711f92ed2bc6dda5f32e4778b5f1b328bd3b2a3b82928645",
+"73397a58cf55ae9d2b14647125725f053dc0a9d5d5599f67955b8b8ceb8c43d8",
+"352a6762b6764cd234a5e7e24e1beaed50618b691be9e40d4b15813d6023439a",
+"4ebe36c93f3561edd31170f6775e38889598f0b40a3a2967882b60c6bcf8d6f6",
+"4af798462ebca10935795dcb09770d98e2a93bc25a99af876c1f080fdf04047e",
+"6f9acbad33e5d972376f1f67457fb5565582c0cc233006fe51942c48479a3c9f",
+"395558ce9453ad4999a1d87585bc88b08731882ae0ffbbec886db1cc3fc7ee62",
+"17b48a7db220b2b4e4a3e9139168f050056e71049e4080ded3949222d3915dd2",
+"13266faaffcb6e011f73a4065bb1f7bdc373571d1b9c0210674f4f9d18cdbf3f",
+"0edbbed85597c4beb59685811f7f3c0ce807083c032e6c71e5869004bb37c93d",
+"64a7409e0e833df31fb574e1c12f764ecf0e3d335cc53afcdc22ac13d7a81da8",
+"730fbba0d85d06eabf3f517d4826457bacb2fa8c2f24168c1b026ada9eca5bf5",
+"1ffdde6d216f269f8d25efca3b28590416ea7340d92df2c02d111e30302ba020",
+"6551f0ba88e2b256f61e052c2ed98e5253fb7791614da7f7f10f9db1dbace96f",
+"5a40abaaa2542543cd1710bab187798b01f6c7d93395e3a1cdaed5b8866018e9",
+"7021fa2631484663ef5e14124c49b3078b460d77c9972b9f3aa8fe7bed79bed6",
+"28e1b47a74ed1328c9cf0188bcce0e6bc8e32d808ad91d62d747382141e7c439",
+"267bb1817a59e83c9cb67f740cb31fccde2ae0f6dc49745f826267f78136bc5a",
+"6f2a6bdaf2152c1368e51b4d1ae3ce48bb8a62e00d92f2f9f21393c691243aee",
+"00cd4b3d36b639b44a828c3dfe8e8da68a7cccaf7063fa92877683c0e5080869",
+"3e8e056dee60929e925fdcd2395a9959202ef71b82a638fd1e3decba9051d016",
+"651baeb3fea106c59cefec6a9c8973347a481a75b04f547d8d2f63a1ced57161",
+"1e6ea48da02249378957d446d9603e4a1e0efd343426933d0cf5a1400148f654",
+"5eb2faa76b282614614ae97db1e0bb722146ac8230739cf9abb35058ae7f6363",
+"6400a9ba34a8ce081b7755a5241338c78c10c07ff6cc97ac94f29b23775922f3",
+"5c475b1284568d5c55fae4840fd5bf9b9f8041fb4c75f3fd902681d97d4b09d2",
+"037e3fa79fcab75541fe4ceed6404d2a89228694646835e0422fb558477fb128",
+"39186a11b8693a21684796f4dd227523ac2782d6d23330d8287d77e19f106923",
+"44b4264d680b2bfa7081436798dce5bc3b20bedf250dfb2103abdde5b3f24eb2",
+"01fd3211afd7ab17103dd5a181b91982d83e69f9df9568ed132db65c23bfba2d",
+"66bd19f66bf63ef557cd87c638d6a97f2853a284307ff04392e61b7a68e56b12",
+"09e3ea8c3c87110454cb0045179ac850f74285652c6854351682cd1706b54f88",
+"22b7ffce8814457850e403085d0f725dc72396144565f4542d5bf826f4627106",
+"255b1285cd235b83bbdc8032f637a74bc8b33a798e2751969ebe67c593b578bb",
+"5b568413938daa1acec17d776af723451fc067e63ed8a24d58cefc27ef7feca9",
+"4fc38e950b447f3040484e58a7d106386da69400c9292640014886e33eb7596f",
+"044e95a76627fade400c813061a56bd38ae137734ac1b7b11fce4a12eed6bb68",
+"129d3939b05352392ee46921665e027d3cb9c9857f0b2f161bb1f0fdd58a74bf",
+"327b98a9fc847d6b6d54a175aaed3678172d615d37cf1c4448c9d4588a2eb7c7",
+"63675e996ad78bc6725b923b4cbeacf40f7d4b85bf38fd8b5ed0f63424779ab5",
+"7374af204d7432c7954dbbd12ed973b79fd0a6d7109061ffd10ecb2f6942d5fd",
+"0fdf70b408b29ce4bb3ef9a02c333ba7789fffbf2b17dc2ef4dce8714ada06a8",
+"4373b306976a59fbd07f82bb44c4ee4e4a11806801960c5c18f32f7679321d3c",
+"1b218fbc57953d8d44ab45c19993b223939a121a1e6bf87b4ca549e06699880a",
+"09b95f647fc4e11ed6a4757be6287d3f4d6bbdc6da8173da072d7a5d046862b1",
+"1def7155ba82eebd07611e2dd694a49dac9085004c1b4e9de2b4f0bf40c063fd",
+"38921799f2fae22e5dc387e3b63a8d4d2210ad60690f61cce190bad2a304c035",
+"2cfc11979ac028eea6636015cd2241a9ca2b9256bcdbae2f89df853751f63589",
+"21e602b39eade2ce622e3da4c76124a5f9b2580296037a33f88044895aa8562c",
+"25c9a818e3691a8d36cc881eed8513110fbcd2c855270ae265cc4a53283e2f4e",
+"6d17e4bdef0620c74ce13ee9b219e49bf2c8ac57cb1882bca03c64ec7c7c69fc",
+"2285fe01b02e1cb4331c2e86272f10d7e7daeac3d368b914e9115d832aab4e12",
+"3fb801cc1a5264babd7f35a65091d15eb9b47a6f06ab9422defafaee4cd35a84",
+"5b2ae60ec46971d3b3535743c3ab4d99f07ee2f551bfb2212ecfc7120169c8eb",
+"5322e28426199923aab00dcb5aa2c0c92690628e69ddbeaa8a9e0b92e4d84aa4",
+"1db225ddf28a651a6f809533078dfc8a006d4b76b59afde3d3356c7f26bf1ac2",
+"600fcc0f370b76ed88186364efc8d0435ba4efe84abd6b2573e87e213cb405dc",
+"007c21ae6a4471fb33141d353cb73f3769ee63d78cbc5d7e6a8c1bdb7cf3eb4f",
+"17520db9848586770ced86adfca305209a0884592720f70eb91f9e3a22c23a94",
+"3db8aeed94f87b37fc9cfee7a7c027605bec03af4965b840a8942b89fef39ecf",
+"10b3102359b66388bf079dd2f30d8131ec4da41bf159fae392838a9708e1cfc9",
+"0c9f537a5a0efc930019893a3fbd46c5e2a85b78b22b4bb60c0c1ec2da334a07",
+"165f9cb0313efaf5a0636141f39c3ff22089c0f9c494ebc40e9e8060b84f149f",
+"001879a49e2e539bf9e9c713416f517ee14f6e510a9cafb9a321fef9ca23ed49",
+"32e53a1e65305675144ebd5bb49bdcf81879daab30fff361eba5cfef952184a3",
+"51b4edb20a2bbb2daf144d4ab3b72a5a4cc956d9bd9e2ba5017c2163928118c3",
+"140c9db4c384a0e3757a41ae5005b2557148cb3c190ab7101059053039d655ed",
+"1737e47c806e74be09d8f7daf7c9d12ede33929f5152eda6c8c008064cfc1be3",
+"23f3501123499df44f5cd31b08fa1338be61194a023c9101a41ce7518acddcdd",
+"68dcbacbeb6727e3b47ef3a6291421496a78d81a645f2451c2cd89818715329b",
+"2f1dd4d3ce3e7b49d67a4bca9ba8b5b64ee37a20496ddbc302aa8c1bed9b2fbf",
+"2b5427a54294793e926c0ed030eff8b5020801ae8a46b1d7cecc49d01d2cd4a1",
+"1bcdebbdce2545485d5db25d9776f7bdc31dc799c61cb726e20e0071e939e4c4",
+"6021616995863e2b6fb9015892f2f361b60656bf1998239aa471d4c698564e9f",
+"4816704f77b55fba8188d9424143ffd7b015587467072992b2482e9bacd4f072",
+"60aad5cbecde71eae3fb3e8355137d5890f2947227093bacd23291a731720e79",
+"5bff651adb907adde66b4a4810173bb8cc0cc618e6698e236979750865b68466",
+"4dc639d5986ad912fc2632704ad03b039c6982fccad820b16ce2e519de54dcb0",
+"1780c0f66f7afefb6b32a019956b2a209224b9eeba8a643a222f7355214be300",
+"6d23740f70b21671e66d9bb35d7387b017dd56c78b65973db44e5479567c27a0",
+"1784ada0fe2211721dff5b63c46ddbd0cc2a7161e42f24b26b10cf0a807398c9",
+"3721b5cbdc714dc02db737a41bac0ad9dfd640229e4ef73c780f2abc7907a101",
+"6777e0e8612172897bde7e5e4d7edafdfac32f855d07b645ef0a2c2b6815d7bd",
+"5430480105f06250a915e429d5436268eeff94a54606848883d84eece231db3a",
+"5b06f0578c8e419abaf9365b1e0e4605a270d831b886b1310c2b30830f70aa05",
+"064faf1daa9415f3bf666dccf10e96a660e3c3e08945cecfad74bcf656a09b63",
+"5a7cf453cdc309e004ac0d4b161686c9497ddd5333302ce1ac689d3cd3f15fe8",
+"3d1cdaba6330736b0b9c17a27d3f31b58ea7b0aa1a46faa5cbc191faef9e41ef",
+"59c894b434302a88c78f3438263ff4a3f82f27af2f086958497b75ba9ede3267",
+"4f96eab2814accfe7cc529624df63fd4d9d3932ecace112a52d488ebd64f86a9",
+"5c3395a99f651f587c1e9f88fb32ffde50f312874219daec0f67f604ba56f55a",
+"10bc86369a85dae2cbcb60d1a110675555b1f29f01af909d0b0a452fd6f8aa0a",
+"025c11c9d5846be858ed85b2706718d0859b14b5e6afafc50e5b7cab9390e88d",
+"6a0df7099df32bbf845516682d8b2c40d5b238bab4493508146ec7da5280b31d",
+"15dee1455b9289a97a4fb4561cd05cc4eaac7f45e2098e6db369c4e38780a898",
+"6b00cd849365b050f85b3bcb73dc91ae063ed60360b053ccecd4ea226f5d3480",
+"36ba01e51f6cce897b12718e2947d0ded1b43f1ad65045d9e80792cc0d2afbcf",
+"705ec3f8f1bdd15381e69d0241b37349e11963b509f73dde27e4d00f7173e9d2",
+"00259c2c2a277983602c80547343f0037a7a3c7edfdf98a1ffd16bea20204aa2",
+"07ba65993dc66a3359f96e202f8408f9367d24e37a83164c622f682ef4d113d0",
+"56324ef5c5a36793bc76d0c2a38e6ae35916ab04bc072325036d9e832981518d",
+"3cdc6e8fc9101d4e6be6b5fb368a3911ac13c4090ea7da9f345cd5f7ae7b1e6c",
+"3fe62a321b08da7f8f6cd2080867b98b6c9f54bf910bac77db5a71da68b18270",
+"53915ca5503403181327eea9143a99782e31f1636a324a946882376fb9d07681",
+"45ec1e9c297bdd973aec556197b1168f8a55b0d7bb0519b5db479f95d11cd045",
+"7310ab366f789b5264f16fd563b6dd31462f3e352a92fbb5e2357a9fbb9a1f16",
+"739ebe2484fabba7b18d7f3a213bb9d3bb2d78a8c05f41515aa20533b933cc2e",
+"048f8d7f23612a95c09d90137f7a4d87e340a1e83ec3c94284d6784ea8006423",
+"49a59faf4bbf57ee29b5e186bb0008a4ec74c8fdb7ea8fe7e1aa46bc40873b50",
+"5cf260d13f5da4870855a40e71d4effda202f310a955db2d140e9317e4238998",
+"38c2eba027b51ab146dc61e33b7403789b63641a5cba018829e3dfc9336cbcb8",
+"1f90a83ada4e0d548c8beea8f902f4bdd8466948161fe2760a0127f44a0edea8",
+"6b65cc39e2d766f83e8f6f59fd5e40290bf8b887c99da8c166417d5a9cae1444",
+"1da9f1f317f97e9c6132dc6808def44d32daa0c2dbcffe580d8f35b85400ccc3",
+"3df94f558d1e935080d48183a3e742f6be2992f5aea51387f01c90219e980fa2",
+"59974c89246e978cbee6e84478252843235f550eb7ba45324d4a7ea572ca7e2b",
+"094be891b94edbc55530775ac31dd8f5ac0d1e2462579c158ce2f28843a2e9b2",
+"02c997879aff55f85e9e19e36a32758b868a0504ff0cb4a704fabdb897f308bd",
+"090a6946efff80828d498845e43aebaf02f19cc8a5459db7b12952e4924e1fd1",
+"3cf7d767a121eb81462c2731ee18da4f5579e007ed7e198ed9c74d0e4122d247",
+"4dafcb7ed415b248c5f169092d29b0f5d213e599e2bf15ade507d9ae2c9d764d",
+"5204fb985e7a86bb77fd705bf71787c4a09b97e7729318e6828a422f70aabcea",
+"0e1b38375d5ded933a6c9d7512ade1e96679651be670f381f875dd62c7279827",
+"6b612638db66a469241a60b7222956ca0364f2d77ea8849aeb99fad2a0b5637f",
+"3626c1544bd18d8a9bde32d6210aa6179839b1ebefb87fdb914d3735db50f92e",
+"222fd118f0cc69ef015f43fdd95a4db3fc08eec734f4cd3fce78e73348373e03",
+"369885b7348e2be8c21dce937e248cc6c390c703a09dddbb88b39bbfb3fa2943",
+"0794753806f2502ff43f7b8c4990e446c37677a49f78e0a8e38622a23c34eb60",
+"4b9b69b8b54c2ba38a23c409263b2ea543ba2082b6fded12c3c9b9dc754c4202",
+"06fae323404cc19a099fb298803a76737720c25913e21f38a75f1c8e63a96b9c",
+"50461e3977f12ec2de486071fc3924cd1aef82a6bc9fbde215eaddee6780de1d",
+"5ff12618767830d17a759dadc62c40221cc848ef84da8cd91b76e5ca59ccaa37",
+"6b7bdeac8d4dc989219510a928aa2e2a8995f4aba16e9f59d85e88ae3f6f5f5f",
+"5fbc48469f2e94eaee4ce3cc7af5c45f27a6532f0b7d8aaad76e61091a319ecd",
+"024ec0f964b1ce01b08352c231662c238c623cd66a2da4ef330debc7323dba8e",
+"0dfd978f5c1e804bd89e9d579edb44c49335296cd5948420d7650775cf88fc0c",
+"57ecafcf80a257780a9bbac3793c3e772fde0c88d6ce8e39399c7eb0a7e76d6a",
+"705b423e84afdccba45b0286397d1a29896cc1dc3fb41721e9e14942a2c13db6",
+"61efd69d156931b397d7aebd87d6c7599f6a5e2925cb7d8891fd751b7757c486",
+"5b0a8e0bc9d55850e65cb119b6b43abd5eda13de38ffd6e45130a6b2c7184251",
+"2ee9eb134a2f83e93bb4b09c71da3e7810d9a2bd01acaacf70fc7b43ccc2fec6",
+"136a3734420b9a29249f23e3292d871653540c3a86fdfbdbb655596aac99d0ce",
+"11ea5a840d53c0f0eaa111e6f43d953cdadcddedd8b7658d82266fd0897cd71a",
+"51a4d6a93c09813a72f272b043ef5cf88fe27eeadb2065cb75c95620874ea281",
+"00b698d1b30b8486b7fb7cafdae54bb93ac182be3623f1feffa7edc12486d4e8",
+"22386f894f2a9326c7ab4cfbceae435cb69f3e359ee49946dc566f242f4238de",
+"636d98aea6cb6afe50fd1e96bb8bfdf18a9d54a87e66fd79e3dff80abda98c18",
+"067a4de70930459165ff7d84a0dc375adb145ac07e67eb0e1fadebd4e2610eeb",
+"64721850463f2d1dfe148e429e472914d67d9867409de6c39150225106d4d425",
+"6c87827aa64247be6bb132c49e271a6e23c54c8334f2c3eca5551b4ae5260f05",
+"65cbbc751ea4f5e7956628b8645708187b37f2d65c6c297a5854355256de476e",
+"6bf24b343856b4066e2835b1fe3e5d16496a36f41386c2afd44d001ba886fdc7",
+"41d82825d409ab7c996773b516f6720e34cbfdebdc9c069fa579dcea11ef44f6",
+"45f741f2e9481a85b86467ab30d363fd0328e33d53fce6b39286c2494ee7bd28",
+"6c06f72d4e071f9c1ddca4f9ea231853f6d8c5e9b7418e9c564c995912d19c18",
+"154f9ecfb65370a8b59a12cd736348aead2e59a7e3701d20a669bec15363fe62",
+"0c4d910fbd3b57be6d6680e8d2db47c1454712b240b78468cb764702be5c1aec",
+"0e1ac575e1125f5ee86da3342018bc4f3c1e2310148043d5074eb4ee22fc55b6",
+"273531c7d0d03d8f97b722ef1f0c324dac39f804e0222202f7502946647ef332",
+"101464d19cf380958e5aef1084736db89f4cb131033ae670f6de0a5cf9d92b73",
+"597cdd384abdad1beccc73fb39f74a18eb44d056951d602c2ef6ef6448fc5626",
+]
+}
+

+ 20 - 0
src/vm.rs

@@ -38,6 +38,7 @@ pub enum CryptoOperation {
     Load(VariableRef, VariableIndex),
     Divide(VariableRef, VariableRef),
     Double(VariableRef),
+    Square(VariableRef),
     UnpackBits(VariableRef, VariableRef, VariableRef),
     Local,
 }
@@ -62,6 +63,9 @@ pub enum ConstraintInstruction {
     Lc0AddCoeff(VariableIndex, VariableIndex),
     Lc1AddCoeff(VariableIndex, VariableIndex),
     Lc2AddCoeff(VariableIndex, VariableIndex),
+    Lc0AddOneCoeff(VariableIndex),
+    Lc1AddOneCoeff(VariableIndex),
+    Lc2AddOneCoeff(VariableIndex),
     Lc0AddBits(VariableIndex),
     Lc1AddBits(VariableIndex),
     Lc2AddBits(VariableIndex),
@@ -166,6 +170,13 @@ impl ZKVirtualMachine {
                     };
                     *self_ = self_.double();
                 }
+                CryptoOperation::Square(self_) => {
+                    let self_ = match self_ {
+                        VariableRef::Aux(index) => &mut self.aux[*index],
+                        VariableRef::Local(index) => &mut local_stack[*index],
+                    };
+                    *self_ = self_.square();
+                }
                 CryptoOperation::UnpackBits(value, start, end) => {
                     let value = match value {
                         VariableRef::Aux(index) => self.aux[*index].clone(),
@@ -365,6 +376,15 @@ impl Circuit<bls12_381::Scalar> for ZKVMCircuit {
                 ConstraintInstruction::Lc2AddCoeff(const_index, index) => {
                     lc2 = lc2 + (self.constants[const_index], variables[index]);
                 }
+                ConstraintInstruction::Lc0AddOneCoeff(const_index) => {
+                    lc0 = lc0 + (self.constants[const_index], CS::one());
+                }
+                ConstraintInstruction::Lc1AddOneCoeff(const_index) => {
+                    lc1 = lc1 + (self.constants[const_index], CS::one());
+                }
+                ConstraintInstruction::Lc2AddOneCoeff(const_index) => {
+                    lc2 = lc2 + (self.constants[const_index], CS::one());
+                }
                 ConstraintInstruction::Lc0AddBits(start_index) => {
                     lc0 = lc_add_bits(lc0, &variables, start_index)?;
                 }

+ 95 - 0
src/zkmimc.rs

@@ -0,0 +1,95 @@
+use bls12_381::Scalar;
+use ff::{PrimeField, Field};
+use std::ops::{Add, AddAssign, MulAssign, Neg, SubAssign};
+
+mod zkmimc_contract;
+mod vm;
+use zkmimc_contract::load_zkvm;
+mod mimc_constants;
+use mimc_constants::mimc_constants;
+
+const MIMC_ROUNDS: usize = 322;
+
+fn mimc(mut xl: Scalar, mut xr: Scalar, constants: &[Scalar]) -> Scalar {
+    assert_eq!(constants.len(), MIMC_ROUNDS);
+
+    for i in 0..MIMC_ROUNDS {
+        let mut tmp1 = xl;
+        tmp1.add_assign(&constants[i]);
+        let mut tmp2 = tmp1.square();
+        tmp2.mul_assign(&tmp1);
+        tmp2.add_assign(&xr);
+        xr = xl;
+        xl = tmp2;
+    }
+
+    xl
+}
+
+macro_rules! from_slice {
+    ($data:expr, $len:literal) => {{
+        let mut array = [0; $len];
+        // panics if not enough data
+        let bytes = &$data[..array.len()];
+        assert_eq!(bytes.len(), array.len());
+        for (a, b) in array.iter_mut().rev().zip(bytes.iter()) {
+            *a = *b;
+        }
+        //array.copy_from_slice(bytes.iter().rev());
+        array
+    }};
+}
+
+fn main() -> std::result::Result<(), vm::ZKVMError> {
+    use rand::rngs::OsRng;
+
+    /////////////////////////////////
+    // Initialize our MiMC constants
+    let mut constants = Vec::new();
+    for const_str in mimc_constants() {
+        let bytes = from_slice!(&hex::decode(const_str).unwrap(), 32);
+        assert_eq!(bytes.len(), 32);
+        let constant = Scalar::from_bytes(&bytes).unwrap();
+
+        constants.push(constant);
+    }
+    /////////////////////////////////
+
+    let mut vm = load_zkvm();
+
+    vm.setup();
+
+    let params = vec![
+        (
+            0,
+            Scalar::from_raw([
+                0xb981_9dc8_2d90_607e,
+                0xa361_ee3f_d48f_df77,
+                0x52a3_5a8c_1908_dd87,
+                0x15a3_6d1f_0f39_0d88,
+            ]),
+        ),
+        (
+            1,
+            Scalar::from_raw([
+                0x7b0d_c53c_4ebf_1891,
+                0x1f3a_beeb_98fa_d3e8,
+                0xf789_1142_c001_d925,
+                0x015d_8c7f_5b43_fe33,
+            ]),
+        ),
+    ];
+    vm.initialize(&params)?;
+
+    let proof = vm.prove();
+
+    let public = vm.public();
+
+    let mimc_hash = mimc(params[0].1.clone(), params[1].1.clone(), &constants);
+    assert_eq!(public.len(), 1);
+    assert_eq!(public[0], mimc_hash);
+
+    assert!(vm.verify(&proof, &public));
+    Ok(())
+}
+