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.

208 lines
11 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
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. var i;
  22. var j;
  23. for (i=0; i<t; i++) {
  24. lc = 0;
  25. for (j=0; j<t; j++) {
  26. lc = lc + M[i][j]*in[j];
  27. }
  28. out[i] <== lc;
  29. }
  30. }
  31. // var nRoundsF = 8;
  32. // var nRoundsP = 57;
  33. // var t = 6;
  34. template Poseidon(nInputs, t, nRoundsF, nRoundsP) {
  35. var C = [
  36. 14397397413755236225575615486459253198602422701513067526754101844196324375522,
  37. 10405129301473404666785234951972711717481302463898292859783056520670200613128,
  38. 5179144822360023508491245509308555580251733042407187134628755730783052214509,
  39. 9132640374240188374542843306219594180154739721841249568925550236430986592615,
  40. 20360807315276763881209958738450444293273549928693737723235350358403012458514,
  41. 17933600965499023212689924809448543050840131883187652471064418452962948061619,
  42. 3636213416533737411392076250708419981662897009810345015164671602334517041153,
  43. 2008540005368330234524962342006691994500273283000229509835662097352946198608,
  44. 16018407964853379535338740313053768402596521780991140819786560130595652651567,
  45. 20653139667070586705378398435856186172195806027708437373983929336015162186471,
  46. 17887713874711369695406927657694993484804203950786446055999405564652412116765,
  47. 4852706232225925756777361208698488277369799648067343227630786518486608711772,
  48. 8969172011633935669771678412400911310465619639756845342775631896478908389850,
  49. 20570199545627577691240476121888846460936245025392381957866134167601058684375,
  50. 16442329894745639881165035015179028112772410105963688121820543219662832524136,
  51. 20060625627350485876280451423010593928172611031611836167979515653463693899374,
  52. 16637282689940520290130302519163090147511023430395200895953984829546679599107,
  53. 15599196921909732993082127725908821049411366914683565306060493533569088698214,
  54. 16894591341213863947423904025624185991098788054337051624251730868231322135455,
  55. 1197934381747032348421303489683932612752526046745577259575778515005162320212,
  56. 6172482022646932735745595886795230725225293469762393889050804649558459236626,
  57. 21004037394166516054140386756510609698837211370585899203851827276330669555417,
  58. 15262034989144652068456967541137853724140836132717012646544737680069032573006,
  59. 15017690682054366744270630371095785995296470601172793770224691982518041139766,
  60. 15159744167842240513848638419303545693472533086570469712794583342699782519832,
  61. 11178069035565459212220861899558526502477231302924961773582350246646450941231,
  62. 21154888769130549957415912997229564077486639529994598560737238811887296922114,
  63. 20162517328110570500010831422938033120419484532231241180224283481905744633719,
  64. 2777362604871784250419758188173029886707024739806641263170345377816177052018,
  65. 15732290486829619144634131656503993123618032247178179298922551820261215487562,
  66. 6024433414579583476444635447152826813568595303270846875177844482142230009826,
  67. 17677827682004946431939402157761289497221048154630238117709539216286149983245,
  68. 10716307389353583413755237303156291454109852751296156900963208377067748518748,
  69. 14925386988604173087143546225719076187055229908444910452781922028996524347508,
  70. 8940878636401797005293482068100797531020505636124892198091491586778667442523,
  71. 18911747154199663060505302806894425160044925686870165583944475880789706164410,
  72. 8821532432394939099312235292271438180996556457308429936910969094255825456935,
  73. 20632576502437623790366878538516326728436616723089049415538037018093616927643,
  74. 71447649211767888770311304010816315780740050029903404046389165015534756512,
  75. 2781996465394730190470582631099299305677291329609718650018200531245670229393,
  76. 12441376330954323535872906380510501637773629931719508864016287320488688345525,
  77. 2558302139544901035700544058046419714227464650146159803703499681139469546006,
  78. 10087036781939179132584550273563255199577525914374285705149349445480649057058,
  79. 4267692623754666261749551533667592242661271409704769363166965280715887854739,
  80. 4945579503584457514844595640661884835097077318604083061152997449742124905548,
  81. 17742335354489274412669987990603079185096280484072783973732137326144230832311,
  82. 6266270088302506215402996795500854910256503071464802875821837403486057988208,
  83. 2716062168542520412498610856550519519760063668165561277991771577403400784706,
  84. 19118392018538203167410421493487769944462015419023083813301166096764262134232,
  85. 9386595745626044000666050847309903206827901310677406022353307960932745699524,
  86. 9121640807890366356465620448383131419933298563527245687958865317869840082266,
  87. 3078975275808111706229899605611544294904276390490742680006005661017864583210,
  88. 7157404299437167354719786626667769956233708887934477609633504801472827442743,
  89. 14056248655941725362944552761799461694550787028230120190862133165195793034373,
  90. 14124396743304355958915937804966111851843703158171757752158388556919187839849,
  91. 11851254356749068692552943732920045260402277343008629727465773766468466181076,
  92. 9799099446406796696742256539758943483211846559715874347178722060519817626047,
  93. 10156146186214948683880719664738535455146137901666656566575307300522957959544,
  94. 19908645952733301583346063785055921934459499091029406575311417879963332475861,
  95. 11766105336238068471342414351862472329437473380853789942065610694000443387471,
  96. 11002137593249972174092192767251572171769044073555430468487809799220351297047,
  97. 284136377911685911941431040940403846843630064858778505937392780738953624163,
  98. 19448733709802908339787967270452055364068697565906862913410983275341804035680,
  99. 14423660424692802524250720264041003098290275890428483723270346403986712981505,
  100. 10635360132728137321700090133109897687122647659471659996419791842933639708516
  101. ];
  102. var M = [
  103. [
  104. 19167410339349846567561662441069598364702008768579734801591448511131028229281,
  105. 14183033936038168803360723133013092560869148726790180682363054735190196956789,
  106. 9067734253445064890734144122526450279189023719890032859456830213166173619761,
  107. 16378664841697311562845443097199265623838619398287411428110917414833007677155,
  108. 12968540216479938138647596899147650021419273189336843725176422194136033835172,
  109. 3636162562566338420490575570584278737093584021456168183289112789616069756675
  110. ],[
  111. 17034139127218860091985397764514160131253018178110701196935786874261236172431,
  112. 2799255644797227968811798608332314218966179365168250111693473252876996230317,
  113. 2482058150180648511543788012634934806465808146786082148795902594096349483974,
  114. 16563522740626180338295201738437974404892092704059676533096069531044355099628,
  115. 10468644849657689537028565510142839489302836569811003546969773105463051947124,
  116. 3328913364598498171733622353010907641674136720305714432354138807013088636408
  117. ],[
  118. 18985203040268814769637347880759846911264240088034262814847924884273017355969,
  119. 8652975463545710606098548415650457376967119951977109072274595329619335974180,
  120. 970943815872417895015626519859542525373809485973005165410533315057253476903,
  121. 19406667490568134101658669326517700199745817783746545889094238643063688871948,
  122. 17049854690034965250221386317058877242629221002521630573756355118745574274967,
  123. 4964394613021008685803675656098849539153699842663541444414978877928878266244
  124. ],[
  125. 19025623051770008118343718096455821045904242602531062247152770448380880817517,
  126. 9077319817220936628089890431129759976815127354480867310384708941479362824016,
  127. 4770370314098695913091200576539533727214143013236894216582648993741910829490,
  128. 4298564056297802123194408918029088169104276109138370115401819933600955259473,
  129. 6905514380186323693285869145872115273350947784558995755916362330070690839131,
  130. 4783343257810358393326889022942241108539824540285247795235499223017138301952
  131. ],[
  132. 16205238342129310687768799056463408647672389183328001070715567975181364448609,
  133. 8303849270045876854140023508764676765932043944545416856530551331270859502246,
  134. 20218246699596954048529384569730026273241102596326201163062133863539137060414,
  135. 1712845821388089905746651754894206522004527237615042226559791118162382909269,
  136. 13001155522144542028910638547179410124467185319212645031214919884423841839406,
  137. 16037892369576300958623292723740289861626299352695838577330319504984091062115
  138. ],[
  139. 15162889384227198851506890526431746552868519326873025085114621698588781611738,
  140. 13272957914179340594010910867091459756043436017766464331915862093201960540910,
  141. 9416416589114508529880440146952102328470363729880726115521103179442988482948,
  142. 8035240799672199706102747147502951589635001418759394863664434079699838251138,
  143. 21642389080762222565487157652540372010968704000567605990102641816691459811717,
  144. 20261355950827657195644012399234591122288573679402601053407151083849785332516
  145. ]
  146. ];
  147. signal input inputs[nInputs];
  148. signal output out;
  149. component ark[nRoundsF + nRoundsP];
  150. component sigmaF[nRoundsF][t];
  151. component sigmaP[nRoundsP];
  152. component mix[nRoundsF + nRoundsP];
  153. var i;
  154. var j;
  155. var k;
  156. for (i=0; i<(nRoundsF + nRoundsP); i++) {
  157. ark[i] = Ark(t, C[i]);
  158. mix[i] = Mix(t, M);
  159. for (j=0; j<t; j++) {
  160. if (i==0) {
  161. if (j<nInputs) {
  162. ark[i].in[j] <== inputs[j];
  163. } else {
  164. ark[i].in[j] <== 0;
  165. }
  166. } else {
  167. ark[i].in[j] <== mix[i-1].out[j];
  168. }
  169. }
  170. if ((i<(nRoundsF/2)) || (i>= (nRoundsP + nRoundsF/2))) {
  171. k= i<nRoundsF/2 ? i : (i-nRoundsP);
  172. for (j=0; j<t; j++) {
  173. sigmaF[k][j] = Sigma();
  174. sigmaF[k][j].in <== ark[i].out[j];
  175. mix[i].in[j] <== sigmaF[k][j].out;
  176. }
  177. } else {
  178. k= i-nRoundsF/2;
  179. sigmaP[k] = Sigma();
  180. sigmaP[k].in <== ark[i].out[0];
  181. mix[i].in[0] <== sigmaP[k].out;
  182. for (j=1; j<t; j++) {
  183. mix[i].in[j] <== ark[i].out[j];
  184. }
  185. }
  186. }
  187. out <== mix[nRoundsF + nRoundsP -1].out[0];
  188. }