mirror of
https://github.com/arnaucube/miksi-core.git
synced 2026-02-07 03:26:41 +01:00
Smartcontract add nullifier, update contract to last circuit
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user