{"_id":"@chung0807/ziden-noir","_rev":"5-e7def782b39daa7f59aff54f56db15fa","name":"@chung0807/ziden-noir","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"@chung0807/ziden-noir","version":"0.0.1","type":"module","main":"build/index.js","dependencies":{"@aztec/bb.js":"^0.3.6","@noir-lang/acvm_js":"git+https://git@github.com/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42","@openzeppelin/contracts":"^4.9.3","@openzeppelin/contracts-upgradeable":"^4.9.3","@typechain/ethers-v5":"^10.1.0","@types/eccrypto":"^1.1.3","bigint-buffer":"^1.1.5","blake2":"^5.0.0","circomlibjs":"^0.1.7","dotenv":"^16.0.3","fflate":"^0.8.0","hardhat-gas-reporter":"^1.0.8","keccak256":"^1.0.6","save-dev":"^0.0.1-security","solidity-bytes-utils":"^0.8.0","solidity-coverage":"^0.8.1","ts-mocha":"^10.0.0","typechain":"^8.1.0"},"devDependencies":{"@types/chai":"^4.3.5","@types/mocha":"^10.0.1","@types/node":"^18.16.14","chai":"^4.3.7","ethers":"^5.7.2","mocha":"^10.2.0","npmignore":"^0.3.0","typescript":"^4.9.3"},"scripts":{"test":"ts-mocha -p tsconfig.json --timeout 1000000 --warnings=false","test-claim":"npm test src/claim.test.ts","test-indexed-merkle-tree":"npm test src/indexed-merkle-tree.test.ts","test-state":"npm test src/state-transition.test.ts","test-claim-query":"npm test src/claim-query.test.ts","build":"tsc --project tsconfig.build.json","prepare":"npm run build","prepack":"npmignore --auto .npmignore"},"publishConfig":{"access":"public","ignore":["src","docs",".eslintrc.cjs",".husky",".mocharc.cjs",".prettierrc",".vscode/settings.json","tsconfig.build.json","tsconfig.json"]},"types":"./build/index.d.ts","gitHead":"064a638e1fb506e38fd8cc723c2de892984122a1","description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","_id":"@chung0807/ziden-noir@0.0.1","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-gbXkZ8ahbI0mRhCfYbALvh+B4ZUXdznGhpjxkeSJZcrrt4t6QdhXwWCMzekEbNT4kWN/487lk3myk1HPFGoZIA==","shasum":"fd42ea7d18d9f09ad5d15cf46a99225e2fed2dfe","tarball":"https://registry.npmjs.org/@chung0807/ziden-noir/-/ziden-noir-0.0.1.tgz","fileCount":169,"unpackedSize":10772827,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDiFqPXA0FjrZoqpzWCy6rBZl1+xtJWiyn2FkLw36d1uAiEAq1ixXZElpPuIEMbAzSPNaSf/T8YoneXQlydfoWfCGmI="}]},"_npmUser":{"name":"chung0807","email":"phamquangchung550@gmail.com"},"directories":{},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ziden-noir_0.0.1_1694430369084_0.9262849572805196"},"_hasShrinkwrap":false},"0.0.2":{"name":"@chung0807/ziden-noir","version":"0.0.2","type":"module","main":"build/index.js","dependencies":{"@aztec/bb.js":"^0.3.6","@noir-lang/acvm_js":"git+https://git@github.com/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42","@openzeppelin/contracts":"^4.9.3","@openzeppelin/contracts-upgradeable":"^4.9.3","@typechain/ethers-v5":"^10.1.0","@types/eccrypto":"^1.1.3","bigint-buffer":"^1.1.5","blake2":"^5.0.0","circomlibjs":"^0.1.7","dotenv":"^16.0.3","fflate":"^0.8.0","hardhat-gas-reporter":"^1.0.8","keccak256":"^1.0.6","save-dev":"^0.0.1-security","solidity-bytes-utils":"^0.8.0","solidity-coverage":"^0.8.1","ts-mocha":"^10.0.0","typechain":"^8.1.0"},"devDependencies":{"@types/chai":"^4.3.5","@types/mocha":"^10.0.1","@types/node":"^18.16.14","chai":"^4.3.7","ethers":"^5.7.2","mocha":"^10.2.0","npmignore":"^0.3.0","typescript":"^4.9.3"},"scripts":{"test":"ts-mocha -p tsconfig.json --timeout 1000000 --warnings=false","test-claim":"npm test src/claim.test.ts","test-indexed-merkle-tree":"npm test src/indexed-merkle-tree.test.ts","test-state":"npm test src/state-transition.test.ts","test-claim-query":"npm test src/claim-query.test.ts","build":"tsc --project tsconfig.build.json","prepare":"npm run build","prepack":"npmignore --auto .npmignore"},"publishConfig":{"access":"public","ignore":["src","docs",".eslintrc.cjs",".husky",".mocharc.cjs",".prettierrc",".vscode/settings.json","tsconfig.build.json","tsconfig.json"]},"types":"./build/index.d.ts","gitHead":"064a638e1fb506e38fd8cc723c2de892984122a1","description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","_id":"@chung0807/ziden-noir@0.0.2","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-4CXhXibQcSQtlmALPUA2yE1uZNyYBWAbdJMaIT3LmrKVwBEM9gGjoZzdH35dnswkTc7BEa/KS7dSsIPkK+LW7A==","shasum":"66d2dad6ef76a74be0b3296c66ffa3b159c54047","tarball":"https://registry.npmjs.org/@chung0807/ziden-noir/-/ziden-noir-0.0.2.tgz","fileCount":169,"unpackedSize":10772935,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCf/4i3GdcyXwaJqCvDTBWsm4Mj6H6KoswDnVePYbT2fgIgGknaG4lw1pDBHe89NieQP5jwRqW4wyP2j6T5W6vSkUQ="}]},"_npmUser":{"name":"chung0807","email":"phamquangchung550@gmail.com"},"directories":{},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ziden-noir_0.0.2_1694580221680_0.28986455471748074"},"_hasShrinkwrap":false},"0.0.3":{"name":"@chung0807/ziden-noir","version":"0.0.3","type":"module","dependencies":{"@aztec/bb.js":"^0.3.6","@noir-lang/acvm_js":"git+https://git@github.com/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42","@openzeppelin/contracts":"^4.9.3","@openzeppelin/contracts-upgradeable":"^4.9.3","@typechain/ethers-v5":"^10.1.0","@types/eccrypto":"^1.1.3","bigint-buffer":"^1.1.5","blake2":"^5.0.0","circomlibjs":"^0.1.7","dotenv":"^16.0.3","fflate":"^0.8.0","hardhat-gas-reporter":"^1.0.8","keccak256":"^1.0.6","save-dev":"^0.0.1-security","solidity-bytes-utils":"^0.8.0","solidity-coverage":"^0.8.1","ts-mocha":"^10.0.0","typechain":"^8.1.0"},"devDependencies":{"@types/chai":"^4.3.5","@types/mocha":"^10.0.1","@types/node":"^18.16.14","chai":"^4.3.7","ethers":"^5.7.2","mocha":"^10.2.0","npmignore":"^0.3.0","typescript":"^4.9.3"},"scripts":{"test":"ts-mocha -p tsconfig.json --timeout 1000000 --warnings=false","test-claim":"npm test src/claim.test.ts","test-indexed-merkle-tree":"npm test src/indexed-merkle-tree.test.ts","test-state":"npm test src/state-transition.test.ts","test-claim-query":"npm test src/claim-query.test.ts","build":"tsc --project tsconfig.build.json","prepare":"npm run build","prepack":"npmignore --auto .npmignore"},"publishConfig":{"access":"public","ignore":["src","crs","specs",".eslintrc.cjs",".husky",".mocharc.cjs",".prettierrc",".vscode/settings.json","tsconfig.build.json","tsconfig.json","compile.sh"]},"gitHead":"17e8c25340a227963a16073771b74a72f83e36a9","description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","_id":"@chung0807/ziden-noir@0.0.3","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-mrxR9hs9GDh167CuBYaFm0KvbJqP6cVhCA96H+QpfE4wjiNqcSQWgTgoOYsAIGSGYe4W5iVqxrYdXcH+MRRXLA==","shasum":"17dec8688c8df17f612c55584913315cdadecc3b","tarball":"https://registry.npmjs.org/@chung0807/ziden-noir/-/ziden-noir-0.0.3.tgz","fileCount":5,"unpackedSize":51645,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBJ1FyKPDuxnFmwyIObZkIp7TtGpwcOj2ROlGWloAfyQAiEAhvWOTX8wDrsRDol/kRpO0mZuhGB2QWCGGhNJvcmofnM="}]},"_npmUser":{"name":"chung0807","email":"phamquangchung550@gmail.com"},"directories":{},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ziden-noir_0.0.3_1695264007696_0.595883901056862"},"_hasShrinkwrap":false},"0.0.4":{"name":"@chung0807/ziden-noir","version":"0.0.4","type":"module","main":"build/index.js","types":"build/index.d.ts","dependencies":{"@aztec/bb.js":"^0.3.6","@noir-lang/acvm_js":"git+https://git@github.com/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42","@openzeppelin/contracts":"^4.9.3","@openzeppelin/contracts-upgradeable":"^4.9.3","@typechain/ethers-v5":"^10.1.0","@types/eccrypto":"^1.1.3","bigint-buffer":"^1.1.5","blake2":"^5.0.0","circomlibjs":"^0.1.7","dotenv":"^16.0.3","fflate":"^0.8.0","hardhat-gas-reporter":"^1.0.8","keccak256":"^1.0.6","save-dev":"^0.0.1-security","solidity-bytes-utils":"^0.8.0","solidity-coverage":"^0.8.1","ts-mocha":"^10.0.0","typechain":"^8.1.0"},"devDependencies":{"@types/chai":"^4.3.5","@types/mocha":"^10.0.1","@types/node":"^18.16.14","chai":"^4.3.7","ethers":"^5.7.2","mocha":"^10.2.0","npmignore":"^0.3.0","typescript":"^4.9.3"},"scripts":{"test":"ts-mocha -p tsconfig.json --timeout 1000000 --warnings=false","test-claim":"npm test src/claim.test.ts","test-indexed-merkle-tree":"npm test src/indexed-merkle-tree.test.ts","test-state":"npm test src/state-transition.test.ts","test-claim-query":"npm test src/claim-query.test.ts","build":"tsc --project tsconfig.build.json","prepare":"npm run build","prepack":"npmignore --auto .npmignore"},"publishConfig":{"access":"public","ignore":["src","crs","specs",".eslintrc.cjs",".husky",".mocharc.cjs",".prettierrc",".vscode/settings.json","tsconfig.build.json","tsconfig.json","compile.sh"]},"gitHead":"17e8c25340a227963a16073771b74a72f83e36a9","description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","_id":"@chung0807/ziden-noir@0.0.4","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-94Zi58bGTrl7IXxbucQyiCIN4TVvyhMUnO1NLB2kzq8wZ9bMEJEiBGg+kGRKZp/8govXpgncBc101mSpaQdL8A==","shasum":"8642cb0aa9f63ce4c3d0f0c364657c7095cd2087","tarball":"https://registry.npmjs.org/@chung0807/ziden-noir/-/ziden-noir-0.0.4.tgz","fileCount":164,"unpackedSize":10670367,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcOLvdTF0GycxYGtpsxYvsE28TigB8dF4nmXbt++F9ZwIhAILO/FJkJweiJLwJJoTHnSDgfxdquUYIweIKovv+QvPU"}]},"_npmUser":{"name":"chung0807","email":"phamquangchung550@gmail.com"},"directories":{},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ziden-noir_0.0.4_1695264343222_0.012031877313529726"},"_hasShrinkwrap":false},"0.0.5":{"name":"@chung0807/ziden-noir","version":"0.0.5","type":"module","main":"build/index.js","types":"build/index.d.ts","dependencies":{"@aztec/bb.js":"^0.3.6","@noir-lang/acvm_js":"git+https://git@github.com/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42","@openzeppelin/contracts":"^4.9.3","@openzeppelin/contracts-upgradeable":"^4.9.3","@typechain/ethers-v5":"^10.1.0","@types/eccrypto":"^1.1.3","bigint-buffer":"^1.1.5","blake2":"^5.0.0","circomlibjs":"^0.1.7","dotenv":"^16.0.3","fflate":"^0.8.0","hardhat-gas-reporter":"^1.0.8","keccak256":"^1.0.6","save-dev":"^0.0.1-security","solidity-bytes-utils":"^0.8.0","solidity-coverage":"^0.8.1","ts-mocha":"^10.0.0","ts-node":"^10.9.1","typechain":"^8.1.0"},"devDependencies":{"@types/chai":"^4.3.5","@types/mocha":"^10.0.1","@types/node":"^18.16.14","chai":"^4.3.7","ethers":"^5.7.2","mocha":"^10.2.0","npmignore":"^0.3.0","typescript":"^4.9.3"},"scripts":{"test":"ts-mocha -p tsconfig.json --timeout 1000000 --warnings=false","test-claim":"npm test src/claim.test.ts","test-indexed-merkle-tree":"npm test src/indexed-merkle-tree.test.ts","test-state":"npm test src/state-transition.test.ts","test-claim-query":"npm test src/claim-query.test.ts","build":"tsc --project tsconfig.build.json","prepare":"npm run build","prepack":"npmignore --auto .npmignore"},"publishConfig":{"access":"public","ignore":["src","crs","specs",".eslintrc.cjs",".husky",".mocharc.cjs",".prettierrc",".vscode/settings.json","tsconfig.build.json","tsconfig.json","compile.sh"]},"gitHead":"06f21bd24fb4ba7c2e270acd991ae7469484a037","description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","_id":"@chung0807/ziden-noir@0.0.5","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-BPTxNCQ+R8qtHu/ADvNh5WcfoXVhv5oDHY/mbRPG1N9K8he3FZEVc2znuDOCC/H2BWARdqpHm/6LYUHMY4BV1g==","shasum":"5edbe1fdcb77251080a63fb89c636592ee8abaa9","tarball":"https://registry.npmjs.org/@chung0807/ziden-noir/-/ziden-noir-0.0.5.tgz","fileCount":164,"unpackedSize":10670731,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEF1+4A/42JAc3FR7AHRmZvyIcRzHpIM/97RqauotomiAiAVzJPsOwRVFn86uyfaMMCMziIK/TTkk6AmyXyomMv5AQ=="}]},"_npmUser":{"name":"chung0807","email":"phamquangchung550@gmail.com"},"directories":{},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ziden-noir_0.0.5_1695268955119_0.648999334410125"},"_hasShrinkwrap":false},"0.0.6":{"name":"@chung0807/ziden-noir","version":"0.0.6","type":"module","main":"build/index.js","types":"build/index.d.ts","dependencies":{"@aztec/bb.js":"^0.3.6","@noir-lang/acvm_js":"git+https://git@github.com/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42","@openzeppelin/contracts":"^4.9.3","@openzeppelin/contracts-upgradeable":"^4.9.3","@typechain/ethers-v5":"^10.1.0","@types/eccrypto":"^1.1.3","bigint-buffer":"^1.1.5","blake2":"^5.0.0","circomlibjs":"^0.1.7","dotenv":"^16.0.3","fflate":"^0.8.0","hardhat-gas-reporter":"^1.0.8","keccak256":"^1.0.6","save-dev":"^0.0.1-security","solidity-bytes-utils":"^0.8.0","solidity-coverage":"^0.8.1","ts-mocha":"^10.0.0","ts-node":"^10.9.1","typechain":"^8.1.0"},"devDependencies":{"@types/chai":"^4.3.5","@types/mocha":"^10.0.1","@types/node":"^18.16.14","chai":"^4.3.7","ethers":"^5.7.2","mocha":"^10.2.0","npmignore":"^0.3.0","typescript":"^4.9.3"},"scripts":{"test":"ts-mocha -p tsconfig.json --timeout 1000000 --warnings=false","test-claim":"npm test src/claim.test.ts","test-indexed-merkle-tree":"npm test src/indexed-merkle-tree.test.ts","test-state":"npm test src/state-transition.test.ts","test-claim-query":"npm test src/claim-query.test.ts","build":"tsc --project tsconfig.build.json","prepare":"npm run build","prepack":"npmignore --auto .npmignore"},"publishConfig":{"access":"public","ignore":["src","crs","specs",".eslintrc.cjs",".husky",".mocharc.cjs",".prettierrc",".vscode/settings.json","tsconfig.build.json","tsconfig.json","compile.sh"]},"gitHead":"2b20ef63277c437201d21f7307dbf96436645e74","description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","_id":"@chung0807/ziden-noir@0.0.6","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-wrkxrmOvoOr+IwtB38B3gugjplR7cAhl31DUr+xSJzu3LTQRkbcLXE3Ra06ojaw51iUiZiVlKuv2umiDG0Z1NA==","shasum":"6e1959b3b3df1962eb4e9a5d2ebcc3484747c678","tarball":"https://registry.npmjs.org/@chung0807/ziden-noir/-/ziden-noir-0.0.6.tgz","fileCount":164,"unpackedSize":10670732,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEVRpPTwBxuJr/MtXd1V7DJH+bgJR53cVdQJmVUQ4Q1rAiAejmY90IB/MbbFtN2tati0Dz033vUB2ECB2fruoSQ6rw=="}]},"_npmUser":{"name":"chung0807","email":"phamquangchung550@gmail.com"},"directories":{},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ziden-noir_0.0.6_1695504595977_0.8965404616995898"},"_hasShrinkwrap":false}},"time":{"created":"2023-09-11T11:06:08.976Z","0.0.1":"2023-09-11T11:06:09.407Z","modified":"2023-09-23T21:29:56.580Z","0.0.2":"2023-09-13T04:43:41.994Z","0.0.3":"2023-09-21T02:40:07.930Z","0.0.4":"2023-09-21T02:45:43.696Z","0.0.5":"2023-09-21T04:02:35.422Z","0.0.6":"2023-09-23T21:29:56.398Z"},"maintainers":[{"name":"chung0807","email":"phamquangchung550@gmail.com"}],"description":"This is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir","readme":"# Noir-Ziden\r\n\r\nThis is the proof-of-concept project of the Privacy-Preserving W3C verifiable credentials protocol with circuits written in Noir\r\n\r\nIn this first version contains completent Noir circuits, test scripts as well as the TS scripts that serve the protocol's logic as specified in the [Protocol-specs](https://github.com/ziden-dev/Noir-Ziden/tree/main/specs)\r\n\r\n## Components\r\n\r\n### 1. Merkle Tree & Indexed Merkle Tree\r\n\r\nThey are core data structure of the protocol, enabling succinct membership and non-membership verification, currently supporting:\r\n\r\n- Membership check\r\n- Non-membership check\r\n- Single insertion\r\n\r\n[See circuit](https://github.com/ziden-dev/Noir-Ziden/blob/main/src/circuits/noirlib/src/indexed_merkle_tree.nr)\r\n\r\nUpcoming features:\r\n\r\n- Variable arity\r\n- Batch insertion\r\n\r\n### 2. Digital Signature\r\n\r\nDigital signatures are used in the protocol as a principal authorization mechanism, this version supports 2 algorithms:\r\n\r\n- EdDSA\r\n- ECDSA\r\n\r\n### 3. Protocol circuits\r\n\r\n- [Claim](https://github.com/ziden-dev/Noir-Ziden/blob/main/src/circuits/noirlib/src/claim.nr)\r\n\r\n- [Identity State](https://github.com/ziden-dev/Noir-Ziden/blob/main/src/circuits/noirlib/src/state_transition.nr)\r\n\r\n- [Claim Presentation](https://github.com/ziden-dev/Noir-Ziden/blob/main/src/circuits/noirlib/src/claim_presentation.nr)\r\n\r\n## Run our code\r\n\r\n### Prerequisite\r\n\r\n- Node version >= 16\r\n- Nargo installed: [See installation guide](https://noir-lang.org/getting_started/nargo_installation)\r\n\r\n### Installation\r\n\r\n- Install dependencies:\r\n\r\n```\r\nnpm i\r\n```\r\n\r\n- Compile Noir circuits:\r\n\r\n```\r\n./compile.sh\r\n```\r\n\r\n### Test\r\n\r\n- Test claim features\r\n\r\n```\r\nnpm run test-claim\r\n```\r\n\r\n- Test indexed merkle tree features\r\n\r\n```\r\nnpm run test-indexed-merkle-tree\r\n```\r\n\r\n- Test state features\r\n\r\n```\r\nnpm run test-state\r\n```\r\n\r\n- Test claim presentation process\r\n\r\n```\r\nnpm run test-claim-query\r\n```\r\n\r\n## Use this as a library\r\n\r\n- Install as an npm dependency:\r\n\r\n```\r\nnpm i @zidendev/noir-ziden@latest\r\n```\r\n\r\n### Indexed Merkle Tree\r\n\r\n- Construct a new Indexed Merkle Tree\r\n\r\n```typescript\r\nimport {\r\n  CryptographyPrimitives,\r\n  IndexedMerkleTree,\r\n  bitUtils,\r\n  generateProofAndVerify,\r\n  CircuitName,\r\n} from \"@zidendev/noir-ziden\";\r\n\r\nconst crypto = await CryptographyPrimitives.getInstance();\r\nconst poseidon = crypto.poseidon;\r\n\r\n// tree with depth being 3 and use Poseidon as hasher\r\nconst tree = new IndexedMerkleTree(3, poseidon);\r\n```\r\n\r\n- Test, generate and verify ZK proof\r\n\r\n```typescript\r\ntree.insert(3n);\r\nvar inputs = bitUtils.object2Array(tree.insert(1n));\r\n\r\nconst witness = new Map<number, string>();\r\n\r\ninputs.forEach((input, index) => {\r\n  witness.set(index + 1, convertToHexAndPad(input));\r\n});\r\n\r\nconst verified = await generateProofAndVerify(\r\n  witness,\r\n  CircuitName.INDEXED_MERKLE_TREE\r\n);\r\n\r\nassert(verified == true);\r\n```\r\n\r\n### Claim\r\n\r\nTechnically, a claim is an array of 8 32-byte numbers called slots, which can be constructed customizably with the following information:\r\n\r\n- Schema hash\r\n- The sequel number (in case there are multiple claims included in a single schema)\r\n- The expired time\r\n- The claim subject\r\n- Credential data (can be stored from slot 2 to 7)\r\n\r\nExample:\r\n\r\n```typescript\r\nimport { ClaimBuilder } from \"@zidendev/noir-ziden\";\r\n\r\nconst schemaHash = BigInt(\"43914\"); // should be the hash of the schema document\r\nconst expirationTime = BigInt(Date.now() + 60 * 60 * 1000);\r\nconst sequel = BigInt(1);\r\nconst subject = BigInt(\"439798\"); // should be the Id of its holder\r\n\r\nconst claim = new ClaimBuilder()\r\n  .withSchemaHash(schemaHash)\r\n  .withExpirationTime(expirationTime)\r\n  .withSequel(sequel)\r\n  .withSubject(subject)\r\n  .withSlotValue(2, BigInt(\"1\"))\r\n  .withSlotValue(3, BigInt(\"2\"))\r\n  .withSlotValue(4, BigInt(\"3\"))\r\n  .withSlotValue(5, BigInt(\"4\"))\r\n  .withSlotValue(6, BigInt(\"5\"))\r\n  .withSlotValue(7, BigInt(\"6\"))\r\n  .build();\r\n```\r\n\r\nWe also can read, set information and perform logics of a claim after it is generated through its below functions:\r\n\r\n```typescript\r\nget schemaHash() {}\r\n\r\nget sequel() {}\r\n\r\nget expirationTime() {}\r\n\r\nget subject() {}\r\n\r\nget allSlots() {}\r\n\r\nasync claimHash() {}\r\n\r\nasync eddsaSign(privateKey: BigInt){}\r\n\r\nasync ecdsaSign(privateKey: BigInt){}\r\n\r\ngetSlotValue(index: number) {}\r\n\r\nclone() {}\r\n\r\nset schemaHash(schemaHash: BigInt) {}\r\n\r\nset sequel(sequel: BigInt) {}\r\n\r\nset expirationTime(expirationTime: BigInt) {}\r\n\r\nset subject(subject: BigInt) {}\r\n\r\nsetSlotValue(index: number, value: BigInt) {}\r\n```\r\n\r\n### Holder\r\n\r\nTo create a holder in the protocol, you only need a set of either EDDSA or ECDSA public keys.\r\n\r\nA holder can perform 2 operations to change its state\r\n\r\n- Add a new key\r\n- Revoked an existing key\r\n\r\n```typescript\r\nimport {\r\n  keyUtils,\r\n  Holder,\r\n  AddAuthOperation,\r\n  StateTransitionByEDDSASignatureWitnessBuilder,\r\n  generateProofAndVerify,\r\n  CircuitName,\r\n} from \"@zidendev/noir-ziden\";\r\n\r\nconst {\r\n  getEDDSAPublicKeyFromPrivateKey,\r\n  getECDSAPublicKeyFromPrivateKey,\r\n  stateTransitionByEDDSASignature,\r\n} = keyUtils;\r\nvar privateKey1 = BigInt(\"123\");\r\nvar privateKey2 = BigInt(\"12\");\r\nvar privateKey3 = BigInt(\"34\");\r\n\r\n// eddsa\r\nvar pubkey1 = await getEDDSAPublicKeyFromPrivateKey(privateKey1);\r\nvar pubkey2 = await getEDDSAPublicKeyFromPrivateKey(privateKey2);\r\n\r\n// ecdsa\r\nvar pubkey3 = getECDSAPublicKeyFromPrivateKey(privateKey3);\r\n\r\nconst holder = new Holder(3, poseidon);\r\n\r\nawait holder.addAuth(pubkey1.X, pubkey1.Y, PublicKeyType.EDDSA);\r\n\r\n// commit key insertion through the ZK proof\r\nvar operation1: AddAuthOperation = {\r\n  type: \"addAuth\",\r\n  publicKeyX: pubkey2.X,\r\n  publicKeyY: pubkey2.Y,\r\n  publicKeyType: PublicKeyType.EDDSA,\r\n};\r\nvar operation2: AddAuthOperation = {\r\n  type: \"addAuth\",\r\n  publicKeyX: pubkey3.X,\r\n  publicKeyY: pubkey2.Y,\r\n  publicKeyType: PublicKeyType.ECDSA,\r\n};\r\n\r\nvar inputs = await stateTransitionByEDDSASignature(privateKey1, issuer, [\r\n  operation1,\r\n  operation2,\r\n]);\r\n\r\nconst witness = new StateTransitionByEDDSASignatureWitnessBuilder(3)\r\n  .withStateTransitionByEDDSASignatureWitness(inputs)\r\n  .build();\r\n\r\nconst verified = await generateProofAndVerify(witness, CircuitName.STATE);\r\n\r\nassert(verified == true);\r\n```\r\n\r\n### Issuer\r\n\r\nApart from key sets, an issuer also maintain a set of claims it has granted for holders and a set of revoked claims.\r\n\r\nA issuer can perform 4 operations to change its state\r\n\r\n- Add a new key\r\n- Revoked an existing key\r\n- Issue a new claim\r\n- Revoke an existing claim\r\n\r\n```typescript\r\nimport {\r\n  keyUtils,\r\n  Issuer,\r\n  AddAuthOperation,\r\n  StateTransitionByEDDSASignatureWitnessBuilder,\r\n  generateProofAndVerify,\r\n  CircuitName,\r\n  ClaimBuilder,\r\n} from \"@zidendev/noir-ziden\";\r\n\r\nconst {\r\n  getEDDSAPublicKeyFromPrivateKey,\r\n  getECDSAPublicKeyFromPrivateKey,\r\n  stateTransitionByEDDSASignature,\r\n} = keyUtils;\r\nvar privateKey1 = BigInt(\"123\");\r\nvar privateKey2 = BigInt(\"12\");\r\nvar privateKey3 = BigInt(\"34\");\r\n\r\n// eddsa\r\nvar pubkey1 = await getEDDSAPublicKeyFromPrivateKey(privateKey1);\r\nvar pubkey2 = await getEDDSAPublicKeyFromPrivateKey(privateKey2);\r\n\r\n// ecdsa\r\nvar pubkey3 = getECDSAPublicKeyFromPrivateKey(privateKey3);\r\n\r\nvar schemaHash = BigInt(\"93819749189437913473\");\r\nvar expirationTime = BigInt(Date.now() + 60 * 60 * 1000);\r\nvar sequel = BigInt(1);\r\nvar subject = BigInt(\"439798\");\r\nvar slotValues = [\r\n  BigInt(\"43818579187414812304\"),\r\n  BigInt(\"43818579187414812305\"),\r\n  BigInt(\"43818579187414812306\"),\r\n  BigInt(\"43818579187414812307\"),\r\n  BigInt(\"43818579187414812308\"),\r\n  BigInt(\"43818579187414812309\"),\r\n];\r\nvar claim = new ClaimBuilder()\r\n  .withSchemaHash(schemaHash)\r\n  .withExpirationTime(expirationTime)\r\n  .withSequel(sequel)\r\n  .withSubject(subject)\r\n  .withSlotValue(2, slotValues[0])\r\n  .withSlotValue(3, slotValues[1])\r\n  .withSlotValue(4, slotValues[2])\r\n  .withSlotValue(5, slotValues[3])\r\n  .withSlotValue(6, slotValues[4])\r\n  .withSlotValue(7, slotValues[5])\r\n  .build();\r\n\r\nconst issuer = new Issuer(3, poseidon);\r\n\r\nawait issuer.addAuth(pubkey1.X, pubkey1.Y, PublicKeyType.EDDSA);\r\n\r\n// commit key insertion through the ZK proof\r\nvar operation1: AddAuthOperation = {\r\n  type: \"addAuth\",\r\n  publicKeyX: pubkey2.X,\r\n  publicKeyY: pubkey2.Y,\r\n  publicKeyType: PublicKeyType.EDDSA,\r\n};\r\nvar operation2: AddAuthOperation = {\r\n  type: \"addAuth\",\r\n  publicKeyX: pubkey3.X,\r\n  publicKeyY: pubkey3.Y,\r\n  publicKeyType: PublicKeyType.ECDSA,\r\n};\r\nvar operation3: RevokeAuthOperation = {\r\n  type: \"revokeAuth\",\r\n  publicKeyX: pubkey3.X,\r\n};\r\nvar operation4: IssueClaimOperation = { type: \"issueClaim\", claim };\r\nvar operation5: RevokeClaimOperation = {\r\n  type: \"revokeClaim\",\r\n  claimHash: await claim.claimHash(),\r\n};\r\n\r\nvar inputs = await stateTransitionByEDDSASignature(privateKey1, issuer, [\r\n  operation1,\r\n  operation2,\r\n  operation3,\r\n  operation4,\r\n  operation5,\r\n]);\r\n\r\nconst witness =\r\n  new stateTransitionWitnessBuilder.StateTransitionByEDDSASignatureWitnessBuilder(\r\n    3\r\n  )\r\n    .withStateTransitionByEDDSASignatureWitness(inputs)\r\n    .build();\r\n\r\nconst verified = await generateProofAndVerify(witness, CircuitName.STATE);\r\n\r\nassert(verified == true);\r\n```\r\n\r\n### Claim presentation\r\n\r\n```typescript\r\nimport {\r\n  Claim,\r\n  ClaimBuilder,\r\n  EDDSAPublicKey,\r\n  ECDSAPublicKey,\r\n  Issuer,\r\n  Holder,\r\n  ClaimExistenceProofWitness,\r\n  ClaimNonRevocationProofWitness,\r\n  ECDSAPublicKey,\r\n  EDDSAPublicKey,\r\n  IdOwnershipByECDSASignatureWitness,\r\n  MembershipSetProofWitness,\r\n  NonMembershipSetProofWitness,\r\n  generateProofAndVerify,\r\n  CircuitName,\r\n  ECDSAClaimQueryWitnessBuilder,\r\n} from \"@zidendev/noir-ziden\";\r\n\r\nlet claim: Claim;\r\n\r\nlet schemaHash: BigInt;\r\nlet expirationTime: BigInt;\r\nlet sequel: BigInt;\r\nlet slotValues: BigInt[];\r\nlet subject: BigInt;\r\n\r\nlet privateKey1: BigInt;\r\nlet privateKey2: BigInt;\r\nlet privateKey3: BigInt;\r\nlet pubkey1: EDDSAPublicKey;\r\nlet pubkey2: ECDSAPublicKey;\r\nlet pubkey3: ECDSAPublicKey;\r\nlet issuer: Issuer;\r\nlet holder: Holder;\r\nlet challenge: BigInt;\r\n\r\nlet iopWitness: IdOwnershipByECDSASignatureWitness;\r\nlet cepWitness: ClaimExistenceProofWitness;\r\nlet cnpWitness: ClaimNonRevocationProofWitness;\r\nlet mpWitness: MembershipSetProofWitness;\r\nlet nmpWitness: NonMembershipSetProofWitness;\r\n\r\nprivateKey1 = BigInt(\"123\");\r\nprivateKey2 = BigInt(\"12\");\r\nprivateKey3 = BigInt(\"12\");\r\n\r\npubkey1 = await getEDDSAPublicKeyFromPrivateKey(privateKey1);\r\npubkey2 = getECDSAPublicKeyFromPrivateKey(privateKey2);\r\npubkey3 = getECDSAPublicKeyFromPrivateKey(privateKey3);\r\n\r\nholder = new Holder(8, poseidon);\r\nholder.addAuth(pubkey1.X, pubkey1.Y, PublicKeyType.EDDSA);\r\nholder.addAuth(pubkey2.X, pubkey2.Y, PublicKeyType.ECDSA);\r\n\r\nissuer = new Issuer(8, 10, poseidon);\r\nissuer.addAuth(pubkey3.X as bigint, pubkey3.Y as bigint, PublicKeyType.ECDSA);\r\n\r\nschemaHash = BigInt(\"93819749189437913473\");\r\nexpirationTime = BigInt(Date.now() + 60 * 60 * 1000);\r\nsequel = BigInt(1);\r\nsubject = BigInt(\"439798\");\r\nslotValues = [\r\n  BigInt(\"43818579187414812304\"),\r\n  BigInt(\"43818579187414812305\"),\r\n  BigInt(\"43818579187414812306\"),\r\n  BigInt(\"43818579187414812307\"),\r\n  BigInt(\"43818579187414812308\"),\r\n  BigInt(\"43818579187414812309\"),\r\n];\r\nclaim = new ClaimBuilder()\r\n  .withSchemaHash(schemaHash)\r\n  .withExpirationTime(expirationTime)\r\n  .withSequel(sequel)\r\n  .withSubject(subject)\r\n  .withSlotValue(2, slotValues[0])\r\n  .withSlotValue(3, slotValues[1])\r\n  .withSlotValue(4, slotValues[2])\r\n  .withSlotValue(5, slotValues[3])\r\n  .withSlotValue(6, slotValues[4])\r\n  .withSlotValue(7, slotValues[5])\r\n  .build();\r\n\r\nissuer.addClaim(claim);\r\nchallenge = BigInt(\"123\");\r\n\r\nmpWitness = await MembershipSetProof(\r\n  6,\r\n  poseidon,\r\n  [claim.getSlotValue(0).valueOf(), 12n],\r\n  0\r\n);\r\nnmpWitness = await NonMembershipSetProof(\r\n  6,\r\n  poseidon,\r\n  [1n, 123123123123123n],\r\n  claim.getSlotValue(0).valueOf()\r\n);\r\n\r\niopWitness = await idOwnershipByECDSASignature(privateKey2, holder, challenge);\r\ncepWitness = await ClaimExistenceProof(issuer, 0);\r\ncnpWitness = await ClaimNonRevocationProof(issuer, await claim.claimHash());\r\n\r\nconst validUntil = BigInt(Date.now() + 30 * 60 * 1000);\r\n\r\nvar witness = new ECDSAClaimQueryWitnessBuilder(8, 10, 6)\r\n  .withClaimSlots(claim.allSlots)\r\n  .withECDSAIopWitness(iopWitness)\r\n  .withCepWitness(cepWitness)\r\n  .withCnpWitness(cnpWitness)\r\n  .withAttestingValue(claim.getSlotValue(0).valueOf() + BigInt(1))\r\n  .withOperator(1)\r\n  .withQueryType(0)\r\n  .withSlotIndex0(0)\r\n  .withSchemaHash(schemaHash)\r\n  .withSequel(sequel)\r\n  .withSubject(subject)\r\n  .withValidUntil(validUntil)\r\n  .build();\r\n\r\nconst verified = await generateProofAndVerify(\r\n  witness,\r\n  CircuitName.ECDSA_CLAIM_PRESENTATION\r\n);\r\n\r\nassert(verified == true);\r\n```\r\n## Benchmark circuits\r\n\r\n| Name | Size | \r\n|----------|----------|\r\n| ecdsa claim presentation circuit size (nAuth = 3, nClaim = 3, nSet = 2) | 103009 | \r\n| eddsa claim presentation circuit size (nAuth = 3, nClaim = 3, nSet = 2) | 101401 | \r\n| ecdsa state transition circuit size (nAuth = 3) | 50029 |\r\n| eddsa state transition circuit size (nAuth = 3) | 48507 |\r\n| insert indexed merkle tree circuit size (n = 3) | 39303 |\r\n\r\n## Future work\r\n\r\n- Solidity smart contracts for proof verification and identity state management\r\n\r\n- User interface for holders\r\n\r\n- Server for issuers\r\n\r\n- Server and smart contracts for verfiers\r\n","readmeFilename":"README.md"}