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.gitInstall packages
Install packages used in Unirep Social
yarn installBuild 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 buildTest
Test all cli commands
yarn test-cliIntegration test
yarn testExample cli commands workflow
1. Run a testing net
We use hardhat here as a blockchain developing environment.
npx hardhat node2. Deploy Unirep smart contract and its verifiers
If we choose the first account, we use 0xac097...ff80 as our deployerPrivateKeyparameter
Open another terminal and run:
npx ts-node cli/index.ts deploy -d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80Then 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 genUnirepIdentity4. 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 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff805. Attester signs up
npx ts-node cli/index.ts attesterSignup \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-d 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690dNOTE: 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, attesterSignupbind 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 07. Attester verify epoch key proof
npx ts-node cli/index.ts verifyEpochKeyProof \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-epk 69 \
-pf Unirep.epkProof.WyIxNjA4MjU3MzE4NTE4MzU0NjcyNTQ5Mjc1Njg1NDMwMDkwMTEwMjUxNDU0NTAwODQ2NjQ1MTk5Mjg5MzY3NjgwNTI4ODc1MDQ2MjY5NiIsIjE0MzE1OTI5OTQzMDI4NTY5MjA4OTQ3NTYyMTI0MDA5MzUwMjgxMzM3MDQyMjk0MTMxODEzMjI4Mzc5NjY5NzgwNTM5NTQwMzgxNjkyIiwiMTI3NzA1NjIzMTA4OTE1MTEyNDEzOTU3ODQ2NjM0MTE1MDA0OTI4MjMwMDA1NjkzNjEwMjI0MzI1MTY5NjA0NzAzMTgxNzc4MDU0NTEiLCIxMDcwNDAyMTI0MzMwNzkwNzEyMTAxNzY0OTMyMjgwNzkyODgyNzMzNzkwODI1NjQ1NTc5NDAwOTA2OTgwMTc3NTA2OTQ4NzU0MzQyMyIsIjIxNjY5MzkzNjExNTY1MTY2MDU4MDkwMDQzMzYzMDk1MjE4ODY2NTMzOTU3MDY3NDk3NDI3NzU3NzU2NTc1MzExNzU0NzM3NjA1ODQ5IiwiNjE0NDg1NzE0MDQyODMwMTM5ODMxODk1MjI2OTIyODI4NzE2MDg5OTQ3OTAzNDE5MTQwMDA2MjM0MDQ3MDIwOTM1NTgyNDcxOTgzMiIsIjE1MTUxNDE2MDg2NTYxMzU3Njc4MjYzMjg2MDI4NzA2NjA1MTkyNjIyMjM4Mzk5NjkwNzY4MTc4MjE0MjQ3MTE0OTk0NzU5ODY3ODI0IiwiMTExMjE2Mzc3NTAyNTA5OTk1MjEwODUwMTAyNjMzMTIwNDMwOTgzOTE0OTM5NzU0Nzg4OTI0MTQ0NDMzNTk1NjA4NzU2MDA4NzM2MjYiXQ8. 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 0xc4d5e343bbf1f90e75e1a61099358df1506ad6588b84f0546d99b7ea4bef747710. 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 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690dUpvote 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 176ff05d9c7c4528b04553217098a71cd076d52623dab894a7f7ee34116ca170The proof can also be verified with verifyReputationProoffunction
11. Epoch transition
npx ts-node cli/index.ts epochTransition \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853\
-d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
-t12. User state transition
npx ts-node cli/index.ts userStateTransition \
-x 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 \
-d 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
-id Unirep.identity.WyJlOGQ2NGU5OThhM2VmNjAxZThjZTNkNDQwOWQyZjc3MjEwOGJkMGI1NTgwODAzYjY2MDk0YTllZWExMzYxZjA2IiwiODZiYjk5ZGQ4MzA2ZGVkZDgxYTE4MzBiNmVjYmRlZjk5ZmVjYTU3M2RiNjIxMjk5NGMyMmJlMWEwMWZmMTEiLCIzMGE3M2MxMjE4ODQwNjE0MWQwYmI4NWRjZDY5ZjdhMjEzMWM1NWRkNDQzYWNmMGVhZTEwNjI2NzBjNDhmYSJd13. 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 014. 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.WyIxNTIzOTA2NTM1NjEyMDU2MTMzNzI0NzkyNDA2ODMyMzE1MTc4NTI0NTcwMjA0MjAwMjQzNTM1MTAxNjc4NzY4OTkyMzMzNDE3Njk2MSIsIjE5Nzc0MTk5NTEyMDExMzkwNTM4MDU2OTMxMTA4ODkwMTg5Nzc3MTMwOTA1ODA4MzI5NzkyMDU3MDEwMTI0MDIxNTMwMDgwMzUxMTY1IiwiMzgzMTU4MzY0NDY5MzMxNzcxODc3NzE4MjE5OTExMTYwMjI3MDI0MTcwODY0Mjg3Mzc0NTczMDA4MzU0OTE2ODA2OTkxMzU5MDc0MSIsIjE1NDkwNzIyODk0NTk0NTE2OTI4ODgwNjA5MDE3MTgzMDg4MDk0MjM4MTgxNDE1ODM1ODU1MDg0NDgwNTAyNjI1NjI1MDY4NjY0Mjk0IiwiMTExMjQ3ODA3MTI3MjQyNTgwMjkyMjM4OTc0OTg2NDQxOTE1NDQyNzIyOTg0MTE1MDk4OTUyMTYxNDk0Njg2NjQwNDk1ODk0Mjg4NjYiLCI3NzU3NzUwMzIzMjI2NDM2MDMwMDM3MTAyMDY5MzQxODMyNDcxNTEyOTQ5NjgwODQzMzE4OTk2NDc5ODI4NTAzOTE2MDU0NDA3NDIyIiwiMTk4OTUyODA4NzUwNjM2Mjg3MjEwNjY0NTgxMTIxNzM2MTg5NDEyNjMxNjA5NjU1OTQzNDkxMzkzMjEwMzkyMjc1MjY1NDg0NzUwOTQiLCIxNjg4NTA1MjIzNjU4NjI1MDM2ODM4MTc3ODAyMjM0OTk2MTE0ODgzMzg2Mzg2OTE1MTA0MzgwODI2MzY1NzYyMzE1ODI1NTA3MDc1Il0User 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?