A standard interface for a "Verifier Registry"'" contract, through which all zk-SNARK verification activity can be registered.
## Abstract
The following standard allows for the implementation of a standard contract API for the registration of zk-SNARKs ("Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge"), also known as "proofs", "arguments", or "commitments".
TODO: Which functionality is exposed in this standard interface?
## Motivation
zk-SNARKs are a promising area of interest for the Ethereum community. Key applications of zk-SNARKs include:
- Private transactions
- Private computations
- Ethereum scaling through proofs of 'bundled' transactions
A standard interface for registering all zk-SNARKs will allow applications to more easily implement private transactions, private contracts, and scaling solutions; and to extract and interpret the limited information which gets emitted during zk-SNARK verifications.
:warning: TODO: Explain the motivation for standardizing a registry, other than simply standardizing the verifier interactions.
⚠️ TODO: Explain the benefits to and perspective of a consumer of information. I.e. the thing that interfaces with the standard verifier registry.
## Specification
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
```solidity
pragma solidity ^0.5.6;
/// @title EIP-XXXX zk-SNARK Verifier Registry Standard
/// @dev See https://github.com/EYBlockchain/zksnark-verifier-standard
/// Note: the ERC-165 identifier for this interface is 0xXXXXXXXXX.
function createNewVkId(uint256[] calldata _vk) external pure returns (bytes32);
function createNewProofId(uint256[] calldata _proof, uint64[] calldata _inputs) external pure returns (bytes32);
}
```
### Interface
``` solidity
interface ERC165 {
/// @notice Query if a contract implements an interface
/// @param interfaceID The interface identifier, as specified in ERC-165
/// @dev Interface identification is specified in ERC-165. This function
/// uses less than 30,000 gas.
/// @return`true` if the contract implements `interfaceID` and
/// `interfaceID` is not 0xffffffff, `false` otherwise
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
```
## Rationale
⚠️ TODO: Add Rationale section.
### Backwards Compatibility
⚠️ TODO: Add Backwards Compatibility section.
### Test Cases
Truffle tests of example implementations are included in this Repo.
⚠️ TODO: Reference specific test cases because there are many currently in the repository.
## Implementations
Detailed example implementations and Truffle tests of these example implementations are included in this Repo.
⚠️ TODO: Update referenced verifier registry implementations so that they are ready-to-deploy or reference deployed versions of those implementations. At current, the referenced code specifically states "DO NOT USE THIS IN PRODUCTION".
⚠️ TODO: Provide reference to an implementation which interrogates a standard verifier registry contract that implements this standard.
## References
⚠️ TODO: Update references and confirm that each reference is cited (parenthetical documentation not necessary) in the text.
5. Ethereum Name Service (ENS). https://ens.domains
6. RFC 2119 Key words for use in RFCs to Indicate Requirement Levels. https://www.ietf.org/rfc/rfc2119.txt
##### Educational material: zk-SNARKs
1. Zcash. What are zk-SNARKs? https://z.cash/technology/zksnarks.html
2. Vitalik Buterin. zk-SNARKs: Under the Hood. https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6
3. Christian Reitweissner. zk-SNARKs in a Nutshell. https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/
4. Ben-Sasson, Chiesa, Tromer, et. al. Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture. https://eprint.iacr.org/2013/879.pdf
##### Notable applications of zk-SNARKs
1. EY. Implementation of a business agreement through Token Commitment transactions on the Ethereum mainnet. https://github.com/EYBlockchain/ZKPChallenge
2. Zcash. https://z.cash
3. Zcash. How Transactions Between Shielded Addresses Work. https://blog.z.cash/zcash-private-transactions/
##### Notable projects relating to zk-SNARKs
1. libsnark: A C++ Library for zk-SNARKs ("project README)". https://github.com/scipr-lab/libsnark