Bulletproofs 해설: 숨겨진 금액을 검증하는 방법

· 읽는 데 7분

Bulletproofs는 짧은 영지식 범위 증명으로, 암호화폐가 모든 트랜잭션 금액을 숨기면서도 각 노드가 코인이 새로 생기지 않았는지 검사할 수 있게 해 줍니다. 이 가이드에서는 페더슨 커밋먼트, 숨겨진 금액에 범위 증명이 필요한 이유, Bulletproofs가 증명을 작게 유지하는 방법, Blocknet이 모든 출력에 이를 사용하는 방식을 설명합니다.

Bulletproofs란 무엇입니까?

짧은 답변

Bulletproofs는 Bünz, Bootle, Boneh, Poelstra, Wuille, Maxwell이 2018년에 발표한 짧은 영지식 증명입니다. 암호화폐에서는 숨겨진 금액이 0부터 2^64 같은 유효한 범위 안에 있다는 것을 금액을 드러내지 않고 증명합니다. 신뢰 설정이 필요 없고, 크기는 범위의 로그에 비례해서만 늘어납니다.

논문 Bulletproofs: Short Proofs for Confidential Transactions and More는 2018년 IEEE Symposium on Security and Privacy에서 발표되었습니다. 저자들은 블록체인의 금액을 커밋먼트로 대체하는 기밀 트랜잭션을 위해 이를 설계했습니다. 애초에 이런 증명이 왜 필요한지 이해하려면 커밋먼트부터 살펴봐야 합니다.

페더슨 커밋먼트란 무엇입니까?

커밋먼트는 봉인된 봉투의 암호학 버전입니다. 숫자를 봉투에 넣고, 모두에게 봉투를 보여 준 뒤, 나중에 안에 무엇이 있었는지 증명할 수 있습니다. 누구도 봉투에서 숫자를 읽을 수 없고, 넣은 사람도 나중에 다른 숫자로 바꿔치기할 수 없습니다.

1991년 Torben Pedersen이 설명한 페더슨 커밋먼트는 이를 타원 곡선 점으로 구현합니다. 금액 v에 커밋하기 위해 지갑은 블라인딩 팩터라고 부르는 무작위 비밀값 r을 고르고 다음을 계산합니다.

C = v·G + r·H

G와 H는 곡선 위의 고정된 두 공개 점으로, 누구도 하나를 다른 하나의 배수로 나타내는 방법을 모르도록 선택됩니다. 결과 C는 32바이트 점 하나입니다. 이 점에는 두 가지 특성이 있습니다.

노드는 읽을 수 없는 트랜잭션을 어떻게 검사합니까?

짧은 답변

페더슨 커밋먼트는 더할 수 있습니다. 두 커밋먼트의 합은 두 금액의 합에 대한 커밋먼트이며, 블라인딩 팩터도 함께 더해집니다. 노드는 트랜잭션의 입력 커밋먼트 합과, 출력 커밋먼트에 수수료를 더한 합을 각각 구해 두 값이 일치하는지 확인하므로, 금액을 하나도 보지 않고 잔액을 확인합니다.

두 커밋먼트를 더하면 (v1 + v2)·G + (r1 + r2)·H가 되고, 이는 그 자체로 v1 + v2에 대한 커밋먼트입니다. 보내는 사람은 입력의 블라인딩 합계가 출력의 합계와 같도록 블라인딩 팩터를 맞춥니다. 금액도 균형이 맞으면 입력 합과 출력 합의 차이는 정확히 0이 되고, 어떤 노드든 이를 검증할 수 있습니다.

네트워크 수수료는 트랜잭션에서 유일하게 공개되는 숫자입니다. 노드는 수수료를 블라인딩 팩터 0인 커밋먼트로 바꿔 출력 쪽에 더하므로, 검사식은 입력 = 출력 + 수수료가 됩니다.

숨겨진 금액에는 왜 범위 증명이 필요합니까?

커밋먼트 연산은 곡선 그룹의 위수라는 매우 큰 수, 약 2^252를 법으로 하는 모듈러 연산입니다. 이 연산에서 “음수” 금액은 그저 거대한 양수일 뿐입니다. 누군가 10코인짜리 입력을 쓰고 11코인짜리와 “마이너스 1”코인짜리 출력 두 개를 만들 수 있습니다. 커밋먼트는 완벽하게 균형이 맞고, 모든 관찰자 몰래 아무것도 없는 데서 1코인이 생겨납니다.

범위 증명이 이 틈을 막습니다. 커밋먼트 안의 금액이 무엇인지 밝히지 않고 그 금액이 0과 2^64 사이에 있다는 것을 증명합니다. 모든 출력이 이렇게 제한되면 출력 몇 개를 더해도 그룹 위수를 넘어 한 바퀴 돌 만큼 큰 수가 될 수 없으므로, 커밋먼트의 균형이 곧 금액의 균형이 됩니다.

이전의 기밀 트랜잭션 설계는 비트 수에 비례해 커지는 범위 증명을 사용했습니다. Bulletproofs는 로그에 비례해서만 커지므로 64비트 증명이 수백 바이트로 줄어듭니다.

Bulletproofs는 어떻게 작동합니까?

Bulletproof는 세 단계로 범위를 증명합니다.

  1. 금액을 비트로 나눕니다. 64비트 금액은 64개 비트로 된 벡터가 됩니다. 증명자는 이 벡터에 커밋하고 두 가지 사실을 보여 줍니다. 각 항목이 0 또는 1이라는 것, 그리고 비트에 2의 거듭제곱을 곱해 더하면 커밋한 금액이 된다는 것입니다.
  2. 이 사실들을 하나의 내적으로 바꿉니다. 증명자는 무작위 챌린지를 사용해 이 모든 조건을 두 벡터의 내적에 대한 하나의 주장으로 접습니다. 챌린지가 무작위이므로 거짓 주장이 통과할 확률은 무시할 수 있을 만큼 작습니다.
  3. 절반씩 줄여 가며 내적을 증명합니다. 라운드마다 증명자가 곡선 점 L과 R 두 개를 보내고, 두 벡터가 절반 길이로 접힙니다. log2(64) = 6라운드가 지나면 숫자 한 쌍만 남습니다.

크기가 작은 이유가 바로 이 절반 줄이기입니다. 논문 초록은 n비트 범위에 대한 범위 증명을 2·log2(n) + 9개의 그룹 및 필드 원소로 제시합니다. 64비트라면 6라운드에서 나오는 점 12개에 9개를 더해 총 21개 원소이며, 원소 하나가 32바이트이면 672바이트입니다.

이 증명은 비대화형입니다. 실시간 검증자가 챌린지를 보내는 대신, 양쪽 모두 증명 기록을 해시해 챌린지를 도출합니다. Fiat-Shamir 휴리스틱으로 알려진 표준 기법입니다. Bulletproofs는 신뢰 설정도 필요 없습니다. 생성자는 공개적으로 도출되며, 보안은 이산 로그 가정에만 의존합니다. 여러 증명을 묶을 수 있고 이때 원소는 로그 수만큼만 늘어나며, 검증도 일괄 처리할 수 있습니다.

누가 Bulletproofs를 사용합니까?

Monero는 트랜잭션 크기를 줄이기 위해 2018년 10월 18일 네트워크 업그레이드(v0.13.0 릴리스)에서 Bulletproofs를 활성화했습니다. dalek-cryptography 프로젝트의 Rust bulletproofs 라이브러리는 Curve25519의 Ristretto 그룹 위에서 이를 구현하며, Blocknet의 암호 라이브러리는 이를 기반으로 만들어졌습니다.

Blocknet은 어떻게 모든 금액을 숨깁니까?

Blocknet에서는 모든 트랜잭션의 모든 출력이 금액 대신 페더슨 커밋먼트를 담고, 출력마다 자체 64비트 Bulletproof가 붙습니다. 프라이버시는 공개 모드가 없는 트랜잭션 형식의 일부이므로, 금액이 보이는 결제를 보낼 방법이 없습니다.

노드는 트랜잭션을 받아들이기 전에 다음을 검사합니다.

Blocknet 탐색기에서 이를 직접 볼 수 있습니다. 트랜잭션 페이지는 금액을 “hidden · Pedersen commitments”로 표시하고, 각 출력에는 커밋먼트, 암호화 메모, 그리고 위의 계산이 예측한 크기인 “672 bytes · Bulletproof” 범위 증명이 표시됩니다.

받는 사람은 실제 금액을 볼 수 있습니다. 각 출력에는 보내는 사람과 받는 사람의 지갑이 공유하는 비밀값으로 암호화한 금액이 들어 있고, 받는 사람의 지갑은 비공개 조회 키로 이를 복호화합니다. 금액은 결제의 두 당사자에게만 보이고 다른 누구에게도 보이지 않습니다.

숨겨진 금액은 Blocknet의 다른 계층과 함께 작동합니다. 16개 출력에 대한 링 서명이 보낸 사람을, 일회용 스텔스 주소가 받는 사람을, Dandelion++가 트랜잭션이 네트워크에 들어온 지점을 숨깁니다. Blocknet 프라이버시 기능 가이드에서 각각을 살펴봅니다.

나만의 프라이빗 BNT 얻기

금액이 숨겨진 코인을 얻는 간단한 방법은 직접 채굴하는 것입니다. Blocknet은 일반 컴퓨터로 채굴할 수 있는 메모리 하드 Argon2id 작업 증명을 사용하며, seine는 CPU와 함께 NVIDIA GPU까지 사용해 채굴하고 설정 없이 스스로 튜닝합니다. bntpool.com이 보내는 모든 지급은 커밋먼트와 Bulletproof를 갖춘 프라이빗 출력으로 도착합니다. 채굴 가이드를 따라 하면 다운로드부터 셰어 승인까지 몇 분이면 됩니다.

자주 묻는 질문

Bulletproofs에는 신뢰 설정이 필요합니까?

아니요. Bulletproofs는 타원 곡선 서명의 기반이기도 한 이산 로그 가정에만 의존하며, 누구나 도출할 수 있는 공개 매개변수를 사용합니다. 설정 의식도, 나중에 누군가 파기해야 하는 비밀값도 없으며, Monero와 Blocknet을 비롯한 프라이버시 코인이 범위 증명에 사용합니다.

Bulletproofs 범위 증명은 얼마나 큽니까?

64비트 Bulletproof 하나에는 2 × log2(64) + 9 = 21개의 원소가 들어갑니다. Ristretto 그룹에서는 원소 하나가 32바이트이므로 증명 하나는 672바이트이며, Blocknet 탐색기도 출력마다 정확히 이 크기를 보여 줍니다. 크기는 범위의 로그에 비례해 늘어나므로 비트 길이를 두 배로 늘려도 원소는 두 개만 추가됩니다.

Blocknet 트랜잭션의 금액은 누가 볼 수 있습니까?

보낸 사람과 받는 사람만 볼 수 있습니다. 체인에는 출력마다 페더슨 커밋먼트와 범위 증명, 그리고 두 지갑이 공유하는 비밀값으로 암호화한 금액이 저장됩니다. 받는 사람의 지갑은 비공개 조회 키로 이를 복호화합니다. 네트워크 수수료만 유일하게 공개되는 숫자이므로, 노드가 잔액 검사에 이를 더할 수 있습니다.

금액이 숨겨져 있는데 노드는 코인이 새로 생기지 않았다는 것을 어떻게 압니까?

모든 노드는 트랜잭션마다 두 가지를 검사합니다. 페더슨 커밋먼트의 합이 맞아야 하므로 입력이 출력과 수수료의 합과 같아야 하고, 모든 출력에는 금액이 0과 2^64 사이에 있다는 유효한 범위 증명이 있어야 합니다. 이 두 가지가 함께 금액을 하나도 드러내지 않고 숨겨진 인플레이션을 막습니다.