마지막 업데이트:
zk.money는 영국 기반의 개발사인 Aztec Labs가 Aztec Network 위에 구축한 오픈 소스 비수탁형 암호화폐 지갑으로, 사용자가 암호화폐를 비공개로 주고받을 수 있게 해줍니다. 이 지갑은 Ethereum 위의 프라이버시 중심 Layer 2인 Aztec Network에 자금을 비공개로 보유하므로, 시스템 내에서 이루어진 거래의 잔액, 금액, 발신자 및 수신자가 공용 체인에 공개되지 않습니다.[1][2] 사용자는 Ethereum에서 자금을 예치하고, zk.money 내에서 비공개로 이동시킨 후, 언제든지 Ethereum mainnet으로 다시 인출할 수 있습니다.[3]
zk.money는 자체 도메인의 웹 지갑 또는 로컬에서 실행되는 데스크톱 애플리케이션으로 사용할 수 있으며, 동일한 패스키를 통해 서로 다른 기기에서 동일한 지갑에 액세스할 수 있습니다.[1] 자금은 Ethereum에서 유입되어 zk.money 내부에서 비공개로 이동하며, 사용자가 원할 때마다 다시 이더리움으로 출금할 수 있습니다.[4] 트랜잭션은 전송되기 전 사용자의 기기에서 증명되므로 개인 키가 기기를 떠나지 않습니다.[3]
이 시스템은 이더리움과 Aztec Network에 상주하는 여러 구성 요소로 이루어져 있습니다: 불변의 온체인 smart contracts, Oxide라는 이름의 보안 및 마이그레이션 프로토콜, 그리고 웹 인터페이스 또는 데스크톱 앱입니다.[4] 이더리움 위의 완전 비공개 및 프로그래밍 가능한 네트워크로 설명되는 Aztec Network는 zk.money의 노트와 잔액이 궁극적으로 보관되는 곳입니다.[1] zk.money는 시스템 내부에서 이루어지는 결제에 대해 이더리움 가스비를 지불하지 않는다고 명시하고 있는 반면, 이더리움에서 zk.money로 보내는 예금은 Ethereum 가스비가 필요하며 모든 이더리움 트랜잭션이 공개되는 것과 마찬가지로 공개됩니다.[1]
이 지갑은 비수탁형이며 불변의 smart contracts에 의해 구동됩니다. Aztec Labs는 zk.money 지갑에 보유된 모든 암호화폐는 전적으로 사용자의 통제하에 있으며, 사용자 외에는 누구도 자금을 이동할 수 없고, 특권적인 관리자 역할이 없으며, 자금을 이동할 수 있는 관리자 키를 가진 중앙 집중식 zk.money 서버도 존재하지 않는다고 명시합니다.[1] 시스템 내의 개별 운영 역할이 중단되거나 서비스를 거부할 수 있지만, 기존 잔액은 여전히 출금할 수 있습니다.[3]
zk.money는 seed phrase를 사용하지 않으며 별도로 적어둘 키도 없습니다. 사용자의 두 키는 모두 패스키에서 파생됩니다.[3] 사용자가 로그인하면 지갑은 패스키에서 비밀 키를 파생하여 로그아웃할 때까지 브라우저 저장소에 암호화되지 않은 상태로 보관하므로, 새로고침, 새 탭 또는 브라우저 종료 시 패스키를 다시 요청하지 않습니다.[3] 문서에 따르면 비밀 키는 잔액과 내역을 표시할 수 있지만 자금을 이동할 수는 없습니다.[3] 계정을 백업한다는 것은 iCloud 키체인, Google 비밀번호 관리자 또는 1Password를 통해 패스키를 백업하는 것을 의미합니다. 하드웨어 보안 키에만 저장된 패스키는 백업이 없으며, 해당 키를 분실하면 지갑도 잃게 됩니다.[3] zk.money는 패스키 사본을 보유하지 않으며 에스크로도 없고, 모든 곳에서 패스키가 사라지면 누구도 계정을 복구할 수 없습니다.[1]
Oxide는 Aztec Network와 함께 실행되는 별도의 프로토콜로, 네트워크의 증명 시스템 내 취약점에 대비한 독립적인 두 번째 보안 계층을 제공합니다.[1] 이는 AWS Nitro Enclaves(호스트와 격리되어 코드가 실행되는 하드웨어 격리 환경인 신뢰 실행 환경(TEE)의 일종)를 기반으로 구축되었으며, 사용자가 Aztec Network 트랜잭션을 시뮬레이션하도록 함으로써 작동합니다.[1] Aztec Labs는 Oxide가 작업에 포함된 내용을 알지 못한 채 작업이 유효함을 증명하므로 제3자가 트랜잭션 세부 정보를 볼 수 없으며, Oxide의 신뢰 가정은 Aztec Network를 보호하는 zero-knowledge (ZK) 회로와 분리되어 있기 때문에 한 시스템의 결함이 다른 시스템을 손상시키지 않는다고 명시합니다.[4] 명시된 목적은 암호화 시스템의 버그에 대한 또 다른 방어 계층을 추가하는 것입니다.[4]
Oxide는 모든 역할에서 오픈 소스이며 허가 없이 이용 가능(permissionless)합니다. zk.money는 Oxide를 위한 기본 엔클레이브(enclave)와 리졸버(resolver)를 실행하지만, 누구든지 자체 엔클레이브와 리졸버를 실행하고 지갑을 그곳으로 연결할 수 있습니다.[1][3] 실제로 L2BEAT는 모든 출금 및 환불에 ZK 증명과 승인된 이미지를 실행하는 라이브 AWS Nitro 엔클레이브의 서명이 모두 필요하다고 언급합니다. 엔클레이브는 처리하는 작업을 복호화하고 읽습니다.[5]
오리지널 zk.money는 Aztec Connect에서 실행되는 프라이빗 탈중앙화 금융(DeFi) 애플리케이션이었습니다. Aztec Labs는 첫해에 zk.money가 75,000개 이상의 고유 지갑과 1억 달러 이상의 거래량을 달성했으며, 이는 프라이빗 암호화폐 전송에 대한 수요를 입증하는 초기 증거라고 밝혔습니다.[4] 이 애플리케이션은 2023년에 예금 접수를 중단하고 2024년 3월에 종료되었습니다.[3] Aztec Labs는 2023년의 서비스 종료가 프라이빗 전송의 실패가 아니라, 당시 존재하지 않았던 인프라가 필요했기 때문이라고 설명했습니다.[4]
그 인프라는 바로 Aztec 네트워크 자체였습니다. Aztec Labs는 zk.money와 같은 시스템이 대중적으로 확장될 수 있도록 돕는 탈중앙화 프라이버시 레이어인 이 네트워크를 구축하고 출시하는 데 3년이 걸렸으며, 네트워크가 가동됨에 따라 그 위에 오픈 소스 프라이버시 제품들을 출시하기 시작했다고 밝혔습니다.[4] 회사는 ZKPassport를 그러한 제품 중 하나로 언급했으며, 부활한 zk.money를 또 다른 사례로 제시했습니다.[4] L2BEAT는 2026년 10월 1일에 zk.money의 초기 전체 발견을 기록했습니다.[5]
지갑이 다시 돌아왔을 때, 이전 zk.money의 초기 사용자들에게 우선 접근 권한이 주어졌으며, 친구들과 자신의 태그를 공유함으로써 즉시 접근 권한을 얻을 수도 있었습니다.[4] 출시 후 몇 주 동안 팀은 스윕(sweep)되지 않던 예금 문제를 해결하여 묶여 있던 자금을 회수할 수 있게 했으며, 사용자가 소액의 팁을 지불하고 증명 대기열을 건너뛰어 5분 이내에 출금할 수 있는 빠른 출금 옵션을 추가했다고 밝혔습니다.[6] 2026년 10월 초, 프로젝트 측은 싱가포르에서 열린 token2049에 참석했으며, 대표자가 메인 이벤트와 프라이버시 서밋(Privacy Summit)에서 연설했다고 전했습니다.[6]
긴 16진수 주소를 복사하는 대신, 각 계정은 패스키로 보안이 유지되는 "yourname.zk.money"와 같은 인간이 읽을 수 있는 태그를 소유합니다.[4] 태그는 누구나 해당 태그로 결제할 수 있도록 설계상 공개되어 있지만, 태그를 안다고 해서 거래 내역이 공개되지는 않으며, 태그의 잔액과 내역은 타인에게 보이지 않습니다.[3] 태그는 선착순으로 제공되며, 팀에서 소수의 태그를 예약해 두었습니다. 예약된 태그는 해당 핸들과 정확히 일치하는 X 계정에서 공식 계정으로 메시지를 보낸 후에만 청구 링크를 통해 소유할 수 있습니다.[3] 기술적인 측면에서 태그는 공개적으로 Aztec 주소 및 키에 매핑되며 두 가지 목적을 수행합니다. Ethereum Name Service (ENS) 오프체인 조회를 통해 Layer 1 (L1) 입금 주소를 도출하고, 지갑이 온체인 레지스트리에서 Aztec 주소를 읽어 프라이빗 Layer 2 (L2) 전송 경로를 지정할 수 있게 합니다.[5]
입금은 SIPA라고 불리는 일회용 Layer 1 주소를 통해 이루어집니다. 누구나 어떤 지갑이나 거래소에서든 수취인의 입금 주소로 DAI, USDC 또는 USDT를 보낼 수 있으며, 자금은 자동으로 수취인의 프라이빗 잔액으로 통합됩니다. 입금되는 USDC와 USDT는 입금 시 Curve 3pool을 통해 DAI로 스왑됩니다.[3][5] 각 입금 주소는 일회용이며, 사용자는 입금 건이 서로 연결되지 않도록 매 결제 시마다 새로운 주소를 사용하도록 권장됩니다. SIPA를 재사용하면 해당 입금 내역들이 연결되기 때문입니다.[1][5] 주소를 직접 건네주는 것을 피하기 위해 사용자는 요청 링크를 보낼 수 있으며, ENS CCIP를 지원하는 Ethereum 지갑에서는 상대방이 bob.zk.money와 같은 태그를 입력하면 리졸버(resolver)가 그 뒤에 숨겨진 새로운 입금 주소를 도출합니다.[3]
zk.money는 두 가지 종류의 공유 가능한 링크를 지원합니다. 결제 링크(payment link)는 자금을 보유합니다. 발신자가 금액을 잠그고 링크를 공유하면, 자신의 패스키로 이를 청구하는 사람은 사전 계정 없이도 자금을 받게 됩니다. 각 결제 링크는 1일, 7일 또는 30일의 청구 기간과 즉시 열리는 환불 기간을 가집니다. 따라서 청구되지 않은 링크는 발신자가 언제든지 다시 회수할 수 있습니다. 링크는 청구와 환불이 동시에 이루어질 수 없으며, 두 결과 중 먼저 발생한 것이 최종 확정됩니다.[3] 요청 링크(request link)는 그 반대로, 누군가에게 결제를 요청하고 입금 주소를 제공하며 누군가 자금을 보내기 전까지는 자금을 보유하지 않습니다.[3] zk.money 내부의 결제는 최종적이며, 지갑은 확인 전에 확인된 수취인을 표시합니다. 완전히 신뢰할 수 없는 상대방의 경우, 청구되지 않은 자금이 발신자에게 돌아오는 결제 링크를 사용하는 것이 문서에서 권장됩니다.[3] 지갑은 종단간 암호화 메시징 네트워크인 XMTP를 사용하여 QR 코드나 링크로 추가된 연락처를 확인하고 결제 요청을 보냅니다.[5]
출시 당시 시스템은 내부 자산으로 DAI를 지원했으며, 모든 입금, 결제 및 출금은 초기에 $2,500 미만으로 제한되었습니다.[3][1] L2BEAT는 이러한 한도를 각각 2,583 DAI로 기록하고 있으며, 입금은 하루 동안 보충되는 50,000 DAI의 총 용량을 공유합니다.[5]
팀은 저축 금고(savings vaults), 은행 및 IBAN 지급, 프라이빗 Layer 2 계정 펀딩, 더 높은 한도를 해제하기 위한 ZKPassport 기반의 영지식 여권 증명, 공유 "팟(pots)" 및 그룹 청구서, 그리고 더 많은 패스키(passkey) 지원을 포함하여 zk.money를 통해 Aztec에서 가능해질 추가 기능들을 개략적으로 설명했습니다.[6] 이는 출시된 기능이 아니라 프로젝트 측에서 설명한 계획 단계의 내용입니다.
입금과 출금 시 이동하는 금액에서 소액의 수수료가 차감됩니다. 각 수수료의 일부는 zk.money를 사용하는 모든 사람의 네트워크 수수료를 충당하는 독립형 수수료 지불 계약(fee-paying contract)을 보충하는 데 사용되며, 이 덕분에 보장된 금액까지는 내부 활동이 무료로 제공됩니다. 나머지 수수료는 자금을 입출금할 때 발생하는 Ethereum gas 비용을 지불하는 데 사용됩니다.[3] 프로젝트 측은 현재 무료 내부 거래 보장이 하루 최대 100건까지 계정 데이터를 수집하지 않고 제공되며, 이 보장 범위는 변경될 수 있다고 명시하고 있습니다.[3] 입금 비용은 $0.35이며 출금 비용은 $0.20입니다.[3]
태그를 신청하는 비용은 $4.90이며, 수수료 지불 계약에 추가로 $0.10가 부과되어 첫 입금액에서 총 $5.00가 차감됩니다. 첫 입금은 USDC, USDT 또는 DAI로 최소 $15 이상이어야 합니다. 예를 들어 $15 DAI를 입금하면 수수료 차감 및 스왑 후 약 $10가 남게 됩니다.[3] 2024년에 종료된 이전 zk.money 시스템의 지갑 소유권을 증명하거나, 공유 링크를 통해 한 명의 사용자가 태그를 신청하게 한 사용자는 가입 과정에서 $4.90의 수수료를 면제받을 수 있습니다. 면제되는 경우에도 최소 $5 이상의 첫 입금이 필요하며, 사용자는 $0.60의 수수료를 지불하게 되어 $5 DAI 입금 시 $4.40가 남게 됩니다.[3] L2BEAT의 회계 기준에 따르면, 스윕(sweep) 시 0.25 DAI가 발생하며 이름을 신청할 때는 0.5 DAI가 발생합니다. 등록 비용은 스윕 수수료를 포함하여 기본적으로 5 DAI입니다. 포털은 Aztec 수수료를 후원하기 위해 각 입금 및 일반 출금에서 0.1 DAI를 가져가며, 후원을 받으려면 등록된 이름이나 바우처가 필요합니다.[5] 전용 펀더 계약(funder contract)은 포털의 자금 조달분을 수집하며, 누구나 이를 AZTEC으로 스왑하여 사용자의 레이어 2 수수료를 지불하는 L2 수수료 지불 계약에 Fee Juice로 브릿지할 수 있습니다.[5]
zk.money는 원장 내부에서 송신자, 금액, 그리고 입금과 출금 사이의 연결을 숨기지만, 이름, 입금 및 Ethereum으로의 출금은 설계상 공개됩니다.[5][4] L2BEAT의 분석은 관찰자에 따라 이 보호 수준을 다르게 평가합니다. 일반적인 공개 관찰자에게는 연결 프라이버시가 보존되는 것으로 보이지만, 이름을 등록하면 해당 이름이 자금 조달 지갑과 연결되고, 새로운 연락처로의 첫 번째 결제는 핸드셰이크를 통해 수취인을 드러내며, 등록 후 첫 번째 후원 트랜잭션은 계정과 연결됩니다.[5] 체인 분석가는 익명성 세트가 Aztec 내의 zk.money 사용자로 제한되어 있고 시스템 외부에서 이름으로 보내는 첫 번째 결제가 공개적으로 연결되어 있기 때문에 연결성을 위험에 빠뜨릴 수 있습니다.[5]
다른 공격자들에게는 위험이 더 커집니다. RPC 제공자, 릴레이어, 인덱서 또는 인터넷 서비스 제공자와 같은 네트워크 관찰자는 웹 트래픽, IP 주소, 타이밍 및 입출금이 포함된 blocks를 볼 수 있으며, 데스크톱 지갑은 Tor나 프록시 설정을 제공하지 않습니다.[5] 프로토콜 키나 평문을 보유한 특권 내부자(업그레이드 관리자, 시퀀서, 뷰 키 보유자, TEE 벤더, 호스팅된 증명자 또는 노트 레지스트리 운영자)는 입금과 수취인을 완전히 연결하여 송신자, 수취인, 금액 및 자산을 노출할 수 있습니다.[5] 현재 체인 데이터를 아카이빙하고 나중에 타원 곡선 암호학을 해독하는 미래의 공격자는 Ethereum에 게시된 과거의 노트와 결제 이벤트를 복호화할 수 있습니다.[5]
에스크로된 자금의 보안은 다중 증명 설계에 기반합니다. 포털은 Aztec이 출금 메시지를 증명하고 등록된 엔클레이브 서명자 중 한 명이 공동 서명한 후에만 자금을 해제합니다. 따라서 에스크로된 자금을 훔치려면 ZK 레이어와 엔클레이브 레이어가 모두 실패해야 하며, 둘 중 하나만 실패해도 프라이버시가 침해됩니다.[5] L2BEAT는 Aztec의 프라이빗 실행 또는 환불 증명이 건전하지 않고 엔클레이브 레이어도 실패하는 경우, 악성 지갑 코드가 유해한 서명을 얻거나 교체된 컨트랙트 목록이 향후 결제를 리다이렉션하는 경우, 또는 이름 컨트롤러가 향후 결제를 리다이렉션하는 경우 자금이 도난당할 수 있다고 요약합니다.[5] 사용자가 패스키를 분실하거나, 모든 AWS 인증 엔클레이브의 작동이 중단되거나, 리졸버 스크리닝이 외부 결제를 blocks하고 수취인이 입금 주소를 다시 도출할 도구가 없는 경우 자금을 잃을 수 있습니다.[5]
L2BEAT는 에스크로와 승인된 엔클레이브 이미지가 불변이기 때문에 출구 윈도우(exit window)를 무한으로 평가하지만, 프로토콜이 "자립성 테스트(walkaway test)"를 통과하지 못한다는 점에 주목합니다. 모든 중앙 집중식 참여자가 사라지면 사용자는 이를 완전히 사용할 수 없는데, 이는 출금 및 환불에 AWS Nitro에서 실행되는 승인된 이미지의 라이브 엔클레이브가 필요하고, 출시된 지갑들 또한 zk.money 서비스에 의존하기 때문입니다.[5] 이 프로젝트는 부분적으로 재현 가능한 것으로 평가됩니다. 컨트랙트, 데스크톱 지갑, 엔클레이브 및 회로 소스는 공개되어 있고 배포된 환불 및 리졸버 검증자는 게시된 회로와 일치하지만, 승인된 엔클레이브 바이너리는 아직 재현되지 않았으며 리졸버, 스냅샷 및 호스팅 지갑 릴리스 소스는 게시되지 않았습니다.[5] 프라이버시 등급은 zk.money Desktop v0.1.0을 기준으로 합니다. 호스팅된 웹 지갑은 방문할 때마다 zk.money에서 코드를 로드하므로 운영자가 뷰 키를 읽을 수 있는 실질적인 내부자가 됩니다. 반면, 검증된 주소를 고정하고 자체 도메인에서 서비스하며 AWS에서 승인된 엔클레이브를 실행하는 수정된 데스크톱 빌드와 같은 독립적인 설정은 가능하지만 테스트되지 않았습니다.[5]
zk.money는 2019년 Aztec이 176명의 참가자와 함께 공개적으로 진행한 BN254 커브 기반 KZG 커밋먼트를 위한 Aztec Ignition 신뢰할 수 있는 설정(trusted setup)에 의존하며, 이는 L2BEAT에서 가장 낮은 위험 등급으로 평가됩니다. 회로(circuits)는 UltraHonk (Plonk) 증명 시스템을 사용합니다.[5]
스크리닝은 온체인이 아닌 오프체인 서비스에서 적용됩니다. 지갑은 zk.money를 통해 Ethereum 주소를 Predicate로 보내 스크리닝을 진행하는 반면, 예치 SIPA에 직접 자금을 지원하는 방식은 이를 우회합니다. 릴레이어(relayer)는 토큰 이동에 대해 OFAC 제재 목록 및 선택적으로 Predicate를 대조하여 스크리닝하며, 직접 제출된 스윕(sweep) 및 출금은 릴레이어 스크리닝을 건너뜁니다.[5] 이름 해석기(name resolver)는 L2에서 수신자에게 알리기 전에 예치 주소와 자금 제공자를 OFAC 목록과 별도로 스크리닝합니다. 차단된 결제는 지갑이 알 수 없는 주소에 자금이 남게 되며, 이는 수신자 본인의 도구와 L1 승인을 통해서만 회수할 수 있습니다.[5]
Aztec 네트워크와 zk.money의 핵심 스마트 컨트랙트는 불변입니다.[5] Ethereum에서 ZkMoneyPortal 컨트랙트는 에스크로를 보유하며, 등록된 TEE 서명자가 공동 서명하고 증명된 Aztec L2-to-L1 메시지가 있을 때만 자금을 방출합니다. 누구든지 승인된 엔클레이브 이미지의 새로운 AWS Nitro 증명을 통해 TEE 서명자를 등록할 수 있으며, L2BEAT 조사 당시 두 명의 서명자가 등록되어 있었습니다.[5] 증명은 하드코딩된 AWS Nitro 루트 인증서만을 신뢰 앵커로 사용하는 NitroValidator 및 CertManager를 통해 검증됩니다.[5] 입금 및 등록 주소는 무허가 팩토리에 의해 결정론적 클론(deterministic clones)으로 배포되며, 포털은 Aztec의 정식 롤업이 변경되면 누구에 의해든 영구적으로 동결될 수 있습니다. 이 동결은 새로운 입금을 중단시키고 마지막으로 증명된 체크포인트에서 환불을 가능하게 하며, 이미 들어온 자금이 나가는 것을 막지는 않습니다.[5][3]
불변의 에스크로 로직에도 불구하고, 네이밍 및 서비스 인프라는 Aztec Labs의 통제 하에 남아 있습니다. 두 개의 Aztec Labs 외부 소유 계정(EOA)이 *.zk.money 네임스페이스를 관리합니다. 하나는 NameRegistry를 소유하며 등록, 메타데이터 및 리졸버(resolver) 컨트랙트를 교체하고 도메인 소유자를 변경할 수 있을 뿐만 아니라 입금 주소 구현을 승인할 수 있습니다. 다른 하나는 모든 이름 클레임을 승인하거나 거부하며, 맞춤형 등록 수수료에 서명하고 영구적인 수수료 수혜자를 추가할 수 있습니다.[5] 이러한 컨트롤러가 이름을 재할당하고 향후 지불 경로를 변경할 수 있으며, Aztec Labs가 ENS에서 zk.money를 소유하고(DNS 보유자가 회수 가능) 호스팅된 지갑, 데스크톱 릴리스 및 현재 두 지갑이 모두 사용하는 두 개의 서명되지 않은 컨트랙트 목록을 제어하기 때문에, L2BEAT는 이름 거버넌스와 지갑 배포를 시스템의 주요 중앙화 지점으로 식별합니다.[5] 이름 클레임에는 이름 차단 목록이 있는 폐쇄 소스 서버의 도메인 소유자 서명이 필요하며, 새 기기에서 계정에 액세스하려면 등록된 이름이 필요합니다.[5]
출금 및 환불은 포털의 등록된 TEE 서명자 역할을 하는 두 개의 추가 Aztec Labs EOA에 의해 공동 서명됩니다. 등록된 TEE 서명자의 서명이 없으면 포털에서 자금이 나갈 수 없습니다.[5] 지원 컨트랙트들이 메커니즘을 처리합니다. 출금 시 스왑(swap-on-withdraw) 에스크로는 고정된 슬리피지 범위 내에서 Curve 3pool 또는 Uniswap을 통해 DAI를 라우팅하여 USDC, USDT 또는 ETH로 출금액을 지급할 수 있게 합니다. 기본 지급 실행자는 수취인과 릴레이어 팁을 지급하며, 일련의 UltraHonk 검증자들은 하드코딩된 검증 키를 기준으로 환불 및 리졸버 회로를 확인합니다.[5] 입금 주소를 도출하는 리졸버 운영자는 비밀을 공유하기 때문에 지갑의 주소들을 연결할 수 있지만, 모든 조회는 사용자의 등록된 키 및 L2 주소와 일치하는 ZK 증명을 수반해야 하므로 운영자가 지불 경로를 변경하는 것을 방지하며, 사용자는 맞춤형 리졸버 운영자를 선택할 수 있습니다.[5]