Getting Started
This tutorial will help you install Unirep and run examples
Download Unirep Social
Clone Unirep Social source code from github
git clone https://github.com/vivianjeng/Unirep-Social.git
Install packages
Install packages used in Unirep Social
yarn install
Build the Circom circuits
Build circom circuits and generate their constraints and verification keys and proving keys files in the build/
directory.
Also export smart contract verifiers to be deployed with Unirep and Unirep Social smart contract.
yarn build
Test
Test all cli commands
yarn test-cli
Integration test
yarn test
Example cli commands workflow
1. Run a testing net
We use hardhat here as a blockchain developing environment.
npx hardhat node
2. Deploy Unirep smart contract and its verifiers
If we choose the first account, we use 0xac097...ff80
as our deployerPrivateKey
parameter
Open another terminal and run:
npx ts-node cli/index.ts deploy -d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Then we use the Unirep Social contract's address to interact with.
3. Generate user's identity and identity commitment
npx ts-node cli/index.ts genUnirepIdentity
4. User signs up
The user signs up with his identity commitment instead of his real identity.
npx ts-node cli/index.ts userSignup \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-c Unirep.identityCommitment.MTI0ZWQ1YTc4NjYzMWVhODViY2YzZDI4NWFhOTA5MzFjMjUwOTEzMzljYzAzODU3YTVlMzY5ZWYxZmI2NTAzNw \
-d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
5. Attester signs up
npx ts-node cli/index.ts attesterSignup \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-d 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
NOTE: Though user signs up requires a private key, private key is used to interact with smart contract but not link identity commitment and the account.
However, attesterSignup
bind the account with attester id. Whenever the user wants to attest others, the user has to use the account he has registered for as an attester.
Therefore, users can sign up their identity commitments and their attester ids with different accounts to enjoy more privacy protection.
6. User generates epoch key and epoch key proof
The user can generate an epoch key with his identity and nonce.
npx ts-node cli/index.ts genEpochKeyAndProof \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-id Unirep.identity.WyJlOGQ2NGU5OThhM2VmNjAxZThjZTNkNDQwOWQyZjc3MjEwOGJkMGI1NTgwODAzYjY2MDk0YTllZWExMzYxZjA2IiwiODZiYjk5ZGQ4MzA2ZGVkZDgxYTE4MzBiNmVjYmRlZjk5ZmVjYTU3M2RiNjIxMjk5NGMyMmJlMWEwMWZmMTEiLCIzMGE3M2MxMjE4ODQwNjE0MWQwYmI4NWRjZDY5ZjdhMjEzMWM1NWRkNDQzYWNmMGVhZTEwNjI2NzBjNDhmYSJd \
-n 0
7. Attester verify epoch key proof
npx ts-node cli/index.ts verifyEpochKeyProof \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-epk 69 \
-pf Unirep.epkProof.WyIxNjA4MjU3MzE4NTE4MzU0NjcyNTQ5Mjc1Njg1NDMwMDkwMTEwMjUxNDU0NTAwODQ2NjQ1MTk5Mjg5MzY3NjgwNTI4ODc1MDQ2MjY5NiIsIjE0MzE1OTI5OTQzMDI4NTY5MjA4OTQ3NTYyMTI0MDA5MzUwMjgxMzM3MDQyMjk0MTMxODEzMjI4Mzc5NjY5NzgwNTM5NTQwMzgxNjkyIiwiMTI3NzA1NjIzMTA4OTE1MTEyNDEzOTU3ODQ2NjM0MTE1MDA0OTI4MjMwMDA1NjkzNjEwMjI0MzI1MTY5NjA0NzAzMTgxNzc4MDU0NTEiLCIxMDcwNDAyMTI0MzMwNzkwNzEyMTAxNzY0OTMyMjgwNzkyODgyNzMzNzkwODI1NjQ1NTc5NDAwOTA2OTgwMTc3NTA2OTQ4NzU0MzQyMyIsIjIxNjY5MzkzNjExNTY1MTY2MDU4MDkwMDQzMzYzMDk1MjE4ODY2NTMzOTU3MDY3NDk3NDI3NzU3NzU2NTc1MzExNzU0NzM3NjA1ODQ5IiwiNjE0NDg1NzE0MDQyODMwMTM5ODMxODk1MjI2OTIyODI4NzE2MDg5OTQ3OTAzNDE5MTQwMDA2MjM0MDQ3MDIwOTM1NTgyNDcxOTgzMiIsIjE1MTUxNDE2MDg2NTYxMzU3Njc4MjYzMjg2MDI4NzA2NjA1MTkyNjIyMjM4Mzk5NjkwNzY4MTc4MjE0MjQ3MTE0OTk0NzU5ODY3ODI0IiwiMTExMjE2Mzc3NTAyNTA5OTk1MjEwODUwMTAyNjMzMTIwNDMwOTgzOTE0OTM5NzU0Nzg4OTI0MTQ0NDMzNTk1NjA4NzU2MDA4NzM2MjYiXQ
8. User publish a post with an epoch key and proof
When a user wants to publish a post, he has to generate his reputation proof to prove that he has enough reputation to make a post. The proof also validate the epoch key.
npx ts-node cli/index.ts publishPost \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853\
-tx postText \
-d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
-id Unirep.identity.WyJlOGQ2NGU5OThhM2VmNjAxZThjZTNkNDQwOWQyZjc3MjEwOGJkMGI1NTgwODAzYjY2MDk0YTllZWExMzYxZjA2IiwiODZiYjk5ZGQ4MzA2ZGVkZDgxYTE4MzBiNmVjYmRlZjk5ZmVjYTU3M2RiNjIxMjk5NGMyMmJlMWEwMWZmMTEiLCIzMGE3M2MxMjE4ODQwNjE0MWQwYmI4NWRjZDY5ZjdhMjEzMWM1NWRkNDQzYWNmMGVhZTEwNjI2NzBjNDhmYSJd \
-n 0
9. Verify reputation proof of certain transaction
Users can use the reputation proof with the transaction hash to obtain snark circuit and its public inputs. Then user can call the on-chain verifier to verify the proof.
npx ts-node cli/index.ts verifyReputationProof \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-epk 69 \
-pf Unirep.reputationProof.WyI3NzIzMzE4MTUzOTYzMzg2NDA2MzA3MTExMTk1ODY0NzA3Mzc3MzExODY4MzQ1MDExMjA1MTg2MDU3NTQ5NTc0NDcyMjI5OTAxMjQ5IiwiMjEzNzE1MzA2NTU3Nzg5NDMxNjE5NzAwMTU3ODM1MDQyMjU0Njk1ODQ0MTg0NTk5Njk2NTMwMjQ3NDEzODEyMTY1MDY5MjU3MTM5ODEiLCI2NjgwNDc3MzQ3ODQwMTE4OTU5NzQ0MDQ0Mzg3OTQ0MDA2MTA5NDY5NTgyMDc0NjYwMTcyNjcwODkzNjU4MDA3ODgyMzMzNTE4MjQxIiwiMTA0NTA0MTM3MDExMjQ2NTUyMzg0NjkyMzkyNzk3MjE3NjUxMTc3Njk2ODMzODAxNzE0NjY5Nzk5MTEyNDA3NDk5NjAzNjk0MjQwOTEiLCIyMDYxMTY2NTkzOTA4NDEzNTc2NzIxODk0MzczODkzNTEzMjg2NzcwMDQ1MjExNDkxODQwODE3MjAxNjk2NDU0ODk4MzAxNzI2NzAyMCIsIjQwMzkwNDg1Mjc2NjcxNTg1NjYxMDM5OTY0NTExMjYyNjI0NDUwOTU0MzM4MjYwNTUyNjQ2NTgwNTQ0NjgxNDQzNjI3NjE4MTkxNjkiLCIxOTc1MDE3NjEzODg3ODIzODk1MzA0MDI2ODkyMDgwMTg4MDQ0MTk3NDM2MTY0MjA2NTIzNDc0ODg5NjA0MzE4NTU4Nzk4ODk5NDgzMiIsIjIwNzI5NDY3MDMxMDYyMjAzNzIwNDg5MjM3OTczMTc0MDAyNTkwNDQxOTc1MTQzOTg4NTEyODUxMDE1MDE5MDQ3NzI2MTI2OTI3MjQiXQ \
-th 0xc4d5e343bbf1f90e75e1a61099358df1506ad6588b84f0546d99b7ea4bef7477
10. Attester upvotes to epoch key
To upvote an epoch key, we need another user with different identity. So we generate an identity and sign up the second user in the same way.
npx ts-node cli/index.ts genUnirepIdentity
npx ts-node cli/index.ts userSignup \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853\
-c Unirep.identityCommitment.YTk0NjJjMWE5ZWY3NjM3MWVkOTFjNDA0YTYxYWJlMjVjMjJiMjVmMTM1MzU3NjFjNjE5OGE2YTA4MGUxMDBm \
-d 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
Upvote or downvote will cost attester's reputation. Therefore, attester also generates his own epoch key to receive negative reputation.
npx ts-node cli/index.ts vote \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-d 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d \
-epk 69 \
-uv 3 \
-id Unirep.identity.WyIxNzk1MTYyYWM2ZDVkZGQ4NWEyMzA0MDdkMjNiOTk3NDU0YmYwNzY2Zjg5ZThkNTQxNWE3ZTIyNTIyN2IxODRiIiwiZDgyNjA0ODY5Njk4NTU3MGMwYzNmNDlhM2RiZDg4MWJjOWJhYjc4Yzg2ZmM0N2UyOTMwNWVjMDEyMDNkZSIsImRkNmZiNDRkMTY3YjFmOTZiYzViZDUyYjdjNGRjOTNiYjhmNDA0Y2Q5YzBjMjA5ODU0ZWMyZWJlOGE0OTMyIl0 \
-n 0 \
-gf 176ff05d9c7c4528b04553217098a71cd076d52623dab894a7f7ee34116ca170
The proof can also be verified with verifyReputationProof
function
11. Epoch transition
npx ts-node cli/index.ts epochTransition \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853\
-d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
-t
12. User state transition
npx ts-node cli/index.ts userStateTransition \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
-id Unirep.identity.WyJlOGQ2NGU5OThhM2VmNjAxZThjZTNkNDQwOWQyZjc3MjEwOGJkMGI1NTgwODAzYjY2MDk0YTllZWExMzYxZjA2IiwiODZiYjk5ZGQ4MzA2ZGVkZDgxYTE4MzBiNmVjYmRlZjk5ZmVjYTU3M2RiNjIxMjk5NGMyMmJlMWEwMWZmMTEiLCIzMGE3M2MxMjE4ODQwNjE0MWQwYmI4NWRjZDY5ZjdhMjEzMWM1NWRkNDQzYWNmMGVhZTEwNjI2NzBjNDhmYSJd
13. User generate reputation proof from certain attester
After user state transition, the user can generate a proof to prove that he has reputation from certain attester.
npx ts-node cli/index.ts genReputationProofFromAttester \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-id Unirep.identity.WyJlOGQ2NGU5OThhM2VmNjAxZThjZTNkNDQwOWQyZjc3MjEwOGJkMGI1NTgwODAzYjY2MDk0YTllZWExMzYxZjA2IiwiODZiYjk5ZGQ4MzA2ZGVkZDgxYTE4MzBiNmVjYmRlZjk5ZmVjYTU3M2RiNjIxMjk5NGMyMmJlMWEwMWZmMTEiLCIzMGE3M2MxMjE4ODQwNjE0MWQwYmI4NWRjZDY5ZjdhMjEzMWM1NWRkNDQzYWNmMGVhZTEwNjI2NzBjNDhmYSJd \
-a 2 \
-mp 2 \
-mn 1 \
-gp 0
14. Verify the reputation proof
Every user with the reputation proof can verify the proof and its claim.
npx ts-node cli/index.ts verifyReputationProofFromAttester \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853\
-a 2 \
-mp 2 \
-mn 1 \
-gp 0 \
-pf Unirep.reputationProofFromAttester.WyIxNTIzOTA2NTM1NjEyMDU2MTMzNzI0NzkyNDA2ODMyMzE1MTc4NTI0NTcwMjA0MjAwMjQzNTM1MTAxNjc4NzY4OTkyMzMzNDE3Njk2MSIsIjE5Nzc0MTk5NTEyMDExMzkwNTM4MDU2OTMxMTA4ODkwMTg5Nzc3MTMwOTA1ODA4MzI5NzkyMDU3MDEwMTI0MDIxNTMwMDgwMzUxMTY1IiwiMzgzMTU4MzY0NDY5MzMxNzcxODc3NzE4MjE5OTExMTYwMjI3MDI0MTcwODY0Mjg3Mzc0NTczMDA4MzU0OTE2ODA2OTkxMzU5MDc0MSIsIjE1NDkwNzIyODk0NTk0NTE2OTI4ODgwNjA5MDE3MTgzMDg4MDk0MjM4MTgxNDE1ODM1ODU1MDg0NDgwNTAyNjI1NjI1MDY4NjY0Mjk0IiwiMTExMjQ3ODA3MTI3MjQyNTgwMjkyMjM4OTc0OTg2NDQxOTE1NDQyNzIyOTg0MTE1MDk4OTUyMTYxNDk0Njg2NjQwNDk1ODk0Mjg4NjYiLCI3NzU3NzUwMzIzMjI2NDM2MDMwMDM3MTAyMDY5MzQxODMyNDcxNTEyOTQ5NjgwODQzMzE4OTk2NDc5ODI4NTAzOTE2MDU0NDA3NDIyIiwiMTk4OTUyODA4NzUwNjM2Mjg3MjEwNjY0NTgxMTIxNzM2MTg5NDEyNjMxNjA5NjU1OTQzNDkxMzkzMjEwMzkyMjc1MjY1NDg0NzUwOTQiLCIxNjg4NTA1MjIzNjU4NjI1MDM2ODM4MTc3ODAyMjM0OTk2MTE0ODgzMzg2Mzg2OTE1MTA0MzgwODI2MzY1NzYyMzE1ODI1NTA3MDc1Il0
User can optionally choose to prove among -mp
, -mn
, -md
or -gp
But the inputs of verification should be identical with the claim of which user uses to generate the proof.
Last updated
Was this helpful?