영지식 증명을 활용하여 이더리움에서 프라이버시 앱을 구축하는 방법

이더리움은 설계상 극단적으로 공개되어 있습니다. 모든 주소, 잔고, 트랜잭션, 컨트랙트 호출 및 이벤트는 블록 탐색기를 가진 사람이라면 누구나 볼 수 있습니다. 이러한 투명성은 검증 가능성을 원할 때 유용합니다. 하지만 사용자가 모든 작업을 동일한 지갑에 연결하지 않고 투표, 청구, 인출 또는 멤버십을 증명해야 할 때는 문제가 됩니다.
익명 멤버십은 이더리움의 수많은 프라이버시 앱을 구동하는 재사용 가능한 패턴입니다. 사람들은 먼저 등록한 다음, 나중에 자신이 어떤 멤버인지 밝히지 않고 그룹에 속해 있음을 증명합니다. 영지식 증명은 등록 지갑과 실행 지갑 사이의 브릿지 역할을 하며, 이 브릿지는 누가 건넜는지 드러내지 않습니다.
주변 제품은 변하지만, 프라이버시의 뼈대는 동일하게 유지됩니다.
익명 투표로 설명하는 패턴
이 패턴은 세 가지 요소로 구성됩니다. 커밋먼트는 각 멤버를 등록합니다. 머클 트리는 이러한 커밋먼트들을 하나의 군중으로 만듭니다. 증명과 널리파이어(nullifier)는 어떤 멤버가 행동했는지 밝히지 않고 한 멤버가 한 번만 행동할 수 있게 해줍니다.
1단계: 등록
모든 유권자는 오프체인에서 비밀값(secret)과 널리파이어라는 두 가지 비공개 값을 생성합니다. 유권자는 이 값들을 해시하여 공개 커밋먼트로 만든 다음, 해당 커밋먼트를 온체인에 등록합니다.
커밋먼트는 공개적인 등록 기록입니다. 비밀값과 널리파이어는 유권자가 나중에 필요로 하는 비공개 노트입니다. 이 노트를 잃어버리면 유권자는 멤버십을 증명할 수 없습니다. 유출되면 다른 사람이 사용자 대신 투표할 수도 있습니다.
커밋먼트는 해시이므로 관찰자는 그 안의 비공개 값을 복구할 수 없습니다. 커밋먼트는 나중에 누가 그 등록을 사용할지 밝히지 않은 채 "누군가 등록했다"는 사실만 알려줍니다.
2단계: 군중 형성
더 많은 유권자가 등록함에 따라, 앱은 그들의 커밋먼트를 머클 트리로 수집합니다. 머클 트리는 긴 값의 목록을 루트(root)라고 하는 단일 해시로 압축합니다. 목록의 값을 하나라도 변경하면 해시가 변경되므로, 루트는 전체 세트에 대한 위변조 방지 요약 역할을 합니다.
이 트리가 바로 익명성 세트입니다. 트리에 10명의 사용자가 있다면, 관찰자는 이후의 행동을 그 10명 중 한 명으로 좁힐 수 있습니다. 트리에 1만 명의 사용자가 있다면, 행동을 한 사람과 연결하기가 훨씬 더 어려워집니다. 익명성 세트가 아주 작은 프라이버시 앱은 암호학적으로 올바르더라도 대개 프라이버시가 잘 보호되지 않습니다.
3단계: 익명으로 행동하기
투표가 시작되면, 유권자는 커밋먼트를 등록한 것과 동일한 지갑에서 투표해서는 안 됩니다. 등록 지갑에서 투표하면 투표가 등록자와 직접 연결되어 프라이버시 보호 작업이 무용지물이 됩니다. 대신 유권자는 영지식 증명을 생성합니다. 이 증명문은 "나는 등록된 커밋먼트를 생성하는 비공개 값을 알고 있으며, 이 투표에 대한 올바른 널리파이어 해시를 공개한다"는 회로(circuit)로 인코딩됩니다.
이 증명은 검증자 컨트랙트에게 해당 증명문이 참임을 확신시킵니다. 비밀값, 널리파이어 또는 어떤 커밋먼트가 사용되었는지는 드러내지 않습니다.
널리파이어는 이중 투표를 방지하는 역할을 합니다. 유권자는 증명과 함께 널리파이어 해시를 게시합니다. 투표 컨트랙트는 투표를 수락한 후 해당 해시를 저장합니다. 동일한 투표에 동일한 비공개 노트를 다시 사용하면 동일한 널리파이어 해시가 생성되며, 컨트랙트는 두 번째 투표를 거부합니다. 증명과 결합하여, 컨트랙트는 어떤 등록된 유권자가 한 번 행동했다는 사실만 알게 될 뿐, 그가 누구인지는 알 수 없습니다.
재사용 가능한 게이트
동일한 증명과 널리파이어 쌍은 투표 이외의 용도에도 작동합니다. 투표라는 맥락을 걷어내면, 스마트 컨트랙트 함수를 위한 프라이버시 게이트가 남습니다.
함수가 실행되기 전에 컨트랙트는 머클 루트를 확인하고, 증명을 검증하며, 널리파이어 해시가 사용되지 않았는지 확인하고, 공개 입력을 올바른 앱, 체인, 투표, 청구 또는 인출에 바인딩합니다. 이러한 검사를 통과하면 널리파이어를 사용됨으로 표시하고 함수의 나머지 부분을 실행합니다.
이 게이트를 투표 앞에 두면 익명 투표가 됩니다. 에어드롭 청구 앞에 두면 익명 청구가 됩니다. 인출 함수 앞에 두면 믹서 스타일 인출 흐름의 핵심이 됩니다. 동일한 커밋먼트 트리, 동일한 널리파이어 개념, 동일한 증명 패턴을 사용합니다. 변경되는 것은 함수 본문과 주변의 앱 로직뿐입니다.
어디서 무엇이 실행되는가
비공개 작업은 대개 오프체인에서 발생합니다. 사용자는 노트를 저장하고, 클라이언트 앱은 증거를 구축하고 증명자를 실행하여 증명을 생성합니다. 인덱서는 커밋먼트와 머클 루트를 추적합니다. 번들러는 사용자 작업(UserOperation)을 온체인에 전파하고 ERC-4337 페이마스터가 가스를 후원하므로, 새로운 지갑이 사용자의 알려진 지갑으로부터 먼저 ETH를 받을 필요가 없습니다.
공개적인 집행은 온체인에서 발생합니다. 검증자 컨트랙트는 증명을 확인합니다. 앱 컨트랙트는 유효한 루트와 사용되지 않은 널리파이어를 확인하고, 널리파이어 해시를 저장하며, 공개 작업을 실행합니다.
민감한 UX는 노트 처리입니다. 비밀값과 널리파이어를 키처럼 취급하세요. 분석, 로그, URL, 오류 보고서 또는 일반적인 서버 측 원격 측정(telemetry)에 넣지 마십시오. 노트가 유출되면 증명이 아무리 강력하더라도 프라이버시는 사라집니다.
도구 생태계의 발전
기본 암호학을 직접 코딩할 필요는 없습니다. 일반적인 방법은 고급 영지식 언어로 회로를 작성하고, Solidity 검증자를 생성한 다음, 앱 컨트랙트에서 해당 검증자를 호출하는 것입니다.
적절한 스택은 작업에 따라 다릅니다. snarkjs를 사용하는 Circom은 앱 수준 회로를 위해 오랫동안 확립된 방법입니다. Barretenberg를 사용하는 Noir는 개발자 친화적인 최신 방법입니다. Halo2와 gnark는 저수준 회로 라이브러리입니다. RISC Zero 또는 SP1과 같은 zkVM은 일반 프로그램을 증명하지만, 작은 맞춤형 회로보다 증명 비용이 더 많이 들 수 있습니다.
익명 멤버십의 경우, 자체 회로를 작성하기 전에 기존 프로토콜을 활용하세요. Semaphore는 그룹 멤버십과 널리파이어 기반의 이중 사용 방지 기능을 컨트랙트와 JavaScript 라이브러리로 패키징합니다. 비공개 투표 및 거버넌스의 경우, 담합 방지 속성을 추가하는 MACI가 특화된 방법입니다. 성숙한 프로토콜이 새로운 회로보다 더 안전한 경우가 많습니다.
증명만으로는 충분하지 않습니다
지갑 흐름에서 연결 고리가 유출되면 완벽한 증명이라도 실패합니다. 지갑 A에서 등록하고 나중에 지갑 A에서 행동하면, 지켜보는 누구나 트랜잭션을 연결할 수 있습니다. 행동하기 직전에 지갑 A에서 지갑 B로 자금을 조달하면, 해당 자금 조달 트랜잭션이 동일한 문제를 일으킵니다.
이것이 번들러와 페이마스터가 중요한 이유입니다. 실행 지갑은 새로워야 하며, 사용자가 행동과 분리하려는 지갑으로부터 ETH를 받을 필요가 없어야 합니다.
동일한 문제가 오프체인에도 존재합니다. 동일한 IP 주소, RPC 제공자 또는 세션에서 등록 및 실행 트랜잭션을 제출하면 회로가 제공하는 프라이버시가 약화될 수 있습니다. 프론트엔드는 분석, 로컬 스토리지 및 지원 로그를 통해 유출될 수 있습니다. 영지식 증명은 증명 내부의 값을 숨깁니다. 트랜잭션 주변의 모든 것을 숨기지는 않습니다.
공개 입력은 프라이버시 앱이 실패하는 또 다른 지점입니다. 회로에서 공개로 표시되거나, 이벤트로 발생하거나, 콜 데이터에 포함되거나, 컨트랙트에 의해 저장되는 모든 것은 볼 수 있습니다. Solidity 컨트랙트의 접근 제어만큼이나 신중하게 공개 입력을 검토하세요.
이것이 빌더에게 가져오는 변화
이더리움에서의 프라이버시는 실현 가능합니다. 빌더는 여러 요소를 결합하여 실제 애플리케이션을 구성할 수 있습니다. 스택은 비공개 증명문을 위한 회로, 증명 확인을 위한 검증자, 공개 규칙을 위한 앱 컨트랙트, 머클 데이터를 위한 인덱서, 그리고 연결 불가능한 제출 및 가스 후원을 위한 번들러와 페이마스터로 이루어집니다.
어려운 부분은 제품 설계, 키 관리, 메타데이터 위생, 감사, 그리고 익명성 세트를 키우는 것입니다. 이 중 하나라도 잘못되면 증명이 제공한 프라이버시는 사라집니다.
더 읽어보기
- 영지식 증명 (ethereum.org) (opens in a new tab)
- Semaphore 문서 (opens in a new tab)
- MACI 문서 (opens in a new tab)
- Circom 문서 (opens in a new tab)
- Noir 문서 (opens in a new tab)
- Halo2 책 (opens in a new tab)
- gnark 문서 (opens in a new tab)
- RISC Zero 문서 (opens in a new tab)
- SP1 문서 (opens in a new tab)
- EIP-4337: EntryPoint 컨트랙트를 통한 계정 추상화 (opens in a new tab)
페이지 최근 업데이트: 2026년 5월 28일