비트코인 세그윗: BIP-141

비트코인 세그윗: BIP-141

이전 글에 이어 세그윗 업그레이드 제안 BIP-141: Segregated Witness (Consensus layer)에서 기술되는 구체적인 장점에 대해서 다뤄보려고 합니다.

Motivation

세그윗을 제안하게 된 가장 큰 Motivation은 다음과 같이 기술되어 있습니다.

The entirety of the transaction's effects are determined by output consumption (spends) and new output creation. Other transaction data, and signatures in particular, are only required to validate the blockchain state, not to determine it. By removing this data from the transaction structure committed to the transaction merkle tree, several problems are fixed:

"트랜잭션의 효과"는 사용되는 output과 생성되는 output에만 결정되며, 다른 트랜잭션 데이터와 서명은 블록체인 상태를 확인하는 것에만 필요하며, 상태를 결정하지 않는다. 그리고 트랜잭션 서명을 머클 트리에서 제거하는 것만으로 다음과 같은 효과를 가진다.

그리고 이를 통해 가질 수 있는 장점에 대해 다음과 같이 언급하고 있습니다.

  1. 의도하지 않은 전송은 불가능 (트랜잭션 가변성)
  2. 서명 데이터 전송은 선택적으로 변경 가능
  3. 소프트 포크를 통해 일부 제약 조건을 우회할 수 있음

결정과 검증?

근데 장점은 대략적으로 아아도 첫 내용이 무슨 말인지 좀 헷갈리지 않나요? 상태에 대한 확인과 상태에 대한 결정은 각각 무슨 차이가 있을까요? 이를 이해하기 위해서는 비트코인을 구성하는 두 주체를 구분해야 합니다.

  1. 노드: 비트코인의 블록을 생성하고, 이를 검증하는 프로그램.
  2. 사용자: 비트코인을 트랜잭션을 통해 받고, 보내는 사용자.

기본적으로 노드는 트랜잭션의 구조적 유효성(syntactic validity)을 확인하고, 올바른 형식을 갖추었는지, 입력과 출력이 잘 구성되었는지가 중요합니다. 여기서 서명 데이터는 필요하지 않습니다. 그리고 사용자 입장에서는 다른 주체가 서명 데이터를 수정할 수 있어 트랜잭션 가변성 문제 또한 있었습니다. 그래서 세그윗은 서명에 필요한 데이터 witness를 트랜잭션 데이터에 분리시켜 트랜잭션 데이터만 포함된 머클 루트 업데이트(UTXO 상태 변경)의 효율성 향상과 가변성 문제를 해결하는 것입니다.

어쨌든 witness 데이터도 필요한 데이터 아닌가?

맞습니다. 최종적으로는 witness 데이터도 전파를 해야하므로 노드 입장에서 전체적으로 보내는 데이터 양은 큰 변화가 없습니다. 조삼모사처럼 보이는 이 업그레이드는 어떤 장점을 더 가져올까요?

기존에는 노드가 구조적 유효성 검사 이후, 트랜잭션의 유효성에 대해 입력과 서명을 검증해야 했습니다. 그런데 이 검증을 병렬 처리하고 싶지만 서명 데이터가 함께 있을 때는 한계가 있었습니다. 트랜잭션 간에 의존성이 있으며, 트랜잭션 식별이 어려웠습니다. 하지만 세그윗에서는 식별자인 txid는 서명과 별개로 분리되었고, 트랜잭션이 선행되었으니 의존성 문제도 없어지며 검증에 대해 병렬처리가 가능해진 것입니다. 물론 클라이언트 레벨에서 코드 수정을 해야하지만, 세그윗 덕분에 가능해진 변화인거죠.

SPV(Simplified Payment Verification)

또한 비트코인의 모든 노드는 풀노드가 아닙니다. 비트코인에는 SPV(Simplified Payment Verification)라는 개념이 있습니다. 모든 데이터를 다운로드하지 않아도 트랜잭션을 검증해주는 기술을 의미합니다.

💡
참고로 라이트노드는 이런 SPV를 포함해 블룸 필터(Bloom Filter) 등의 기술을 선택적으로 포함한 구현체로 이해하시면 됩니다.

이런 SPV 클라이언트는 원래 블록 헤더만 다운로드합니다. 이전 블록 해시, 머클 루트, 타임스탬프 등의 데이터를 포함합니다. 클라이언트는 검증이 필요한 트랜잭션에 대해 머클 브랜치(트랜잭션이 블록에 포함되어 있음을 증명하는 최소한의 데이터)를 요청하고, 이를 통해 검증합니다. 이런 SPV 이입장에서는 세그윗 덕분에 더 작은 크기의 블록 데이터를 다운로드하고 필요한 witness만 요청하여 효율성이 개선됩니다. 또한 머클트리를 만들 때도 데이터의 수가 줄은만큼 생성과 검증에 필요한 계산량이 줄어듭니다.

업그레이드에 대한 가능성 확보

세그윗은 서명 데이터를 분리함으로 업그레이드에 대한 가능성이 열렸습니다.

  • 새로운 서명 알고리즘 도입: 기존 시스템에서는 새로운 서명 알고리즘을 도입하기 위해서는 모든 노드가 동시에 업그레이드 해야했습니다. 하지만 이제는 서명이 별도로 분리되어 점진적으로 업그레이드 할 수 있는 환경이 만들어졌습니다.
  • 스크립트 언어 확장: 우선 비트코인 스크립트는 제약 사항이 많습니다. 근데 이제는 트랜잭션 외의 데이터를 witness에 저장함으로 별도의 스크립트 언어를 기록할 공간이 생겼습니다.

그리고 이에 대한 연장선이 2021년 11월에 활성화된 Taproot입니다. 이는 또 다른 글에서 다뤄보겠습니다.

다음 글에서는 실제 세그윗의 구현체와 그 과정에 대해 더 살펴보겠습니다.