-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathminaPoseidon.js
245 lines (238 loc) Β· 13.4 KB
/
minaPoseidon.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
import { pow7 } from "./modular";
/**
* @noinline
* @const {bigint}
*/
const P = (1n << 254n) + 0x224698fc094cf91b992d30ed00000001n;
/**
* @param {!Array<bigint>} vals
* @return {bigint}
*/
const poseidon = (vals) => {
const /** number */ n = vals.length;
let /** bigint */ s0 = 0n;
let /** bigint */ s1 = 0n;
let /** bigint */ s2 = 0n;
let /** bigint */ t0;
let /** bigint */ t1;
let /** bigint */ t2;
if (n & 1) vals.push(0n);
for (let /** number */ i = 0; i < n; i += 2) {
s0 += vals[i]; s0 %= P;
s1 += vals[i + 1]; s1 %= P;
for (let j = 0; j < 55; ++j) {
s0 = pow7(s0, P);
s1 = pow7(s1, P);
s2 = pow7(s2, P);
t0 = md00 * s0 + md01 * s1 + md02 * s2;
t1 = md10 * s0 + md11 * s1 + md12 * s2;
t2 = md20 * s0 + md21 * s1 + md22 * s2;
s0 = (t0 + rc0[j]) % P;
s1 = (t1 + rc1[j]) % P;
s2 = (t2 + rc2[j]) % P;
}
}
return s0;
};
/** @const {bigint} */
const md00 = 0x1a9bd250757e29ef4959b9bef59b4e60e20a56307d6491e7b7ea1fac679c7903n;
/** @const {bigint} */
const md01 = 0x384aa09faf3a48737e2d64f6a030aa242e6d5d455ae4a13696b48a7320c506cdn;
/** @const {bigint} */
const md02 = 0x3d2b7b0209bc3080064d5ce4a7a03653f8346506bfa6d076061217be9e6cfed5n;
/** @const {bigint} */
const md10 = 0x9ee57c70bc351220b107983afcfabbea79868a4a8a5913e24b7aaf3b4bf3a42n;
/** @const {bigint} */
const md11 = 0x20989996bc29a96d17684d3ad4c859813115267f35225d7e1e9a5b5436a2458fn;
/** @const {bigint} */
const md12 = 0x14e39adb2e171ae232116419ee7f26d9191edde8a5632298347cdb74c3b2e69dn;
/** @const {bigint} */
const md20 = 0x174544357b687f65a9590c1df621818b5452d5d441597a94357f112316ef67cbn;
/** @const {bigint} */
const md21 = 0x3ca9263dc1a19d17cfbf15b0166bb25f95dffc53212db207fcee35f02c2c4137n;
/** @const {bigint} */
const md22 = 0x3cf1fbef75d4ab63b7a812f80b7b0373b2dc21d269ba7c4c4d6581d50aae114cn;
/**
* @noinline
* @const {!Array<bigint>}
*/
const rc0 = [
0x2ec559cd1a1f2f6889fc8ae5f07757f202b364429677c8ff6603fd6d93659b47n,
0x37c0281fda664cc2448d0e7dd77aaa04752250817a945abeea8cfaaf3ee39ba0n,
0x21b7c2b35fd7710b06245711f26c0635d3e21de4db10dd3a7369f59f468d7be6n,
0x230043a0dc2dfab63607cbe1b9c482fdd937fdefecc6905aa5012e89babead13n,
0x2a18257c15ad9b6fe8b7c5ad2129394e902c3c3802e738f24ce2f585ae5f6a38n,
0x2e28f50a9a55d2e91774083072734544417e290a1cfebc01801b94d0728fe663n,
0x219e08b460c305b428670bacab86ac1e9458075778d35c3619ae7ba1f9b2ed76n,
0x30f33ed70da4c2bfb844ff1a7558b817d1ec300da86a1694f2db45047d5f18bn,
0x30083dbbb5eab39311c7a8bfd5e55567fa864b3468b5f9200e529cda03d9ef71n,
0x16ff7592836a45340ec6f2b0f122736d03f0bcb84012f922a4baa73ea0e66f51n,
0x34a8d9f45200a9ac28021712be81e905967bac580a0b9ee57bc4231f5ecb936an,
0xc31b68f6850b3bd71fe4e89984e2c87415523fb54f24ec8ae71430370154b33n,
0x3698c932f2a16f7bb9abac089ec2de79c9965881708878683caf53caa83ad9c4n,
0x2c124735f3f924546fb4fdfa2a018e03f53063d3a2e87fd285ba8d647eda6765n,
0x218eb756fa5f1df9f1eb922ef80b0852588779a7368e3d010def1512815d8759n,
0x19826c0ee22972deb41745d3bd412c2ae3d4c18535f4b60c9e870edffa3d550n,
0x8943ec01d9fb9f43c840757738979b146c3b6d1982280e92a52e8d045633ea1n,
0x68177d293585e0b8c8e76a8a565c8689a1d88e6a9afa79220bb0a2253f203c3n,
0x2c982c7352102289fc1b48dafcd9e3cc364d5a4324575e4721daf0af10033c67n,
0x3124b12deb37dcbb3d96c1a08d507523e30e03e0919559bf2daaab238422eaden,
0xff6c794ad1afaa494088d5f8ee6c47bf9e83013478628cf9f41f2e81383ebebn,
0x123e185b2ec7f072507ac1e4e743589bb25c8fdb468e329e7de169875f90c525n,
0x2fdee42805b2774064e963c741552556019a9611928dda728b78311e1f049528n,
0xc8ef1168425028c52a32d93f9313153e52e9cf15e5ec2b4ca09d01730dad432n,
0x3312ef7cbbad31430f20f30931b070379c77119c1825c6560cd2c82cf767794en,
0x1defccbd33740803ad284bc48ab959f349b94e18d773c6c0c58a4b9390cc300fn,
0x27409401e92001d434cba2868e9e371703199c2372d23ef329e537b513f453en,
0x25c327e2cc93ec6f0f23b5e41c931bfbbe4c12da7d55a2b1c91c79db982df903n,
0x1ece62374d79e717db4a68f9cddaaf52f8884f397375c0f3c5c1dbaa9c57a0a6n,
0x36dfa18a9ba1b194228494a8acaf0668cb43aca9d4e0a251b20ec3424d0e65cdn,
0x15791f9bbea213937208c82794eb667f157f003c65b64aa9800f4bbee4ea5119n,
0x3418a929556ec51a086459bb9e63a821d407388cce83949b9af3e3b0434eaf0en,
0x1852d574e46d370a0b1e64f6c41eeb8d40cf96c524a62965661f2ef87e67234dn,
0x3f62f164f8c905b335a6cbf76131d2430237e17ad6abc76d2a6329c1ec5463een,
0xbe0848eb3e09c7027110ad842c502441c97afa14a844406fcfec754a25658c1n,
0x380bd03b840c48c8ba3830e7cace72f91a5002218c617294e8c8bc687d5216den,
0x9b6b283ebaf45fbb1e448969ace9be62adf67ddf58614925741deb6a1ba7defn,
0x272f12e731077b74317ef2543c33b86194db1da5f6a7e1eee0656672c81685fen,
0xe8ec18c7b52c514d42047f1f0b2a90cb8c0c7391cf9479cd7fd5bfe1d3db8f2n,
0x23691c7009b9283b268766e8d491716d3c1993e6ecf458def8f762af3e355707n,
0x2bb74bb185372334a4ef5f6d18e2ece54086e62b04985dd794b7117b0be9217fn,
0xb7901c670e1d75d726eb88d000950b3c963f0f7a6ca24994bdc07ae2f78b4d3n,
0x26596ea9e1915e53da3479e9d13c3c920505e2449e325810ff6ca855fe4b7c6en,
0x16a49e69721e80690d41e06229e9bc2dbaf9a2abf4b89388db2485595409d62bn,
0x11a69b867d9ea22ec1b2f28e96617129e36eefaea9e8126bdc6a42b99072902bn,
0x38ef3ab5b61c117a3465a017a9c8ba4c227659b41fdf145206d5c960f49dd45bn,
0x3afb5bc126020586dcccba32dd054cd9a3f3b834ca9678d6802c48b1da97d6edn,
0x375ae56b8d9310d553ed77d406dedc3f0393e5a321b71caee6a5bb7078b5035n,
0x62da5280948d8c6c4acc7e6a1aa421f0f9ec179a44146750060be4be6755f85n,
0x42721e8a9cc32557851feb0e0190c5dfbf4cb1b8f47d37e7e653ec6ff8a4059n,
0x39316997737610193c3f9ffcfd4e23d38aac12cd7b95b8d256d774101650a6can,
0x1ca568aeddb2ef391a7c78ecf104d32d785b9ca145d97e35879df3534a7d1e0bn,
0x38df2fd18a8d7563806aa9d994a611f642d5c397388d1dd3e78bc7a4515c5b1n,
0x2caad6108c09ee6aee7851b4a2d2d3b7c3ca3c56a80003c8471f90bfa4ac628bn,
0xe10c10cbbe1717a9441c6299c4fc087c222208bd4fa8f3be66d2075f623b513n,
];
/**
* @noinline
* @const {!Array<bigint>}
*/
const rc1 = [
0x2553b08c788551bfe064d91c17eb1edb8662283229757711b2b30895f0aa3badn,
0x140488321291998b8582eaceeb3fa9ca3980eb64a453573c5aaa2910405936b6n,
0x1803a068d25fef2ef652c8a4847aa18a29d1885e7bf77fd6a34d66536d09cad7n,
0x218af77a05c502d3fa3144efcf47a0f2a0292498c10c6e2368565674e78764f4n,
0xa6f7ba75f216403d2e4940469d199474a65aa5ef814e36400bddef06158dcf8n,
0xfdedf8da8654a22831040cfc74432464b173ee68628fd90498480b9902f2819n,
0x38bb36a12ebcec4d4e8728eb43e3f12a6e33b1ffa1463379018d4e12424e62can,
0x282b04137350495ab417cf2c47389bf681c39f6c22d9e370b7af75cbcbe4bb1n,
0x17eace73cf67c6112239cbf51dec0e714ee4e5a91dbc9209dc17bbea5bcd094n,
0x1a5985d4b359d03de60b2edabb1853f476915febc0e40f83a2d1d0084efc3fd9n,
0x979556cb3edcbe4f33edd2094f1443b4b4ec6c457b0425b8463e788b9a2dcdan,
0x1a27ca0b953d3dba6b8e01cf07d76c611a211d139f2dff5ac023ed2454f2ed90n,
0x3c7e25e0ac8fba3dc1360f8a9a9fa0be0e031c8c76a93497b7cac7ed32ade6c0n,
0x12c875c9b79591acf9033f8b6c1e357126c44b23f3486fbee0d98340a3382251n,
0x23bcf1032957015ef171fbb4329bca0c57d59885522f25f4b082a3cf301cfbc6n,
0x30bcb17dfd622c46f3275f698319b68d8816bed0368ded435ed61992bc43efa9n,
0x2670bf8c01822e31c70976269d89ed58bc79ad2f9d1e3145df890bf898b57e47n,
0x35216f471043866edc324ad8d8cf0cc792fe7a10bf874b1eeac67b451d6b2cf5n,
0x352f7e8c7662d86db9c722d4d07778858771b832af5bb5dc3b13cf94851c1b45n,
0x143bf0def31437eb21095200d2d406e6e5727833683d9740b9bfc1713215dc9an,
0x3d0a10ac3ee707c62e8bdf2cdb49ac2cf4096cf41a7f214fdd1f8f9a24804f17n,
0x30b780c0c1cb0609623732824c75017da9799bdc7e08b527bae7f409ebdbecf2n,
0x31b2b65c431212ed36fdda5358d90cd9cb51c9f493bff71cdc75654547e4a22bn,
0x378c73373a36a5ed94a34f75e5de7a7a6187ea301380ecfb6f1a22cf8552638en,
0x356449a71383674c607fa31ded8c0c0d2d20fb45c36698d258cecd982dba478cn,
0x2d263cc2e9af126d768d9e1d2bf2cbf32063be831cb1548ffd716bc3ee7034fen,
0x24a852bdf9cb2a8fedd5e85a59867d4916b8a57bdd5f84e1047d410770ffffa0n,
0x39df3e22d22b09b4265da50ef175909ce79e8f0b9599dff01cf80e70884982b9n,
0x3bd089b727a0ee08e263fa5e35b618db87d7bcce03441475e3fd49639b9fa1c1n,
0x119e98db3f49cd7fcb3b0632567d9ccaa5498b0d411a1437f57c658f41931d0cn,
0x1adbeb5e9c4d515ecfd250ebee56a2a816eb3e3dc8d5d440c1ab4285b350be64n,
0x9406b5c3af0290f997405d0c51be69544afb240d48eeab1736cda0432e8ff9en,
0xa657027cce8d4f238ea896dde273b7537b508674a366c66b3789d9828b0ce90n,
0x7e397f503f9c1cea028465b2950ea444b15c5eab567d5a69ea2925685694df0n,
0x26b78788fd98ac020bac92d0e7792bb5ffed06b697d847f61d984f905d9ba870n,
0x2c6e57ddc1d7c81a0299ed49c3d74759416bc8426f30e2af5622895c531b4e1cn,
0x15d5095164c885763fa83cdf776d436382821a17bc5563a5b6f6dfcdac504aden,
0x5323f85deb8c07c193c37a73d76f6114967913a2bdce11995f183e769f42967n,
0x1591c865ea7065d54304519f8bb268bddbeaf3afae54edcd01a833ed0a9ef1an,
0x26cdab2c837ebeac5bea4be1d6f0488034907374d81a61a34f1c4db397d4c09bn,
0x366250fe928c45d8d5aa35f0a142754907ff3c598410199b589b28cd851b2204n,
0x32c4bd8ab70e1f25af77af57dd340c8e6c8a101dfc5e8dd03314566db90b870n,
0x30f296a269868a7fca8f5b1e269c0116304df31729559a270e713509d3a6d5dcn,
0x3d7aca02c051fcad8073cfd67210cd423a31888afc4a444d9d3adf3d6c5da7bfn,
0x25bc1af391f3c1f2284a95da92b5883d1b3a40794b2358b2e7a70fca22da64cen,
0x3992f83f26143dbdbd335604a1a14daf238ae43c249783f694feaf560aaae20fn,
0x172b7c2d8e7e4b06d183a2575b790749d0970c54966407fa8f59072c729de671n,
0x1d49a0d53bc2993cbf1fb5d1da9bb76fe46a7031d5e5d43fadbf54bc17c1ef38n,
0xa4b4d5cde54a974ea4e57ee4132d2ab2510c300f21930d6bbbf211d1add80f9n,
0x53d9b2633fff31ca4fc5724ce6b4422318128cdf01897d321e86f47cdf748b1n,
0x191e377462986563fdabf9b23529f7c84c6b200b9101b3a5096bca5f377981fbn,
0x25de9ba0a37472c3b4c0b9c3bc25cbbf78d91881b6f94ee70e4abf090211251cn,
0x5c6503ff1ee548f2435ad9148d7fb94c9222b0908f445537a6667047f6d501cn,
0xa57dbd4c327826c8a97bc7285f94bcddb966177346f1792c4bd7088aa0353f3n,
0x1e8b254cbff2c92a83dff1728c81dd22a9570f590e497cb2d640042cb879a930n,
];
/**
* @noinline
* @const {!Array<bigint>}
*/
const rc2 = [
0x25a706fb0f35b260b6f28d61e082d36a8f161be1f4d9416371a7b65f2bfafe4en,
0x3a73fe35b1bdd66b809aad5eab47b5c83b0146fd7fc632dfb49cd91ae1169378n,
0x291de61c5e6268213772cf7e03c80c2e833eb77c58c46548d158a70fbbd9724bn,
0x223e2d94c177d27e071d55729d13a9b216955c7102cc9a95ea40058efb506117n,
0x169be41c6227956efef5b4cdde65d00d5e04fe766178bdc731615c6e5b93e31en,
0x46a3ed9863d2d739dd8bc9e90a746fda1197162d0a0bec3db1f2f6042cf04e2n,
0x1e9aa3fe25d116ccfbd6a8fccdae0aa9bc164a03ab7e951704ee9a715fbedee6n,
0x9b1528dea2eb5bd96905b88ff05fdf3e0f220fe1d93d1b54953ac98fec825f0n,
0x37af1de8f5475ba165b90f8d568683d54e215df97e9287943370cf4118428097n,
0x255a9d4beb9b5ea18ab9782b1abb267fc5b773b98ab655fd4d469698e1e1f975n,
0x2a4d028c09ad39c30666b78b45cfadd5279f6239379c689a727f626679272654n,
0x109ae97c25d60242b86d7169196d2212f268b952dfd95a3937916b9905303180n,
0x2fc5023c5e4aed5aa7dfca0f5492f1b6efab3099360ec960237512f48c858a79n,
0x3cda935e895857d39a7db8476aeda5a5131cb165a353073fd3e473fd8855528dn,
0x17474c3b6a9bc1057df64b9e4d62badbc7f3867b3dd757c71c1f656205d7bcebn,
0x3bd816c214c66410229cfbd1f4a3a42e6a0f82f3c0d49b09bc7b4c042ff2c94bn,
0xdd53b41599ae78dbd3e689b65ebcca493effa94ed765eeec75a0d3bb20407f9n,
0x1fd6efb2536bfe11ec3736e7f7448c01eb2a5a9041bbf84631cc83ee0464f6afn,
0x18e3c0c1caa5e3ed66ee1ab6f55a5c8063d8c9b034ae47db43435147149e37d5n,
0x1ebee92143f32b4f9d9a90ad62b8483c977480767b53c71f6bde934a8ef38f17n,
0x1d61014cd3ef0d87d037c56bdfa370a73352b95d472ead1937bed06a31801c91n,
0x1dfb3801b7ae4e209f68195612965c6e37a2ed5cf1eeee3d46edf655d6f5afefn,
0x1e3ca033d8413b688db7a543e62ac2e69644c0614801379cfe62fa220319e0efn,
0x3218aeec20048a564015e8f221657fbe489ba404d7f5f15b829c7a75a85c2f44n,
0xcc88d1c91481d5321174e55b49b2485682c87fac2adb332167a20bcb57db359n,
0x111e314db6fb1a28e241028ce3d347c52558a33b6b11285a97fffa1b479e969dn,
0x205d1b0ee359f621845ac64ff7e383a3eb81e03d2a2966557746d21b47329d6en,
0x9b08d58853d8ac908c5b14e5eb8611b45f40faaa59cb8dff98fb30efcdfaa01n,
0x3fedea75f37ad9cfc94c95141bfb4719ee9b32b874b93dcfc0cc12f51a7b2affn,
0x1100b21c306475d816b3efcd75c3ae135c54ad3cc56ca22abd9b7f45e6d02c19n,
0x1fbf4738844a9a249aec253e8e4260e4ab09e26bea29ab0020bf0e813ceecbc3n,
0x23ece5d70b38ccc9d43cd923e5e3e2f62d1d873c9141ef01f89b6de1336f5bc7n,
0x3482f98a46ec358108fbbb68fd94f8f2baa73c723baf21922a850e45511f5a2dn,
0x405f1fc711872373d6eb50a09fbfb05b2703ae0a0b4edb86aedb216db17a876n,
0x38fd5318d39055c82fef9bdd33315a541c0ec4363e6cc0687005871355dfa573n,
0x11d3a81b262fc76ef506ee6d88e5991d0de8cb9dd162d97c58b175e3bc4584f3n,
0x3427fdbfca3cea23063eb138c5055c6cad9c4252b23d12c12293308eff7d9124n,
0x3d5ce415ecae4ba42b417ea3a501b44694f46efddff2fcca952b097f3852d3d8n,
0x3eddbeeee5eca5deee4bf1789c435e1241e0d71186d8f0f62d74729dfc3119fbn,
0x2d2206730664d58be0676dad1fee0e990c264a7410a2cdb6b55653c1df72ef56n,
0x1868f8118482c6b4a5a61a81c8aaca128953179c20f73a44022d9976bdc34af1n,
0x1ce36db31fe6ea3cd9308db9aa43a8af5c41a8f0a6509bfe00f0e7b486c0ab8an,
0x2588961eff7897d87eb6ac72350ef9f52640647cbd23136919a994dfd1979d5n,
0x299bd48a740b7790075268312ab8072c72421de5a6437fa5e25431ef951847b4n,
0x361ab3843f4d8ddadede39d82bb1a8109f89b6d9aa117b8f365de43895de0baan,
0x350287977eb71c81b10ecd039aad99cfa9ed84a04301cb30869e1dc7fa1dc638n,
0x2eb53fe3a278688a70494569e54a0f0d269935aec6c897bef4d368c1f67d57e4n,
0x132d17b87cab6d707ddfa1f01df1724ad37957e989c44f1ff71426367f953160n,
0x3356f1fbeac493ccab752b70bbed821ce49965c19284d7aacd78fbf3ff864e91n,
0x267d96caeafde5dbd3db1f0668b09ccd532a22f0205494716a786219fb4c801cn,
0x20f89af9722f79c860d2059a0ec209cf3a7925ad0798cab655eca62fe73ff3d9n,
0x3393debd38d311881c7583bee07e605ef0e55c62f0508ccc2d26518cd568e1efn,
0x104c88d6d0682d82d3d664826dc9565db101a220aa8f90572eb798468a82a2abn,
0x3c15552f9124318b8433d01bb53ba04ba1cc9eb91d83b918e32fea39fbe908fan,
0x1812dbcd70c440610057bbfdd0cc4d31d1faf5786419b53841c4adc43f2b2352n,
];
export { P, poseidon };