Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/masa-finance/masa-zksbt
A template for creating new SBTs inheriting from the Masa SBT smart contracts, using ZKP.
https://github.com/masa-finance/masa-zksbt
circom smart-contracts solidity
Last synced: 22 days ago
JSON representation
A template for creating new SBTs inheriting from the Masa SBT smart contracts, using ZKP.
- Host: GitHub
- URL: https://github.com/masa-finance/masa-zksbt
- Owner: masa-finance
- License: mit
- Created: 2023-04-18T19:45:43.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-08-27T05:51:01.000Z (6 months ago)
- Last Synced: 2024-08-27T06:54:53.964Z (6 months ago)
- Topics: circom, smart-contracts, solidity
- Language: TypeScript
- Homepage:
- Size: 46.8 MB
- Stars: 8
- Watchers: 5
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# Masa ZKSBT
A template for creating new SBTs inheriting from the Masa SBT smart contracts, using ZKP.
We use [eth-crypto](https://www.npmjs.com/package/eth-crypto) package to encrypt and decrypt the data.
## Install dependencies and deployment
### Preparations
* Set `DEPLOYER_PRIVATE_KEY` to the deployers private key in `.env.{network}.secret`
* Set `INFURA_API_KEY` to the Infura API key in `.env`
* Set `COINMARKETCAP_API_KEY` to the CoinMarketCap API key in `.env`, if needed
* Set `ETHERSCAN_API_KEY` to the Etherscan API key in `.env`, if needed
* Set the environment variables in every `.env.{network}` file. These variables are used to deploy the smart contracts to the network.### Install dependencies
Run:
```
yarn install
```### Build smart contracts
Run:
```
yarn build
```### Deploy
Run:
```
yarn deploy --network {network}
```## Contract Deployments
### Deployment addresses
You can see the deployment address of the smart contracts in the [deployments/goerli](deployments/goerli) and [deployments/mainnet](deployments/mainnet) folders. For every deployed smart contract you will find a `.json` JSON file with the address in the `"address"` field.
## Zero-Knowledge Proof
Zero-knowledge proof is a method by which one party (the prover) can prove to another party (the verifier) that the prover knows a value x that fulfills some constraints without revealing any information apart from the fact that he/she knows the value x.
### Circom and dependencies setup
#### Install Rust
```
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```#### Build Circom from source
```
git clone https://github.com/iden3/circom.git
cd circom
cargo build --release
cargo install --path circom
```#### Install snarkjs
```
npm install -g snarkjs
```### Compile the circuit
```
cd circuits
circom verify4.circom --r1cs --wasm
```### Download the trusted setup (Powers of tau file)
```
wget https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_11.ptau
```It is a community-generated trusted setup. A trusted setup is an algorithm that determines a protocol’s public parameters using information that must remain secret to ensure the protocol’s security.
### Generate the verification key
The verification key is generated starting from `verify4.r1cs` (description of the circuit and its constraints) and `powersOfTau28_hez_final_11.ptau` which is the trusted setup. The output file of the operation is `verify4.zkey`, namely the verification key for the circuit.
```
snarkjs groth16 setup verify4.r1cs powersOfTau28_hez_final_11.ptau verify4.zkey
```# Get a verification key in json format (from the proving key)
```
snarkjs zkey export verificationkey verify4.zkey verification_key.json
```### Compute the witness
Add the input in the file `input.json` file:
```
{
"index": 1,
"root": "0x20630d227f9c346b4c6f52a21a4085fb061d8b9eba3ed155b6061ae6d177b693",
"owner": "0x14B2Bab4d1068e742BAf05F908D7b5A00773B0dd",
"threshold": 40,
"operator": 3,
"value": 45,
"data": ["0x14B2Bab4d1068e742BAf05F908D7b5A00773B0dd", 45, 3100, 1675196581804]
}
```Then execute:
```
node verify4_js/generate_witness.js verify4_js/verify4.wasm input.json witness.wtns
```### Generate a proof
Generate a zk-proof associated to the circuit and the witness:
```
snarkjs groth16 prove verify4.zkey witness.wtns proof.json public.json
```### Verifying a Proof
To verify the proof, execute the following command:
```
snarkjs groth16 verify verification_key.json public.json proof.json
```### Verifying from a Smart Contract
We need to generate the Solidity code using the command:
```
snarkjs zkey export solidityverifier verify4.zkey ../contracts/verifier.sol
```The `Verifier` has a `view` function called `verifyProof` that returns `TRUE` if and only if the proof and the inputs are valid. To facilitate the call, you can use `snarkJS` to generate the parameters of the call by typing:
```
snarkjs generatecall
```