arnaucube
arnaucube/circomlibPublic Self-hosted repository
circomlib/circuits/poseidon.circom
circuits/poseidon.circomRaw
  1
  2template Sigma() {
  3    signal input in;
  4    signal output out;
  5
  6    signal in2;
  7    signal in4;
  8
  9    in2 <== in*in;
 10    in4 <== in2*in2;
 11
 12    out <== in4*in;
 13}
 14
 15template Ark(t, C) {
 16    signal input in[t];
 17    signal output out[t];
 18    for (var i=0; i<t; i++) {
 19        out[i] <== in[i] + C;
 20    }
 21}
 22
 23template Mix(t, M) {
 24    signal input in[t];
 25    signal output out[t];
 26    var lc;
 27
 28    for (var i=0; i<t; i++) {
 29        lc = 0;
 30        for (var j=0; j<t; j++) {
 31            lc = lc + M[i][j]*in[j];
 32        }
 33        out[i] <== lc;
 34    }
 35}
 36
 37//    var nRoundsF = 8;
 38//    var nRoundsP = 57;
 39//    var t = 6;
 40
 41template Poseidon(nInputs, t, nRoundsF, nRoundsP) {
 42
 43    var C = [
 44        1354025385229961744769229343273868518314335569873439558835166239576773343708,
 45        14378844218625331047742339561309620904043097700980163591187076404481144585564,
 46        19370813333785034372560258124535206525278124675105547990205946542330734467847,
 47        19339919977375282793227987561727366424934767905100680591050582380667086628202,
 48        8422275364316831706903446151602338206948363474119622730702497535467809432414,
 49        7433947928146794739292515659214608949964639549664630885486968546133071892830,
 50        20753350951496713264979200428833003140825588922450200809553577914404143341040,
 51        21437018888080559864996889038552602698883513894753499324572098534369350747880,
 52        6815447461573214810645016226370803316854141900901895816072622961504507953749,
 53        11746901014017411226283657362310634990885933032228701131899561585228216986615,
 54        13428722985713722660261823704226749286675766756093697029778643398137361221114,
 55        10894749142018158588533110743373157663019829222177356873395009880383491602356,
 56        13720066349319517776784660327982201297420012713976744204318378121767771862484,
 57        4665971664531891307640113589671067488692829783046247264698659233443166028412,
 58        5364541878673041196937884015923978656299860601766012213141306792903990539664,
 59        1747411112078838632103476037026417344408680910500491241306123941341644055714,
 60        1835035066071759522152578007305026433897204459772540871869487151042238374039,
 61        21055637025200882290106914253232617255445210101773537879323245961051751183138,
 62        19215142378199333594641095299020637309879189505235993967243075316794127016728,
 63        5264915734761449905856538116909638235466879053604660991987579054616980096262,
 64        10045917614023673044141331581538797960977704806582630277050701175565262856382,
 65        7789533631025313780520004400945166898631872921910178131342071973345076732672,
 66        19972498130123740615813398456152565371201412297339860820234719562997192378694,
 67        14216077977931104808041453382683965630500368477063603536695472115075869912121,
 68        2555981910568472028679439033700033287358333564454149464965229699417319912931,
 69        11735111941739477522347883122573591136355121750109794306409399099068977659499,
 70        16957890207070910233505303498878270130436461648242792271152604513138986611609,
 71        358520143235124107055243451716507147499373646513864848163778795927281509793,
 72        6389190271835493841487214043252929516390267871881261173336690351147926750010,
 73        12939611907106878137030264379019786496625916664142697309441198804098015086205,
 74        456696638239570875759108333278090964360604015255503302016190396687826618227,
 75        20569764931577491771523222445135914903999292206008007769649255123342890660989,
 76        3341317247281280728261320226215152668194921091152837358683334635401182164637,
 77        11821224368797169892747612081573458772211068320533296007836648033607696236615,
 78        2185176387193659864764608304330502180888068591409305411859725028056771843945,
 79        17161758741114551704796078639849789476380746803787101178795737276111464575519,
 80        11889888355183092530573415929875444766831739308191993115663429638848547668798,
 81        19503084309842095729857399025417533485089330284851492085544757107759925099089,
 82        20280152151768521735424910115623976684589382048161526796204268413029416266256,
 83        17607351334578006856860845064970248988416315904757246948622629528628773644114,
 84        20769468546336672951384440602623018830493119282829911435465737079851020547355,
 85        1546429204704408801701093430086546742691081844046642451323347737810191940866,
 86        11200569249561318620053458114013886527484999499632128671282997438827107108229,
 87        20198213289062010915914579158889968647687156198219713083074315178786791524034,
 88        12911209060630719799682705729835581341676468319742562559036843993017369855977,
 89        18925188847138989248835676768641716482476141553833902070405850166412140133887,
 90        20376466983584239909415025821007315251422803039634139484663713769887712746966,
 91        5250536177612235431141386983455571232984126980327432803966957255414592397060,
 92        344847263093423485167610155050688875010578621416939967999896518937961396680,
 93        19870333728541576497318505013425518731999037041271340888970559590767369935385,
 94        20604512495859902382577228682521142736989261702707317046150335692410020156250,
 95        18293964088694556689667514948280720605277532123251572448395882397578643211622,
 96        21211253784206079547762943120791531326787601501123474236198383850531142559075,
 97        17247914781304154940895909185506123510423535554247372833321968000513811053190,
 98        16432189025237084563810000088202867449333673799705533820685782829379758927490,
 99        7204783063529242442830743239980168374343946353418800547956909848044774363774,
100        2108268032972510691814120801033692084861951866306906253604497017452204030001,
101        13483247063999686990721729188827693318708500027762095503921527692630827328070,
102        18194665574704709729868916970580318177272365766028499528691737819467051567534,
103        9275639092314761435364537152118796424056864859607619908791935597976913759411,
104        12700165678727983685032332532042155014245610964583614362270316386368455898604,
105        19127554193875137546212792134421555344854604853165878912238751527694270097310,
106        16817455471920423226570476063669349525676437756352144502692679769377074040335,
107        17331185397945904160678487303485263376032543419657328137924881433628614769955,
108        11605569208043267134285833752214422326246425655661043119023566733685555142420
109    ];
110
111    var M = [
112        [
113            12037235000515189726428793905458162231976011685774991261061889278958802340039,
114            15885254491685089152627111704751054604879027605518712546805347341940526552948,
115            12220682901774309471330657931458552366575439534877271150866614914170639536810,
116            11195096069395318710866553226959674457987772316145705151894647995087349332576,
117            598000700605575401177173118514166571064818339748567530524299773749024042768,
118            1430722853270801285936618367966028727146977818314178365893636191280860605092
119        ],[
120            2478807512283787086755520696277192042388812450777005645736937700857950416751,
121            2233078558675693495109307103888903813217767160310116996267068037131890781382,
122            18876120310576321787684235034151243856925703159922712959767164734820803570163,
123            16850806847813838898693870637445284830832219430572133120914449039176718036761,
124            1333036876405396107763619427367607232034082504897380383847654332653606615427,
125            8024813862822108072341428765418554797098705487914663416123759888639403831315
126        ],[
127            6500095533434910955474026763873910167129305339747639394388586826716085593160,
128            8370208895752773828195461153114215021863221486187756770286440396339432061839,
129            9303960191058819387902927958335344077259478983903385066838134730814638010892,
130            12233235273183315334651707749232602313616943260130930740801007863528547113209,
131            9140649423847813564210562288927015604065254723368331178903734405333716165919,
132            1715897011776785698388835993891828784112980527691698420841641796168725014542
133        ],[
134            19092640119254952117901733765506685707486610088248205883870061221436629780176,
135            3099417239661426161523333446616746096617346084970490427773391639810420659748,
136            4498351799178816410443394768364090919370619407529999860500200773846156676605,
137            17766546613911504681964882079687098358108049762069064124348111606619240189874,
138            19735199036142202254810745273503942799136628866093225336283966579447096889407,
139            18618071352177331467649099054615438672487187348128402045695624605978242597928
140        ],[
141            13282641901514824677915134398195165361567825236648422290753355584311135817423,
142            842963276112770184096507757019973399127531993386626262873928307889423235104,
143            5724939764407712239242783736588389538981693110806985476155198757555171230777,
144            3015568820237516884743892014063659856564948150197038824747891972506031149123,
145            8926202997251578932273751544826990276848999132609774201265891812369804099098,
146            13523975980414815337318802343464374889255493007711857898760066111901192774093
147        ],[
148            13163705634211158833717167498904899472888572514300041636511944020589976373689,
149            6705743158328622712684686369234272301477431173971663001146157949982901448493,
150            5341285785102635724684809992160578025785996331334612975598752577556138916495,
151            2365134732811643517126128253974711531515283135672252986518431351700239265326,
152            11812366860142870031000585328436207067560705932658624313008187741187899702321,
153            11192751017231920972897699839932659451476356148115786649719660565307185769796
154        ]
155    ];
156
157    signal input inputs[nInputs];
158    signal output out;
159
160    component ark[nRoundsF + nRoundsP];
161    component sigmaF[nRoundsF][t];
162    component sigmaP[nRoundsP];
163    component mix[nRoundsF + nRoundsP];
164
165    var k;
166
167    for (var i=0; i<(nRoundsF + nRoundsP); i++) {
168        ark[i] = Ark(t, C[i]);
169        mix[i] = Mix(t, M);
170
171        for (var j=0; j<t; j++) {
172            if (i==0) {
173                if (j<nInputs) {
174                    ark[i].in[j] <== inputs[j];
175                } else {
176                    ark[i].in[j] <== 0;
177                }
178            } else {
179                ark[i].in[j] <== mix[i-1].out[j];
180            }
181        }
182
183        if ((i<(nRoundsF/2)) || (i>= (nRoundsP + nRoundsF/2))) {
184            k= i<nRoundsF/2 ? i : (i-nRoundsP);
185            for (var j=0; j<t; j++) {
186                sigmaF[k][j] = Sigma();
187                sigmaF[k][j].in <== ark[i].out[j];
188                mix[i].in[j] <== sigmaF[k][j].out;
189            }
190        } else {
191            k= i-nRoundsF/2;
192            sigmaP[k] = Sigma();
193            sigmaP[k].in <== ark[i].out[0];
194            mix[i].in[0] <== sigmaP[k].out;
195            for (var j=1; j<t; j++) {
196                mix[i].in[j] <== ark[i].out[j];
197            }
198        }
199    }
200
201    out <== mix[nRoundsF + nRoundsP -1].out[0];
202}