카테고리: 개발사 및 Wallet 👛

TL;DR

CoinJoin 같은 금액 출력 구조

CoinJoin 같은 금액 출력 구조

CoinJoin은 “섞는 서비스”보다 transaction 구조다

[033]에서 본 것처럼 Bitcoin privacy의 기본 문제는 UTXO들이 서로 어떻게 연결되어 보이는가다. 일반적인 지출에서는 여러 input이 함께 쓰이면 같은 지갑이 통제했을 가능성이 높다고 추정된다. 이를 common-input ownership heuristic이라고 부른다.

CoinJoin은 이 추정을 일부러 깨기 위한 transaction 구조다. 여러 사람이 각자의 UTXO를 input으로 넣고, 각자가 받을 output도 같은 transaction 안에 만든다. 그러면 단순히 “input이 같이 쓰였으니 한 사람 것”이라고 말하기 어려워진다.

중요한 점은 CoinJoin이 Bitcoin 규칙 밖의 별도 시스템이 아니라는 것이다. 결과물은 여전히 하나의 정상적인 Bitcoin transaction이다. 다만 그 transaction이 여러 사람의 공동 서명으로 만들어지고, output 구조가 관찰자의 추정을 어렵게 설계되어 있다.

같은 금액 output이 왜 중요한가

가장 직관적인 CoinJoin 형태는 같은 금액 output을 여러 개 만드는 방식이다.

예를 들어 5명이 각각 0.1 BTC짜리 CoinJoin output을 하나씩 받는다고 하자. transaction 안에는 여러 input과 함께 0.1 BTC output 5개가 생긴다. 체인을 보는 사람은 0.1 BTC output들 중 어느 것이 어떤 input 참가자에게 돌아갔는지 확정하기 어렵다.

이때 privacy set은 대략 “같은 금액 output 후보가 몇 개인가”에서 출발한다. 0.1 BTC output이 5개면 관찰자는 최소한 그 5개 사이에서 헷갈린다. 물론 현실에서는 fee, change, script type, timing, 이후 지출 방식 같은 추가 단서가 붙기 때문에 숫자 하나로 privacy를 단정할 수는 없다.

반대로 output 금액이 전부 다르면 구분이 쉬워진다. 내가 넣은 input 조합과 거의 같은 금액의 output이 하나뿐이라면, 관찰자는 연결을 추정할 수 있다. 그래서 classic CoinJoin에서는 denomination, 즉 공통 금액 단위가 중요하다.

coordinator는 무엇을 하는가

CoinJoin에는 참가자들을 모으고 round를 진행할 무언가가 필요하다. 이 역할을 coordinator라고 부른다.

coordinator가 보통 하는 일은 다음과 같다.