LINE DEVELOPER DAY 2021에서 소홍섭 님이 발표하신 계정(account) 기반 블록체인에서의 개인 정보 보호 세션 내용을 옮긴 글입니다.
안녕하세요. LINE Blockchain에서 메인넷을 개발하며 팀을 리딩하고 있는 소홍섭입니다. 이번 글에서는 LINE Blockchain에서 연구하고 개발한 보안 거래와 관련해 '계정(account) 기반 블록체인에서 어떻게 거래 데이터를 보호할 수 있을까'라는 주제로 이야기해 보겠습니다.
먼저 블록체인에서 보안 거래를 가능하게 만드는 개인 정보 보호 강화 기술에 대해서 알아보고, 블록체인의 주요 특징인 UTXO(Unspent Transaction Outputs)와 계정의 개념과 차이에 대해서 설명하겠습니다. 이어서 이런 기술 중 LINE Blockchain에서 보안 거래를 위해 사용한 기술과 방법을 설명하고 마지막으로 앞으로의 계획을 말씀드리겠습니다.
거래 정보를 숨겨야 하는 이유
먼저 생각해 보아야 할 점은 '왜 거래 정보를 숨겨야 할까'입니다. 모든 거래를 누구나 투명하게 볼 수 있고 검증할 수 있는 것이 바로 블록체인의 특징입니다. 하지만 LINE Blockchain을 개발하고 운영하면서 블록체인의 복원력이나 탈중앙성과 같은 블록체인의 특성은 유지하면서 개인 정보는 보호되길 원한다는 요구 사항을 여러 서비스에서 전달받았는데요. 이와 같이 아래와 같이 크게 두 가지로 정리해 볼 수 있습니다.
첫 번째는 개인 정보를 보호하기 위해서입니다. 개인 정보에 대한 인식이 많이 달라지고 있습니다. 개인 정보의 범위가 점차 넓어지면서 생년월일이나 전화번호를 넘어서 누군가를 특정할 수 있는 정보까지 개인 정보로 취급하고 있는데요. 이에 거래자를 특정하거나 유추할 수 있는 블록체인 거래 역시 개인 정보에 민감한 서비스에서는 개인 정보로 생각하고 보호하기를 원합니다.
두 번째로 중앙은행과 같은 기관들의 거액 거래는 보안 관점에서 거래 정보가 노출되지 않아야 합니다. 거래 정보나 보유 잔액 정보가 노출될 경우 보안을 유지해야 하는 중요한 정책들을 시행하기 어렵기 때문입니다.
이와 같은 이유들 때문에 LINE Blockchain에서는 거래 정보가 노출되지 않는 기술을 개발하기 시작했습니다.
거래 정보를 숨기는 방법 - PETs(Privacy Enhancing Technologies)
그렇다면 거래 정보를 숨길 수 있는 블록체인의 기술은 어떤 것들이 있는지 간략하게 살펴보겠습니다. 내용이 조금 어려울 수 있는데요. 최대한 간단하게 개념을 이야기해 보겠습니다.
2020년 Project Stella의 보고서에 따르면 블록체인의 개인 정보 보호 기술은 '분리(segregating)'와 '연결 해제(unlinking)', '숨기기(hiding)'로 분류할 수 있다고 합니다. 각각에 대해 자세히 살펴보겠습니다.
분리(segregating)
분리하기는 거래 당사자들은 거래 정보를 알 수 있지만 제3자는 거래 정보를 볼 수 없도록 만드는 기술로, '원장 분리(ledger segregating)'와 '오프체인 지불 채널(offchain payment channel)' 등이 있습니다.
원장 분리
원장 분리는 거래 당사자 또는 관련자만 공유하는 원장에 거래를 기록해 제3자는 거래 정보 자체에 접근할 수 없도록 차단하는 기술입니다.
원장 분리를 적용하면 거래별로 각각 개별 원장을 생성하므로 동일 분산 원장 방식을 사용할 때에는 적용하기 어렵습니다.
오프체인 지불 채널
오프체인 지불 채널은 특정 참여자 간에 거래가 여러 번, 자주 발생하는 경우 거래를 시작한 시점과 거래를 종료한 시점만 원장에 기록하고 그 사이에 발생하는 모든 거래는 원장 밖에서 진행하는 기술입니다.
거래가 발생하는 동안 실제 원장에서는 자산이 이동하지 않으므로, 거래를 중단하거나 잔액이 부족한 경우에 대비하기 위해 에스크로(escrow) 등의 장치가 필요하며 거래 당사자들 간 신뢰가 형성돼야 합니다.
연결 해제(unlinking)
연결 해제는 거래 당사자인 송신자와 수신자 또는 거래 금액을 거래 정보를 통해 유추할 수 없도록 관계를 끊는 기술입니다. '일회용 주소(one-time address)'와 '믹싱(mixing)', '링 서명(ring signature)' 등이 있습니다.
일회용 주소
먼저 일회용 주소는 거래할 때마다 매번 새로운 주소를 사용해서 실제 사용자와 주소 및 거래 내용의 연관관계를 파악하기 어렵게 만드는 기술입니다. 매번 새로 생성되는 주소를 관리하기 위해서 HD(Hierarchical Deterministic) 월렛과 같은 키 관리 기술을 사용하기도 합니다.
믹싱
믹싱은 같은 금액의 여러 거래를 묶어서 처리함으로써 송신자와 수신자를 매칭시키기 어렵게 만드는 기술입니다. 송신 금액이 서로 다를 경우엔 거래를 분할해서 같은 금액으로 만들어 거래가 섞일 수 있도록 만듭니다.
링 서명
링 서명은 송신자의 공개 키만 이용하는 일반적인 디지털 서명과는 달리, 공개된 여러 사용자의 공개 키를 수집해서 해당 거래에 섞어 사용하는 링 서명으로 송신자를 감추는 기술입니다.
숨기기
숨기기는 거래 정보 중 송신자와 수신자 혹은 거래 금액의 일부 또는 전체를 숨길 수 있는 기술로 Pedersen 커밋먼트와 영지식 증명(zero knowledge proof, 이후 ZKP), 동형 암호(homomorphic encryption) 등이 있습니다.
Pedersen 커밋먼트
Pedersen 커밋먼트는 커밋먼트 기법의 한 기술입니다. 커밋먼트 기법은 송신자가 수신자에게 값을 그대로 보내는 게 아니라 값을 암호화해서 보낸 뒤 복호화키를 공유해서 내용을 확인할 수 있도록 하는 암호학적인 방법인데요. 여기에 Pedersen 커밋먼트는 타원 곡선 암호 방식을 사용해서 암호화된 상태에서도 덧셈 연산이 가능합니다. 따라서 거래 금액을 공개하지 않아도 거래 유효성을 검증할 수 있습니다. 블록체인에서는 주로 거래 금액을 숨기는 데 사용합니다.
ZKP
ZKP는 숨기고자 하는 정보를 공개하지 않으면서 검증자에게는 숨긴 정보를 알고 있다는 것을 증명할 수 있는 증거를 공유해 검증하는 알고리즘입니다. 거래 내용의 모든 정보를 숨기면서 이를 증명하기에 좋은 알고리즘입니다.
동형 암호
동형 암호는 데이터를 암호화한 상태에서도 덧셈과 곱셈의 사칙 연산이 가능하도록 만드는 암호화 알고리즘입니다. 아직은 블록체인에서 사용할 수 있을 정도로 빠르고 효율적이지 않아서 블록체인에서는 사용하지 않는데요. 점점 기술이 발전하고 있기 때문에 머지않은 미래의 블록체인에서는 사용할 수 있을 것 같습니다. 이에 LINE Blockchain 개발 팀에서도 꾸준히 관련 연구를 진행하고 있습니다.
분리하기 vs 연결 해제 vs 숨기기
간략하게 여러 기술을 살펴봤는데요. 각 기술이 거래 정보인 송신자와 수신자, 거래 금액 중 어느 정보를 숨길 수 있는지 정리하면 아래 표와 같습니다. 기술에 따라서 모든 정보를 숨길 수 있거나 일부만 숨길 수 있습니다.
어려운 기술을 최대한 쉽게 설명하려고 했지만 이 분야에 익숙하지 않으신 분들은 여전히 어렵게 느끼실 수 있는데요. 전부 이해하진 못하더라도 이 표를 잘 기억하시면 각 기술을 어떻게 활용할 수 있을지 알 수 있습니다.
이제 LINE Blockchain의 보안 거래를 구현하기 위해서 이 중에서 어느 기술을 사용했는지 말씀드리겠습니다.
블록체인 거래 처리 방식
블록체인의 거래 처리 방식은 크게 UTXO 방식과 계정 방식으로 나눌 수 있습니다. 이에 따라 블록체인도 UTXO 기반 블록체인과 계정 기반 블록체인으로 나눌 수 있는데요. 비트코인은 대표적인 UTXO 기반의 블록체인이고 이더리움은 계정 기반 블록체인입니다. 거래 처리 방식에 따라서 보안 거래를 구현하기 위해 선택할 수 있는 기술이 달라집니다. 따라서 먼저 각각의 정의와 차이점에 대해서 간략하게 살펴보겠습니다. 참고로 LINE Blockchain은 계정 기반 블록체인입니다.
UTXO
UTXO는 'Unspent Transaction Output'의 약자로 소유자 정보와 사용 여부, 잔액 정보가 포함된 객체입니다. UTXO에 포함된 소유 정보에 해당하는 개인 키로 해당 UTXO의 소유권을 증명해 사용할 수 있고, 이렇게 소유한 UTXO를 새로운 소유주에게 전달하는 UTXO를 생성해서 거래를 진행합니다.
아래 예시 그림을 보시겠습니다. 왼쪽 첫 번째 블록의 Tx k에서 input 0(1 BTC)을 세 개의 output으로 나눈 새로운 UTXO를 생성해서 소유권을 이전하는 트랜잭션으로 거래가 이루어집니다. Tx k+3처럼 여러 UTXO의 소유를 증명해서 하나의 거래를 진행할 수도 있습니다. 이때 거래에 사용한 입력(input) UTXO는 거래 완료 후에는 사용된 것으로 표시되고, 이후 다른 거래의 입력으로 사용할 수 없습니다.
UTXO는 여러 종류의 권종이 있는 화폐와 비슷합니다. 1달러와 10달러가 각각 존재하며 이 권종들을 합쳐서 계산하는 것과 비슷합니다. UTXO는 한 번 사용하면 사라지기 때문에 익명성과 보안성이 우수하고, 각각의 UTXO 객체를 병렬로 처리할 수 있어서 확장성도 뛰어납니다. 하지만 소유자의 자산 보유량을 알기 위해서는 소유자의 모든 UTXO 목록을 관리해야 하고, 체인에서도 각 UTXO를 모두 저장하고 관리해야 하기 때문에 저장 공간을 많이 차지합니다.
계정(account)
계정 모델은 은행 계정과 같이 사용자 계정을 기준으로 잔액 정보를 키-값 형태의 데이터베이스로 관리하는 모델로 거래는 송신자가 보유한 잔액 이하의 금액을 송신 금액으로 하고 이 거래를 송신자의 개인 키로 서명해서 거래를 증명합니다.
다시 말해서 UTXO는 소유권을 증명하지만, 계정 모델은 잔액이 있음을 증명합니다. 거래 처리를 완료하면 각 계정의 잔액을 변경해서 거래 결과를 반영합니다. 트랜잭션에 기록된 내용을 상태 값 연산에 그대로 적용할 수 있으므로 복잡한 처리도 직관적으로 작성할 수 있고 이해하기가 더 쉽습니다. 그래서 잔액 정보가 다양하게 연계되는 스마트 계약을 구현하는 데 용이하지만, 계정의 잔액이 크리티컬 영역이기 때문에 병렬 처리를 통한 성능 향상은 쉽지 않습니다.
UTXO vs 계정
지금까지 알아본 UTXO와 계정 모델의 차이점과 장단점을 쉽게 알아볼 수 있게 아래와 같이 표로 정리했습니다.
트랜잭션을 처리하는 방법을 살펴보겠습니다. UTXO는 인풋과 아웃풋, 잠금, 해제 스크립트로 구성되고, 인풋의 소유권을 증명해서 소유권을 이전하는 방식으로 처리하는 형태입니다. 계정 모델은 송신자와 수신자, 거래 금액, 서명으로 구성되며, 송신자의 잔액이 충분한지와 서명이 유효한지를 검증해서 결과를 계정 잔액에 각각 계산해 반영하는 방식입니다.
상태를 기록하는 방식을 살펴보겠습니다. UTXO는 자금의 이동이 DAG(directed acyclic graph) 형태로 기록되며, 소유자의 잔액은 소유자의 모든 UTXO들의 합으로 구할 수 있습니다. 그와 달리 계정 모델은 네트워크 상태 값이 키-값 형태의 데이터베이스로 기록되며, 소유자의 잔액은 계정의 잔액을 조회하는 것으로 간단하게 구할 수 있습니다.
이와 같은 구조 차이 때문에 UTXO 기반의 모델은 병렬 처리가 가능하고, 샤딩이 용이하며, 익명성과 보안성이 뛰어난 반면, 스마트 계약을 설계하기에는 복잡합니다. 반면 계정 기반 모델은 스마트 계약 개발이 용이하고, 단일 계정 거래 내에서 트랜잭션 히스토리 생성도 쉽지만, 이중 지불을 방지하기 위해서 임시값(nonce)을 추가하는 것과 같은 방안을 마련해야 하고 성능 향상을 위한 병렬 처리가 어렵습니다.
UTXO 모델과 계정 모델은 상태를 저장하는 방식의 차이 때문에 사용할 수 있는 개인 정보 보안 강화 기술에도 차이가 있습니다.
UTXO 모델에서 상태를 저장하는 방식은 다음과 같습니다. UTXO를 생성할 때 고유 정보를 객체 형태로 그대로 갖고 있는 상태에서 위 왼쪽 그림과 같이 DAG 형태로 저장합니다. 해당 UTXO를 사용하려면 단순 소유 증명만 하면 되기 때문에 특정 UTXO만 보안 처리해서 거래 당사자만 확인하고 그 외 3자는 확인할 수 없도록 할 수 있습니다.
반면 계정 모델에서는 잔액을 하나의 변수에서 관리하면서 지속적으로 업데이트하므로 특정 거래만 보안 처리해 계정 당사자만 알 수 있도록 하기 위해서는 공개 잔액과는 다른 보안 잔액을 별도 변수로 관리해야 합니다. 또한 보안 잔액의 상태를 변경할 때마다 값을 변경하기 위해서 동형 암호와 같은 기술을 사용해 암호화된 상태에서도 덧셈 연산이 가능하게 만들어야 합니다.
잘 이해하셨나요? 다시 한 번 정리해 보겠습니다. 아래 왼쪽 UTXO 모델의 그림에서 State(N+2)에 UTXO5를 보안 처리한다고 가정하면, 어떤 기술을 사용하든 UTXO5만 소유를 증명할 수 있으면 됩니다.
이번에는 아래 오른쪽 계정 모델 그림을 보시겠습니다. State(N+2)에서 계정의 Balance t2를 보안 거래해서 State(N+3)에 반영하기를 원한다면, State(N+2)에서 계정의 Balance t2가 왜 이 잔액을 가지고 있는지, 그리고 유효한 잔액인지를 증명해야 합니다. 그런데 이 잔액은 이전 거래들을 진행하며 계속 반영한 것이기 때문에 이전에 완료한 거래들도 모두 증명할 수 있어야 됩니다. 그래서 계정 모델에서 특정 거래만 보안 거래를 하기 위해서는 보안 거래를 위한 별도의 잔액을 변수로 관리해야 하고, 이 잔액은 암호화된 상태에서 연산할 수 있어야 합니다.
더 어려워지셨나요? 핵심은, UTXO 모델의 블록체인보다 계정 모델의 블록체인에서 보안 거래를 구현하는 게 조금 더 어렵다는 것입니다. 이것만 기억해 주시면 될 것 같습니다.
LINE Blockchain에서 선택한 보안 거래 기술과 작동 방식
앞서 블록체인에서 개인 정보를 보호할 수 있는 여러 기술과 블록체인의 거래 처리 방식에 대해 알아보았습니다. 여러분은 이제 블록체인의 보안 전문가가 되신 것입니다. :) 그렇다면 이제 LINE Blockchain에서는 보안 거래를 위해 어느 기술을 사용하고 있는지 알아보겠습니다. LINE Blockchain은 이미 별도의 합의 알고리즘이 있고 개발한 메인넷이 있습니다. 이 메인넷에 보안 거래 기능을 추가하는 것이기 때문에 기본적으로 지켜야 하는 룰이 있고 주의해야 할 점들도 있습니다. 또 LINE Blockchain의 보안 거래를 위해서 별도로 필요한 기능들도 있어서 이를 정리해 봤습니다.
요구 사항 정리
첫 번째로, 공개 거래와 보안 거래가 모두 가능해야 한다는 것입니다. 대부분의 거래는 이미 구현된 공개 거래로 송신자와 수신자, 거래 금액이 모두 공개되지만, 특별 서비스나 특정 거래는 보안 거래가 가능해야 한다는 것입니다.
두 번째로, 모든 공개 거래와 보안 거래의 거래 내역을 공개해서 누구나 해당 거래가 처리됐다는 것을 확인할 수 있어야 하고, 모든 노드가 동일한 원장을 가져야 한다는 것입니다. 이는 분할된 비 동일 원장은 현재 개발된 합의 알고리즘의 변경 없이는 검증과 합의가 어렵기 때문입니다.
세 번째는 보안 거래에서 송신자와 수신자, 거래 금액을 모두 보안 처리해서 거래 당사자 외에는 알 수 없도록 해야 한다는 것입니다. 이것이 궁극적으로 원하는 보안 거래 방법입니다.
마지막으로 네 번째는 보안 거래는 감사자가 감사할 수 있는 기능이 필요합니다. 보안 거래로 송신자와 수신자, 거래 금액이 모두 보안 처리된다고 하더라도, 일반적인 경우에는 사용하지 않겠지만 감사 요구 권한이 있는 사람이 감사를 요구할 경우 해당 거래 내용을 감사할 수 있는 기능이 필요합니다. 이 기능은 필수는 아니지만, 블록체인을 사용하는 상황에 따라 선택적으로 필요한 요구 사항이었습니다.
요구 사항에 맞는 기술 선택
위와 같은 요구 사항을 충족하기 위해서 우리는 앞서 살펴봤던 기술 중에서 적용 가능한 기술을 확인해 봤습니다.
먼저 모든 거래를 공개해야 한다는 두 번째 요구 사항 때문에 원장을 분리하는 기술은 적용할 수가 없었습니다. 모든 원장을 모든 사용자나 모든 노드에 공개하는 것이 아니라, 비공개와 공개 원장으로 분리하거나 거래 당사자만 볼 수 있도록 분리하기 때문입니다. 또한 보안 거래에서 모든 거래 내용을 보안 처리해야 한다는 세 번째 요구 사항을 만족하는 기술로는 원장 분리와 ZKP가 있었는데요. 원장 분리는 앞서 말씀드린 대로 두 번째 요구 사항에 걸리기 때문에 ZKP를 사용하기로 했습니다.
물론 믹싱과 링 서명 또는 믹싱과 Pedersen 커밋먼트를 조합해서 모든 정보를 보안 처리할 수도 있겠지만, 실시간 거래와 확장 속도를 높이기 위해서 ZKP를 사용하기로 결정했습니다.
ZKP
앞서 ZKP에 대해 간단하게 설명했는데요. 구현된 내용을 설명하기 전에 이해를 돕기 위해서 조금 더 설명하겠습니다. ZKP를 설명할 때 가장 많이 사용되는 예시가 아래 그림과 같은 '알리바바의 동굴' 예시입니다.
그림과 같이 동굴에는 A 방향과 B 방향으로 갈 수 있는 갈림길이 있고, 반대편 중간은 주문으로 열 수 있는 문으로 막혀 있습니다. 왼쪽 첫 번째 이미지처럼 Bob이 동굴 밖에서 기다리는 동안 Alice가 A나 B 방향 중 한 방향을 선택해서 간 뒤, Bob이 동굴 안으로 들어와서 Alice에게 A나 B 방향 중 어느 한 방향으로 나오라고 했을 때, Alice가 Bob이 말한 방향으로 나온다면 중간의 문을 열 수 있는 주문을 알고 있는 것이라고 할 수 있습니다. 물론 운 좋게 Alice가 A 방향으로 들어갔는데 Bob이 A 방향으로 나오라고 한다면 문을 열지 않고도 나올 수 있는데요. 이런 방법을 서로 논의하지 않고 여러 번 반복했을 때 매번 운이 좋을 수는 없습니다. 따라서 Alice가 항상 Bob이 지정한 방향으로 나온다면 확률적으로 Alice가 문을 열 수 있는 주문을 알고 있다고 Bob은 말할 수 있습니다. 결론적으로 Alice는 문을 열 수 있는 주문을 말하지 않고도 자신이 알고 있다는 것을 Bob에게 증명할 수 있는 것입니다. 이 예시는 ZKP를 이해하기 쉽게 설명한 것인데요. 실제로는, 증명자는 숨기고 싶은 정보를 타원 곡선 암호 방식으로 계산해 증거를 생성하고, 검증자는 이 증거를 검증할 수 있도록 구현돼 있습니다.
이렇듯 ZKP를 사용하면 숨기고 싶은 정보를 공개하지 않으면서도 암호학적 방법으로 계산한 증거를 이용해 이를 검증할 수 있습니다.
LINE Blockchain은 계정 기반 모델을 사용하고 있습니다. 앞서 말씀드린 것처럼 계정 기반에서는 잔액을 지속적으로 업데이트하므로 잔액을 암호화한 상태에서도 덧셈할 수 있는 기술이 필요합니다. 앞서 말씀드린 기술 중에서 Pedersen 커밋먼트 기술이 여기에 해당하는데요. 첫 번째 요구 사항인 공개 거래와 보안 거래가 모두 가능하려면 공개 잔액과 암호화된 잔액 간 전환이 가능해야 되고 이를 검증할 수 있어야 하는데 Pedersen 커밋먼트로는 이를 구현하기가 쉽지 않아 많은 고민을 했습니다.
고민 끝에, 공개 거래의 변경 없이 보안 거래에서 사용하는 잔액은 UTXO 모델을 사용하고, 공개 거래에서 사용하는 잔액은 계정 모델을 사용하는 하이브리드 모델을 사용하기로 결정했습니다. 그래서 계정 모델의 잔액과 UTXO 모델의 잔액을 모두 사용할 수 있도록 했습니다.
또한 보안 거래는 감사자가 감사할 수 있어야 한다는 네 번째 요구 사항에 맞추기 위해서 보안 거래에서 사용되는 보안 잔액은 서명 키와는 다른, 암호화(encryption) 키와 뷰잉(viewing) 키의 쌍으로 암호화해서 감사를 요청할 때 뷰잉 키를 공유해 소유를 증명할 수 있도록 했습니다.
LINE Blockchain 보안 거래의 주요 기능
앞서 말씀드린 요구 사항에 맞춰 구현한 LINE Blockchain 보안 거래의 주요 기능은 크게 다음 네 가지입니다.
- 먼저 기존 공개 거래를 유지하면서 보안 거래를 추가했습니다. 보안 거래는 송신자와 수신자, 거래 금액 모두 ZKP이기 때문에 공개하지 않고 증거로 검증 가능합니다.
- 두 번째로 보안 거래는 UTXO 모델을 사용하고 공개 거래는 계정 모델을 사용해 특정 거래와 서비스는 보안 거래가 가능하면서, 기존에 구현된 스마트 계약이나 합의 알고리즘은 변경 없이 사용할 수 있습니다.
- 세 번째로 일반적으로 공개된 계좌 모델의 잔액과, 보안 거래로 생성된 UTXO 모델의 보안 잔액의 상호 교환 거래에 제약이 없습니다.
- 마지막으로 보안 거래의 UTXO는 소유자의 서명 키를 공개하지 않고도 감사할 수 있고, 암호화 키를 매 보안 거래마다 새롭게 생성해 암호화된 UTXO의 소유자를 유추하기 어렵게 했습니다.
LINE Blockchain 보안 거래의 작동 방식
LINE Blockchain에서 보안 거래는 UTXO 모델의 보안 잔액으로 진행됩니다. 그런데 기본 거래는 계정 모델인 공개 잔액으로 진행되므로 공개 잔액과 보안 잔액 간 교환이 필요합니다. 이에 공개 잔액을 보안 잔액으로 송금할 수 있는 HidingTransaction과 보안 잔액에서 공개 잔액으로 송금할 수 있는 RevealingTransaction을 추가했고, 보안 거래는 SecretTransaction에서 송신자와 수신자, 거래 금액을 모두 비공개로 거래할 수 있습니다.
이와 같은 보안 잔액과 공개 잔액 간의 거래가 어떻게 진행되고, 모든 정보를 비공개하는 보안 거래가 어떻게 가능한지 하나씩 살펴보겠습니다.
HidingTransaction - 공개 잔액을 보안 잔액으로 송금
LINE Blockchain에서 계정 방식의 잔액인 공개 잔액을 UTXO 방식인 보안 잔액으로 송금하기 위해서 HidingTransaction을 사용합니다.
HidingTransaction에서는, 송신자와 거래 금액은 트랜잭션에 추가해 공개하지만 송신자의 정보는 추가하지 않고, 수신자가 소유하게 될 secret UTXO와 이를 증명하는 ZKP 증거를 포함합니다. 그리고 송신자의 서명이 추가됩니다. 체인에서 HidingTransaction을 수신하면 먼저 송신자의 서명과 잔액을 검증하고, 수신자가 소유하게 될 secret UTXO의 ZKP 증거를 검증합니다.
검증 결과 정상적인 HidingTransaction 요청으로 확인되면, 송신자의 공개 잔액에서 거래 금액만큼 차감하고 차감된 거래 금액은 소각합니다. 그리고 소각된 거래 금액만큼의 잔액으로 소유자가 송신자인 mint UTXO를 생성하고, mint UTXO에서 secret UTXO로 소유권이 이전된 것으로 처리합니다. 거래 금액만큼 공개 잔액은 소각되고 보안 잔액이 새로 발행되는 프로세스를 거치는 것입니다. Mint UTXO는 모든 정보를 공개하기 때문에 소유권이 전환된 secret UTXO의 잔액을 유추해 볼 수는 있습니다. 하지만 소유자가 누구인지는 알 수 없고, 다음 거래에서 보안 송금을 하면 secret UTXO가 다른 secret UTXO로 쪼개지거나 결합되면서 더 이상 해당 잔액 정보를 추적할 수 없습니다.
RevealingTransaction - 보안 잔액을 공개 잔액으로 송금
HidingTransaction과 달리 보안 잔액에서 공개 잔액으로 송금할 때는 RevealingTransaction으로 진행합니다.
RevealingTransaction의 경우 송신자 정보 없이 수신자와 거래 금액을 트랜잭션에 추가해 공개하고 송신자 소유인 input secret UTXO의 소유 증명을 위해 ZKP로 계산한 증거를 거래에 포함합니다. 체인에서 RevealingTransaction을 수신하면, secret UTXO의 사용 여부를 확인하고 ZKP의 증거를 검증합니다. 정상적인 RevealingTransaction으로 검증되면 공개 잔액으로 송금되는 거래 금액만큼 burn UTXO를 생성해서 소각하고, 그 금액만큼 공개 잔액을 생성해 수신자의 공개 잔액에 추가합니다.
이때 입력 secret UTXO의 전체 잔액을 모두 송금하는 거래일 경우 burn UTXO가 공개되므로 그 잔액을 유추해 볼 수 있는데요. 이런 경우에는 입력 secret UTXO의 전액이 아니라 일부 금액만 공개 잔액으로 송금하고 남은 잔액은 출력 secret UTXO로 생성하면, 입력 secret UTXO의 잔액 정보를 유추하기 어렵게 만들 수 있습니다. 이와 같이 RevealingTransaction으로 UTXO 모델의 보안 잔액을 계정 모델의 공개 잔액으로 변환하면서 수신자와 거래 금액이 공개돼 누구나 알 수 있지만, 송신자가 누구인지, 그리고 송신자의 잔액이 얼마였는지는 알 수 없습니다.
SecretTransaction - 보안 잔액 간 거래
보안 잔액 간의 거래는 SecretTransaction으로 거래를 진행합니다. 저희가 진정으로 원했던, 송신자와 수신자, 거래 금액을 모두 비공개로 하고 거래를 진행할 수 있는 거래입니다. SecretTransaction에서는 송신자와 수신자, 거래 금액을 모두 공개하지 않습니다. 보안 잔액의 secret UTXO의 소유권과 거래가 진행되는 모든 계산에 대한 증명은 ZKP 계산으로 증거를 생성합니다.
체인에서는 secret UTXO에 포함돼 전달되는 secret UTXO들의 사용 여부와 ZKP 증거를 검증하고, 정상적으로 검증되면 입력 secret UTXO는 사용한 UTXO로 전환하고, 출력 secret UTXO들은 새로 사용할 수 있는 UTXO로 상태를 기록합니다.
이로써 모든 정보가 비공개인 보안 거래가 정상적으로 진행됐습니다.
물론 위와 같이 하나의 secret UTXO에서 송금하는 것뿐 아니라 여러 개의 secret UTXO의 소유를 증명해서 하나 또는 두 개의 secret UTXO를 output으로 내놓는 보안 거래도 가능합니다.
감사
여기까지 보안 거래가 진행되는 과정을 말씀드렸습니다. 이와 같이 보안 거래가 이루어지면 암암리에 불법 자금을 이용한 불법 거래가 진행될 수도 있습니다. 이를 방지하기 위해서 불법 거래로 의심되는 거래에 포함된 secret UTXO에 대해서 거래 당사자에게 secret UTXO를 볼 수 있는 뷰잉 키를 요구해서 해당 거래 정보를 감사할 수 있습니다. 여기서 공유된 뷰잉 키로는 해당 secret UTXO만 확인할 수 있습니다. 다른 secret UTXO는 확인할 수 없습니다. 만약 중앙은행과 같은 기관에서 감사하기를 원한다면 암호화 키와 뷰잉 키를 별도 감사 기관에서 관리하도록 설계하면 모든 거래를 감사할 수 있습니다.
LINE Blockchain의 보안 거래 간단 요약
LINE Blockchain의 보안 거래를 잘 이해하셨나요? 아래 그림을 보며 간단하게 요약하겠습니다.
일반적인 거래는 기존 트랜잭션을 이용해서 모든 거래 정보가 공개되는 공개 거래를 진행하면 됩니다. 이는 이미 공개한 LINE Blockchain의 기본적인 거래 방식입니다. 만약 내가 특정 잔액을 비공개로 진행하고 싶으면 송신하는 상대방에게 HidingTransaction으로 거래를 요청해서 보안 잔액으로 수신하면 됩니다. 물론 자기 자신과 HidingTransaction으로 거래해서 보안 잔액으로 변환할 수도 있습니다. 보안 잔액은 SecretTransaction을 이용해 쭉 보안 거래할 수 있고, 그러다가 필요할 때 RevealingTransaction을 사용해서 공개 잔액으로 전환할 수 있습니다.
중앙은행과 같은 기관에서 처음부터 보안 잔액을 사용해서 모든 거래를 보안 거래로 진행할 수 있도록 하는 방법은 추후 추가할 계획입니다.
향후 계획
LINE Blockchain의 요구 사항에 맞는 기술을 도입하기 위해 여러 논문을 살펴보고 많은 시행착오를 거친 뒤, 현재 체인에 적용해서 테스트하고 있습니다. 아직 아주 기본적인 보안 거래 기능만 추가한 상태지만, 향후 이 기본 기능을 더욱 유익하고 편리하게 사용할 수 있도록 개선할 계획입니다.
첫 번째로 지금은 기본 코인만을 보안 송금할 수 있습니다. 그런데 LINE에서 NFT를 서비스하면서 NFT의 소유 여부를 다른 이에게 공개하지 않으면서 소유를 증명하거나 익명 송금을 할 수 있게 해달라는 요구 사항이 들어왔습니다. 이에 NFT의 소유 여부와 송금 역시 보안 거래가 가능하도록 추가할 계획입니다.
두 번째로, 현재 보안 거래를 감사하려면 뷰잉 키를 소유 당사자에게 요구해야 하며, 만약 소유자가 분실했을 경우 이를 감사할 방법이 없습니다. 이를 개선하기 위해 소유주를 포함한 다중의 감사자 또는 감사 시스템이 각기 공유되지 않는 입력 값을 모두 활용해서 동일한 결과를 계산하는 방식인 MPC(Multi-Party computation)를 고려하고 있으며, 그 외 다른 방법도 여러 방면으로 살펴보며 검토하고 있습니다.
세 번째로, 현재 체인에서 secret UTXO들의 거래는 ZKP 증거에 의존하고 있는데요. 물론 지금의 방식으로도 전혀 문제될 건 없지만, 동형 암호를 도입해서 체인에서 secret UTXO의 암호화된 정보까지 검증할 수 있게 개선할 계획입니다.
제 글은 여기까지입니다. 이해하기 어려운 Blockchain의 보안 거래에 대한 긴 글을 읽어주셔서 정말 감사합니다. LINE Blockchain에서는 여러분들이 좀 더 편리하게 블록체인을 사용할 수 있도록 부단히 노력하며 연구하고 있으며, 보안 거래도 그 연구 결과 중 하나입니다. 앞으로 많은 관심과 기대 부탁드립니다.