[Blockchain-ZKP Series] 2. Zether의 영지식 증명 활용 분석

Tariz
Decipher Media |디사이퍼 미디어
16 min readNov 17, 2020

Author

정현 of Decipher ZKP Research Team 안녕지식
Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)
Reviewed by:
오영택

[Blockchain-ZKP Series] 1. 블록체인의 영지식 증명 효용성 논의

들어가며

블록체인의 사용성을 증가시키기 위해서는 분산화를 유지한 채 사용자의 요구를 만족시킬 수 있는 능력이 필요하며, 이를 위한 전제 조건으로는 빠른 속도, 저렴한 비용, 프라이버시 유지 등이 있습니다. 과거 블록체인의 확장 솔루션은 이러한 요구사항 중 하나 이상을 포기해야 했지만, 최근 영지식 증명의 발전으로 이러한 조건들을 함께 해결할 수 있는 새로운 가능성이 열렸습니다.

블록체인으로 구현된 분산 어플리케이션(DApp)에서 영지식 증명을 사용하기 위해서는 ‘영지식 증명 알고리즘을 직접 구현’하거나 ‘영지식 증명 기반의 블록체인 네트워크를 새롭게 구축하여 DApp을 구현’해야 합니다. 영지식 증명의 경우 암호학으로 이를 어플리케이션에 도입하는 것은 어려운 문제입니다. 이를 위해서는 DApp에 맞춰 구성한 영지식 증명의 안전성을 증명할 수 있는 암호학 연구 인력이 필요하며, 또한 이를 안전하게 프로그램화 할 수 있어야 합니다. 한편, 현재 대부분의 DApp은 이더리움 블록체인을 기반으로 구축되어 있기 때문에 영지식 증명을 활용하기 위해 이미 구축된 DApp을 영지식 증명이 구축된 다른 블록체인 네트워크로 옮기는 것은 매우 어려운 일입니다.

이러한 이유로 많은 DApp들은 영지식 증명 도입에 어려움을 겪고 있었습니다. 하지만 Zether의 등장으로 이더리움 DApp이 영지식 증명을 사용할 수 있는 가능성이 열렸습니다. Zether는 이더리움과 같은 어카운트 기반 블록체인의 결제 메커니즘에 영지식 증명을 적용하여 기밀성을 유지할 수 있도록 하는 메커니즘입니다. Zether의 가장 큰 강점은 이더리움 스마트 컨트렉트를 변형하지 않고 DApp이 영지식 증명을 통한 결제 프라이버시 유지를 가능하게 할 수 있다는 것입니다. 이러한 가능성을 증명하듯 Consensys에서 JP Morgan의 Quorum 블록체인에 Zether를 도입하기 위해 시도하고 있습니다.

이번 게시글에서는 이전 편에서 예고한 ‘2. 블록체인에서 영지식 증명은 어떻게 구현될까’를 주제로 Zether의 영지식 증명 활용 방법을 소개합니다. 이 게시글에서 주로 다루는 질문과 이에 대한 요약된 정보는 다음과 같습니다.

  • Zether는 영지식 증명을 사용하여 어떤 정보를 숨길까?
    1. 소각 트랜잭션: Zether의 토큰을 이더로 환전할 때 사용자의 비밀키를 숨깁니다.
    2. 송금 트랜잭션: Zether의 토큰을 송금할 때 전송하는 토큰 양을 숨깁니다.
  • Zether는 위 정보를 숨기기 위해 증명을 어떻게 만들까?
    영지식 증명에서 ‘증명'의 역할은 숨기고자 하는 정보의 유효성을 검증할 수 있는 핵심 정보입니다. ‘증명’이 ‘진실’이라면 모든 참여자는 정보를 직접 확인하지 않고 정보가 유효함을 인정할 수 있습니다. 이처럼 단순한 과정을 가능하게 하기 위해서는 증명을 만들기 위한 논리적 과정이 필요합니다. 우리는 아래에서 이를 구체적으로 설명할 것입니다.
  • 검증 결과가 진실(True)이라고 검증된 경우 의미하는 것은 무엇일까?
    1. 소각 트랜잭션: Zether는 사용자가 비밀키를 알고 있음을 증명하여, 다른 참여자가 환전을 요청한 토큰이 사용자의 것임을 납득할 수 있게 합니다.
    2. 송금 트랜잭션: Zether는 사용자가 특정 금액을 전송할 만큼 충분한 돈을 가지고 있고 B는 A가 전송한 정확한 금액을 받았음을 증명하여, 다른 참여자가 송금 트랜잭션이 유효함을 납득할 수 있게 합니다.

위 내용에 대한 자세한 정보는 본 게시글에 설명되어 있습니다. 또한 게시글에서 다루지 않은 Zether의 구체적인 정보를 제공하기 위해 디사이퍼 — 안녕지식 팀이 번역한 Zether 한글 버전을 공유합니다.

Zether 소개

Zether는 이더리움과 같은 어카운트 기반 모델에서 사용할 수 있는 분산화된 기밀 결제 메커니즘입니다. Bünz et al (2020)에 따르면, Zether는 이더리움 결제 시스템에 도입할 수 있도록 스마트 컨트렉트를 기반으로 구축되었고, 이 과정에서 시스템의 어떤 변화도 요구하지 않습니다. DApp 사용자는 Zether의 스마트 컨트렉트인 ZSC를 통해 Zether의 토큰인 ZTH를 기밀성을 유지한 채 교환할 수 있습니다. 또한 Zether에서 이용된 기술들은 블록체인의 합의 메커니즘과 관계없이 구성되어 다른 어카운트 기반의 블록체인에도 적용될 수 있습니다.

Zether는 각 언카운트 잔액을 암호화하고 ZTH를 사용할 때 영지식 증명의 증명을 제공하도록 하여, ZSC를 통해 구성한 트랜잭션에 기밀성을 부여합니다. 사용하는 영지식 증명 시스템은 Σ-Bullets로 Monero가 사용하는 영지식 증명 시스템인 Bulletproofs와 Σ-protocols을 결합한 새로운 영지식 증명 시스템입니다. 이 시스템의 가장 큰 특징은 Bulletproofs를 기반으로 하는 range proof와 ELGamal 암호화를 효율적으로 결합할 수 있다는 것입니다.

Zether 컨트렉트 (ZSC)의 동작

Zether 컨트렉트는 이더리움을 기반으로 구현됩니다. ZSC는 ZTH와 함께 동작하며, 다섯 가지 공개 메소드(public method)를 제공합니다: Fund, Burn, Transfer, Lock, Unlock

  1. Fund: b ETH → b ZTH
    Fund는 Zether 어카운트에 자금을 추가하기 위해 사용되며, b ETH를 ZSC로 보내 b ZTH로 바꾸고 이를 어카운트에 입금합니다.
  2. Burn: b ZTH → b ETH
    Burn은 ZTH를 ETH로 바꾸기 위해 사용되며, b ZTH를 ZSC를 통해 전송하면 이더리움 어카운트로 입금할 수 있는 b ETH로 환전합니다. ZSC는 이 과정에서 소각 트랜잭션(Burn Transaction)을 생성하고, 사용자의 비밀키를 숨긴 채 b ZTH가 사용자의 것임을 증명하기 위해 영지식 증명을 사용합니다.
  3. Transfer: A → B (b ZTH)
    Transfer는 A의 b ZTH를 B에게 송금할 때 사용됩니다. ZSC는 이 과정에서 송금 트랜잭션(Transfer Transaction)을 생성하고, 전송하는 양 b를 숨기기 위해 영지식 증명을 사용합니다.
  4. Lock, Unlock: A
    ZSC의 Lock과 Unlock 기능은 Burn, Transfer의 트랜잭션을 처리하는 중간에 제 3자가 전송한 ZTH 때문에 발생하는 오류를 막기 위해 고안되었습니다. 예를 들어, 사용자 A가 b ZTH를 전송하거나 소각할 때 금액 b의 유효성을 검증해야 하는데, 검증 도중에 사용자 B가 A에게 b’ ZTH를 보내 b + b’ ZTH가 되면 A의 검증은 실패하게 됩니다. 이와 같은 문제를 막기 위해 Zether는 전송 및 소각 트랜잭션을 처리할 때 A의 어카운트를 잠구거나(Lock) 해제(Unlock)하는 방법을 제공합니다.

Zether의 영지식 증명 활용

Zether는 전송 트랜잭션과 ZTH를 ETH로 바꾸는 소각 트랜잭션에 영지식 증명을 포함하여 해당 트랜잭션이 유효하다는 사실 이외에 숨기고자 하는 정보를 노출하지 않고 이를 확실하게 검증할 수 있도록 합니다. 이를 위해 Zether에서 사용되는 영지식 증명은 Σ-protocols입니다. 우리는 이 장에서 Σ-protocols을 간단히 알아보고 두 가지 트랜잭션이 이를 어떻게 활용하는지 분석합니다.

Fiat-Shamir 변환을 한 Σ-protocols

Σ-protocols은 대화형 영지식 증명으로 ElGamal 암호화에서 b를 랜덤한 값 r을 통해 암호화할 때 ‘증명자가 b와 r을 알고 있다'와 같은 대수적 명제(statement)를 증명하는데 매우 효율적으로 사용될 수 있습니다. 증명자는 Σ-protocols을 통해 명제가 참이라는 것을 증명할 수 있는 증명, 검증자는 Σ-protocols을 통해 이 증명이 참이라는 것을 검증합니다. Σ-protocols에서 증명자가 증명 생성을 위해 구성하는 명제는 다음과 같습니다:

위 명제를 통해 만들어진 증명이 검증자에 의해 ‘진실’이라 검증될 경우 의미하는 것은 다음과 같습니다.

증명자는 (3)이 진실이 되도록 하는 (2)를 알고 있습니다.

여기서 (1)의 a, b, c, …는 모든 참여자에게 공개된 변수이고, (2)의 x, y, z … 는 증명자가 숨기고자 하는 정보입니다. (3)의 함수는 증명자가 진실임을 증명하고자 하는 논리적 구조를 대수적으로 표현한 함수입니다. 우리는 다음 장에서는 Zether의 소각 트랜잭션과 송금 트랜잭션이 Σ-protocols 명제를 어떻게 구성하고 이를 통해 증명자가 무엇을 증명하는지 자세하게 설명할 것입니다.

한편, Zether는 증명생성을 위해 Fiat-Shamir 변환을 시행한 Σ-protocols을 사용합니다. Fiat-Shamir 변환은 Σ-protocols과 같은 대화형 영지식 증명을 비대화형 영지식 증명으로 변환하는 방법입니다. Fiat-Shamir 변환을 시행한 Σ-protocols은 아래와 같은 비대화형 영지식 증명의 3가지 속성을 모두 만족합니다.

  1. 정직한 증명자는 유효한 증명을 생성할 수 있습니다.
  2. 검증자는 증명으로부터 명제가 사실이라는 것 이외에는 그 무엇도 알 수 없습니다.
  3. 계산능력이 제한된 정직한 증명자는 거짓 명제가 참이라고 검증자를 속일 수 없습니다.

대화형 영지식 증명 시스템과 비대화형 영지식 증명 시스템의 자세한 내용은 링크된 자료를 참고하여 주시길 바랍니다.

소각 트랜잭션의 영지식 증명 활용 방법

소각 트랜잭션은 사용자가 가진 b ZTH를 b ETH로 환전하는 트랜잭션입니다. 이더리움에서는 소각 기능이 필요하지 않지만 Zether에서는 이더리움과 호환되기 위해 사용자가 가진 ZTH를 ETH로 바꾸는 기능이 필요하며, Zether에서는 이를 소각 트랜잭션을 통해 가능하게 합니다.

사용자가 b ZTH를 b ETH로 바꾸는 트랜잭션을 보낼 때 ZSC는 사용자가 요청한 b ZTH가 사용자의 것인지 확인해야 합니다. 이를 확인하는 간단한 방법은 ZSC가 사용자의 어카운트를 확인할 수 있는 비밀키를 요청하여 어카운트에 접근해 요청된 b ZTH가 사용자의 것인지 확인하는 것입니다. 이 경우 사용자의 비밀키를 공개해야 하기 때문에 악의적인 다른 사용자에 의해 사용자의 이전 트랜잭션의 내용과 잔액이 노출되어 프라이버시가 깨질 위험이 있습니다.

Zether의 소각 트랜잭션의 목표는 사용자의 비밀키를 공개하지 않고 요청된 b ZTH를 b ETH로 바꾸는 것이며, Zether가 이를 검증하기 위해서 확인하는 내용은 다음과 같습니다.

소각 트랜잭션으로 요청된 b ZTH는 사용자의 것입니다.

이를 검증하는 간단한 방법은 b를 암호화한 비밀키 sk가 사용자 본인의 것인지 확인하는 것입니다. 여기서 sk는 사용자만 알고 있는 정보이기 때문에, b를 암호화한 비밀키를 알고 있다는 것은 요청된 b ZTH가 사용자의 것임을 증명하는 것과 같습니다. 이를 논리적으로 정리하면 다음과 같습니다.

[숨기고자 하는 것]

  • A의 비밀키 정보

[논리적 정보]

  1. 사용자는 소각을 요청한 b ZTH를 비밀키로 서명했습니다.
  2. 사용자는 1번의 비밀키를 알고 있습니다.

이제 우리는 논리적으로 구성된 2가지 항목으로 Σ-protocols의 명제를 구성할 수 있습니다. Zether의 소각 트랜잭션의 명제는 다음과 같습니다:

위 명제에서 (1)은 공개된 정보로, 여기에는 사용자의 공개키 y와 소각하는 양 b가 포함됩니다. (2)는 사용자가 숨기고자 하는 정보로 사용자의 비밀키 sk가 포함됩니다. (3)은 사용자가 (2)를 알고 있음을 증명하기 위해 논리적으로 구성한 대수적 함수로 위에서 소개한 ‘[논리적 정보]’의 내용을 포함합니다. 즉, 위 명제가 검증자에 의해 ‘진실’이라 검증된 경우 의미하는 것은 다음과 같습니다.

사용자는 [논리적 정보]가 진실이 되도록 하는 비밀키 sk를 알고 있습니다. 여기서 요청된 b ZTH는 sk로 서명되었고, sk는 요청한 사람 이외에 아무도 알 수 없는 정보이기 때문에 소각 요청된 b ZTH는 사용자의 것이 맞습니다.

이제 (3)의 각 수식이 의미하는 것을 간단히 알아보겠습니다.

  • (3)-1
    여기서 y는 사용자의 공개키로 명제에 의해 다른 참여자에게 공개된 정보입니다. 위 수식이 진실인 경우 의미하는 것은 모두에게 공개된 사용자의 공개키 y가 사용자의 비밀키 sk로 만들어졌다는 것입니다.
  • (3)-2
    위 수식은 소각을 요청한 b ZTH를 사용자의 비밀키 sk로 암호화하는 것을 의미합니다. 위 수식이 진실인 경우 의미하는 것은 요청한 b가 사용자의 것이라는 것이며, 이는 사용자 자신만 알고 있는 비밀키 sk로 서명하였기 때문에 가능합니다.

사용자는 위 명제를 통해 2가지 논리적 정보를 진실로 만드는 비밀키를 공개하지 않고, b가 자신의 것임을 증명할 수 있습니다. 이를 통해 블록체인 네트워크 참여자는 소각 트랜잭션에서 사용자의 비밀키를 확인하지 않더라도 해당 명제가 진실이라는 검증 결과를 통해 b가 사용자의 것임을 납득하여 해당 트랜잭션을 유효한 트랜잭션으로 인정하고 이를 블록체인에 기록할 수 있습니다.

송금 트랜잭션의 영지식 증명 활용 방법

송금 트랜잭션은 A의 어카운트에서 B의 어카운트로 b* ZTH를 송금하는 트랜잭션입니다. Zether에서는 송금 트랜잭션에 Σ-protocols을 통해 만든 증명을 포함하여 b*를 숨긴 채 유효한 송금 트랜잭션을 구성합니다. 다시 말해, A가 B에게 b* ZTH를 전송할 때 b*의 값의 트랜잭션에 작성하지 않는 대신 Σ-protocols로 만든 증명을 포함하고, 검증자와 참여자는 증명이 ‘진실’인지 확인만 하고도 송금 트랜잭션이 유효한 트랜잭션임을 인정할 수 있다는 것입니다.

우리는 앞서 [1. 블록체인의 영지식 증명 효용성 논의]에서 유효한 트랜잭션이 무엇을 의미하는지 정리했습니다. 이를 Zether의 송금 트랜잭션에 대입해보면, 송금하는 양을 공개하지 않고 송금 트랜잭션이 유효하다는 것을 검증하기 위해서는 다음 두 가지를 확인해야 합니다.

  • A가 송금한 ZTH의 양과 B가 받은 ZTH의 양은 같습니다.
  • A는 B에게 송금할 만큼 충분한 돈을 가지고 있습니다.

여기서 A와 B는 b*의 값을 숨겨야 하므로 이를 암호화해야 합니다. 위의 두 가지 항목과 b*의 암호화를 논리적으로 정리하면 다음과 같습니다.

[숨기고자 하는 것]

  • A가 B에게 전송하는 ZTH의 개수인 b*의 값
  • A의 전송 후 잔액 b’

[논리적 정보]

  1. A와 B가 b* 값을 노출하지 않도록 정확한 암호문을 각각 만들어야 합니다.
  2. 1번에서 만든 A와 B의 암호문이 같은 값 b*를 암호화한 것입니다.
  3. A가 전송한 b*가 0보다 커야 합니다.
  4. A의 송금 후 잔액인 b’가 0보다 커야 합니다.

이제 우리는 논리적으로 구성한 4가지 항목으로 Σ-protocols의 명제를 만들 수 있습니다. Zether의 송금 트랜잭션의 명제는 다음과 같습니다:

위 명제에서 (1)은 공개된 정보로, 여기에는 A의 공개키 y와 B의 공개키 y’가 포함됩니다. (2)는 A와 B가 숨기고자 하는 정보로 A의 비밀키 sk, 송금양 b*, A의 송금 후 잔액 b’, 랜덤 값 r이 포함됩니다. (3)은 (2)를 알고 있음을 증명하기 위해 논리적으로 구성한 대수적 함수로 위에서 소개한 [논리적 정보]의 내용을 포함합니다. 즉, 위 명제가 검증자에 의해 ‘진실’이라 검증된 경우 의미하는 것은 다음과 같습니다:

사용자는 [논리적 정보]가 진실이 되도록 하는 (2)의 정보를 모두 알고 있습니다. 따라서 다른 참여자는 전송 금액이 얼마인지 모르지만, A는 B에게 특정액을 전송할 만큼 충분한 돈을 가지고 있으며, B는 A가 전송한 정확한 금액을 받았음을 납득할 수 있습니다.

이제 (3)의 각 수식이 의미하는 것을 간단히 알아보겠습니다.

  • (3)-1
    여기서 y는 A의 공개키, y’은 B의 공개키를 의미합니다. 여기서 g, y, y’은 공개되어 있지만 랜덤 값 r은 공개되어있지 않기 때문에 b*의 값을 유도할 수 없습니다. 위 수식이 진실이라는 것은 A와 B가 같은 값 b*를 노출하지 않도록 정확한 암호문을 만들었음을 의미합니다.
  • (3)-2
    여기서 b*은 송금액을 b’은 A의 송금 후 남은 잔액을 의미합니다. 위 수식이 참이라는 것은 두 숫자가 모두 0 이상임을 의미합니다.

사용자는 위 명제를 통해 4가지 논리적 정보를 진실로 만드는 비밀키, 송금액, 송금 후 잔액을 공개하지 않고 증명을 만들어 이를 A가 알고 있음을 증명할 수 있습니다. 이를 통해 블록체인 네트워크 참여자는 송금 트랜잭션에서 송금액 b*의 값을 확인하지 않더라도 송금 트랜잭션이 유효한 트랜잭션이라 납득하고 이를 블록체인에 기록할 수 있습니다.

Zether Cost

이더리움에서 특정 메커니즘이 사용되기 위해서 확인해야 하는 중요한 정보 중 하나는 가스비입니다. 각 메소드별 가스비는 다음과 같습니다.

Zether 논문 작성 시점에서 Zether의 기본적인 트랜잭션 비용은 1.5 USD이며, 하나의 송금 트랜잭션에 있어 타원곡선 연산이 총비용의 90%를 차지합니다. 즉, 익명 송금 한 개의 비용이 약 8백만 가스로 블록의 가스 한도를 모두 차지하기 때문에 현재 가스 비용을 고려하면 Zether의 실현 가능성은 매우 낮습니다. 하지만 이더리움에서 타원 곡선의 곱셈 연산 비용을 최적화하면 이 비용을 더욱더 감소시킬 수 있습니다. 현재 이더리움에서는 secp256k1Curve25519와 같이 타원곡선 연산을 보다 효율적으로 할 수 있는 연산 방법을 도입하기 위한 추가적인 연구가 진행되고 있어, Zether의 보다 효율적인 실현가능성을 기대할 수 있습니다.

Zether: Toward Privacy in a Smart Contract World Korean Version

디사이퍼-안녕지식 팀은 더욱 구체적인 정보 제공을 위해 Zether 논문을 한국어로 번역했습니다. 해당 번역본은 Zether의 저자인 Benedikt Bünz의 공식적인 허가를 받은 후 작성 및 공개되었습니다.

Zether Korean Version by ZKP Research Team at Decipher: https://drive.google.com/file/d/1MajJ0-76EXv9t9i_vsBik8bJA0e33KZ7/view?usp=sharing

디사이퍼 — 안녕지식팀 소개

정현, 김수민, 박성완, 오아영

--

--