비트코인 세그윗: BIP-141 상세

비트코인 세그윗: BIP-141 상세

비트코인 BIP-141에서 이뤄진 논의를 통해 실제 구현 상황에서 변화는 다음과 같습니다.

Specification

Transaction ID

기존의 txid[nVersion][txins][txouts][nLockTime] 형태의 트랜잭션 데이터를 SHA256 함수를 두 번 실행한 값으로 계산되었습니다. 이는 유지하면서 wtxid 라는 새로운 형태의 id를 사용합니다. 이는 [nVersion][marker][flag][txins][txouts][witness][nLockTime] 에 SHA256을 두번 실행한 값입니다.

  • marker: SegWit임을 나타내는 데이터로 고정된 값이다. 0x00
  • flag: SegWit의 버전을 나타내며 시작은 0x01 로 한다. 즉 SegWit version 1임을 나타냄
  • witness: 서명, 공개 키, 기타 스크립트 데이터 등이 포함될 수 있습니다. 각 트랜잭션 별로 witness가 존재합니다.

결론적으로 SegWit 트랜잭션 전체 구조는 다음과 같습니다. txin, txout 을 수와 실제 트랜잭션으로 구분하여 표현한 값은 다음과 같습니다. 실제 사례는 다음과 같이 해석할 수 있으니 참고하세요. 이는 BIP-144: Segregated Witness (Peer Services)에서도 정의되고 있습니다.

[nVersion][marker][flag][input_count][inputs][output_count][outputs][witness_count][witness_data][nLockTime]

Commitment structure

비트코인은 머클 트리에 트랜잭션 데이터의 해시값을 통해 계속 기록하며, 이 과정을 "커밋먼트"라고 표현합니다. 결국 txid 데이터로 머클 트리를 업데이트 한다면, witness 데이터는 어떤 식으로 기록할까요?

SegWit에서는 witness에 대해 별도의 머클 트리를 생성하며, 이를 coinbase 트랜잭션에 포함시킵니다. 또한 이 coinbase 트랜잭션은 기존 머클 트리에 포함되므로 결국에 이 모든 데이터는 머클 트리에 포함된다고 볼 수 있습니다. 이를 통해 소프트포크로 업그레이드를 진행한 SegWit은 데이터를 효과적으로 분리하면서 전체 네트워크에서 안정성을 유지할 수 있습니다.

Witness Program

scriptPubKey, redeemScript 는 비트코인 트랜잭션의 출력을 잠그고 해제에 사용하는 스크립트입니다. 여기서 다음 조건을 포함하면 witness program으로 인식합니다.

  • version: 처음은 버전 바이트로 OP_0, OP_1 .. OP_16 사이의 값
  • L: witness program의 길이
  • witness program : 길이 L 의 스크립트

BIP-141은 크게 2가지를 명시하고 있습니다.

  • P2WPKH(pay-to-witness-public-key-hash): 버전 0에 길이 20이며, 공개 키에 해당하는 개인 키로 서명할 때 잠금이 해제됩니다.
  • P2WSH(pay-to-witness-script-hash): 버전 0에 길이 32이며, 해당 스크립트의 조건을 만족해야 합니다.

관련하여 구체적인 명세는 BIP-143: Transaction Signature Verification for Version 0 Witness Program 에 기술되어 있습니다.

Block Size & Block Weight

기존 비트코인은 블록 당 크기의 제한을 1MB( 1,000,000 Bytes)로 제한했습니다. 세그윗에서는 절대적인 크기가 아닌 가중치 개념을 도입했습니다.

  • 블록 가중치 = 기본 크기 * 3 + 전체 크기
  • 기본 크기: SegWit 관련 데이터를 제외한 기존 형식의 블록 크기 (바이트)
  • 전체 크기: SegWit 데이터를 포함 전체 블록 크기 (바이트)

그리고 가중치의 제한을 4MB(4,000,000)로 늘렸습니다. 여기서 몇 가지 아티클에서 알고있는 정보와 다른 부분을 확인할 수 있었습니다.

  • 세그윗의 대다수 글에 언급된 트랜잭션 1MB와 서명 데이터 3MB와 같은 설명은 기존 제안에 틀린 설명입니다.
  • 세그윗 업그레이드에 동의하지 않은 레거시 노드도 데이터에 대해 수령해야 하므로 총 1MB의 용량을 뛰어넘을 수는 없습니다.
  • 그럼에도 들어갈 수 있는 거래량은 늘었으며 다음과 같이 유도할 수 있습니다. 블록 가중치(4,000,000) - witness 데이터 > 4 * 거래 데이터 기존에 서명 데이터가 50% 이상을 차지하고 있었으며 대략적으로 3,500,000/4 = 875,000 = 500,000 * 1.75 로 약 거래 데이터는 기존보다 70% 정도 더 많은 거래 데이터를 담을 수 있게 됩니다.

Sigops

비트코인에서 Sigops는 Signature Opteration을 의미하며, 거래 검증 과정에서 필요한 서명 연산의 수를 측정하는 단위 입니다. 대표적인 Sigops는 다음과 같습니다.

  • OP_CHECKSIG: 단일 서명을 검증합니다.
  • OP_CHECKSIGVERIFY: OP_CHECKSIG와 동일한 기능을 수행하지만, 검증 결과에 따라 스크립트 실행을 중단할 수 있습니다.
  • OP_CHECKMULTISIG: 다중 서명을 검증합니다.
  • OP_CHECKMULTISIGVERIFY: OP_CHECKMULTISIG와 동일한 기능을 수행하지만, 검증 결과에 따라 스크립트 실행을 중단할 수 있습니다.

이러한 Sigops는 블록 당 20,000으로 제한이 있었습니다. 그리고 기존의 공개키 스크립트, 서명 스크립트 및 P2SH 확인 스크립트의 Sigop 이전 값의 4배로 계산됩니다. 시그옵 제한도 마찬가지로 ≤ 80,000으로 4배 증가했습니다. 이는 증가한 트랜잭션 수에 맞게 균형을 맞추기 위해 제안된 내용입니다.

Others

  • 세그윗은 이전에 설명한 BIP-9를 통해 소프트포크 업그레이드가 진행되었습니다.
  • 이후 세그윗 2x라는 블록 용량 증가에 대한 업그레이드 논의가 이뤄졌지만 합의가 이뤄지지 않은 상태로 마무리되었습니다.