용어집 / 프로토콜과 업그레이드
위트니스 데이터
별칭은 Witness입니다.
- 위트니스 데이터란 무엇입니까?
- 위트니스 데이터는 SegWit 트랜잭션이 별도의 구역에 담는 서명 자료로, 바이트당 가중치 1단위로 할인되고 txid에서는 완전히 제외됩니다.
BIP-144에 명시되어 있습니다.
각 입력에는 고유한 위트니스가 붙습니다. 항목의 스택이며, 대개 서명과 공개 키로 이루어집니다. 이 구역은 출력 뒤에 놓이고, 그 앞의 2바이트 마커와 플래그가 소프트웨어에 이 트랜잭션이 더 새로운 형식임을 알려 줍니다. 2017년 업그레이드 이전의 소프트웨어를 실행하는 노드는 이 구역을 요청하지도 않고 보지도 않습니다.
작동 방식
위트니스 데이터는 트랜잭션의 바이트 배치에서 고유한 자리를 차지하며, 그 자리는 BIP-144가 정의합니다.
새로운 형식으로 직렬화된 트랜잭션은 다음과 같은 순서로 읽힙니다. 버전, 마커 바이트 0x00, 플래그 바이트 0x01, 입력, 출력, 그다음 같은 순서로 입력마다 하나씩 놓이는 위트니스 스택, 마지막으로 록타임입니다. 마커는 호환성을 위한 이 방식의 핵심입니다. 값이 0이면 구형 파서에서는 입력이 0개라는 뜻이 되는데 이는 말이 되지 않으므로, 새로운 형식을 받은 구형 소프트웨어는 그것이 자신을 위한 것이 아님을 즉시 알게 되며, 레거시 피어에게는 이 형식이 아예 전송되지 않습니다.
여기서 식별자 두 개가 나옵니다. txid는 마커, 플래그, 위트니스를 제거한 트랜잭션의 이중 SHA-256이며, 그래서 위트니스 안의 어떤 것도 txid를 바꿀 수 없습니다. wtxid는 전체 직렬화를 대신 해시합니다. 모든 블록은 자신의 wtxid들로 만든 머클 루트를 코인베이스 출력 하나 안에 커밋하며, 이 출력은 OP_RETURN이고 그 스크립트는 최소 38바이트이며 4바이트 태그 0xaa21a9ed로 시작합니다. 따라서 이 데이터는 더 오래된 커밋 밖에 있으면서도 보호됩니다.
비용에서 할인이 드러납니다. 위트니스 밖의 모든 것은 바이트당 가중치 4단위가 부과되고, 위트니스 안의 모든 것은 1단위가 부과되며, 블록당 상한은 4,000,000 가중치 단위입니다. 가중치를 4로 나누면 가상 바이트가 되며, 수수료율은 이 단위로 표시됩니다.
확인하는 곳
블록 탐색기에서 아무 트랜잭션이나 열면 크기, 가상 크기, 가중치가 나란히 표시됩니다. 이들이 서로 다르면 그 차이가 위트니스입니다. 위트니스가 전혀 없는 결제는 크기가 vsize와 같은 값으로 표시됩니다. Taproot 결제는 vsize가 원시 크기의 4분의 1 남짓에 불과한 값으로 표시될 수 있습니다.
현대적인 탐색기에서 입력 하나를 펼치면 스택 자체가 보입니다. bc1q 결제의 경우 항목은 두 개이며, 약 71 또는 72바이트의 서명과 33바이트의 압축 공개 키입니다. Taproot 키 경로 지출의 경우 항목은 정확히 64바이트 하나입니다. 이 항목 수가 바로 새로운 출력 유형에서 지출 비용이 더 저렴한 이유 전부입니다.
이 필드는 하드웨어 지갑이 처리하는 파일에도 나타납니다. 부분 서명된 비트코인 트랜잭션에는 입력마다 위트니스 UTXO 기록과 최종 위트니스 기록이 있으며, 멀티시그 트랜잭션이 서명을 모으는 동안 코디네이터 앱이 주고받는 것이 바로 이것입니다.
위트니스 데이터 vs 위트니스 스크립트
위트니스 데이터는 스택 전체이고, 위트니스 스크립트는 그 안의 항목 하나입니다. P2WSH 지출에서는 스택의 마지막 항목이 출력이 해시에 커밋한 스크립트이며, 그 앞의 모든 것은 그 스크립트를 충족하기 위해 존재합니다. 이 관계는 리딤 스크립트가 P2SH 시그니처 스크립트의 마지막 항목이 되는 더 오래된 패턴을 그대로 따릅니다. 따라서 모든 위트니스 스크립트는 위트니스 데이터이지만, 모든 일반적인 단일 키 지출을 포함한 대부분의 위트니스 데이터에는 위트니스 스크립트가 전혀 들어 있지 않습니다.