블록체인/레벨 IV · 프로토콜 심화/4.1 Script/수업 7
세그리게이티드 위트니스와 트랜잭션 가변성
불안정한 ID, 분리된 서명, 그리고 라이트닝의 길을 연 해결책
준비물JSON 출력 기능을 갖춘 블록 탐색기SegWit 이전의 P2PKH 트랜잭션 헥스 문자열(2016년 또는 그 이전)SegWit 이후의 P2WPKH 트랜잭션 헥스 문자열
호기심
- 왜 제3자가 트랜잭션의 유효성을 깨뜨리지 않고도 그 ID를 바꿀 수 있었을까요?
- 서명을 해시 밖으로 옮기면 어떻게 합의에 의한 보호는 유지하면서 가변성 문제를 해결할 수 있을까요?
- 블록 웨이트란 무엇이며, 위트니스 데이터를 할인하자 왜 용량이 늘어났을까요?
탐구
- SegWit 이전에는 트랜잭션 ID(txid)가 서명을 포함한 트랜잭션 전체에 SHA-256을 두 번 적용한 값이었습니다. 제3자는 예를 들어 서명의 s 값의 부호를 뒤집거나 서명을 푸시하는 방식을 바꾸는 식으로, 서명을 무효화하지 않은 채 다시 인코딩할 수 있었고, 그 결과 같은 결제에 대해 새로운 txid가 만들어졌습니다. 이러한 가변성은 미확인 트랜잭션 체인을 망가뜨렸습니다. 앨리스의 자식 트랜잭션이 부모 트랜잭션을 ID로 참조하고 있었다면, 부모 트랜잭션이 변조될 경우 자식 트랜잭션은 고아가 되었고, 이는 결제를 추적하는 지갑과 거래소에 혼란을 일으켰습니다.
- 2014년 2월, Mt. Gox는 파산 과정에서 벌어진 내부 혼란을 설명하며 이 메커니즘을 언급했지만, 이후 분석에 따르면 보고된 손실 가운데 이 메커니즘으로 인한 부분은 극히 일부였습니다. ECDSA 서명은 바이트 표현상 본질적으로 변경 가능하기 때문에 이 취약점은 계속 남아 있었습니다. 제3자가, 그리고 BIP66과 low-S 규칙 이후에는 주로 채굴자가 서명을 다시 쓸 수 있었습니다. 이러한 불안정성 때문에, 컨펌 전에 특정하고 예측 가능한 트랜잭션 ID에 채널 상태가 의존하는 라이트닝 같은 양방향 결제 채널을 구축하는 것은 안전하지 않았습니다.
- 2017년 8월 24일 블록 481,824에서 활성화된 세그리게이티드 위트니스(BIP141)는 위트니스 데이터를 트랜잭션 본문에서 분리함으로써 이 문제를 해결했습니다. 이제 txid는 위트니스를 제외한 필드만 해시하므로 서명 인코딩이 바뀌어도 변하지 않습니다. 위트니스는 원시 트랜잭션 안에 별도의 구조로 남아 있지만 식별용 해시에서는 제외됩니다. 제3자는 더 이상 txid를 바꿀 수 없으며, 서명은 여전히 합의 규칙에 따라 빠짐없이 검증됩니다.
- 위트니스 데이터는 각 블록의 코인베이스 트랜잭션이 참조하는 머클 트리를 통해 커밋되므로, 블록을 무효화하지 않고서는 삭제하거나 수정할 수 없습니다. 위트니스는 txid와 분리되어 있지만, 새로운 '웨이트(weight)' 척도에 따라 여전히 블록 크기 한도에 포함됩니다. 한도는 블록당 4,000,000 웨이트 단위입니다. 위트니스가 아닌 데이터는 1바이트당 4 웨이트 단위, 위트니스 데이터는 1바이트당 1 웨이트 단위로 계산되므로, 서명이 많은 트랜잭션을 더 쉽게 담을 수 있습니다.
- BIP143은 입력이 많은 트랜잭션에서 발생하던 이차 해싱 비용을 없앤 새로운 서명 해싱 방식을 도입했습니다. BIP141은 새 주소의 표준이 된 버전 0 위트니스 프로그램인 P2WPKH와 P2WSH를 정의했고, BIP144는 위트니스 데이터가 피어 간에 전달되는 방식을 규정했습니다. 이러한 변화는 가변성을 해결했을 뿐 아니라, 기존 합의 규칙을 깨뜨리지 않고 스크립트를 발전시킬 수 있는 버전 기반 위트니스 프로그램 체계를 마련함으로써 탭루트 같은 향후 업그레이드의 토대를 놓았습니다.
- 블록 탐색기를 열고 최근의 P2WPKH 트랜잭션을 찾아보세요. 살펴보면 서명이 입력의 scriptSig가 아니라 별도의 'witness' 필드에 들어 있으며, txid는 서명을 빼고 계산됩니다. 이를 서명이 scriptSig에 들어 있어 txid 계산에 반영되는 2016년의 SegWit 이전 P2PKH 트랜잭션과 비교해 보세요. 이러한 시각적 구분을 통해 위트니스 데이터가 더 이상 트랜잭션의 ID에 영향을 주지 않는다는 것을 확인할 수 있습니다.
핵심 사실
- 세그리게이티드 위트니스는 2017년 8월 24일, 블록 481,824에서 활성화되었습니다.
- 트랜잭션 가변성 때문에 제3자는 트랜잭션을 무효화하지 않고도 ECDSA 서명 인코딩을 수정해 txid를 바꿀 수 있었습니다.
- BIP141은 서명을 txid 계산에서 제외되는 별도의 위트니스 구조로 옮겼습니다.
- 블록 웨이트는 4,000,000 단위로 제한되며, 위트니스 데이터는 비위트니스 데이터에 비해 4분의 1로 할인되어 계산됩니다.
- BIP143은 입력이 많은 트랜잭션의 2차 해싱 비용을 없애는 서명 해싱 방식을 도입했습니다.
- BIP141은 버전 번호가 부여된 위트니스 프로그램(버전 0: P2WPKH 및 P2WSH)을 도입함으로써 향후 탭루트와 같은 새로운 버전들을 위한 여지를 남겼습니다.
연습 아홉, 여섯, 셋, 하나
9모으기2017년 이전 트랜잭션 가변성이 초래한 기술적 또는 경제적 결과 9가지를 나열하세요. 각각 사용자, 지갑, 거래소, 프로토콜 개발자 중 누구에게 영향을 미쳤는지도 적으세요.
6묶기9가지를 ID 불안정성, 미확인 트랜잭션 체인의 단절, 거래소의 혼란, 채널 구현 불가능, 서명 인코딩 가변성, 합의 보호의 공백이라는 6개 범주로 분류하세요.
3추리기6개 범주를, SegWit 이전에 가변성이 확장 가능한 결제 채널을 가로막았던 3가지 핵심 이유로 압축하세요.
1결정화위트니스 데이터를 txid 해시에서 분리하는 것이 어떻게 ID 안정성 문제를 해결하는 동시에 향후 스크립트 업그레이드를 가능하게 하는지 한 문장으로 쓰세요.
팩트 체크
날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.