You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
11 KiB

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