SegWit과 증인 데이터

Segregated Witness가 서명을 별도의 증인 필드로 옮겨 거래를 재구성하는 방식 - 가변성(malleability)을 고치고 수수료를 줄입니다.

0단계 ·

진행률 0/0

무엇을 배우는가

  • SegWit 거래에서 증인 필드의 구조
  • SegWit이 거래 가변성을 고치는 방식
  • 가중치 할인과 수수료에 미치는 영향

Segregated Witness란 무엇인가?

2017년 8월에 활성화된 Segregated Witness(SegWit)는 서명 데이터를 거래 본문에서 분리합니다. 서명을 각 입력의 ScriptSig 필드에 내장하는 대신, SegWit은 이를 출력과 locktime 사이에 자리하는 전용 증인(witness) 섹션으로 옮깁니다.

이 작아 보이는 재구성은 여러 중요한 문제를 해결하고 라이트닝 네트워크 같은 기술을 가능하게 합니다.

증인 구조

SegWit 거래에서 각 입력은 대응하는 증인 스택을 갖습니다. P2WPKH (Pay-to-Witness-Public-Key-Hash) 입력의 경우, 증인은 정확히 두 개의 항목을 포함합니다:

02                          # Stack item count: 2
47                          # Item 1 length: 71 bytes
3044022047ac...0121          # DER-encoded signature + SIGHASH byte
21                          # Item 2 length: 33 bytes
03b8f12c...a4e9             # Compressed public key (33 bytes)

증인 스택은 직렬화된 거래에서 입력과 같은 순서로 나타납니다. 거래에 3개의 입력이 있으면 3개의 증인 스택이 있습니다 - 일부 입력이 레거시라도(그들의 증인 스택은 비어 있음: 00).

완전한 SegWit 거래

서명된 거래의 전체 레이아웃:

02000000                    # Version 2
0001                        # Marker (0x00) + Flag (0x01) → "this is SegWit"
01                          # 1 input
  <32-byte prev tx hash>
  00000000                  # vout 0
  00                        # Empty ScriptSig (SegWit!)
  fdffffff                  # Sequence
02                          # 2 outputs
  e093040000000000          # 300,000 sats
  160014<recipient-hash>    # P2WPKH output
  b882020000000000          # 198,590 sats (change)
  160014<change-hash>       # P2WPKH output
                            # === Witness data starts ===
  02                        # 2 witness items for input 0
    47 <71-byte signature>
    21 <33-byte pubkey>
                            # === Witness data ends ===
00000000                    # Locktime

주의: 버전 뒤의 마커 0x00과 플래그 0x01은 이 거래가 증인 데이터를 포함한다고 파서에게 알립니다. SegWit을 이해하지 못하는 레거시 노드는 마커를 0-입력 거래로 보고 건너뜁니다 - 이것이 SegWit이 소프트 포크로서 하위 호환성을 달성하는 방식입니다.

거래 가변성 고치기

SegWit 이전에는 **거래 ID (txid)**가 ScriptSig를 포함한 전체 직렬화된 거래에서 계산되었습니다. ECDSA 서명은 무효화하지 않고 수학적으로 수정될 수 있기 때문에(예: S 값 부정), 제3자가 거래의 의미를 바꾸지 않고도 txid를 변경할 수 있었습니다.

이것은 실제 문제였습니다:

  • 라이트닝 네트워크는 txid로 서로를 참조하는 거래 체인을 구축해야 합니다. txid가 바뀔 수 있으면 체인이 끊어집니다.
  • 2014년 Mt. Gox 사건은 가변성을 악용해 거래소의 거래 추적을 혼란시키는 것을 포함했습니다.

SegWit은 비 증인 데이터만으로 txid를 계산함으로써 이를 고칩니다. 서명이 증인에 있기 때문에(메인 본문이 아니라), 그것들을 수정해도 txid가 바뀌지 않습니다. 별도의 wtxid (증인 txid)가 증인 데이터를 포함한 전체 거래를 커버합니다.

가중치 할인

SegWit은 1 MB 블록 크기 제한을 4,000,000 가중치 단위(WU) 제한으로 대체합니다. 핵심 통찰은 증인 데이터가 할인을 받는다는 것입니다:

Non-witness data: 1 byte = 4 weight units
Witness data:     1 byte = 1 weight unit

이는 100바이트의 비 증인 데이터와 100바이트의 증인 데이터를 가진 거래가:

Weight = (100 × 4) + (100 × 1) = 500 WU
vBytes = 500 ÷ 4 = 125 vB

모든 200 바이트가 전체 가중치로 계산되는 레거시 거래와 비교:

Weight = 200 × 4 = 800 WU
vBytes = 800 ÷ 4 = 200 vB

실제 결과: SegWit 거래는 동등한 레거시 거래보다 수수료가 30~40% 저렴합니다.

할인이 합리적인 이유

할인은 임의적이지 않습니다. 증인 데이터는 검증 중에만 필요합니다 - 거래가 검증되면 노드는 이를 폐기할 수 있습니다. 비 증인 데이터(UTXO를 참조하는 입력, 새 UTXO를 만드는 출력)는 노드가 영구히 저장해야 하는 UTXO 집합에 지속적인 영향을 미칩니다. 일시적 데이터에 대한 저렴한 가격 책정은 네트워크에 대한 낮은 장기 비용을 반영합니다.

다음 단계

거래 브로드캐스트로 계속해서 서명된 거래를 비트코인 네트워크에 보내세요.