세모포어는 영지식을 사용하여 사용자가 그룹 멤버십을 증명하고 원래 신원을 밝히지 않고 투표나 endorsements와 같은 signal들을 보낼 수 있도록 합니다. 목표는 세마포어를 익명 신호 및 그룹 멤버십 증명의 표준으로 만드는 것입니다.
semaphore는 pse.dev팀에서 개발한 프로토콜입니다.
접근성
매우 많은 개발자 그룹에 도달하려면 프로토콜이 사용자 친화적이고, 이해하기 쉬우며 간단해야 합니다.
구성 가능성
모듈성, 자율성, 상호 운용성을 통해 단순성과 기능성 간의 탁월한 균형을 달성합니다.
능률
프로토콜은 단순히 기능하는 데 그치지 않고 모든 사람의 개인정보 보호를 기본적으로 지원하는 것이 목표라면 매우 효율적이어야 합니다.
세마포는 개발자 친화적인 경험 제공과 교육 그리고 지역사회 발전에 초점을 두고 있습니다.
Semaphore는 사용자들이 신원을 드러내지 않고도 그룹 내에서 자신의 존재를 증명하고, 익명으로 신호를 보낼 수 있도록 하는 프라이버시 중심의 프로토콜입니다.
해당 프로젝트는 ZKP 특히, zk-SNARKs를 사용하여 사용자들이 개인정보를 공개하지 않고도 검증 가능한 행동을 할 수 있게 합니다.
익명투표, 개인 메시지 송수신, 프라이버시가 중요한 dApp 등에 사용됩니다.semaphore를 사용한 가장 유명한 프로젝트는 샘 알트먼의 '월드코인'입니다. 이는 보다 포괄적인 금융 시스템에 대한 보편적 접근성을 제공하는 글로벌 디지털 통화입니다.
Worldcoin은 개인정보가 보호되는 세계 최대 금융 네트워크가 되는 것을 목표로 설계되었으며, 모든 사람에게 소유권을 부여합니다. Worldcoin은 국가나 배경에 상관없이 누구나 세계 경제에 접근할 수 잇도록 함으로써 AI 시대에 모두가 혜택을 받을 수 있는 장을 구축하는 것을 목표로 합니다.
여기서 신분을 밝히지 않고 고유한 실제 사람임을 익명으로 증명하는 'World ID'에 zkp를 활용하여 사용자의 World ID가 진짜임을 증명합니다.
https://demo.semaphore.pse.dev/
데모 버전 체험 가능
semaphore는 tornado cash의 기본 로직과 유사하지만 조금 더 복잡합니다.
tornado cash는 자금의 이동을 추적하는 것을 막기 위해 설계된 코인 믹서입니다. 이를 사용하려면 사용자가 키 쌍을 생성해야 합니다. 키 중 하나를 사용하여 Tornado Cash smart contract에 특정 금액을 입금한 다음 다른 키를 사용하여 인출할 수 있습니다. 두 키의 한 쌍이라는 연결성은 영지식 증명을 사용하여 증명되므로 사용자 외에는 어느 누구도 어떤 입금 키가 어떤 인출 키에 해당하는지 확인할 수 없습니다. 따라서 자금 이체를 추적할 수 없습니다.
아래의 사진은 tornado cash에서 키가 생성되는 방법을 보여줍니다.

출처: https://hackernoon.com/the-magic-of-zero-knowledge-proofs-through-the-source-code-of-tornado-cash
사용자는 nullifier와 secret을 생성합니다. 이들은 두 개의 키를 생성하는 데 사용됩니다. 입금을 위해 사용자는 secret과 nullifier를 해싱하여 생성된 커밋먼트 해시를 사용합니다. 출금에 사용되는 키는 nullifier 해시입니다. 사용자가 자금을 deposit에 넣으면 smart contract는 commitment hash를 머클 트리에 저장합니다.
자금을 withdraw할 때 사용자는 nullifier 해시와 영지식 증명을 제공하는데, 이는 비밀을 사용하여 무효화 해시에서 commitment 해시를 도출할 수 있음을 증명하고, 이 커밋먼트 해시가 머클트리에 포함되어 있음을 증명하는 merkle proof를 제공합니다. smart contract는 nullifier해시를 저장하여 한 번만 사용할 수 있도록 보장하고, 따라서 입금된 금액은 여러 번 인출할 수 없습니다.
아래 사진은 semaphore 시스템과 관련된 회로의 개략도입니다.

출처: https://semaphore.pse.dev/docs/technical-reference/circuits
사용자는 두 개의 개인 변수, Identity Trapdoor와 Identity Nullifier를 생성합니다. 이 두 개인 변수는 개인 키로 볼 수 있습니다. 이 두 개인 변수를 hash하면 Identity Commitment가 생성되는데, 이는 공개 키의 한 형태로 볼 수 있습니다. 예로, 해당 공개키는 익명 투표의 등록 등에 사용할 수 있습니다.
등록은 Merkle 트리에 Identity Commitment를 추가하여 Tornado Cash와 동일한 프로세스를 따르므로 그룹의 멤버십을 증명하고자 할 때 Merke 증명으로 증명할 수 있습니다. 회로에서 머클 증명은 Sibiligs 및 Path Indices 매개변수로 정의됩니다.
사진은 nullifier hash가 토네이도 캐시의 경우처럼 nullifier를 hash하여 생성되는 것이 아니라 ID nullifier와 external nullifier 해시의 조합으로 생성되는 것을 보여줍니다. 이는 토네도 캐시와 달리 nullifier를 여러 번 재사용할 수 있기 때문에 유용합니다. 예시로, 익명 투표 시스템의 경우 사용자는 한 번만 등록하고 여러 투표에 참여할 수 있습니다. 각 투표에 고유한 external nullifier가 생성됩니다. 이를 통해 각 투표에 대해 고유한 public nullifier를 생성할 수 있으며, 이는 특정 투표에 국한되지만 서로 연결될 수 없습니다.
마지막 매개변수는 signal Hash입니다. signal은 영지식 증명에 연결될 수 있는 자유롭게 선택된 데이터입니다. 예를 들어 투표의 경우 투표 자체일 수 있습니다. Identity Trapdoor와 Identity Nullifier를 개인키로, Identity Commitment를 공개 키로 간주하면 영지식증명은 개인데이터에 대한 지식으로만 생성될 수 있으므로 디지털 서명의 한 형태로 볼 수 있습니다. 이경우 signal은 디지털로 서명된 콘텐츠입니다.