스텔스 주소란? 일회용 주소의 작동 원리

· 읽는 데 6분

스텔스 주소를 쓰면 주소 하나만 공개해도 나에게 오는 결제가 매번 체인의 새로운 곳에 도착합니다. 이 가이드는 그 원리와 조회 키, 지출 키가 각각 하는 일, 그리고 지갑이 자기 결제를 찾는 방법을 Blocknet을 예시로 설명합니다.

스텔스 주소란 무엇입니까?

짧은 답변

스텔스 주소는 블록체인에 절대 나타나지 않는 공개 주소입니다. 지출 키와 조회 키라는 두 개의 공개 키를 담고 있습니다. 결제할 때마다 송신자의 지갑은 이 키들을 새 난수와 결합해, 수신자만 알아보고 쓸 수 있는 일회용 주소를 만듭니다.

공개 원장에서 일반 주소는 받는 모든 결제에 나타납니다. 표준 Bitcoin 주소가 이런 방식입니다. 주소를 아는 사람은 누구나 각 결제를 조회하고 합계를 낼 수 있습니다. 그래서 많은 Bitcoin 지갑이 결제마다 새 주소를 발급합니다.

스텔스 주소는 이 일을 대신 해 줍니다. 웹사이트나 프로필에, 또는 @name으로 주소 하나를 공유하면, 송신자마다 그 주소에서 서로 다른 일회용 주소를 만들어 냅니다. 나에게 온 결제 10건은 서로는 물론 공유한 주소와도 눈에 보이는 공통점이 없는 출력 10개가 됩니다. 주고받는 과정도 필요 없습니다. 송신자가 공개 주소와 난수만으로 혼자 일회용 주소를 계산합니다.

스텔스 주소는 어디에서 왔습니까?

Monero, Blocknet 등 여러 코인이 쓰는 일회용 주소 설계는 2013년 10월 17일자로 Nicolas van Saberhagen이 쓴 CryptoNote v2.0 백서로 거슬러 올라갑니다. 백서는 이 아이디어를 “연결할 수 없는 결제(unlinkable payments)“라고 부르며, 송신자가 수신자의 주소로 “일회용 공개 키”를 생성하는 방식을 설명합니다. Monero 문서는 스텔스 주소를 송신자가 “수신자를 대신해 트랜잭션마다 무작위 일회용 주소”를 만들 수 있게 하는 것이라고 설명합니다.

이 아이디어는 프라이버시 코인 너머로 퍼졌습니다. Bitcoin의 BIP 352 “Silent Payments”는 고정된 Bitcoin 주소로 체인에서 연결할 수 없는 결제를 받게 해 주며, 2022년에 만들어진 Ethereum의 ERC-5564는 Ethereum 계정용 스텔스 주소를 표준화합니다. 두 체인에서는 모두 선택해서 쓰는 기능입니다. Blocknet에서는 모든 결제가 일회용 주소를 사용합니다.

스텔스 주소는 어떻게 작동합니까?

짧은 답변

송신자는 난수 r을 고르고, 트랜잭션에 R = r·G를 게시하며, r을 수신자의 공개 조회 키와 결합해 공유 비밀을 만듭니다. 이 비밀을 공개 지출 키에 더하면 일회용 키가 됩니다. 수신자는 R과 자신의 개인 조회 키로 같은 비밀을 다시 만들 수 있으므로, 결제를 찾을 수 있는 것은 수신자뿐입니다.

지갑에는 키 쌍이 두 개 있습니다. 각 개인 키는 비밀 숫자(지출용 s, 조회용 v)이고, 각 공개 키는 그 숫자에 고정된 곡선 위의 점 G를 곱한 값입니다. 주소는 두 공개 키 S와 V일 뿐입니다. 전체 과정은 다음과 같습니다.

Receiver publishes:   S = s·G   and   V = v·G
Sender picks r:       R = r·G                 (stored in the transaction)
One-time key:         P = H(r·V)·G + S
Receiver checks:      H(v·R)·G + S == P       (true because r·V = v·R)
Key to spend it:      x = H(v·R) + s          (so P = x·G)

핵심은 디피-헬만 키 교환입니다. 송신자는 r·V를, 수신자는 v·R을 계산하는데, 둘 다 r·v·G이므로 같은 점에 도달합니다. 다른 누구도 r이나 v를 모르므로 이 점을 계산할 수 없습니다. 이 점을 해시(H)하면 공유 비밀이 되며, 일회용 키 P는 이 비밀을 점으로 바꿔 공개 지출 키에 더한 것입니다.

스캔할 때 지갑은 R과 개인 조회 키로 비밀을 다시 계산하고, 그것이 P를 만들어 내는지 확인합니다. 그렇다면 그 출력은 내 것입니다. 이를 쓰려면 지갑이 같은 비밀을 개인 지출 키에 더해 그 출력 하나에 대한 개인 키 x를 얻습니다.

Blocknet은 Curve25519 위의 Ristretto 그룹에서 이 설계를 따르며, Blocknet 전용 도메인 태그와 함께 SHA-256으로 해시합니다. 또한 트랜잭션 안에서 각 출력의 위치를 해시에 섞으므로, 한 트랜잭션에서 같은 사람에게 가는 두 출력도 서로 무관한 키를 받습니다. 같은 공유 비밀로 출력 금액을 숨기는 블라인딩 값과 메모를 암호화하는 키도 만들어지며, 수신자는 이렇게 금액과 메모를 모두 읽습니다.

조회 키와 지출 키는 무엇을 합니까?

키를 나누면 두 단계의 접근 권한이 생깁니다.

이렇게 나뉘어 있기 때문에 조회 전용 지갑이 가능합니다. Blocknet 명령줄 지갑에서 viewkeys는 조회 키로 별도의 지갑 파일을 만듭니다. 지갑 도움말은 이 파일을 “모니터링은 할 수 있지만 지출은 할 수 없는” 파일로, “다른 머신에서 조회 전용으로 접근하고 싶을 때” 유용하다고 설명합니다. 실행하면 지갑은 무엇을 만드는지 설명합니다.

# View Keys
  This will create a view-only wallet that can monitor incoming
  funds but CANNOT spend. Anyone with this file can see your
  balance and transaction history.

조회 전용 지갑은 회계사처럼 트랜잭션 내역을 보여 줘도 되는 사람에게만 주거나, 자신의 두 번째 컴퓨터에 두십시오. 어느 쪽이든 지출 키는 믿을 수 있는 머신에 둔 채로 자금이 들어오는 것을 지켜볼 수 있습니다.

지갑은 결제를 어떻게 찾습니까?

일회용 키는 주소와 무관해 보이기 때문에, 체인의 어떤 출력이 내 것인지 표시하는 정보는 없습니다. 지갑이 직접 확인합니다. 새 블록의 모든 트랜잭션에 대해 R을 가져와 개인 조회 키로 공유 비밀을 계산하고, 각 출력을 위의 공식으로 검사합니다. 지갑이 동기화할 때 하는 일이 바로 이것입니다.

Blocknet의 스캐너는 이 과정을 빠르게 처리합니다. 비용이 큰 단계인 R과 조회 키의 곱셈은 트랜잭션당 한 번만 실행되고, 그 결과로 트랜잭션 안의 모든 출력을 검사합니다. 출력이 일치하면 지갑은 금액을 복호화하고 출력의 페더슨 커밋먼트와 대조해 확인한 뒤 잔액에 더합니다.

스캔 덕분에 복구도 간단합니다. Blocknet의 두 키 쌍은 모두 12단어 복구 시드에서 나오므로, 새 컴퓨터에서 시드를 복원하면 키가 다시 만들어지고, 지갑이 체인을 다시 스캔해 내 출력을 모두 찾습니다. Blocknet 지갑 가이드에서 시드를 백업하고 복원하는 방법을 보여 줍니다.

Blocknet의 스텔스 주소

Blocknet에서 스텔스 주소는 그냥 내 주소입니다. 공개 지출 키, 공개 조회 키, 4바이트 체크섬을 base58로 인코딩한 것으로 길이는 92자 또는 93자입니다. 트랜잭션 형식에 투명 모드가 없으므로 나에게 오는 모든 결제가 이 방식을 씁니다. 블록 보상도 일회용 키로 가므로, 솔로 채굴자의 코인베이스 출력도 같은 스캔으로 찾습니다.

스텔스 주소는 Blocknet의 다른 프라이버시 기능과 함께 동작합니다. 크기 16의 링은 지출이 어느 출력에서 나왔는지를, 커밋먼트는 금액을, Dandelion++는 트랜잭션이 네트워크에 들어온 위치를 숨깁니다. Blocknet 프라이버시 가이드에서 각 계층을 설명합니다.

이름과도 함께 쓸 수 있습니다. @yourname 같은 Blocknet ID 짧은 이름은 공개적으로 내 주소에 연결되므로, 송신자는 blocknet.id에서 이름을 주소로 변환할 수 있습니다. 결제 자체는 여전히 새로운 일회용 키로 가므로, 이름으로는 내가 무엇을 받았는지 전혀 알 수 없습니다.

그래서 짧은 이름은 채굴 수령 주소로 쓰기에 편리합니다. seine를 실행하고 프롬프트에 주소나 @yourname을 입력한 뒤 기본 풀인 bntpool.com을 선택하십시오. 나머지는 채굴 가이드에서 다루며, 지갑은 위에서 설명한 조회 키 스캔으로 채굴한 BNT를 찾습니다.

자주 묻는 질문

스텔스 주소와 일회용 주소는 같은 것입니까?

하나의 시스템을 이루는 두 부분입니다. 스텔스 주소는 공개 지출 키와 공개 조회 키로 이루어진, 내가 공개하는 주소입니다. 일회용 주소는 송신자가 결제 한 건을 위해 스텔스 주소에서 새로 만들어 내는 키입니다. 체인에는 일회용 주소만 나타나며, 공개한 주소는 절대 나타나지 않습니다.

누군가 내 스텔스 주소를 알면 잔액을 볼 수 있습니까?

아닙니다. 공개한 주소를 안다고 해서 결제를 찾을 수는 없습니다. 각 결제는 그 주소와 무관해 보이는 일회용 키로 들어오기 때문입니다. 결제를 찾으려면 개인 조회 키가 필요하므로, 받은 내역을 나열할 수 있는 것은 내 지갑뿐입니다. Blocknet에서는 금액도 숨겨지므로 출력 자체에도 금액이 표시되지 않습니다.

누군가 내 개인 조회 키를 가지면 무엇을 할 수 있습니까?

개인 조회 키를 가진 사람은 나에게 온 결제를 찾고 그 금액과 메모를 읽을 수 있습니다. 지출에는 개인 지출 키가 필요하므로 아무것도 쓸 수는 없습니다. Blocknet에서는 viewkeys 명령어로 조회 키를 조회 전용 지갑으로 만들 수 있으며, 두 번째 컴퓨터에서 자금을 지켜볼 때 편리합니다. 믿을 수 있는 사람에게만 공유하십시오.

Blocknet에서 스텔스 주소를 따로 켜야 합니까?

아닙니다. 트랜잭션 형식에 투명 모드가 없기 때문에 모든 Blocknet 결제는 자동으로 일회용 스텔스 주소로 갑니다. 지갑은 송금할 때 일회용 키를 만들고, 동기화할 때 조회 키로 들어온 결제를 찾습니다. 주소로 결제하든 @name으로 결제하든 설정할 것이 없습니다.