127 / 736WIT

Witness Data

지출 권한을 검증하는 데이터

네트워크는 코인을 어디로 보내는지뿐 아니라 보낼 권한이 있는지도 알아야 합니다. Witness는 서명 같은 증거를 제공합니다. 이 데이터를 분리한다고 Bitcoin에서 없애는 것은 아닙니다.

Witness Data는 SegWit의 지출 조건을 검증하기 위해 거래 입력에 붙이는 데이터입니다. 입력은 이전에 받아서 지금 쓰려는 코인을 가리킵니다. Witness에는 서명, 공개키나 스크립트가 들어갈 수 있습니다. 거래의 일부이며 돈을 보관하는 별도 장소가 아닙니다.

안나는 전에 받은 Bitcoin으로 이제 피터에게 돈을 보내려 합니다. 이전 결제는 금액과 향후 지출 조건을 기록한 출력을 만들었습니다. 새 거래는 입력을 통해 그 출력을 참조합니다. 하지만 코인이 안나 것이라고 말하는 것만으로는 부족합니다. 일반 결제에서는 지갑이 개인키를 공개하지 않고도 검증할 수 있는 서명을 만듭니다. 지갑은 비트코인을 받고 보내는 앱이나 기기입니다. 개인 키는 이러한 서명을 만드는 데 사용하는 비밀 숫자 값입니다. SegWit에서는 이런 검증 데이터를 입력의 witness로 제출합니다. 서명이 있다는 사실만으로 서명이 올바른 것은 아닙니다. [1] [4] [5]

유효한 증명서를 내라는 조건과 실제로 낸 증명서의 차이를 생각해 보세요. Bitcoin에서는 사람이 판정하지 않고 규칙이 둘의 관계를 확인합니다. Witness program은 이전 출력에 기록된 조건의 일부이며, 버전이 평가 방식을 정합니다. Witness는 그 출력을 쓰는 새 거래가 제공합니다. 기술적으로는 입력마다 있는 순서가 정해진 데이터 목록입니다. 그 자체가 곧 실행 가능한 프로그램이거나 모든 미사용 코인의 사본인 것은 아닙니다. [1] [7]

Witness에는 서명, 공개키 또는 실제로 사용한 스크립트가 드러날 수 있습니다. 공개 키는 서명을 검증하는 데 사용하며 비밀로 유지할 필요가 없습니다. 스크립트는 지출 조건을 설명하는 프로그램입니다. Witness는 암호화된 보관함이 아닙니다. 개인키는 내게 남겨 두고 서명에 사용하며, 서명 대신 키 자체를 네트워크에 보내지 않습니다. Witness나 공개된 서명은 지갑 복구용 단어인 Seed Phrase를 대체하지 못합니다. 키와 백업을 모두 잃으면 공개 결제 기록만으로 새 송금에 서명할 능력을 되찾을 수 없습니다. [1] [3] [4]

블록 탐색기는 특정 네트워크의 거래와 블록을 조회하는 앱입니다. 탐색기에 txid와 함께 wtxid가 표시될 수 있습니다. 둘 다 정확한 데이터 표현에 SHA-256을 두 번 적용해 만든 짧은 지문인 해시입니다. txid는 witness를 뺀 표현을, wtxid는 witness를 포함한 전체 표현을 사용합니다. 수취 주소나 서로 다른 두 결제가 아닙니다. Witness가 없으면 원래 형식을 사용해 두 식별자가 같습니다. Bitcoin Core v29.0의 decoderawtransaction은 전체 식별자를 hash 필드에, 입력의 witness 데이터를 txinwitness에 표시합니다. [1] [7] [8]

어떤 거래가 확정되기 전에 다른 거래가 이를 참조할 수 있습니다. 서명 데이터만 바꾸어 앞 거래의 식별자를 바꿀 수 있다면 참조가 맞지 않게 됩니다. Witness만 바꾸면 txid는 바뀌지 않아 Lightning Network처럼 의존하는 거래를 사용하는 프로토콜에 도움이 됩니다. 그렇다고 거래 전체를 바꿀 수 없다는 뜻은 아닙니다. 다른 필드나 SegWit이 아닌 구형 입력은 여전히 txid에 영향을 줄 수 있고, 변경된 witness도 해당 검증 규칙을 만족해야 합니다. [1] [6]

Witness는 완전한 거래 표현과 함께 전송되고 거래가 포함되면 블록 데이터의 일부가 됩니다. 체인 밖의 무료 저장소가 아닙니다. Witness 직렬화로 추가된 한 바이트는 1 WU, 기본 데이터 한 바이트는 4 WU로 계산하며 WU는 무게 단위입니다. Full Node는 규칙을 독립적으로 확인하며 지출 검증에 해당 데이터가 필요합니다. 무게가 적게 계산된다고 필수 검사를 생략하거나 저장 공간이 필요 없다고 볼 수는 없습니다. [1] [7]

구형 형식에서는 지출 증거를 scriptSig에 넣었습니다. 네이티브 SegWit 버전 0은 이 필드를 비워 두도록 요구하며 증거는 witness에 있습니다. 스크립트 해시로 조건을 지정해 결제하는 이전 방식인 P2SH로 감싼 형태도 있습니다. 이때 scriptSig에는 해당 witness program을 넣는 동작만 있어야 하며 임의의 추가 명령은 허용되지 않습니다. 증거는 계속 witness에 남습니다. 같은 목적이라도 표현은 다를 수 있어 필드 이름만으로 해석할 수는 없습니다. [1] [5]

P2WPKH는 서명과 공개키를 제공합니다. 노드는 키의 해시가 원래 조건에 맞는지, 서명이 유효한지 확인합니다. P2WSH는 전체 스크립트의 해시로 지정한 조건을 지원합니다. 마지막 witness 항목은 witnessScript이며 그 해시가 출력의 프로그램과 맞아야 합니다. 앞의 항목들은 서명처럼 스크립트 실행에 필요한 초기 데이터를 제공합니다. BIP 143은 이 버전에서 서명할 메시지를 구성하는 방법을 정하며 지출하는 출력의 금액도 포함합니다. 데이터를 읽는 데 성공했다고 조건이 충족된 것은 아닙니다. [1] [2] [5]

Taproot는 네이티브 witness 버전 1을 사용하고 키 경로와 스크립트 경로의 지출을 구분합니다. 판단 전에 특별한 추가 필드 annex가 있으면 따로 떼어 놓지만, 그 데이터도 무게에 포함되고 서명의 대상입니다. 한 항목만 남으면 키 경로 서명으로 해석합니다. 스크립트 경로는 사용한 스크립트와 control block을 공개합니다. 후자는 이전 출력과의 관계를 증명하는 데이터이지 새 블록체인 블록이 아닙니다. 그 앞의 항목이 있으면 스크립트에 데이터를 제공합니다. 버전 0 규칙을 그대로 옮길 수는 없습니다. [3] [5]

암호학적 커밋먼트는 데이터를 그 구체적인 내용에 연결하는 지문과 같은 값입니다. Witness 데이터에 대한 커밋먼트가 필요한 경우 BIP 141은 채굴자 보상을 위한 첫 거래인 Coinbase Transaction을 통해 나머지 블록과 연결합니다. wtxid 해시 트리에서 포함된 데이터를 요약하는 루트가 만들어집니다. 이 트리에서 보상 거래의 wtxid는 영으로 취급합니다. 루트와 예약된 32바이트 값을 결합해 두 번 해시한 결과를 해당 출력에 커밋먼트로 기록합니다. 어떤 거래에도 witness가 없다면 커밋먼트는 선택 사항입니다. 이는 공개 증거를 묶는 장치이며 키 백업이나 실제 검증의 대체물이 아닙니다. [1]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 SegWit, Block Weight, Bitcoin Script, Taproot, Bitcoin, Seed Phrase. 다음 항목에서도 이 글을 참조합니다 Block Weight, Miniscript, Compact Block Filters.

DOC · 001BIP 141 — Segregated Witness명세 DOC · 002BIP 143 — SegWit signature hashing명세 DOC · 003BIP 341 — Taproot명세 DOC · 004Bitcoin Developer Reference — Transactions문서 DOC · 005Bitcoin Core v29.0 — Script interpreter문서 DOC · 006Bitcoin Core — Segregated Witness benefits문서 DOC · 007BIP 144 — Segregated Witness Peer Services명세 DOC · 008Bitcoin Core v29.0 — decoderawtransaction문서
개정일: 1차 출처 우선 · 투자 조언이 아닙니다