Skip to content

jay0xmo/ZKYC

Repository files navigation

ZKYC, Zero-Knowledge Yacht Club

Objective

해당 리파짓토리는 영지식 증명(ZK-SNARKS)를 활용하여, 간단한 NFT DApp(Decentralized Application)을 구현하는 것을 목표로 합니다. 토네이도 캐시의 Mixer 아이디어를 바탕으로, 초대자가 누구인지를 익명으로 하는 멤버십 NFT를 설계하였습니다.

Concept: Secret Invitation Membership

ZKYC 클럽 멤버들은 ZKYC 클럽에 어울리는 사람들은 초대할 수 있어요. 다만 어떤 멤버가 초대했는지 알게 된다면, 초대한 사람이 누구인지에 따라 그 사람을 판단하게 되겠지요. 그래서, ZKYC에서는 영지식 증명을 활용해, 누가 초대했는지를 알 수 없는 멤버십 NFT를 만들려고 합니다.

Features

  1. 익명화된 초대권
    • 멤버들은 누가 초대했는지를 알 수 없어요.
  2. 이중 사용 방지
    • 한 번 사용된 초대권은 더 이상 사용할 수 없어요.
  3. 초대권 갯수 제한
    • 한 명의 멤버에게 할당된 초대권에는 제한이 있어요.
  4. 계정 귀속(Soul-Bounded Token)
    • 해당 멤버십 토큰은 다른 누구에게 전송하거나 팔 수 없어요.
    • 하나의 계정에는 하나의 멤버십 토큰만 소유할 수 있어요.

User Flows

  • 초대하는 사람 (inviter)이 초대장을 만드는 과정

    1. inviter은 Nullifier 값을 랜덤하게 추출해요.

      • 이 정보는 invitee에게만 노출해야 합니다. 이 값을 알게 되면, 누가 초대했는지를 대번에 알 수 있어요.
    2. commitmentHash 함수를 통해 암호화된 nullifierinvitation이라 합니다. 이 값을 ZKYC 컨트랙트에 등록하여, 초대권을 발행합니다.

      • invitation = commitmentHash(nullifier) = poseidonHash(nullifier, 0)
      • 이후, 초대장의 소유 여부를 증명할 때 사용합니다.
    3. inviter는 발행된 초대권이 유효한 초대권인지를 증명하는 Proof와 이중 사용을 방지하기 위한 nullifierHash를 생성합니다.

      • 발행된 초대권이 유효한 초대권인지를 증명하는 Proof을 구성합니다.
        • invitation이 머클 트리에 존재했는지 여부
        • invitation이 해당 유저에게 제공하는 것이 맞는지 여부
      • 발급 후, 해당 초대장이 2번 사용되지 않도록, nullifierHash 값을 통해 사용 여부를 체크합니다.
      • 그리고 해당 초대장이 내가 제공한 invitee 외에는 쓸 수 없도록
      • nullifierHash = poseidonHash(nullifier, 1, invitation Index)
    4. 초청에 필요한 모든 정보는(Proof / root / nullifierHash)를 Letter이라 하겠습니다.이 값을 내가 초대하고 싶은 사람(invitee)에게 전달합니다.

  • 초청받은 사람 (invitee)이 멤버십에 가입하는 과정

    1. invitee는 inviter에게 Letter를 전달 받습니다.
    2. join 함수를 호출하여, 멤버십을 발급받습니다.

pre-requirements

  • circom2

    ZK-SNARKs의 회로(circuit)를 컴파일 하기 위해, circuit 컴파일러인 circom2을 활용하고 있습니다.

installations

  1. 패키지 설치하기
yarn install
  1. 컨트랙트 컴파일하기

    ZKYC 컨트랙트를 컴파일합니다. typechain-types 폴더에 typechain이 등록됩니다.

yarn build:contract
  1. 서킷 컴파일하기

    총 3단계의 작업을 순차대로 수행합니다

    1. 서킷 컴파일 (r1cs / wasm)
    2. trusted setup 수행
    3. Solidity Verifier 생성
yarn build:circuit
  1. 테스트 수행하기
yarn test

References

About

Zero Knowledge Yacht Club!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published