Skip to content

Commit 3ec29f1

Browse files
authored
fix!: move mimc to hash submodule (#3361)
1 parent a48c03b commit 3ec29f1

5 files changed

Lines changed: 131 additions & 129 deletions

File tree

docs/docs/standard_library/cryptographic_primitives/00_hashes.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ example:
151151

152152
fn main() {
153153
let x = [163, 117, 178, 149]; // some random bytes
154-
let hash = std::hash::mimc_bn254(x);
154+
let hash = std::hash::mimc::mimc_bn254(x);
155155
}
156156
```
157157

noir_stdlib/src/hash.nr

Lines changed: 1 addition & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod poseidon;
2+
mod mimc;
23

34
#[foreign(sha256)]
45
pub fn sha256<N>(_input : [u8; N]) -> [u8; 32] {}
@@ -37,129 +38,3 @@ pub fn hash_to_field<N>(_input : [Field; N]) -> Field {
3738
#[foreign(keccak256)]
3839
pub fn keccak256<N>(_input : [u8; N], _message_size: u32) -> [u8; 32] {}
3940

40-
// mimc-p/p implementation
41-
// constants are (publicly generated) random numbers, for instance using keccak as a ROM.
42-
// You must use constants generated for the native field
43-
// Rounds number should be ~ log(p)/log(exp)
44-
// For 254 bit primes, exponent 7 and 91 rounds seems to be recommended
45-
fn mimc<N>(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field {
46-
//round 0
47-
let mut t = x + k;
48-
let mut h = t.pow_32(exp);
49-
//next rounds
50-
for i in 1 .. constants.len() {
51-
t = h + k + constants[i];
52-
h = t.pow_32(exp);
53-
};
54-
h + k
55-
}
56-
57-
global MIMC_BN254_ROUNDS = 91;
58-
59-
//mimc implementation with hardcoded parameters for BN254 curve.
60-
#[field(bn254)]
61-
pub fn mimc_bn254<N>(array: [Field; N]) -> Field {
62-
//mimc parameters
63-
let exponent = 7;
64-
//generated from seed "mimc" using keccak256
65-
let constants: [Field; MIMC_BN254_ROUNDS] = [
66-
0,
67-
20888961410941983456478427210666206549300505294776164667214940546594746570981,
68-
15265126113435022738560151911929040668591755459209400716467504685752745317193,
69-
8334177627492981984476504167502758309043212251641796197711684499645635709656,
70-
1374324219480165500871639364801692115397519265181803854177629327624133579404,
71-
11442588683664344394633565859260176446561886575962616332903193988751292992472,
72-
2558901189096558760448896669327086721003508630712968559048179091037845349145,
73-
11189978595292752354820141775598510151189959177917284797737745690127318076389,
74-
3262966573163560839685415914157855077211340576201936620532175028036746741754,
75-
17029914891543225301403832095880481731551830725367286980611178737703889171730,
76-
4614037031668406927330683909387957156531244689520944789503628527855167665518,
77-
19647356996769918391113967168615123299113119185942498194367262335168397100658,
78-
5040699236106090655289931820723926657076483236860546282406111821875672148900,
79-
2632385916954580941368956176626336146806721642583847728103570779270161510514,
80-
17691411851977575435597871505860208507285462834710151833948561098560743654671,
81-
11482807709115676646560379017491661435505951727793345550942389701970904563183,
82-
8360838254132998143349158726141014535383109403565779450210746881879715734773,
83-
12663821244032248511491386323242575231591777785787269938928497649288048289525,
84-
3067001377342968891237590775929219083706800062321980129409398033259904188058,
85-
8536471869378957766675292398190944925664113548202769136103887479787957959589,
86-
19825444354178182240559170937204690272111734703605805530888940813160705385792,
87-
16703465144013840124940690347975638755097486902749048533167980887413919317592,
88-
13061236261277650370863439564453267964462486225679643020432589226741411380501,
89-
10864774797625152707517901967943775867717907803542223029967000416969007792571,
90-
10035653564014594269791753415727486340557376923045841607746250017541686319774,
91-
3446968588058668564420958894889124905706353937375068998436129414772610003289,
92-
4653317306466493184743870159523234588955994456998076243468148492375236846006,
93-
8486711143589723036499933521576871883500223198263343024003617825616410932026,
94-
250710584458582618659378487568129931785810765264752039738223488321597070280,
95-
2104159799604932521291371026105311735948154964200596636974609406977292675173,
96-
16313562605837709339799839901240652934758303521543693857533755376563489378839,
97-
6032365105133504724925793806318578936233045029919447519826248813478479197288,
98-
14025118133847866722315446277964222215118620050302054655768867040006542798474,
99-
7400123822125662712777833064081316757896757785777291653271747396958201309118,
100-
1744432620323851751204287974553233986555641872755053103823939564833813704825,
101-
8316378125659383262515151597439205374263247719876250938893842106722210729522,
102-
6739722627047123650704294650168547689199576889424317598327664349670094847386,
103-
21211457866117465531949733809706514799713333930924902519246949506964470524162,
104-
13718112532745211817410303291774369209520657938741992779396229864894885156527,
105-
5264534817993325015357427094323255342713527811596856940387954546330728068658,
106-
18884137497114307927425084003812022333609937761793387700010402412840002189451,
107-
5148596049900083984813839872929010525572543381981952060869301611018636120248,
108-
19799686398774806587970184652860783461860993790013219899147141137827718662674,
109-
19240878651604412704364448729659032944342952609050243268894572835672205984837,
110-
10546185249390392695582524554167530669949955276893453512788278945742408153192,
111-
5507959600969845538113649209272736011390582494851145043668969080335346810411,
112-
18177751737739153338153217698774510185696788019377850245260475034576050820091,
113-
19603444733183990109492724100282114612026332366576932662794133334264283907557,
114-
10548274686824425401349248282213580046351514091431715597441736281987273193140,
115-
1823201861560942974198127384034483127920205835821334101215923769688644479957,
116-
11867589662193422187545516240823411225342068709600734253659804646934346124945,
117-
18718569356736340558616379408444812528964066420519677106145092918482774343613,
118-
10530777752259630125564678480897857853807637120039176813174150229243735996839,
119-
20486583726592018813337145844457018474256372770211860618687961310422228379031,
120-
12690713110714036569415168795200156516217175005650145422920562694422306200486,
121-
17386427286863519095301372413760745749282643730629659997153085139065756667205,
122-
2216432659854733047132347621569505613620980842043977268828076165669557467682,
123-
6309765381643925252238633914530877025934201680691496500372265330505506717193,
124-
20806323192073945401862788605803131761175139076694468214027227878952047793390,
125-
4037040458505567977365391535756875199663510397600316887746139396052445718861,
126-
19948974083684238245321361840704327952464170097132407924861169241740046562673,
127-
845322671528508199439318170916419179535949348988022948153107378280175750024,
128-
16222384601744433420585982239113457177459602187868460608565289920306145389382,
129-
10232118865851112229330353999139005145127746617219324244541194256766741433339,
130-
6699067738555349409504843460654299019000594109597429103342076743347235369120,
131-
6220784880752427143725783746407285094967584864656399181815603544365010379208,
132-
6129250029437675212264306655559561251995722990149771051304736001195288083309,
133-
10773245783118750721454994239248013870822765715268323522295722350908043393604,
134-
4490242021765793917495398271905043433053432245571325177153467194570741607167,
135-
19596995117319480189066041930051006586888908165330319666010398892494684778526,
136-
837850695495734270707668553360118467905109360511302468085569220634750561083,
137-
11803922811376367215191737026157445294481406304781326649717082177394185903907,
138-
10201298324909697255105265958780781450978049256931478989759448189112393506592,
139-
13564695482314888817576351063608519127702411536552857463682060761575100923924,
140-
9262808208636973454201420823766139682381973240743541030659775288508921362724,
141-
173271062536305557219323722062711383294158572562695717740068656098441040230,
142-
18120430890549410286417591505529104700901943324772175772035648111937818237369,
143-
20484495168135072493552514219686101965206843697794133766912991150184337935627,
144-
19155651295705203459475805213866664350848604323501251939850063308319753686505,
145-
11971299749478202793661982361798418342615500543489781306376058267926437157297,
146-
18285310723116790056148596536349375622245669010373674803854111592441823052978,
147-
7069216248902547653615508023941692395371990416048967468982099270925308100727,
148-
6465151453746412132599596984628739550147379072443683076388208843341824127379,
149-
16143532858389170960690347742477978826830511669766530042104134302796355145785,
150-
19362583304414853660976404410208489566967618125972377176980367224623492419647,
151-
1702213613534733786921602839210290505213503664731919006932367875629005980493,
152-
10781825404476535814285389902565833897646945212027592373510689209734812292327,
153-
4212716923652881254737947578600828255798948993302968210248673545442808456151,
154-
7594017890037021425366623750593200398174488805473151513558919864633711506220,
155-
18979889247746272055963929241596362599320706910852082477600815822482192194401,
156-
13602139229813231349386885113156901793661719180900395818909719758150455500533,
157-
];
158-
159-
let mut r = 0;
160-
for elem in array {
161-
let h = mimc(elem, r, constants, exponent);
162-
r = r + elem + h;
163-
}
164-
r
165-
}

noir_stdlib/src/hash/mimc.nr

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// mimc-p/p implementation
2+
// constants are (publicly generated) random numbers, for instance using keccak as a ROM.
3+
// You must use constants generated for the native field
4+
// Rounds number should be ~ log(p)/log(exp)
5+
// For 254 bit primes, exponent 7 and 91 rounds seems to be recommended
6+
fn mimc<N>(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field {
7+
//round 0
8+
let mut t = x + k;
9+
let mut h = t.pow_32(exp);
10+
//next rounds
11+
for i in 1 .. constants.len() {
12+
t = h + k + constants[i];
13+
h = t.pow_32(exp);
14+
};
15+
h + k
16+
}
17+
18+
global MIMC_BN254_ROUNDS = 91;
19+
20+
//mimc implementation with hardcoded parameters for BN254 curve.
21+
#[field(bn254)]
22+
pub fn mimc_bn254<N>(array: [Field; N]) -> Field {
23+
//mimc parameters
24+
let exponent = 7;
25+
//generated from seed "mimc" using keccak256
26+
let constants: [Field; MIMC_BN254_ROUNDS] = [
27+
0,
28+
20888961410941983456478427210666206549300505294776164667214940546594746570981,
29+
15265126113435022738560151911929040668591755459209400716467504685752745317193,
30+
8334177627492981984476504167502758309043212251641796197711684499645635709656,
31+
1374324219480165500871639364801692115397519265181803854177629327624133579404,
32+
11442588683664344394633565859260176446561886575962616332903193988751292992472,
33+
2558901189096558760448896669327086721003508630712968559048179091037845349145,
34+
11189978595292752354820141775598510151189959177917284797737745690127318076389,
35+
3262966573163560839685415914157855077211340576201936620532175028036746741754,
36+
17029914891543225301403832095880481731551830725367286980611178737703889171730,
37+
4614037031668406927330683909387957156531244689520944789503628527855167665518,
38+
19647356996769918391113967168615123299113119185942498194367262335168397100658,
39+
5040699236106090655289931820723926657076483236860546282406111821875672148900,
40+
2632385916954580941368956176626336146806721642583847728103570779270161510514,
41+
17691411851977575435597871505860208507285462834710151833948561098560743654671,
42+
11482807709115676646560379017491661435505951727793345550942389701970904563183,
43+
8360838254132998143349158726141014535383109403565779450210746881879715734773,
44+
12663821244032248511491386323242575231591777785787269938928497649288048289525,
45+
3067001377342968891237590775929219083706800062321980129409398033259904188058,
46+
8536471869378957766675292398190944925664113548202769136103887479787957959589,
47+
19825444354178182240559170937204690272111734703605805530888940813160705385792,
48+
16703465144013840124940690347975638755097486902749048533167980887413919317592,
49+
13061236261277650370863439564453267964462486225679643020432589226741411380501,
50+
10864774797625152707517901967943775867717907803542223029967000416969007792571,
51+
10035653564014594269791753415727486340557376923045841607746250017541686319774,
52+
3446968588058668564420958894889124905706353937375068998436129414772610003289,
53+
4653317306466493184743870159523234588955994456998076243468148492375236846006,
54+
8486711143589723036499933521576871883500223198263343024003617825616410932026,
55+
250710584458582618659378487568129931785810765264752039738223488321597070280,
56+
2104159799604932521291371026105311735948154964200596636974609406977292675173,
57+
16313562605837709339799839901240652934758303521543693857533755376563489378839,
58+
6032365105133504724925793806318578936233045029919447519826248813478479197288,
59+
14025118133847866722315446277964222215118620050302054655768867040006542798474,
60+
7400123822125662712777833064081316757896757785777291653271747396958201309118,
61+
1744432620323851751204287974553233986555641872755053103823939564833813704825,
62+
8316378125659383262515151597439205374263247719876250938893842106722210729522,
63+
6739722627047123650704294650168547689199576889424317598327664349670094847386,
64+
21211457866117465531949733809706514799713333930924902519246949506964470524162,
65+
13718112532745211817410303291774369209520657938741992779396229864894885156527,
66+
5264534817993325015357427094323255342713527811596856940387954546330728068658,
67+
18884137497114307927425084003812022333609937761793387700010402412840002189451,
68+
5148596049900083984813839872929010525572543381981952060869301611018636120248,
69+
19799686398774806587970184652860783461860993790013219899147141137827718662674,
70+
19240878651604412704364448729659032944342952609050243268894572835672205984837,
71+
10546185249390392695582524554167530669949955276893453512788278945742408153192,
72+
5507959600969845538113649209272736011390582494851145043668969080335346810411,
73+
18177751737739153338153217698774510185696788019377850245260475034576050820091,
74+
19603444733183990109492724100282114612026332366576932662794133334264283907557,
75+
10548274686824425401349248282213580046351514091431715597441736281987273193140,
76+
1823201861560942974198127384034483127920205835821334101215923769688644479957,
77+
11867589662193422187545516240823411225342068709600734253659804646934346124945,
78+
18718569356736340558616379408444812528964066420519677106145092918482774343613,
79+
10530777752259630125564678480897857853807637120039176813174150229243735996839,
80+
20486583726592018813337145844457018474256372770211860618687961310422228379031,
81+
12690713110714036569415168795200156516217175005650145422920562694422306200486,
82+
17386427286863519095301372413760745749282643730629659997153085139065756667205,
83+
2216432659854733047132347621569505613620980842043977268828076165669557467682,
84+
6309765381643925252238633914530877025934201680691496500372265330505506717193,
85+
20806323192073945401862788605803131761175139076694468214027227878952047793390,
86+
4037040458505567977365391535756875199663510397600316887746139396052445718861,
87+
19948974083684238245321361840704327952464170097132407924861169241740046562673,
88+
845322671528508199439318170916419179535949348988022948153107378280175750024,
89+
16222384601744433420585982239113457177459602187868460608565289920306145389382,
90+
10232118865851112229330353999139005145127746617219324244541194256766741433339,
91+
6699067738555349409504843460654299019000594109597429103342076743347235369120,
92+
6220784880752427143725783746407285094967584864656399181815603544365010379208,
93+
6129250029437675212264306655559561251995722990149771051304736001195288083309,
94+
10773245783118750721454994239248013870822765715268323522295722350908043393604,
95+
4490242021765793917495398271905043433053432245571325177153467194570741607167,
96+
19596995117319480189066041930051006586888908165330319666010398892494684778526,
97+
837850695495734270707668553360118467905109360511302468085569220634750561083,
98+
11803922811376367215191737026157445294481406304781326649717082177394185903907,
99+
10201298324909697255105265958780781450978049256931478989759448189112393506592,
100+
13564695482314888817576351063608519127702411536552857463682060761575100923924,
101+
9262808208636973454201420823766139682381973240743541030659775288508921362724,
102+
173271062536305557219323722062711383294158572562695717740068656098441040230,
103+
18120430890549410286417591505529104700901943324772175772035648111937818237369,
104+
20484495168135072493552514219686101965206843697794133766912991150184337935627,
105+
19155651295705203459475805213866664350848604323501251939850063308319753686505,
106+
11971299749478202793661982361798418342615500543489781306376058267926437157297,
107+
18285310723116790056148596536349375622245669010373674803854111592441823052978,
108+
7069216248902547653615508023941692395371990416048967468982099270925308100727,
109+
6465151453746412132599596984628739550147379072443683076388208843341824127379,
110+
16143532858389170960690347742477978826830511669766530042104134302796355145785,
111+
19362583304414853660976404410208489566967618125972377176980367224623492419647,
112+
1702213613534733786921602839210290505213503664731919006932367875629005980493,
113+
10781825404476535814285389902565833897646945212027592373510689209734812292327,
114+
4212716923652881254737947578600828255798948993302968210248673545442808456151,
115+
7594017890037021425366623750593200398174488805473151513558919864633711506220,
116+
18979889247746272055963929241596362599320706910852082477600815822482192194401,
117+
13602139229813231349386885113156901793661719180900395818909719758150455500533,
118+
];
119+
120+
let mut r = 0;
121+
for elem in array {
122+
let h = mimc(elem, r, constants, exponent);
123+
r = r + elem + h;
124+
}
125+
r
126+
}

tooling/nargo_cli/tests/execution_success/6/src/main.nr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ fn main(x: [u8; 5], result: pub [u8; 32]) {
1515
assert(digest == result);
1616

1717
let y = [12, 45, 78, 41];
18-
let h = std::hash::mimc_bn254(y);
18+
let h = std::hash::mimc::mimc_bn254(y);
1919
assert(h == 18226366069841799622585958305961373004333097209608110160936134895615261821931);
2020
}

tooling/nargo_cli/tests/execution_success/merkle_insert/src/main.nr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use dep::std;
2+
use dep::std::hash::mimc;
23

34
fn main(
45
old_root: Field,
@@ -14,7 +15,7 @@ fn main(
1415
let calculated_root = std::merkle::compute_merkle_root(leaf, index, old_hash_path);
1516
assert(new_root == calculated_root);
1617

17-
let h = std::hash::mimc_bn254(mimc_input);
18+
let h = mimc::mimc_bn254(mimc_input);
1819
// Regression test for PR #891
1920
std::println(h);
2021
assert(h == 18226366069841799622585958305961373004333097209608110160936134895615261821931);

0 commit comments

Comments
 (0)