forked from Tonnel-Network/core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MiMcSponge.fc
322 lines (301 loc) · 24.6 KB
/
MiMcSponge.fc
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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#include "imports/stdlib.fc";
const op::verify = "op::verify"c; ;; create an opcode from string using the "c" prefix, this results in 0x3b3cca17 opcode in this case
const error::verify_failed = 1001;
;; storage variables
;; load_data populates storage variables using stored data
() load_data() impure {
var ds = get_data().begin_parse();
ds.end_parse();
}
;; save_data stores storage variables as a cell into persistent storage
() save_data() impure {
set_data(
begin_cell()
.end_cell()
);
}
(int, int) MiMCFeistel(int xL_in, int xR_in) impure {
;; if (xR_in == 0) {
;; throw(0);
;; }
tuple c_partial = empty_tuple();
c_partial~tpush(7120861356467848435263064379192047478074060781135320967663101236819528304084);
c_partial~tpush(18253558722113524385869353417731172885353199650731767434016363008616844739019);
c_partial~tpush(17980351014018068290387269214713820287804403312720763401943303895585469787384);
c_partial~tpush(19886576439381707240399940949310933992335779767309383709787331470398675714258);
c_partial~tpush(23101958150063061948052561406995951992068715260094353934029412146957343098216);
c_partial~tpush(40050381125239234053296951000671963327678952655307234814632436701258393230128);
c_partial~tpush(51443948025144720602351070688490938853517575848436989943757882543131654573110);
c_partial~tpush(42324647810708748861824093462056117367620994502264655684508965438825041234912);
c_partial~tpush(1204793880210306772300971186170362150216400915423060822608943400767656900559);
c_partial~tpush(4798196928559910300796064665904583125427459076060519468052008159779219347957);
c_partial~tpush(30616091934979780444776294789075948391627816221970618894705151433484765703288);
c_partial~tpush(23234188202321934244326532097674672658804351266954581980242878953422980877080);
c_partial~tpush(25126395455152371396962340450817709056184923820518951696390492877255105611100);
c_partial~tpush(51888876875754703420821156160097120082680137988037010923845232459726794950498);
c_partial~tpush(44525750597697375253956979980299663515022129488181425775809541087632199909740);
c_partial~tpush(16912499177895340229920075278024254767338113164925453223925913288465496877669);
c_partial~tpush(29444993723623098136919721956387182871227874128762395712677095770951359681872);
c_partial~tpush(42279532250924072636803845029947229187269583601587561726989729862910116798640);
c_partial~tpush(18146517657445423462330854383025300323335289319277199154920964274562014376193);
c_partial~tpush(29968416337106811454780852581405936340535417705810682248910986165675725110909);
c_partial~tpush(45913539319130360655039953604818866189414652230941843274417571404872458329096);
c_partial~tpush(9973751619308956219995207993159735001369409304145366378315779945058644835568);
c_partial~tpush(26512137355234398742490373463572605266574321495918581157627494519839928718785);
c_partial~tpush(38733996020041052414653364419459849840273602340396669205647157375896170703414);
c_partial~tpush(39739266798815615179058883484238955402532713621723007425606711213127023091626);
c_partial~tpush(16688277490485052681847773549197928630624828392248424077804829676011512392564);
c_partial~tpush(46995749173414578158376071466513047146076618373019625011027652355322341888914);
c_partial~tpush(37553542037977882697034020855607777725294619087812628812778825910831662927437);
c_partial~tpush(23776341561384426793309673551863785121247041729339774401778834828318133563494);
c_partial~tpush(22037166978343340887075461343574097072417773982039280124203805713362600176719);
c_partial~tpush(18875020877782404439294079398043479420415331640996249745272087358069018086569);
c_partial~tpush(50306789725551139255528208686979954824152470538373593260035840844014082313795);
c_partial~tpush(11010060692025017746328056211697932560312723635386161069820848883655668340800);
c_partial~tpush(10091386227208618563717095615124583278711423093595796149011259316242581930832);
c_partial~tpush(4144769320246558352780591737261172907511489963810975650573703217887429086546);
c_partial~tpush(10097732913112662248360143041019433907849917041759137293018029019134392559350);
c_partial~tpush(6289523436916718186444313055657780215308239474334966048426187515755061147380);
c_partial~tpush(50078873963558777695818419879049731628283859855043457043960043141404918281350);
c_partial~tpush(6745410632962119604799318394592010194450845483518862700079921360015766217097);
c_partial~tpush(2198767803817943589280921642790908809205729297175211103784796636220527112943);
c_partial~tpush(42130141766579368955293458561833969523921242119488382157763431984481939353210);
c_partial~tpush(1506391351313571485881100600075561642709511904142774157224509684789564134130);
c_partial~tpush(2832093654883670345969792724123161241696170611611744759675180839473215203706);
c_partial~tpush(35270108034586437235770964856203192103752723850855933468447404146432911752692);
c_partial~tpush(11537581209139811323584200312499220634649317959334639394131664579649044893664);
c_partial~tpush(46957459660689095772805951326497015047735250691217671713053838581293111460890);
c_partial~tpush(17198004293191777441573635123110935015228014028618868252989374962722329283022);
c_partial~tpush(42759256821459579548166397931784793706183414854788129028588674378588978555087);
c_partial~tpush(19346204940546791021518535594447257347218878114049998691060016493806845179755);
c_partial~tpush(2842421437159230356172937170723119670102383117906691475594646716111652623993);
c_partial~tpush(46890459191070604266317239160900802974908533755578122148794381341533188288739);
c_partial~tpush(6545064306297957002139416752334741502722251869537551068239642131448768236585);
c_partial~tpush(5203908808704813498389265425172875593837960384349653691918590736979872578408);
c_partial~tpush(46023178175689841026652873619585312184471231437839176005501814000061930801458);
c_partial~tpush(24989423875823824314937167977186680492838322378413552981950019434148137151475);
c_partial~tpush(40660845794722250942085290196307743844710895885989881349878624191288851189794);
c_partial~tpush(178159762542918727821591804347278406343778877185928208377653576093313576023);
c_partial~tpush(12855514863299373699594410385788943772765811961581749194183533625311486462501);
c_partial~tpush(27251903546528396899121474879526661580930585336015815465004841986837721015346);
c_partial~tpush(26391195843970939137841205575716687521452241966960922688184944968006152251773);
c_partial~tpush(14145795079718504770705945930496165856921198507620254179439735067290096119068);
c_partial~tpush(37506832428423709656256273961443390505383859205590192832334204767335500669845);
c_partial~tpush(8959562060028569701043973060670353733575345393653685776974948916988033453971);
c_partial~tpush(7731365032885761677310646932202953497105470140821233291413966482118114934371);
c_partial~tpush(43944768140426338959401520582272141403192172703333434187400026557057113151669);
c_partial~tpush(8327443473179334761744301768309008451162322941906921742120510244986704677004);
c_partial~tpush(17213012626801210615058753489149961717422101711567228037597150941152495100640);
c_partial~tpush(45511465953764647124788124872041231812625887587652755960871083470440901750235);
c_partial~tpush(31013240275783957841487647842879560228780311911120617713267760478681014464586);
c_partial~tpush(29762043380228723080655477118227007944433689264910885567340541818950071085320);
c_partial~tpush(40613638986050645429324840061158001427095985560891567840561502277599320440693);
c_partial~tpush(7132325028834551397904855671244375895110341505383911719294705267624034122405);
c_partial~tpush(148317947440800089795933930720822493695520852448386394775371401743494965187);
c_partial~tpush(1682271808862440282980921092350962309063619480603564453222259235804458666498);
c_partial~tpush(32053127852161465462169316093314510536388945556524309776725816805402610913798);
c_partial~tpush(34659657202033226378630404135681338559314591068402458305387916743914585669822);
c_partial~tpush(46449142887031190139216485961588429714541818604532129342402536147531141042612);
c_partial~tpush(9607550223176946388146938069307456967842408600269548190739947540821716354749);
c_partial~tpush(43873481600693254959738111647279087619665212806447307380840462711684699580538);
c_partial~tpush(176061952957067086877570020242717222844908281373122372938833890096257042779);
c_partial~tpush(47317309289713558716296874877909056240912747041807665569810086994231478048812);
c_partial~tpush(32756696495947150739112552245134405790477428033375694606064837020080558524475);
c_partial~tpush(23904338266239082475843193497391848295750932275873594914793790930454761946355);
c_partial~tpush(35044431664159965621093590179925347703658686597264946300505865685445234869852);
c_partial~tpush(9493236856637559930081273350624640782542308951393390221312749976434983490680);
c_partial~tpush(6383048952626209942138778475649264916563189894404161393382520434272104699043);
c_partial~tpush(24038977256657247960213590131417824243678650429008037465092964569077824958836);
c_partial~tpush(5723133132341250854861268916425629325342734411181852289748823989258168536080);
c_partial~tpush(40124614971497340609672361401187657166379372470415222317287023708862426565107);
c_partial~tpush(46287918290617142236529451481121014492218375468861320972684732037502283542871);
c_partial~tpush(32883284540320451295484135704808083452381176816565850047310272290579727564);
c_partial~tpush(23713710354670747799902470145991402738501287353459006370282455010782932981895);
c_partial~tpush(23914976631484794694805202158236485097718743560282556743579770496207243310570);
c_partial~tpush(6072416789788229847846402446037320700702350307036983995500856710403496461100);
c_partial~tpush(36628570355032552369312250880819263729786881252903691461511741096057877446269);
c_partial~tpush(32016281725687193969161342479538876008447731247868851642071245076461854186892);
c_partial~tpush(47580532808391673264649910944163009365913105556571270704844270700934906886306);
c_partial~tpush(38597847667537176864195008764499342760554657691243026015464815512838341298531);
c_partial~tpush(24290570526323125287894326381620140004869643567957567143978846885696751553033);
c_partial~tpush(7391194735311468119242697393960800040167201546306535770156943838054242258713);
c_partial~tpush(30696648320294530956702048672738568112448532289392479971626324787669727594993);
c_partial~tpush(6140984795177536140538164360537240130528748166481765554651789007422729352291);
c_partial~tpush(45158148088482133575387236667735799397554030431373066909134827052511787412257);
c_partial~tpush(39098850070699014386350695777320804549601612104022530399440739900064964365506);
c_partial~tpush(17594717838497071976469180298998504975975078281214064588509244383602175981238);
c_partial~tpush(37508897639536271703014061156696937196010503723136859500621329608908212991305);
c_partial~tpush(35331315680778462099510303640576731611326194958342902352825120183441748888677);
c_partial~tpush(40080306972154416306488412404574532111647191346309405823533424648878208151291);
c_partial~tpush(6828160325694399104373982497729389847654752986100125784249790765363687745974);
c_partial~tpush(32030690069598978637648665417698590866482222868116614290363428007774886136739);
c_partial~tpush(11246573086260753259993971254725613211193686683988426513880826148090811891866);
c_partial~tpush(19802920300252626556996044629797746268143243087262577802201225286493276603573);
c_partial~tpush(11311085442652291634822798307831431035776248927202286895207125867542470350078);
c_partial~tpush(42866191232054535137687664432906740706734133743554169728045168653540819369396);
c_partial~tpush(792781492853909872425531014397300057232399608769451037135936617996830018501);
c_partial~tpush(5027602491523497423798779154966735896562099398367163998686335127580757861872);
c_partial~tpush(14595204575654316237672764823862241845410365278802914304953002937313300553572);
c_partial~tpush(49090635155852171523462141531270568570311335479300234193364258207201029694959);
c_partial~tpush(16395063164993626722686882727042150241125309409717445381854913964674649318585);
c_partial~tpush(43582865152277934960288399151014567804710747032388154450998191418019762064618);
c_partial~tpush(21345603324471810861925019445720576814602636473739003852898308205213912255830);
c_partial~tpush(43060227277691865566216644763950145888265422361524944867574974215593594436608);
c_partial~tpush(23989880554149623417928543009074392331129100654350676057681166461779908069985);
c_partial~tpush(19907152271457026022214043034574278016181923106896234801393927963452532294568);
c_partial~tpush(18222516022580267561493792993094710416551420737012230740376611434888381479095);
c_partial~tpush(1045389295600293605788742203100387113059158959420189813539386816940038734648);
c_partial~tpush(47282831354033165458229956338985941730237735086796394283611131945139628976063);
c_partial~tpush(4818196685146638944563521578540804379512141824393241718798236403588114489159);
c_partial~tpush(10090204501612803176317709245679152331057882187411777688746797044706063410969);
c_partial~tpush(3978370972183085294060841546479012913167341218498903025630274718281504586942);
c_partial~tpush(51846464455460738983880702533559500846979890926089421736652545536455808863054);
c_partial~tpush(26355434378604614587217464414049917283790561533427706903151232334217236928910);
c_partial~tpush(30565791031197288585537420052659875918627026956249687861541912238080391486449);
c_partial~tpush(14251805205518762005872942974946053284152012765592753598483434853007489357683);
c_partial~tpush(23776437942090855829219822810893705382966259823845274775293258371048739720069);
c_partial~tpush(39338361697133659656458693429206444641618421873101022301085312475104891377779);
c_partial~tpush(37942489883385542549005260901920573386682862123096313518129796952218646769834);
c_partial~tpush(41059273944532217500303025344978503110184035705028471693817867423180520988710);
c_partial~tpush(24009660652688766373908982245294763137442813775972870810752637338122175523071);
c_partial~tpush(912157918237895974688212732741399012245721255353371698672738811552051334437);
c_partial~tpush(8241676540423739842974351063721277092374788540929416417130528766505776570102);
c_partial~tpush(22034737013442833543538173574780223542978122944126682746155655985591771597870);
c_partial~tpush(15721582719050781977702175062583814686202661570749006900489233117049133897886);
c_partial~tpush(24092467781845921757841339240519360281759056806549568023633047527813329729121);
c_partial~tpush(51179213722416750684154807770175465535026749536043511827781796616557887691525);
c_partial~tpush(10464392462621117981391619691168646719072846329703430666200629602508815600788);
c_partial~tpush(48723968483093628656710316280437628723131167720370054427800232890879817323520);
c_partial~tpush(38031508522484952102708051869101902868926616300926679605574071610074721933683);
c_partial~tpush(397690828254561723549349897112473766901585444153303054845160673059519614409);
c_partial~tpush(46389749911143180305047503654048529635402356335288164156437540849855274025642);
c_partial~tpush(6907538422859239409738132556650688762832248950826842041523880479933789397751);
c_partial~tpush(27451751659884119367453572869150111331012809878576639176638914714921892751895);
c_partial~tpush(16690275395485630428127725067513114066329712673106153451801968992299636791385);
c_partial~tpush(47443516734004517330972360350944221010789419773533540182154080192169425669818);
c_partial~tpush(34508892464893066029907805370108280730435799768191337629577893533271375085480);
c_partial~tpush(15895485136902450169492923978042129726601461603404514670348703312850236146328);
c_partial~tpush(42850147268533238394300014789870548842069107481977192010327882656496256610515);
c_partial~tpush(35555220113207311888310542136026583134078540737712286334755193143311473323771);
c_partial~tpush(814913922521637742587885320797606426167962526342166512693085292151314976633);
c_partial~tpush(25597565727472966040929150867850618906690553497747087085415349842293213901102);
c_partial~tpush(7064270866339130026645934404670707188805756104839816854061305241372917700628);
c_partial~tpush(51218228613745249399050828534629455153682748537023324654595406229871759110832);
c_partial~tpush(10822114293933955185262379119718677245131363334925588360015325377534318204715);
c_partial~tpush(9277135875276787021836189566799935097400042171346561246305113339462708861695);
c_partial~tpush(10493603554686607050979497281838644324893776154179810893893660722522945589063);
c_partial~tpush(43790186062893619645432241857137211213832854092146683908280288428802298447234);
c_partial~tpush(22787246713302002131537352647724509045434320594330593842910040841127904915588);
c_partial~tpush(10352898428674946112419285524093156622220645537465553354366631318208000453939);
c_partial~tpush(9783723818270121678386992630754842961728702994964214799008457449989291229500);
c_partial~tpush(15550788416669474113213749561488122552422887538676036667630838378023479382689);
c_partial~tpush(36904408617995508086316128317304444160334698216077144094558369220917381399838);
c_partial~tpush(41623322017941107573208439434143080503991885005740188569668998696029217776529);
c_partial~tpush(10796631184889302076168355684722130903785890709107732067446714470783437829037);
c_partial~tpush(19871836214837460419845806980869387567383718044439891735114283113359312279540);
c_partial~tpush(34099935207235101531041085817571931211985744218227246459694205468152679442960);
c_partial~tpush(26988348643356966664524838609347504504715360584208109651445786562538664316414);
c_partial~tpush(43894983424307182804788502773914715687889345951588471964249796272105778108841);
c_partial~tpush(27188683741975666501190619077401602784207525552041791881331036910678479394373);
c_partial~tpush(44981934287331483389126773723060257811024853467700522603117439257814949595770);
c_partial~tpush(49318985740988731974925113982657124510957178106256243154094477058742526328005);
c_partial~tpush(32916337117601607497471770708163213185207613561785127142203759126528334389910);
c_partial~tpush(32416168205228228305696074686128971835179488339097944831216667595013123599347);
c_partial~tpush(17047263688548829001253658727764731047114098556534482052135734487985276987385);
c_partial~tpush(2596070665283687085624766109015710214118713177836322186441320903847285219752);
c_partial~tpush(38046754396931624667053755394209871213583380777644614525816282615740097463619);
c_partial~tpush(50209358672950610571881045751491557268113671528372794575410674544675121754316);
c_partial~tpush(12919190909308013201095901632318775182958978607191369680290221219027165891701);
c_partial~tpush(36375877813452670729557741538879208191531962386643844885148697341986330094946);
c_partial~tpush(25707841289997007356695455034842955389725347420060009273227071872844511215780);
c_partial~tpush(8653175945487997845203439345797943132543211416447757110963967501177317426221);
c_partial~tpush(50391138734018986055606887660211654759621294819866105367558310515180584559376);
c_partial~tpush(41100758374813180044241517541460339264403360471913133726789188162193843887175);
c_partial~tpush(10004926483031654238331087853694247825468072905536942066211326502275328076490);
c_partial~tpush(11498264615058604317482574216318586415670903094838791165247179252175768794889);
c_partial~tpush(45931122726443350408645827606695565820986509316553031311724625401680880129729);
c_partial~tpush(30795039031122723384356183260705159374706667715148864839958867673558697733445);
c_partial~tpush(14016139747289624978792446847000951708158212463304817001882956166752906714332);
c_partial~tpush(43359697893573352159940613996579337405295341766552351658385576988680216658321);
c_partial~tpush(22473534416736715261544067941801920282953160371102136406786599478303891383326);
c_partial~tpush(25445632613126760725981352394892988690191664428803122694319312960508052492454);
c_partial~tpush(10702811721859145441471328511968332847175733707711670171718794132331147396634);
c_partial~tpush(50256153656470772984412173566637004125023091547738518766725861523759044364213);
c_partial~tpush(6458155222123913785542019504710356487730543780076793698127342673748684122906);
c_partial~tpush(50618688897675457708660667828011689869992028674971200016038881071814663718014);
c_partial~tpush(25961676733193172813300616241634455744031375008661689714995620330750095030393);
c_partial~tpush(42053368939101946150352910620901976393593765413653922898525036134662101686618);
c_partial~tpush(17297554111853491139852678417579991271009602631577069694853813331124433680030);
c_partial~tpush(51758692446980850982642198494208197547822165306696053225557492888848998662814);
c_partial~tpush(20629334630176789516860947714482314798992354416524472955719602723708835701419);
c_partial~tpush(6842669431160982482847022837584007313081303465454510513000267687168592963107);
c_partial~tpush(6503148632294502650351373264456118644619008949586617049376215243199755041177);
c_partial~tpush(27516281968279608144494984064905758951752895262194194603257235517863529751139);
c_partial~tpush(29314245636286327016859390131768536299281404590861240585300083644943936833598);
c_partial~tpush(14227467863135365427954093998621993651369686288941275436795622973781503444257);
c_partial~tpush(40112700265905821047799813136547383573670013597674982664594368591094492800739);
c_partial~tpush(35392041466963204202322462836392105335114209440145464275636830536391163487382);
c_partial~tpush(46167918560522027957758009103703608990448171377762762588245494670035961017484);
c_partial~tpush(6689006025876429199677361467123247729845660913735100398372583214997802454030);
int c = 0;
int nrounds = 220;
int i = 0;
int p = 52435875175126190479447740508185965837690552500527637822603658699938581184513;
int xL = xL_in % p;
int xR = xR_in % p;
repeat(nrounds) {
if ((i == 0) | (i == nrounds - 1)) {
c = 0;
} else {
c = c_partial.at_index(i - 1);
}
int t = (i == 0) ? xL : _::curve_math::addmod(xL, c, p);
int t_2 = _::curve_math::mulmod(t, t, p);
int t_4 = _::curve_math::mulmod(t_2, t_2, p);
int xR_tmp = xR;
if (i < nrounds - 1) {
xR = xL;
xL = _::curve_math::addmod(xR_tmp, _::curve_math::mulmod(t_4, t, p), p);
} else {
xR = _::curve_math::addmod(xR_tmp, _::curve_math::mulmod(t_4, t, p), p);
}
i += 1;
}
return (xL, xR);
}
(int) MiMCSponge(int input0, int input1) impure {
int R = 0;
int C = 0;
R = _::curve_math::addmod(input0 , R , 52435875175126190479447740508185965837690552500527637822603658699938581184513);
(R, C) = MiMCFeistel(R , C);
R = _::curve_math::addmod(input1 , R , 52435875175126190479447740508185965837690552500527637822603658699938581184513);
(R, C) = MiMCFeistel(R , C);
return R;
}
;; recv_internal is the main function of the contract and is called when it receives a message from other contracts
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
if (in_msg_body.slice_empty?()) { ;; ignore all empty messages
return ();
}
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
if (flags & 1) { ;; ignore all bounced messages
return ();
}
load_data(); ;; here we populate the storage variables
int op = in_msg_body~load_uint(32); ;; by convention, the first 32 bits of incoming message is the op
int query_id = in_msg_body~load_uint(64); ;; also by convention, the next 64 bits contain the "query id", although this is not always the case
if (op == op::verify) {
int res = MiMCSponge(123, 456); ;; this is a dummy call to MiMC to make sure it is in the code (otherwise it will be removed by the compiler
if (res) {
save_data();
return ();
;; verifiaction successful
}
throw(error::verify_failed); ;; verifiaction failed
}
throw(0xffff); ;; if the message contains an op that is not known to this contract, we throw
}
;; get methods are a means to conveniently read contract data using, for example, HTTP APIs
;; they are marked with method_id
;; note that unlike in many other smart contract VMs, get methods cannot be called by other contracts