기밀 트랜잭션 설명
기밀 트랜잭션(Confidential Transactions)은 가상자산 프로토콜의 프라이버시를 강화한 것으로, 네트워크에서 당사자 간에 주고 받은 금액을 알아내기 어렵게 합니다.
들어가며
블록체인이 작동하기 위해서는 보통 시스템 투명성을 핵심적인 것으로 간주합니다. 이는 모든 네트워크 상의 모든 노드가 사본을 저장할 수 있고 검증할 수 있으며, 어떠한 규칙도 위반되지 않는다는 걸 의미합니다. 다수의 분산화된 원장에 대하여 누구나 온라인 블록 탐색기를 불러올 수 있고 이를 통해 블록, 트랜잭션, 주소를 검색할 수 있습니다.
그러나 이는 프라이버시 측면에서는 이상적이지 않습니다. 비트코인과 같은 시스템에서 모든 트랜잭션은 이전 트랜잭션과 연결될 수 있습니다. 코인은 기술적으로 대체 불가능하며, 이는 각 코인이 특정 트랜잭션과 연결되어 있음을 의미합니다. 누구도 여러분이 비트코인을 전송하는 것을 가로막을 수 없지만, 해당 코인이 블랙리스트 처리된 주소를 거친 적이 있다면 여러분의 트랜잭션을 거부할 수도 있습니다.
최악의 경우, 대체 가능성의 결여는 시스템 근간에 큰 영향을 줄 수 있습니다. 새로운 코인 값이 비싸질 수 있으며, 지난 기록에 따라 오래된 코인의 값은 떨어질 수 있습니다.
비트코인 프라이버시는 보통 과장되곤 합니다. 코인뿐만 아니라 사용자도 추적될 수 있습니다. 여기에는 익명성이 존재하지만(이름 대신 공개 주소가 보임), 결점이 없는 것은 아닙니다. 복잡한 분석 기술은 주소들을 종합해 보다 정확하게 네트워크 주체의 익명성을 해체할 수 있습니다.
기밀 트랜잭션 업그레이드는 트랜잭션을 온전히 비공개로 만드는 것입니다.
기밀 트랜잭션이란 무엇인가요?
기밀 트랜잭션은 2013년 블록스트림 CEO 아담 벡(Adam Back)이 처음으로 공론화했으며, 비트코인 개발자 그레고리 맥스웰(Gregory Maxwell)에 의해 논의가 확대되었습니다. 맥스웰은 초기에 제시되었던 문제들(대체 가능성과 미약한 익명성)을 정리하고 해결책을 제시했습니다. 전송된 금액은 더 큰 네트워크로부터 감춰질 수 있으며, 따라서 거래의 당사자들만이 이를 알 수 있습니다.
일반적인 상황(공개적으로 볼 수 있는 트랜잭션)에서, 전송받은 금액이 전송한 양을 초과하지 않는다는 것을 하나의 노드가 확인하는 것은 간단한 일입니다. 만약 앨리스가 밥에게 0.3 BTC를 보내고자 하며, 그녀가 사용하지 않은 않은 코인(이를 1 BTC라 하겠습니다)을 갖고 있다고 해보겠습니다. 앨리스는 이를 두 조각으로 나눕니다. 0.3이 밥에게 전송될 것이고, 0.69는 다시 그녀에게 돌아올 것입니다(마이닝 수수료를 제외하고).
이는 다른 노드에게도 간단한 수학 과정입니다. 1은 0.3 + 0.69보다 크고, 해당 서명이 모두 올바르며, 앨리스의 금액이 이전에 다른 곳에서 사용되지 않았기에, 트랜잭션은 반드시 유효할 것입니다. 그러나 금액이 감춰질 경우, 문제는 그리 간단하지 않습니다. 하나의 알 수 없는 금액이 알 수 없는 다른 두 금액과 같거나 이를 초과한다는 걸 어떻게 계산할 수 있을까요?
암호 방식의 도입
데이터를 감추기 위해서는 암호화가 필수적입니다. 하지만 전통적인 방법은 문서들을 안전하게 보관하기는 하지만, 내부에서 이를 보호할 경우 암호화를 해제하기 전까지는 사용할 수 없게 됩니다. 기밀 트랜잭션을 위해서는 당사자의 금액이 공개되지 않지만, 외부자에 의해 해당 자산이 검증될 수 있는 디지털 금고가 필요합니다.
해답은 동형 암호화(homomorphic encryption)에 있으며, 보다 정확하게는 페데르센 계산법(Pedersen commitment)이라 하는 방법에 있습니다. 해당 암호화 방식은 외부자로 하여금 암호화된 데이터(볼 수 없는)를 다양한 목적으로 활용할 수 있게 합니다.
차후에 공개하고 싶은 데이터에는 일반적인 해시를 사용할 수 있습니다. 여러분이 가장 좋아하는 거래소를 알아 맞힐 경우 0.01 BTC를 상금으로 주는 콘테스트를 소셜 미디어에 공고하고 싶다고 가정해 보겠습니다. 콘테스트가 끝난 다음 해당 결과를 보고 여러분이 언급되지 않은 거래소를 선택할 수 있기 때문에, 참가자는 의심스러워 할 수 있을 것입니다.
여러분이 할 수 있는 것은 해시(특정한 입력값을 나타내는 무작위처럼 보이는 일련의 숫자와 문자)를 팔로워들에게 제공하는 것입니다. 여러분은 특정 결괏값을 얻기 위해 함수에 거래소를 대입합니다. SHA256 알고리즘과 함께 이를 살펴보도록 하겠습니다.
f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191
이것만 봐서는 입력값이 무엇이었는지 알 수 없습니다. 또한, 입력값을 얻기 위해 함수를 되돌릴 수도 없습니다. 그러나 입력값이 고팍스였다는 것을 안다면, 해당 해시가 위의 해시와 일치하는지 쉽게 확인할 수 있습니다. 이런 식으로, 여러분의 팔로워들은 콘테스트가 끝났을 때 결과를 바꾸지 않았다는 것을 확신할 수 있습니다. 만약 결과를 바꾼다면 전혀 다른 값이 나올 것입니다.
그럼에도 불구하고 현실적으로 이는 매우 안전하지 않습니다. 여러분의 팔로워들은 알고리즘을 역공학(reverse-engineer)할 수 없지만, 가능한 거래소 목록을 작성하여, 일치하는 결과를 얻을 때까지 이를 모두 해싱할 수 있습니다. 우리는 해시화하려는 데이터에 비공개 요소(blinding factor)라 하는 임의 데이터를 추가하여 이를 어느 정도 방지할 수 있습니다.
만약 우리가 고팍스는 내가 가장 좋아하는 거래소입니다. 다른 어떤 거래소보다 고팍스를 좋아해요를 입력한다면, 상대가 이를 추측하기란 상당히 어려워집니다(또한 그 누구도 0.01BTC를 위해 이를 시도해 보려 하지는 않을 것입니다).
페데르센 계산법은 계산 뒤에 입력값을 추가할 수 있게 합니다. 맥스웰은 다음과 같이 설명했습니다.
C(BF1 + D1) + C(BF2 + D2) = C(BF1 + BF2, D1 + D2)
BF는 비공개 요소이며, D는 데이터입니다.
타원 곡선 암호화와 범위 증명(range proofs)을 포함시키려면 몇 가지 과정을 더 거쳐야 하지만, 기본적인 아이디어는 사용자가 자신의 주소에 페데르센 계산을 적용하는 것입니다. 자금을 전송할 때, 두 가지 계산이 진행됩니다(하나는 사용자에게 변경된 주소를 반환하기 위해, 다른 하나는 목적지 주소를 위해).
누구도 얼마가 전송되고 있는지 알 수 없으나, 변경 사항과 목적지 계산(맥스웰 방정식의 왼쪽 부분)을 더한 것이 근원 주소(방정식의 오른쪽 부분)와 맞는지 확인할 수 있습니다. 해당 방정식이 정확하면, 입력값과 출력값이 동일하다는 것이 증명되었기에 사용자의 트랜잭션은 유효합니다.
기밀 트랜잭션으로 무엇을 할 수 있나요?
기밀 트랜잭션이 비트코인에 적용된다면, 우리는 훨씬 더 비공개적인 시스템을 만끽할 수 있을 것입니다. 입력값과 출력값 모두가 더 큰 네트워크에서 가려질 것이고, 장부에 접근하는 것은 어려워질 것이지만, 노드는 여전히 검증을 계속할 수 있습니다. 프라이버시의 상당한 증가와 더불어, 체인을 분석해도 더 이상 해당 코인의 기록이 나타나지 않기 때문에 비트코인은 효과적으로 대체 가능해질 수도 있습니다.
현재로써는 프로토콜에 기밀 트랜잭션이 통합될 것 같지는 않습니다. 해당 기능이 추가되면, 보통 수준보다 트랜잭션은 훨씬 커지게 되며, 제한된 블록 공간을 고려할 때, 이는 부담이 될 뿐입니다. 또한 전통적으로 어려운 것으로 증명된 코드를 변경하는 것에 대한 대다수 참가자의 동의를 필요로 할 것입니다.
마치며
기밀 트랜잭션은 다른 가상자산과 비트코인 사이드체인에서 변형되어 사용되고 있습니다. 일례로, 모네로(Monero)는 익명성과 대체 가능성을 달성하기 위해 이를 링 서명(ring signatures)과 함께 조합해 사용합니다. 리퀴드(Liquid) 사이드 체인은 프라이버시를 향상시키기 위해 이를 사용하며, 밈블윔블은 이를 동일한 수준으로 확장시킵니다.
기밀 트랜잭션이 가져다 주는 장점들은 더 큰 공간이라는 담보를 필요로 합니다. 가상자산은 종종 기본 레이어에서 확장성과 처리량 문제를 겪으며, 트랜잭션 크기가 커지는 것은 환영받을 사항이 전혀 아닙니다. 그럼에도 프라이버시를 지지하는 이들은 가상자산이 진정으로 대체 가능한 돈으로 사용되기 위해서는 거래 금액과 참여자를 알 수 없게 하는 것이 필수적인 것이라 믿습니다.