arnaucube
arnaucube/circomlibPublic Self-hosted repository
circomlib/src/mimc_gencontract.js
src/mimc_gencontract.jsRaw
  1// Copyright (c) 2018 Jordi Baylina
  2// License: LGPL-3.0+
  3//
  4
  5const Web3 = require("web3");
  6
  7const Contract = require("./evmasm");
  8
  9function createCode(seed, n) {
 10
 11    let ci = Web3.utils.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 = Web3.utils.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