μ°¨μΈλ μ΅λͺ λ΄λΆκ³ λ° νλ«νΌ - Zero-Knowledge Proof κΈ°λ° μμ ν μ 보 μμ€ν
ZkWhistleBlowingμ Zero-Knowledge μ¦λͺ κΈ°μ μ νμ©νμ¬ μμ ν μ΅λͺ μ±μ 보μ₯νλ νμ μ μΈ λ΄λΆκ³ λ° νλ«νΌμ λλ€. λΈλ‘체μΈκ³Ό μνΈνμ μ¦λͺ μ ν΅ν΄ μ 보μμ μ μμ μλ²½νκ² λ³΄νΈνλ©΄μλ μ 보μ μ§μμ±μ κ²μ¦ν μ μμ΅λλ€.
- Zero-Knowledge Proof: μ μμ λ ΈμΆνμ§ μκ³ λ μ§μμμ μ¦λͺ
- Merkle Tree κΈ°λ° μΈμ¦: μ¬μ©μ λ°μ΄ν°λ² μ΄μ€λ₯Ό μνΈννμ¬ κ΄λ¦¬
- Nullifier μμ€ν : μ€λ³΅ μ 보 λ°©μ§ λ° κ°μΈμ 보 보νΈ
- Noir Language: κ³ μ±λ₯ ZK-SNARK νλ‘ κ΅¬ν
- UltraHonk Backend: ν¨μ¨μ μΈ μ¦λͺ μμ± λ° κ²μ¦
- Arbitrum κ²μ¦: λΈλ‘μ²΄μΈ μμμ μ¦λͺ κ²μ¦
- IPFS ν΅ν©: Pinataλ₯Ό ν΅ν νμ€μν νμΌ μ μ₯
- λΆλ³μ± 보μ₯: μ 보 λ΄μ©μ μλ³μ‘° λ°©μ§
- μꡬ 보쑴: κ²μ΄ μ νμ± ν보
- Next.js 15: React κΈ°λ° νμ€ν νλ μμν¬
- Turbopack: κ³ μ κ°λ° νκ²½
- Tailwind CSS: λͺ¨λ UI μ€νμΌλ§
- Noir: ZK νλ‘ νλ‘κ·Έλλ° μΈμ΄
- @aztec/bb.js: UltraHonk λ°±μλ
- Poseidon Hash: μνΈνμ ν΄μ ν¨μ
- Ethers.js: μ΄λ리μ λΈλ‘μ²΄μΈ μνΈμμ©
- Arbitrum: L2 μ루μ μΌλ‘ κ²μ¦ λΉμ© μ κ°
- Hardhat: μ€λ§νΈ 컨νΈλνΈ κ°λ° νκ²½
- Better-sqlite3: λ‘컬 μ¬μ©μ λ°μ΄ν°λ² μ΄μ€
- IPFS/Pinata: λΆμ° νμΌ μ μ₯
- Indexed Merkle Tree: ν¨μ¨μ μΈ λ©€λ²μ μ¦λͺ
- Node.js 18+
- npm λλ yarn
- Git
- μ μ₯μ ν΄λ‘
git clone https://github.com/Zk-Whistleblowing/front-end.git
cd zkwhistle- μμ‘΄μ± μ€μΉ
npm install- νκ²½λ³μ μ€μ
cp .env.local.example .env.localνμν νκ²½λ³μ:
ARBITRUM_RPC_URL=https://sepolia-rollup.arbitrum.io/rpc
VERIFIER_CONTRACT_ADDRESS=0x...
PINATA_JWT=your_pinata_jwt_token
PINATA_GATEWAY=your_pinata_gateway_url- λ°μ΄ν°λ² μ΄μ€ μ΄κΈ°ν
node db/initDB.js- κ°λ° μλ² μ€ν
npm run devλΈλΌμ°μ μμ http://localhost:3000μ μ΄μ΄ νμΈνμΈμ.
zkwhistle/
βββ app/ # Next.js μ± λΌμ°ν°
β βββ api/ # API μλν¬μΈνΈ
β β βββ auth/ # μΈμ¦ μμ€ν
β β βββ generate-zk-proof/ # ZK μ¦λͺ
μμ±
β β βββ submit-report/ # μ 보 μ μΆ
β βββ dashboard/ # λμ보λ νμ΄μ§
β βββ sign-in/ # λ‘κ·ΈμΈ νμ΄μ§
β βββ page.js # λ©μΈ ννμ΄μ§
βββ circuit/ # Noir ZK νλ‘
β βββ circuit.json # μ»΄νμΌλ νλ‘
βββ db/ # λ°μ΄ν°λ² μ΄μ€
β βββ initDB.js # DB μ΄κΈ°ν μ€ν¬λ¦½νΈ
βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β βββ calculate_nullifier.js # Nullifier κ³μ°
β βββ merkleProof.js # Merkle μ¦λͺ
μμ±
βββ public/ # μ μ νμΌ
βββ package.json # νλ‘μ νΈ μ€μ
npm run dev # κ°λ° μλ² μμ (Turbopack)
npm run build # νλ‘λμ
λΉλ
npm run start # νλ‘λμ
μλ² μ€ν
npm run lint # ESLint κ²μ¬npm run hardhat:compile # 컨νΈλνΈ μ»΄νμΌ
npm run hardhat:test # ν
μ€νΈ μ€ν
npm run hardhat:node # λ‘컬 λ€νΈμν¬ μ€ν
npm run hardhat:deploy # 컨νΈλνΈ λ°°ν¬
npm run hardhat:deploy:arbitrum # Arbitrumμ λ°°ν¬npm run noir:compile # ZK νλ‘ μ»΄νμΌ- μ§μμ΄ μ΄λ©μΌκ³Ό μ§μ IDλ‘ λ‘κ·ΈμΈ
- μμ€ν μ΄ Merkle Treeμμ μ¬μ©μ μμΉ νμΈ
- μΈμ μμ± λ° μΏ ν€ μ μ₯
// 1. Merkle Proof μμ±
const proofData = await generateMerkleProofs(user);
// 2. Noir νλ‘λ‘ μ¦λͺ
μμ±
const noir = new Noir(circuitJSON, backend);
const proof = await backend.generateProof(witness);
// 3. Arbitrumμμ κ²μ¦
const verified = await contract.verify(proof.proof, proof.publicInputs);- IPFSμ μ 보 λ΄μ© μ λ‘λ (Pinata)
- ZK μ¦λͺ κ³Ό ν¨κ» μ μΆ
- λΈλ‘체μΈμμ κ²μ¦ ν μ μ₯
- Nullifier: λμΌμΈ μ¬μ 보 λ°©μ§νλ μ μ λΉκ³΅κ°
- Merkle Tree: μ 체 μ§μ λͺ©λ‘ μμ΄ λ©€λ²μ μ¦λͺ
- Zero-Knowledge: μ μ μ 보 μμ λΆλ¦¬
- μ μ μ 보μ μ 보 λ΄μ© μμ λΆλ¦¬
- ν΄λΌμ΄μΈνΈ μ¬μ΄λ μνΈν
- λ©νλ°μ΄ν° μ΅μν
- Soundness: κ±°μ§ μ¦λͺ λΆκ°λ₯
- Zero-Knowledge: μ μ μ 보 λμΆ μμ
- Completeness: μ λΉν μ§μμ μ¦λͺ νμ μ±κ³΅
- λΆλ³μ κ²μ¦ κΈ°λ‘
- νμ€μνλ μ¦λͺ μ μ₯
- κ²μ΄ μ νμ±
- Fork νλ‘μ νΈ
- Feature λΈλμΉ μμ± (
git checkout -b feature/AmazingFeature) - λ³κ²½μ¬ν μ»€λ° (
git commit -m 'Add some AmazingFeature') - λΈλμΉμ Push (
git push origin feature/AmazingFeature) - Pull Request μμ±
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
- μ΄μ 리ν¬νΈ: GitHub Issues
- λ¬Έμ: νλ‘μ νΈ μν€
- μ΄λ©μΌ: support@zkwhistle.org
- λ€μ€ μλͺ κ²μ¦ μμ€ν
- λͺ¨λ°μΌ μ± κ°λ°
- λ€κ΅μ΄ μ§μ
- κ³ κΈ λΆμ λμ보λ
- ν΅ν© μ κ³ μν¬νλ‘μ°
ZkWhistleBlowing: μ§μ€μ 보νΈνλ κΈ°μ , μμ μ 보μ₯νλ μνΈν