Vitalik 신작: 은신 주소 불완전 가이드
원문 제목:An incomplete guide to stealth addresses
저자:Vitalik Buterin
편집:Karen,Foresight News
현재 이더리움 생태계에서 가장 큰 도전 중 하나는 프라이버시입니다. 기본적으로 공공 블록체인에 들어가는 모든 것은 공개적이며, 이는 자산과 거래 활동뿐만 아니라 ENS 도메인 이름, POAP, NFT 및 영혼 결합 토큰 등을 포함합니다. 이더리움 애플리케이션을 사용하면 많은 활동이 다른 사람에게 공개적으로 보여지고 분석될 수 있습니다.
우리는 이러한 상황을 개선할 필요가 있습니다. 그러나 지금까지 프라이버시 개선에 대한 논의는 주로 특정 사용 사례, 즉 ETH 및 주요 ERC20 토큰의 프라이버시 보호 전송에 집중되어 있었습니다. 이 글에서는 이더리움의 프라이버시 상태를 개선할 수 있는 다양한 도구의 메커니즘과 사용 사례를 설명할 것입니다. 즉, "은신 주소"(stealth addresses) 개념입니다.
은신 주소 시스템이란 무엇인가?
가정해 보겠습니다. 앨리스(Alice)는 밥(Bob)에게 자산을 전송하고 싶어합니다. 이는 일정량의 암호화폐(예: 1 ETH, 500 RAI)일 수도 있고, NFT일 수도 있습니다. 밥이 자산을 받을 때, 그는 다른 사람들이 그 자산의 수신자가 자신이라는 것을 알기를 원하지 않습니다. 전송이 발생했다는 사실을 숨기는 것은 불가능하지만, 수신자가 누구인지 숨기는 것은 더 가능할 수 있습니다.
앨리스와 밥이 더 원해야 하는 것은, 밥이 앨리스(또는 ENS 도메인 지원)에게 결제를 받을 수 있는 "주소"를 인코딩하여 보내는 결제 프로세스 시스템입니다. 이 정보만으로도 앨리스(또는 다른 누구든지)가 그에게 자산을 보낼 수 있으며, 이는 현재의 결제 작업 흐름과 거의 완전히 동일합니다.
이러한 프라이버시는 Tornado Cash가 제공하는 프라이버시와는 완전히 다르다는 점에 유의해야 합니다. Tornado Cash는 ETH 또는 주요 ERC-20과 같은 주요 대체 자산의 전송을 숨길 수 있지만(자주 자신에게 비공식적으로 전송하는 데 사용됨), 잘 알려지지 않은 ERC20 전송에 프라이버시를 추가하는 데 매우 취약하며, NFT 전송에 대한 프라이버시를 전혀 제공하지 않습니다.
위에서 언급한 암호화폐로 결제하는 일반적인 작업 흐름은 프라이버시를 증가시킵니다. 즉, 아무도 자산 수신자가 밥이라는 것을 알 수 없으며, 작업 흐름은 변경되지 않습니다.
은신 주소는 앨리스나 밥이 생성할 수 있는 주소이지만, 오직 밥만이 이를 제어할 수 있습니다. 밥은 지출 키(spending key)를 생성하고 이를 비밀로 유지한 다음, 해당 키를 사용하여 은신 메타 주소(stealth meta-address)를 생성합니다. 그는 이 메타 주소를 앨리스에게 전달합니다(또는 ENS에 등록합니다). 앨리스는 이 메타 주소에 대해 계산을 수행하여 밥의 은신 주소를 생성할 수 있습니다. 그런 다음 앨리스는 자신이 보내고자 하는 자산을 이 주소로 보낼 수 있으며, 밥은 이 자산을 완전히 제어합니다. 전송 과정에서 앨리스는 체인에 추가적인 암호화 데이터를 게시합니다(임시 공개 키), 이를 통해 밥이 이 주소가 자신에게 속한다는 것을 발견할 수 있도록 돕습니다.
다른 관점에서 보면, 은신 주소는 밥과 동일한 프라이버시 속성을 제공하며, 각 거래마다 새로운 주소를 생성하지만 밥의 어떤 상호작용도 필요하지 않습니다.
은신 주소 솔루션의 전체 작업 흐름은 다음과 같습니다:
밥은 자신의 루트 지출 키(m)와 은신 메타 주소(M)를 생성합니다.
밥은 ENS 기록을 추가하여 (M)를 bob.eth의 은신 메타 주소로 등록합니다.
앨리스가 밥의 주소가 bob.eth라는 것을 알고 있다고 가정합니다. 앨리스는 ENS에서 밥의 은신 메타 주소(M)를 조회합니다.
앨리스는 자신만 아는 임시 키를 생성하며, 이는 단 한 번만 사용할 수 있습니다(특정 은신 주소를 생성하기 위해).
앨리스는 알고리즘을 사용하여 자신의 임시 키와 밥의 메타 주소를 결합하여 은신 주소를 생성합니다. 이제 그녀는 이 주소로 자산을 보낼 수 있습니다.
앨리스는 또한 자신의 임시 공개 키를 생성하고 이를 임시 공개 키 등록소에 게시합니다(이는 자산을 이 은신 주소로 처음 전송하는 거래와 동일한 거래에서 완료할 수 있습니다).
밥이 자신의 은신 주소를 발견하기 위해서는, 밥이 임시 공개 키 등록소를 스캔하여 마지막 스캔 이후에 누군가 게시한 모든 임시 공개 키 목록을 찾아야 합니다.
각 임시 공개 키에 대해, 밥은 자신의 루트 지출 키와 결합하여 은신 주소를 생성하고, 해당 주소에 자산이 있는지 확인합니다. 만약 있다면, 밥은 해당 주소의 지출 키를 계산하고 이를 기억합니다.
이 모든 것은 암호학적 속임수의 두 가지 용도에 의존합니다. 첫째, 우리는 공유 비밀(shared secret)을 생성하기 위한 알고리즘 쌍이 필요합니다: 하나의 알고리즘은 앨리스의 임시 키와 밥의 메타 주소를 사용하고, 다른 알고리즘은 밥의 루트 지출 키와 앨리스의 임시 공개 키를 사용합니다. 이는 여러 방법으로 수행할 수 있으며; Diffie-Hellman 키 교환은 현대 암호학 분야의 성과 중 하나로, 이를 정확히 구현합니다.
그러나 공유 비밀만으로는 충분하지 않습니다. 만약 우리가 단순히 공유 비밀로부터 개인 키를 생성한다면, 앨리스와 밥 모두 이 주소에서 소비할 수 있습니다. 우리는 또한 키 블라인딩 메커니즘을 추가했습니다: 알고리즘 쌍 중 하나에서 밥은 공유 비밀을 자신의 루트 지출 키와 결합할 수 있고, 앨리스는 공유 비밀을 밥의 메타 주소와 결합할 수 있습니다. 이렇게 하면 앨리스는 은신 주소를 생성할 수 있고, 밥은 해당 은신 주소에 대한 지출 키를 생성할 수 있으며, 이 모든 것이 은신 주소와 밥의 메타 주소 간에 공개 링크를 생성할 필요 없이 이루어집니다.
타원 곡선 암호학을 사용한 은신 주소 숨기기
타원 곡선 암호학을 사용한 은신 주소는 처음에 Peter Todd가 2014년 비트코인 배경에서 도입했습니다. 이 기술의 작동 원리는 다음과 같습니다:
· 밥은 키(m)를 생성하고 M = G * m을 계산합니다. 여기서 G는 타원 곡선의 공인 생성점입니다. 은신 메타 주소는 (M)입니다.
· 앨리스는 임시 키(r)를 생성하고 임시 공개 키 R = G * r을 게시합니다.
· 앨리스는 공유 비밀 S = M * r을 계산할 수 있으며, 밥도 동일한 공유 비밀 S = m * R을 계산할 수 있습니다.
· 일반적으로 비트코인과 이더리움(올바르게 설계된 ERC-4337 계정 포함)에서 주소는 해당 주소에서 발생하는 거래를 검증하는 데 사용되는 공개 키의 해시를 포함합니다. 따라서 공개 키를 계산하면 주소를 계산할 수 있습니다. 공개 키를 계산하기 위해 앨리스 또는 밥은 P = M + G * hash(S)를 계산할 수 있습니다.
· 해당 주소의 개인 키를 계산하기 위해, 밥은 p = m + hash(S)를 계산할 수 있습니다.
이것은 위의 모든 요구 사항을 충족하며, 매우 간단합니다.
실제로 EIP가 이더리움에 은신 주소 표준을 정의하려고 시도했으며, 이는 이 방법을 지원하고 사용자에게 다른 방법을 개발할 수 있는 공간을 제공합니다(예: 밥이 별도의 지출 및 조회 키를 가지거나, 양자 안전성을 구현하기 위해 다른 암호학을 사용하는 것). 이제 당신은 은신 주소가 그리 어렵지 않다는 것을 생각할 수 있습니다. 이론적 지식은 확고하며, 채택은 단지 구현 세부 사항일 뿐입니다. 그러나 문제는 실제로 효과적인 구현이 몇 가지 중요한 구현 세부 사항을 통해 이루어져야 한다는 것입니다.
은신 주소와 거래 수수료 지불
누군가 당신에게 NFT를 보냈다고 가정해 보겠습니다. 당신이 프라이버시를 보장하고 싶다면, 그들은 당신이 제어하는 은신 주소로 그것을 보내야 합니다. 체인에서 임시 공개 키를 스캔하면, 당신의 지갑이 자동으로 해당 주소를 발견합니다. 이제 당신은 NFT의 소유권을 자유롭게 증명하거나 다른 사람에게 양도할 수 있습니다. 그러나 한 가지 문제가 있습니다. 해당 계정의 ETH 잔액이 0이므로 거래 수수료를 지불할 수 없습니다. 심지어 ERC-4337 토큰 지불자도 작동하지 않습니다. 왜냐하면 그것들은 대체 가능한 ERC20 토큰에만 적용되기 때문입니다. 그리고 당신은 주 지갑에서 그것으로 ETH를 보낼 수 없습니다. 그렇게 하면 공개적으로 볼 수 있는 링크가 생성되므로 프라이버시가 사라집니다.
이 문제를 해결하는 간단한 방법이 있습니다: ZK-SNARKs를 사용하여 자금을 이동하여 수수료를 지불하는 것입니다. 그러나 이렇게 하면 많은 Gas를 소모하게 되며, 단일 전송만으로도 수십만 Gas를 추가로 소모하게 됩니다.
보다 영리한 방법 중 하나는 전문 거래 집합기(MEV 용어에서의 검색자 searchers)를 신뢰하는 것입니다. 이러한 집합기는 사용자가 체인에서 거래를 지불하는 데 사용할 수 있는 "티켓" 세트를 구매하기 위해 한 번 지불할 수 있도록 허용합니다. 사용자가 다른 내용이 없는 은신 주소에서 NFT를 소비해야 할 때, 그들은 집합기에게 그 중 하나의 티켓을 제공하고, Chaumian 블라인드 방식으로 인코딩합니다. 이는 1980년대와 1990년대에 제안된 중앙 집중식 프라이버시 보호 전자 현금 계획에서 사용된 원래 프로토콜입니다. 검색자는 티켓을 수락하고 거래를 무료로 그들의 번들에 포함시키며, 거래가 블록에 성공적으로 수락될 때까지 반복합니다.
은신 주소와 지출 및 조회 키 분리
밥이 모든 작업을 수행할 수 있는 주 "루트 지출 키" 하나만 있는 것이 아니라, 별도의 루트 지출 키와 조회 키를 원한다고 가정해 보겠습니다. 이 조회 키는 밥의 모든 은신 주소를 볼 수 있지만, 지출할 수는 없습니다.
타원 곡선 세계에서, 이는 매우 간단한 암호 기술을 사용하여 해결할 수 있습니다:
· 밥의 메타 주소(M)는 이제 (K, V)의 형태로, G * k와 G * v를 인코딩합니다. 여기서 k는 지출 키, v는 조회 키입니다.
· 공유 키는 이제 S = V * r = v * R입니다. 여기서 r은 여전히 앨리스의 임시 키이고, R은 여전히 앨리스가 게시한 임시 공개 키입니다.
· 은신 주소의 공개 키는 P = K + G * hash(S)이며, 개인 키는 p = k + hash(S)입니다.
첫 번째 단계(공유 비밀 생성)는 조회 키를 사용하고, 두 번째 단계(앨리스와 밥의 병렬 알고리즘으로 은신 주소 및 그 개인 키 생성)는 루트 지출 키를 사용합니다.
이는 많은 사용 사례를 가지고 있습니다. 예를 들어, 밥이 POAP를 수신하고 싶다면, 밥은 그의 POAP 지갑(또는 심지어 덜 안전한 웹 인터페이스)에 조회 키를 제공하여 체인을 스캔하고 그의 모든 POAP를 볼 수 있도록 할 수 있습니다. 이 경우, POAP를 소비할 권한을 이 인터페이스에 제공할 필요가 없습니다.
은신 주소와 쉬운 스캔
전체 임시 공개 키 집합을 더 쉽게 스캔하기 위한 한 가지 기술은 각 임시 공개 키에 뷰 태그(view tag)를 추가하는 것입니다. 위의 메커니즘에서 이를 수행하는 한 가지 방법은 뷰 태그를 공유 키의 한 바이트로 만드는 것입니다(예: S 모듈로 256의 x 좌표 또는 hash(S)의 첫 번째 바이트).
이렇게 하면 밥은 각 임시 공개 키에 대해 공유 키를 계산하기 위해 한 번의 타원 곡선 곱셈만 수행하면 되며, 뷰 태그 덕분에 스캔이 더 쉬워집니다.
은신 주소와 양자 안전성
위의 솔루션은 타원 곡선에 의존하지만, 이 솔루션이 잘 작동하더라도 불행히도 양자 컴퓨터의 공격에 취약합니다. 우리는 양자 안전 알고리즘으로 전환해야 합니다. 두 가지 자연스러운 후보가 있습니다: 타원 곡선 동형 및 격자(lattices).
타원 곡선 동형은 매우 다른 타원 곡선 기반의 수학적 구조로, 선형 특성을 가지고 있어 우리가 위에서 수행한 것과 유사한 암호 기술을 사용할 수 있게 해주지만, 양자 컴퓨터의 이산 로그 공격에 취약할 수 있는 순환 군을 피하는 방식으로 교묘하게 설계되었습니다.
동형 기반의 주요 약점은 그 복잡한 기본 수학과 이러한 복잡성 아래 숨겨진 공격의 위험입니다. 지난해 일부 동형(암호학) 기반 프로토콜이 공격을 받았지만, 다른 프로토콜은 여전히 안전합니다. 동형의 주요 장점은 상대적으로 작은 키 크기와 다양한 타원 곡선 방법을 직접 이식할 수 있는 능력입니다.
CSIDH의 3-동형
격자(lattices)는 매우 다른 암호 구조로, 타원 곡선 동형보다 간단한 수학에 의존하며, 매우 강력한 작업을 수행할 수 있습니다(예: 완전 동형 암호화). 은신 주소 솔루션은 격자 위에 구축될 수 있지만, 가장 잘 설계된 솔루션이 무엇인지에 대한 질문은 여전히 남아 있습니다. 그러나 격자 기반 구조는 종종 더 큰 키 크기를 가집니다.
완전 동형 암호화, 격자의 응용. FHE는 또한 은신 주소 프로토콜을 돕는 다른 방식으로 사용될 수 있습니다: 밥이 자신의 조회 키를 공개하지 않고도 체인 전체에서 자산이 포함된 은신 주소를 확인하는 계산을 아웃소싱할 수 있도록 돕습니다.
세 번째 방법은 일반적인 블랙 박스 원리를 사용하여 은신 주소 솔루션을 구축하는 것입니다. 이 솔루션의 공유 키 생성 부분은 키 교환으로 직접 매핑되며, 이는 공개 키 암호 시스템의 중요한 구성 요소입니다. 더 어려운 부분은 앨리스가 은신 주소만 생성하고(지출 키가 아닌) 밥이 지출 키를 생성하는 병렬 알고리즘을 만드는 것입니다.
불행히도, 공개 키 암호 시스템을 구축하는 데 필요한 것보다 더 간단한 구성 요소를 사용하여 은신 주소를 구축할 수는 없습니다. 간단한 증명은 은신 주소 솔루션을 사용하여 공개 키 암호 시스템을 구축할 수 있다는 것입니다. 만약 앨리스가 밥에게 메시지를 암호화하고 싶다면, 그녀는 N개의 거래를 보낼 수 있습니다. 각 거래는 밥의 은신 주소 중 하나로 보내지거나 그녀 자신의 은신 주소로 보내지며, 밥은 어떤 거래를 수신했는지 확인하여 메시지를 읽을 수 있습니다. 이는 중요합니다. 수학적 증명에서 해시만으로는 공개 키 암호화를 수행할 수 없지만, 해시만으로는 제로 지식 증명을 수행할 수 있습니다. 따라서 은신 주소는 단순히 해시만으로는 완성될 수 없습니다.
이는 상대적으로 간단한 구성 요소를 사용하는 방법입니다: 제로 지식 증명은 해시와(키 숨김) 공개 키 암호화로 구성될 수 있습니다. 밥의 메타 주소는 공개 암호화 키와 해시 h = hash(x)의 조합이며, 그의 지출 키는 해당하는 복호화 키와 x의 조합입니다. 은신 주소를 생성하기 위해, 앨리스는 값을 c를 생성하고, 밥이 읽을 수 있는 c를 암호화하여 그녀의 임시 공개 키로 게시합니다. 해당 주소 자체는 ERC-4337 계정이며, 거래를 검증하기 위해 제로 지식 증명을 요구하여 거래를 검증합니다. 이는 값 x와 c의 소유권을 증명하여 k = hash(hash(x), c) (여기서 k는 계정 코드의 일부입니다). x와 c를 알면, 밥은 주소와 코드를 스스로 재구성할 수 있습니다.
(c)의 암호화는 밥 외의 다른 누구에게도 어떤 정보도 제공하지 않으며, (k)는 해시로, c에 대한 거의 모든 정보를 드러내지 않습니다. 지갑 코드 자체는 (k)만 포함하고, (c)가 비공개이므로 (k)는 (h)로 추적할 수 없습니다.
그러나 이는 STARK를 필요로 합니다. 결국, 나는 후량자 이더리움 세계가 많은 STARK의 응용을 포함할 가능성이 높다고 생각하며, 따라서 나는 여기서 설명한 것처럼 모든 STARK를 조합하여 공간을 절약하는 재귀 STARK를 제안합니다.
은신 주소와 사회적 복구 및 다중 L2 지갑
오랫동안 나는 사회적 복구 지갑에 관심이 많았습니다. 사회적 복구 지갑은 다중 서명 메커니즘을 가지고 있으며, 그 키는 기관, 다른 장치 및 친구의 조합 간에 공유될 수 있습니다. 만약 당신이 주요 키를 잃어버린다면, 대부분의 키는 계정 접근을 복구할 수 있게 해줍니다.
그러나 사회적 복구 지갑은 은신 주소와 잘 결합되지 않습니다. 만약 당신이 계정을 복구해야 한다면(그것을 제어하는 개인 키를 변경해야 함), 당신은 N개의 은신 지갑의 계정 검증 논리를 변경하기 위한 몇 가지 단계를 수행해야 하며, 이는 N개의 거래가 필요하여 높은 비용, 편의성 및 프라이버시 비용을 초래합니다.
사회적 복구와 여러 L2 프로토콜 간의 상호 작용에도 유사한 우려가 있습니다. 만약 당신이 Optimism, Arbitrum, StarkNet, Scroll, Polygon에 계정을 가지고 있고, 확장성 이유로 여러 개의 병렬 인스턴스가 있으며, 각 인스턴스에 계정이 있다면, 키를 변경하는 것은 매우 복잡한 작업이 될 수 있습니다.
여러 체인에서 여러 계정의 키를 변경하는 것은 큰 작업입니다.
어쩌면 당신은 일부 자동화 소프트웨어를 사용하여 두 주의 시간 간격으로 자산을 새로운 은신 주소로 무작위 간격으로 전송하여 시간 기반 연관의 유효성을 낮출 수 있습니다. 그러나 이는 결코 완벽하지 않습니다. 또 다른 방법은 감시자 간에 루트 키를 비밀 공유하는 것입니다. 그러나 이는 감시자가 당신의 계정을 복구하는 데 도움을 줄 수 있는 능력을 제거하므로 장기적인 위험이 있습니다.
보다 복잡한 방법은 제로 지식 증명을 포함합니다. 이는 여러 계정이, 심지어 여러 L2 프로토콜을 넘어서, 어디선가(기본 체인이나 특정 L2에서) 단일 k 값으로 제어되도록 허용합니다. 이 값이 변경되면 모든 계정의 소유권이 변경되며, 이 모든 것이 당신의 여러 계정 간의 연결을 누설하지 않습니다.
결론
현재 기본적인 은신 주소는 빠르게 구현할 수 있으며, 이더리움에서 사용자들의 프라이버시를 상당히 향상시킬 수 있습니다. 나는 프라이버시와 관련된 다른 이유로 인해 지갑이 더 원주율적인 다중 주소 모델로 전환하기 시작해야 한다고 생각합니다(예: 당신이 상호작용하는 각 애플리케이션에 대해 새로운 주소를 생성하는 것이 하나의 선택일 수 있습니다).
그러나 은신 주소는 사회적 복구의 어려움과 같은 일부 장기적인 사용성 문제를 가져옵니다. 장기적으로 이러한 문제는 해결할 수 있지만, 은신 주소 생태계는 실제로 제로 지식 증명에 심각하게 의존하는 것으로 보입니다.