From 693d6340649f96537f87711c4edafad07bf9ca62 Mon Sep 17 00:00:00 2001 From: arnaucube <root@arnaucube.com> Date: Thu, 14 May 2020 00:19:29 +0200 Subject: [PATCH] Contract Deposit call successfully called with zkproof --- index.html | 19 +++++++---- index.js | 81 +++++++++++++++++++++++++++++++++++++++++--- lib/miksi-browser.js | 8 ++++- package.json | 2 +- 4 files changed, 97 insertions(+), 13 deletions(-) diff --git a/index.html b/index.html index 91bd756..620c1bb 100644 --- a/index.html +++ b/index.html @@ -48,13 +48,13 @@ <div class="card-body"> <!-- menu --> <div class="tab-content" id="myTabContent"> - <button onclick="todo()" class="btn color_primary-o float-right">Connect Metamask</button> + <button onclick="connectMetamask()" class="btn color_primary-o float-right">Connect Metamask</button> <h2><i>miksi</i></h2> <i>From Esperanto, <b>miksi</b> (miks·i): to mingle, to blend, to mix, to shuffle</i> <br> Ethereum trustless <b>zk-mixer</b>. <br><br> - <div class="alertBox"><b>WARNING</b>: experimental code, use only in Göerli testnet, and without real value.</div> + <div class="alertBox"><b>WARNING</b>: experimental code, use only in Göerli testnet, without any real value.</div> <br><br> <!-- deposit --> @@ -63,21 +63,26 @@ <div class="col-md"> <h5 class="card-title">Deposit</h5> <hr> + a Quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit. <br><br> <button onclick="deposit('deposit')" class="btn color_primary float-right">Deposit 1 ETH</button> - <br><br><br> + <br> + <div id="depositRes"></div> + <br><br> </div> <div class="col-md"> <h5 class="card-title">Withdraw</h5> <hr> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore. <br><br> - <input id="secret" type="text" class="form-control" placeholder="secret"></input> + <input id="secret" type="text" class="form-control" placeholder="secret" value="1234567890"></input> + <br> + <input id="nullifier" type="text" class="form-control" placeholder="nullifier" value="567891234"></input> <br> - <input id="nullifier" type="text" class="form-control" placeholder="nullifier"></input> + <button onclick="withdraw('withdraw')" class="btn color_primary float-right">Withdraw 1 ETH</button> <br> - <button onclick="todo()" class="btn color_primary float-right">Withdraw 1 ETH</button> + <div id="withdrawRes"></div> </div> </div> <br><br> @@ -171,7 +176,7 @@ <script src="lib/wasmsnark_bn128.js"></script> <script src="lib/snarkjs.js"></script> - <!-- <script src="node_modules/web3/dist/web3.min.js"></script> --> + <script src="node_modules/web3/dist/web3.min.js"></script> <script src="lib/miksi-browser.js"></script> <script src="index.js"></script> diff --git a/index.js b/index.js index ce4ecaa..fdc5653 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,8 @@ var circuit = {}; var provingKey = {}; var witnessCalc = {}; +const abi = JSON.parse(`[{"inputs":[{"internalType":"address","name":"_depositVerifierContractAddr","type":"address"},{"internalType":"address","name":"_withdrawVerifierContractAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"_commitment","type":"uint256"},{"internalType":"uint256","name":"_root","type":"uint256"},{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCommitments","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"},{"internalType":"uint256","name":"nullifier","type":"uint256"},{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]`); +const miksiAddress = "0x6E77f4bB1356426baD1Bd014d04388eFAc197Fe1"; function loadCircuit(circuitname) { fetch("circuits-files/"+circuitname+"-proving_key.bin").then( (response) => { @@ -20,19 +22,26 @@ function loadCircuit(circuitname) { } async function deposit(circuitname) { + document.getElementById("depositRes").innerHTML = ` + Generating zkProof & making the deposit + `; console.log("circuit:", circuitname); // TODO const secret = "1234567890"; const nullifier = "567891234"; const commitments = []; + // getCommitments from the tree - // witness + // calculate witness console.log(witnessCalc[circuitname]); - const witness = await miksi.calcWitness(witnessCalc[circuitname], secret, nullifier, commitments); + const cw = await miksi.calcWitness(witnessCalc[circuitname], secret, nullifier, commitments); + const witness = cw.witness; + const publicInputs = cw.publicInputs; console.log("w", witness); + console.log("pi", publicInputs); - // proof + // generate proof const start = new Date().getTime(); console.log(provingKey[circuitname]); const proof = await window.groth16GenProof(witness.buffer, provingKey[circuitname]); @@ -40,10 +49,74 @@ async function deposit(circuitname) { const time = end - start; console.log("circuit " + circuitname + " took " + time + "ms to compute"); console.log(proof); + + + // send tx + const accounts = await web3.eth.getAccounts(); + const sender = accounts[0]; + console.log("SENDER", sender); + + console.log("sc call data", + publicInputs.commitment, + publicInputs.root.toString(), + [proof.pi_a[0], proof.pi_a[1]], + [ + [proof.pi_b[0][1], proof.pi_b[0][0]], + [proof.pi_b[1][1], proof.pi_b[1][0]] + ], + [proof.pi_c[0], proof.pi_c[1]], + ); + miksiContract.methods.deposit( + publicInputs.commitment, + publicInputs.root.toString(), + [proof.pi_a[0], proof.pi_a[1]], + [ + [proof.pi_b[0][1], proof.pi_b[0][0]], + [proof.pi_b[1][1], proof.pi_b[1][0]] + ], + [proof.pi_c[0], proof.pi_c[1]], + ).send( + {from: sender, value: 1000000000000000000}, + function(error, transactionHash){ + console.log("https://goerli.etherscan.io/tx/"+transactionHash); + console.log(error); + }); + + // print secret & nullifier + document.getElementById("depositRes").innerHTML = ` + Secret: <b>`+secret+`</b><br> + Nullifier: <b>`+nullifier+`</b><br> + `; } loadCircuit("deposit"); loadCircuit("withdraw"); -// var web3 = new Web3(Web3.givenProvider || "ws://localhost:8545"); + + +let miksiContract; + +function connectMetamask() { + const ethEnabled = () => { + if (window.web3) { + window.web3 = new Web3(window.web3.currentProvider); + window.ethereum.enable(); + return true; + } + return false; + } + + if (!ethEnabled()) { + alert("Please install MetaMask to use miksi"); + } + + console.log("abi", abi); + miksiContract = new web3.eth.Contract(abi, miksiAddress); + console.log("miksiContract", miksiContract); + + web3.eth.getBalance("0x35d4dCDdB728CeBF80F748be65bf84C776B0Fbaf", function(err, res){console.log("BAL", JSON.stringify(res));}); + + miksiContract.methods.getCommitments().call() + .then(console.log); +} diff --git a/lib/miksi-browser.js b/lib/miksi-browser.js index c980f0d..590e460 100644 --- a/lib/miksi-browser.js +++ b/lib/miksi-browser.js @@ -76358,7 +76358,13 @@ exports.calcWitness = async (wasm, secret, nullifier, commitments) => { // const witness = unstringifyBigInts(stringifyBigInts(w)); - return wBuff; + return { + witness: wBuff, + publicInputs: { + commitment:commitment, + root:rootNew + } + }; } diff --git a/package.json b/package.json index d9d0a3f..d1b26f1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "toastr": "^2.1.4", "wasmsnark": "0.0.10", "snarkjs": "^0.1.31", - "web3": "^1.0.0-beta.30" + "web3": "1.2.7" }, "devDependencies": { "browserify": "^16.5.0"