용어집 / 프로토콜과 업그레이드
위트니스 커밋먼트
- 위트니스 커밋먼트란 무엇입니까?
- 위트니스 커밋먼트는 코인베이스 트랜잭션의 한 출력에 들어 있는 32바이트 해시로, 블록의 모든 wtxid를 헤더의 기존 머클 트리에 묶어 줍니다.
BIP-141에 명시되어 있습니다.
세그윗은 블록 헤더를 건드리지 않고 두 번째 머클 루트를 기록할 필요가 있었고, BIP-141은 이를 코인베이스 출력에 넣어 두어 변경 사항이 소프트 포크로 배포될 수 있게 했습니다. 스크립트는 최소 38바이트여야 하며 0x6a24aa21a9ed로 시작해야 합니다. 커밋먼트는 사용자의 코인을 승인하는 서명을 그 코인을 채굴한 블록에 묶습니다. txid는 구조상 위트니스 데이터를 제외하기 때문입니다.
작동 방식
BIP-141은 위트니스 커밋먼트를 오피코드 수준까지 규정하며, 노드는 블록을 받아들이기 전에 그 값을 다시 계산합니다.
노드는 블록 위에 두 번째 머클 트리를 만들며, 잎으로 txid 대신 wtxid를 사용하고 헤더 자체의 트리를 만드는 방식과 동일하게 이들을 결합합니다. 코인베이스 트랜잭션 자체의 잎은 실제 wtxid가 아닙니다. BIP-141은 그 값을 32개의 0바이트로 가정합니다. 계산되는 숫자가 바로 그 트랜잭션 안에 있고 어떤 것도 스스로를 해시할 수 없기 때문입니다. 출력에 기록되는 것은 위트니스 루트 해시에 32바이트 위트니스 예약 값을 이어 붙인 것의 이중 SHA-256이며, 그 예약 값은 코인베이스 입력 자체의 위트니스 필드에 단일 항목으로 나타나야 합니다.
바이트 단위로 보면 출력 스크립트는 다음과 같습니다. OP_RETURN 1바이트(0x6a), 다음 36을 푸시하는 1바이트(0x24), 4바이트 커밋먼트 헤더(0xaa21a9ed), 그리고 32바이트 해시입니다. 이들을 합하면 38바이트가 되며, 39번째 바이트부터 이어지는 것은 합의상 의미가 없는 선택적 데이터입니다.
이 패턴이 악용되거나 과도하게 적용되는 것을 막는 두 가지 예외 규칙이 있습니다. 여러 출력이 일치할 경우 출력 인덱스가 가장 높은 것이 유효하며, 따라서 앞에 놓인 미끼는 실제 값을 밀어낼 수 없습니다. 그리고 블록의 어떤 트랜잭션도 위트니스 데이터를 담지 않는다면 커밋먼트는 선택 사항입니다. 이 규칙은 BIP9 버전 비트를 통해 segwit이라는 이름으로 비트 1에 배포되었으며, 메인넷 신호 기간은 2016년 11월 15일 UTC 자정부터 2017년 11월 15일 UTC 자정까지였습니다.
확인할 수 있는 곳
위트니스 커밋먼트는 블록 탐색기에서 스크립트가 OP_RETURN으로 시작하는 코인베이스 트랜잭션의 출력으로 나타납니다.
최근 블록의 첫 번째 트랜잭션을 열면 출력은 두 종류로 나뉩니다. 채굴 풀과 그 고객에게 지급하는 출력, 그리고 스크립트 16진수가 6a24aa21a9ed로 시작하는 출력입니다. 그 접두사 뒤의 32바이트가 커밋먼트 자체이며, 첫 38바이트를 넘어서는 부분은 여유 공간입니다.
채굴 소프트웨어는 누구보다 자주 이 필드를 다룹니다. 이 값은 블록의 모든 wtxid에 대한 해시이므로, 후보 트랜잭션 집합이 바뀔 때마다 다시 계산해야 하고, 헤더를 해시하기 전에 코인베이스에 다시 기록해야 합니다.
주목할 부분은 예약 값입니다. BIP-141은 오늘날 이 값에 합의상 의미를 부여하지 않고 의도적으로 남겨 두는데, 향후 소프트 포크가 새 값을 예약 값과 먼저 함께 해시하는 방식으로 기존 커밋먼트 안에 추가 커밋먼트를 중첩할 수 있게 하기 위해서입니다. 이 문서는 병합 채굴처럼 합의와 무관한 용도가 그 공간을 차지하는 것을 금지하며, 무엇을 위해 남겨 두는지 밝힙니다. 수수료에 대한 합계 트리, 블록 크기와 sigops에 대한 카운터, 그리고 트랜잭션이 소비하는 출력에 대한 역방향 링크입니다. 이것들이 갖춰지면 라이트 클라이언트는 블록 자체 대신 그 블록이 유효하지 않다는 짧은 증명을 받게 됩니다.
위트니스 커밋먼트 vs 머클 루트
위트니스 커밋먼트와 머클 루트는 서로 다른 두 트리의 루트이며, 그중 블록 헤더에 자리를 차지하는 것은 하나뿐입니다.
머클 루트는 잎이 txid인 헤더 필드이며, txid는 구조상 위트니스 데이터를 제외합니다. 위트니스 커밋먼트는 트랜잭션 출력에 있고, 그 잎은 해당 데이터를 포함하는 wtxid이며, 코인베이스 잎은 영으로 채워집니다. 중첩이 핵심입니다. 코인베이스 트랜잭션은 기존 트리에 다른 잎과 마찬가지로 잎으로 들어가 있으므로, 커밋먼트를 수정하면 코인베이스가 바뀌고, 헤더의 머클 루트가 바뀌며, 세그윗을 들어 본 적 없는 소프트웨어에게도 블록이 깨집니다.