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.

114 lines
3.0 KiB

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