circomlib/src/mimc_gencontract.js
src/mimc_gencontract.jsRaw
1// Copyright (c) 2018 Jordi Baylina
2// License: LGPL-3.0+
3//
4
5const Web3Utils = require("web3-utils");
6
7const Contract = require("./evmasm");
8
9function createCode(seed, n) {
10
11 let ci = Web3Utils.keccak256(seed);
12
13 const C = new Contract();
14
15 C.push(0x44);
16 C.push("0x00");
17 C.push("0x00");
18 C.calldatacopy();
19 C.push("0x0100000000000000000000000000000000000000000000000000000000");
20 C.push("0x00");
21 C.mload();
22 C.div();
23 C.push("0xd15ca109"); // MiMCpe7(uint256,uint256)
24// C.push("0x8c42199e"); // MiMCpe7(uint256,uint256,uint256)
25 C.eq();
26 C.jmpi("start");
27 C.invalid();
28
29 C.label("start");
30 C.push("0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001"); // q
31 C.push("0x24");
32 C.mload(); // k q
33
34
35 C.dup(1); // q k q
36 C.dup(0); // q q k q
37 C.push("0x04");
38 C.mload(); // x q q k q
39 C.dup(3); // k x q q k q
40 C.addmod(); // t=x+k q k q
41 C.dup(1); // q t q k q
42 C.dup(0); // q q t q k q
43 C.dup(2); // t q q t q k q
44 C.dup(0); // t t q q t q k q
45 C.mulmod(); // a=t^2 q t q k q
46 C.dup(1); // q a q t q k q
47 C.dup(1); // a q a q t q k q
48 C.dup(0); // a a q a q t q k q
49 C.mulmod(); // b=t^4 a q t q k q
50 C.mulmod(); // c=t^6 t q k q
51 C.mulmod(); // r=t^7 k q
52
53 for (let i=0; i<n-1; i++) {
54 ci = Web3Utils.keccak256(ci);
55 C.dup(2); // q r k q
56 C.dup(0); // q q r k q
57 C.dup(0); // q q q r k q
58 C.swap(3); // r q q q k q
59 C.push(ci); // c r q q k q
60 C.addmod(); // s=c+r q q k q
61 C.dup(3); // k s q q k q
62 C.addmod(); // t=s+k q k q
63 C.dup(1); // q t q k q
64 C.dup(0); // q q t q k q
65 C.dup(2); // t q q t q k q
66 C.dup(0); // t t q q t q k q
67 C.mulmod(); // a=t^2 q t q k q
68 C.dup(1); // q a q t q k q
69 C.dup(1); // a q a q t q k q
70 C.dup(0); // a a q a q t q k q
71 C.mulmod(); // b=t^4 a q t q k q
72 C.mulmod(); // c=t^6 t q k q
73 C.mulmod(); // r=t^7 k q
74 }
75
76 C.addmod(); // res=t^7+k
77 C.push("0x00");
78 C.mstore(); // Save it to pos 0;
79 C.push("0x20");
80 C.push("0x00");
81 C.return();
82
83 return C.createTxData();
84}
85
86module.exports.abi = [
87 {
88 "constant": true,
89 "inputs": [
90 {
91 "name": "in_x",
92 "type": "uint256"
93 },
94 {
95 "name": "in_k",
96 "type": "uint256"
97 }
98 ],
99 "name": "MiMCpe7",
100 "outputs": [
101 {
102 "name": "out_x",
103 "type": "uint256"
104 }
105 ],
106 "payable": false,
107 "stateMutability": "pure",
108 "type": "function"
109 }
110];
111
112module.exports.createCode = createCode;
113
114