97 lines
2.8 KiB
Solidity
Raw Normal View History

pragma solidity 0.5.10;
2019-06-22 17:03:38 +03:00
pragma experimental ABIEncoderV2;
2019-06-22 17:33:56 +03:00
import "./IVerifier.sol";
import "./Structs.sol";
2019-06-22 17:03:38 +03:00
contract Lazy is Structs {
event Submitted(address indexed sender, uint256 index, Task task);
event Challenged(address indexed challenger, uint256 index);
enum Status {UNCHECKED, VALID, INVALID, FINALIZED}
struct Task {
Data data;
Proof proof;
address payable submitter;
2019-06-22 17:33:56 +03:00
uint timestamp;
2019-06-22 17:03:38 +03:00
Status status;
}
Task[] public tasks;
2019-06-22 20:33:01 +03:00
function tasksNum() external view returns(uint) {
return tasks.length;
}
2019-06-22 17:03:38 +03:00
uint256 public stake;
2019-06-22 17:33:56 +03:00
IVerifier public verifier;
2019-06-22 17:03:38 +03:00
2019-06-23 13:18:25 +03:00
constructor(IVerifier _verifier) public {
verifier = _verifier;
}
2019-06-22 17:03:38 +03:00
/// @dev This function submits data.
/// @param data - public inptut for zkp
/// @param proof - proof that verifies input
function submit(Data calldata data, Proof calldata proof) external payable {
require(msg.value == stake);
2019-06-23 15:06:32 +03:00
Task memory task = Task(data, proof, msg.sender, now, Status.UNCHECKED);
2019-06-22 17:03:38 +03:00
uint index = tasks.push(task);
emit Submitted(msg.sender, index, task);
}
/// @dev This function challenges a submission by calling the validation function.
/// @param id The id of the submission to challenge.
function challenge(uint id) external {
Task storage task = tasks[id];
require(now < task.timestamp + 1 weeks);
require(task.status == Status.UNCHECKED);
if (verifier.isValid(task.data, task.proof)) {
task.status = Status.VALID;
task.submitter.transfer(stake);
} else {
task.status = Status.INVALID;
msg.sender.transfer(stake);
}
// пруф не подходит, на это надо реагировать
emit Challenged(msg.sender, id);
}
function finzalize(uint id) external {
Task storage task = tasks[id];
require(now > task.timestamp + 1 weeks);
require(task.status == Status.UNCHECKED);
task.status = Status.FINALIZED;
msg.sender.transfer(stake);
}
2019-06-22 17:33:56 +03:00
2019-06-23 15:01:34 +03:00
function taskDataById(uint id) external view returns(uint[13] memory data) {
2019-06-22 20:33:01 +03:00
Task memory task = tasks[id];
2019-06-22 21:28:57 +03:00
data[0] = task.data.input[0];
data[1] = task.data.input[1];
data[2] = task.data.input[2];
data[3] = task.data.input[3];
data[4] = task.data.input[4];
data[5] = task.proof.a[0];
data[6] = task.proof.a[1];
data[7] = task.proof.b[0][0];
data[8] = task.proof.b[0][1];
data[9] = task.proof.b[1][0];
2019-06-23 12:12:05 +03:00
data[10] = task.proof.b[1][1];
2019-06-22 21:28:57 +03:00
data[11] = task.proof.c[0];
data[12] = task.proof.c[1];
2019-06-22 20:33:01 +03:00
}
2019-06-22 17:03:38 +03:00
}