영지식 증명을 활용한 프라이버시 토큰(zk-ERC20) 구현

**주의 : 코드가 많음**

철학자(정순형)
Jun 6 · 23 min read
zero knowledge proof에 대한 이미지 검색결과
P2P 시스템에서 검증자(Verifier)는 누구?

서론: 트랜잭션 토폴로지 변경

이더리움 블록체인에서 발생하는 토큰 전송(Token Transfer) 트랜잭션은 계정에서 계정으로 토큰의 잔액이 이동하는 매쉬형 토폴로지(meshed topology) 구조를 띄고 있습니다. 얼핏 보기에 이러한 구조는 매우 복잡해 보이지만, 모든 트랜잭션이 공개되기 때문에 사실상 거래 기록의 프라이버시는 없다고 봐도 무방하죠(100조원에 달하는 ERC20토큰의 거래기록은 단 하나도 빠지지 않고 1원 단위까지 이더리움 블록체인에 기록되어 공개됩니다).

Transaction Topology 변경 — 출처 : ZETH

노트(Note) : 소유자와 액면가 정보가 기록된 증서

노트, 시크릿노트(Note, SecretNote)

노트(Note)란 소유자 및 해당 소유자가 보유한 토큰의 액면가를 기록한 증서(note)입니다. 그리고 이 증서를 사용하기 위해서는 해당 증서의 소유주임을 증명(verify)해야 합니다. 이러한 방식의 소유자 증명은 블록체인에서 일반적으로 사용하는 공개키 암호화 알고리즘이 활용되죠(노트는 개념은 봤을때, 비트코인의 UTXO와 같습니다). 하지만 노트 자체는 익명화되기 힘듭니다. 그래서 믹서는 익명화를 위해 해시화된 노트만을 기록으로 유지합니다. 그리고 이렇게 해시화된 노트를 시크릿 노트(SecretNote)-비..밀..노트..?-라고 부릅니다.

시크릿 노트를 사용할 수 있는 지식(Knowledge of Transfer Value of SecretNote)

구현의 단순화를 위해서 노트의 소유권을 옮기기 위해서는 하나의 노트는 태워 없어져 매번 새롭게 2개의 노트가 만들어지는 모델을 사용합니다. 2개의 노트중 하나는 하나는 당사자에게 귀속시키고, 나머지 하나는 본인이게 돌려줍니다.

PK1소유주는 PK2소유주에게 v’만큼의 토큰을 전송했다
고수준 서킷 코드

Trusted Setup

일단 컴퓨터에 zokrates를 설치합니다. 그리고 설치된 환경에 앞서 제작한 서킷 코드를 옮겨서 다음 명령어를 순서대로 입력합니다.

//out, out.code 파일 생성
$./zokrates compile -i zk-circuit.code//proving.key, verification.key파일 생성
$ ./zokrates setup --proving-scheme pghr13//verifier.sol파일 생성
$./zokrates export-verifier --proving-scheme pghr13
  • setup : 만들어진 QAP를 이용해서(컴파일된 서킷을 이용해서) verification.key와 proving.key를 만듭니다. 이 과정에서 toxic waste라는 랜덤값이 사용되는데, 이 값은 사라져야 하며 해당 값이 어딘가에 남아있으면 가짜 증거(fake proof)를 만들어 낼 수 있습니다(이중지불이 가능하게 되죠).
  • export-verifier : 정의된 서킷을 검증할 수 있는 솔리디티 컨트랙트 코드를 만들어줍니다. verifier.sol파일이 그것이고, 컨트랙트 호출간 verifyTx()라는 심플한 함수를 사용해 영지식 검증을 수행 합니다.

Mixer.sol : SecretNote Management Contract

컨트랙트는 객체이고, 객체를 통해 상태(variables)와 행위(function)를 정의할 수 있습니다. 믹서 컨트랙트 앞서 만들어진 verifier를 상속해 시크릿노트에 관한 상태와 행위를 제어합니다.

상태(variables) : State, notes, allNotes, allHashedNotes

노트의 상태값들
노트1, 노트2가 사용되는 과정에서 Crated → Spent 상태로 변경

행위(functions) : transferNote( )

앞서 노트는 다양한 상태(Invalid, Created, Spent)를 가질 수 있고, 노트가 쓰이는 과정에서 이러한 상태가 바뀌는것은 이해 했습니다만, 구체적으로 어떠한 코드를 통해 이러한 변화가 이뤄지 살펴보도록 하겠습니다.

Mixer.sol의 transferNote( ) 함수
Proof.json

[179426333, 181327921, 198492781, 533001793, 334216237]

단순한 숫자 5개처럼 보이지만 이 값은 다음의 복잡한 내용을 간결하게 증명 증명(Succinct Proof)하고 있습니다.

연산증명 : witness → Proof.json

witness란 컴파일된 zokrates소스코드(out파일)에 명시된 main() 함수에 파라미터를 전달해 만들어진 영지식 증거(proof)를 뜻합니다. 앞서 구현된 서킷은 16개의 파라미터로 구성되어 있으니, 해당 내용에 맞는 파라미터를 생성해서 zokrates에 전달하면 됩니다. 예를들어 0x65f01a39f2b7e3cb9b0f0f933ae13309e2b814fc 계정(계정0번)이 가진 액면가 5의 노트를 0x23f18f142c93dd1d719eaf67b56973517f6ebcb8 계정(계정1)에게 3만큼 보내는 witness를 계산 할 때는 다음의 명령을 주면 됩니다.

./zokrates compute-witness -a 299336082027245038390806872836251868434 146214785280603262054605348855920364042 1710234169 322627985543346917984603212343009613052 0 5 338680819269871046518773602934504523249 240032092968569212144514626611958402952 603033364 59253784198043682718523328310826417336 0 3 170846492286112848076693656918639323381 285388887744989578963627759440747666135 0 2
./zokrates generate-proof --proving-scheme pghr13

구현 및 테스트 아키텍처

한계

zkERC20은 매우 단순한 형태의 구현이기 때문에 여러 제약 및 한계가 있으며, 실제 production수준으로 가기 위해서는 이러한 문제들을 해결해야 합니다. 특히나 많은 양의 가스를 소모한다는점으로 인해서 이더리움 메인체인보다는 튜링 완전함을 지원하는 확장성 높은 레이어2(토카막 플라즈마 등)등에서 오히려 활용 가능성이 높습니다.

구현된 스마트 컨트랙트 문제

  • 검증 함수(verifyTx) 가 가스를 상당히 많이 소모한다(약 7백만).
  • 노트 소유자 잔액 조회 문제 encrypt( hash(pk, v) ).
  • 내가 소유한 노트의 정확한 잔액을 알아야만 트랜잭션을 날릴 수 있다.
  • 노트를 배열 처리해서 노트가 많아지면 매우 느려진다.
  • 노트를 쓰려면 항상 2개로 쪼갠다(튜링 불완전성).
  • 모든 금액을 보내는 경우 노트 하나는 잔액이 0이된다.
  • 조건부 거래 : 여러명에게, 멀티 시그를 하고 싶을 때는..?
  • 충분한 노트가 쌓이지 않으면 프라이버시가 보장 되기 힘들다.

ZKP 구조적 문제

  • 이니셜 셋업에 toxic waste를 누가 셋업할 것인가? → MPC 등으로 보완
  • witness를 만드는 연산이 클라이언트에게 부담이 적지 않고, 유저는 플라즈마 외에 별도의 클라이언트 혹은 서비스가 필요

실용성의 문제

  • zokrates랭귀지가 지원하는 라이브러리가 많지 않음

향후 연구 및 응용

현재까지의 시크릿노트의 구현은 단순 전송을 위해 2개의 노트가 항상 만들어져야 하는 등 구조적으로 유연하지 못하게 설계되어있습니다. 그렇기때문에 다양한 조건부 거래(멀티시그 등의 소유권 이전에 관한 권한을 스마트 컨트랙트에게 부여하는 문제 등)가 어렵고 이에 대한 개선이 필요합니다. 조건부 거래가 가능한 노트의 설계와 이에 근거한 서킷 코드의 정교한 설계가 필요하고, 이렇게 만들어진 코드가 해당 체인에서 동작 가능한지에 관한 실무적인 검토 또한 필요합니다 — Practical한 수준에서 이더리움 메인체인에서 직접 활용은 어렵다고 보는게 맞을 것 같습니다. 스마트 컨트랙트를 지원하는 플라즈마 등 레이어2체인에서 활용 가능성이 높아보입니다 — .

토카막 플라즈마에 응용된 시크릿노트 거래소

*별첨1 : zkDAI세미나 영상

프라이버시를 보장하는 스테이블 코인 zk-DAI 깊게 살펴보기(철학자, Onther Inc.)

*별첨2 : 프라이버시 기술의 가치

온더의 ZKP에 관한 리서치와 개발은 단순한 지적 호기심을 충족하기 위해 혹은 엔지니어링 퍼즐의 만족감을 위해 이뤄지는 것은 아닙니다 — 사실 생각보다 많은 연구개발 산출물들이 연구자들의 호기심으로부터 시작해 연구팀만 쓰는 시제품 형태의 장난감으로 남습니다 — . ERC20의 프라이버시를 보장할 수 있는 완벽한 기술이 나온다면 얼마정도의 가치를 가지게 될까요?

  1. (프라이버시 보장 기능이 갖춰진) 코인의 시총 규모와 비중

ERC20 시가 총액의 규모

  • Coinmarketcap.com에 등록된 ERC20토큰의 갯수는 92개
  • (2019.6.4 기준)이들 토큰의 시총 합은 9조 5천억원

프라이버시 코인의 시총과 비중

  • 3대 프라이버시 코인 : 모네로, 대시, ZCASH
  • (2019.6.4)시총 합 : 3조 7천억원(출처 — coinmarketcap.com)
  • 전체 코인 시총 중 프라이버시 코인 비중 : 약 1.3%(출처 — coinmarketcap.com)

Onther-Tech

Building an Ethereum Blockchain ECO system to Change the World

철학자(정순형)

Written by

Onther Inc Founder. Seoul Ethereum Meetup Co-organizer. Blockchain Engineer. Crypto Lover.

Onther-Tech

Building an Ethereum Blockchain ECO system to Change the World