Smartcontract add nullifier, update contract to last circuit

This commit is contained in:
arnaucube
2020-05-11 09:39:09 +02:00
parent 95d4f210be
commit 2179505f3b
5 changed files with 131 additions and 69 deletions

View File

@@ -8,52 +8,58 @@ contract Miksi {
constructor( address _verifierContractAddr) public {
verifier = Verifier(_verifierContractAddr);
}
mapping(uint256 => Deposit) deposits;
struct Deposit {
uint256 coinCode;
uint256 amount;
bool used;
}
uint256 amount = uint256(1000000000000000000);
uint256 root;
uint256[] commitments;
mapping(uint256 => bool) nullifiers;
function deposit(
uint256 coinCode,
// uint256 amount,
uint256 commitment
uint256 _commitment,
uint256 _root
) public payable {
deposits[commitment] = Deposit(coinCode, msg.value, false);
// TODO check root state transition update with zkp
require(msg.value==amount, "value should be 1 ETH"); // this can be flexible with a wrapper with preset fixed amounts
commitments.push(_commitment);
root = _root;
}
function getDeposit(
uint256 commitment
) public view returns (uint256, uint256) {
return (
deposits[commitment].coinCode,
deposits[commitment].amount
);
function getCommitments() public view returns (uint256[] memory, uint256) {
return (commitments, root);
}
function withdraw(
uint256 commitment,
address payable _address,
uint256 nullifier,
uint[2] memory a,
uint[2][2] memory b,
uint[2] memory c
) public {
uint256[4] memory input = [
deposits[commitment].coinCode,
deposits[commitment].amount,
commitment,
uint256[5] memory input = [
0,
amount,
nullifier,
root,
uint256(_address)
];
require(verifier.verifyProof(a, b, c, input), "zkProof withdraw could not be verified");
// zk verification passed, proceed with the withdraw
require(!deposits[commitment].used, "deposit already withdrawed");
deposits[commitment].used = true;
_address.send(deposits[commitment].amount);
// _address.call.value(deposits[commitment].amount).gas(20317)();
// zk verification passed
require(useNullifier(nullifier), "nullifier already used");
// nullifier check passed
// proceed with the withdraw
_address.send(amount);
// _address.call.value(amount).gas(20317)();
}
function useNullifier(
uint256 nullifier
) internal returns (bool) {
if (nullifiers[nullifier]) {
return false;
}
nullifiers[nullifier] = true;
return true;
}
}