From 118238ea62243a1f67cf641ec9624fb0b2c8c9c4 Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 26 Oct 2020 16:30:10 +0300 Subject: [PATCH] pass fixes size array arg in solidity poseidon implementation --- src/poseidon_gencontract.js | 21 +++++++++++++-------- test/poseidoncontract.js | 17 ++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/poseidon_gencontract.js b/src/poseidon_gencontract.js index 5a65ac9..a93c1ec 100644 --- a/src/poseidon_gencontract.js +++ b/src/poseidon_gencontract.js @@ -4,6 +4,7 @@ const Contract = require("./evmasm"); const { unstringifyBigInts } = require("snarkjs"); +const Web3Utils = require("web3-utils"); const { C:K, M } = unstringifyBigInts(require("./poseidon_constants.json")); @@ -99,7 +100,7 @@ function createCode(nInputs) { C.push(0); C.calldataload(); C.div(); - C.push("0xc4420fb4"); // poseidon(uint256[]) + C.push(Web3Utils.keccak256(`poseidon(uint256[${nInputs}])`).slice(0, 10)); // poseidon(uint256[]) C.eq(); C.jmpi("start"); C.invalid(); @@ -112,11 +113,10 @@ function createCode(nInputs) { // Load t values from the call data. // The function has a single array param param - // [Selector (4)] [Pointer (32)][Length (32)] [data1 (32)] .... - // We ignore the pointer and the length and just load t values to the state - // (Stack positions 0-{t-1}) If the array is shorter, we just set zeros. + // [Selector (4)] [item1 (32)] [item2 (32)] .... + // Stack positions 0-nInputs. for (let i=0; i { web3 = new Web3(ganache.provider(), null, { transactionConfirmationBlocks: 1 }); @@ -21,15 +23,17 @@ describe("Poseidon Smart contract test", function () { }); it("Should deploy the contract", async () => { - const C = new web3.eth.Contract(poseidonGenContract.abi); - - poseidon2 = await C.deploy({ + + C2 = new web3.eth.Contract(poseidonGenContract.generateABI(2)); + poseidon2 = await C2.deploy({ data: poseidonGenContract.createCode(2) }).send({ gas: 5000000, from: accounts[0] }); - poseidon4 = await C.deploy({ + + C4 = new web3.eth.Contract(poseidonGenContract.generateABI(4)); + poseidon4 = await C4.deploy({ data: poseidonGenContract.createCode(4) }).send({ gas: 5000000, @@ -37,8 +41,7 @@ describe("Poseidon Smart contract test", function () { }); }); - it("Shold calculate the poseidon correctly for 2 inputs", async () => { - + it("Should calculate the poseidon correctly for 2 inputs", async () => { const res = await poseidon2.methods.poseidon([1, 2]).call(); // console.log("Cir: " + bigInt(res.toString(16)).toString(16)); @@ -48,7 +51,7 @@ describe("Poseidon Smart contract test", function () { assert.equal(res.toString(), res2.toString()); }); - it("Shold calculate the poseidon correctly for 4 inputs", async () => { + it("Should calculate the poseidon correctly for 4 inputs", async () => { const res = await poseidon4.methods.poseidon([1, 2, 3, 4]).call();