궁금한 주제를 찾아보세요

비트코인, 스테이블코인, 온체인 데이터처럼 주제로 검색하세요.

다시 읽을 이야기

저장한 글은 이 브라우저에만 보관됩니다.

해설기술·생태계

탭루트 control block은 script path를 어떻게 증명할까

Control block의 parity·leaf version·internal key·Merkle sibling으로 Taproot output key를 재구성하는 BIP341 검증 순서를 풉니다.

난이도 중급주제 카테고리와 개념 밀도 기준검토 정보AI 보조 초안 · 출처 목록 제공 · 주장별 대조 진행 중
스크립트 잎에서 중간 가지 증명을 거쳐 출력 열쇠에 도달하는 탭루트 control block 개념도
주제의 이해를 돕기 위해 imagegen으로 제작한 AI 생성 개념 일러스트
먼저 읽는 핵심

Control block 길이는 33+32m 바이트이며 m은 0~128입니다.
첫 byte는 parity bit와 leaf version을 결합합니다.
Merkle proof가 맞은 뒤에도 tapscript 조건이 성공해야 합니다.

Taproot script path의 control block은 첫 byte에 output key parity와 leaf version을, 다음 32바이트에 internal x-only key를, 이후에는 선택 leaf에서 root까지의 32바이트 Merkle siblings를 담습니다. 검증 node는 tapscript와 leaf version으로 TapLeaf hash를 만들고 siblings를 정렬해 TapBranch hashes를 계산한 뒤 internal key와 root로 TapTweak output point를 재구성합니다. 이 point의 x 좌표와 parity가 실제 P2TR output key와 맞아야 script 실행으로 넘어갑니다.

Witness 마지막 항목이 control block입니다

BIP341 script path에서는 annex를 제거한 witness의 끝에서 두 번째 항목을 script s, 마지막 항목을 control block c로 해석합니다. c 길이는 정확히 33+32m이어야 하고 m은 0부터 128 사이입니다. 나머지 witness items는 tapscript의 초기 stack이 됩니다.

c[0]의 최하위 bit는 output point Q의 y parity이고 c[0]&0xfe는 leaf version입니다. 현재 tapscript leaf version은 0xc0입니다. c[1:33]은 internal key P의 x 좌표이며 lift_x가 실패하면 전체 지출도 실패합니다.

Control block은 script 내용을 숨기는 열쇠가 아니라, 공개한 leaf가 원래 output key에 포함됐다는 짧은 Merkle 증명입니다.

JOBCOIN 해설

VISUAL GUIDE프로토콜 실행의 기본 구조
입력이 실행 규칙을 통과할 때 상태가 바뀌는 프로토콜 개념도
그림과 함께 짚어볼 본문 내용

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.

  1. Witness 마지막 항목이 control block입니다

    BIP341 script path에서는 annex를 제거한 witness의 끝에서 두 번째 항목을 script s, 마지막 항목을 control block c로 해석합니다.

  2. TapLeaf에서 root까지 올라갑니다

    먼저 k0=hashTapLeaf(v || compact_size(len(s)) || s)를 계산합니다.

  3. Internal key와 root로 output key를 복원합니다

    t=hashTapTweak(p || k_m)를 secp256k1 order와 비교하고 Q=P+tG를 계산합니다.

AI로 제작한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.

TapLeaf에서 root까지 올라갑니다

먼저 k0=hashTapLeaf(v || compact_size(len(s)) || s)를 계산합니다. Script 길이는 CompactSize로 encoding되므로 raw bytes와 length prefix가 정확해야 합니다. 사람이 읽은 opcode 문자열을 다시 조립하면 원본 byte sequence와 달라질 수 있어 witness의 raw script를 사용합니다.

각 sibling e_j에 대해 현재 k_j와 e_j를 lexicographic order로 작은 값부터 이어 TapBranch tagged hash를 만듭니다. Left·right 방향 bit를 control block에 따로 저장하지 않는 이유입니다. 모든 siblings를 처리한 k_m이 committed Merkle root가 됩니다.

Control block byte 구성
구간 길이 의미
c[0] 1바이트 parity + leaf version
c[1:33] 32바이트 internal x-only key
c[33:] 32m바이트 Merkle siblings
script s 별도 witness 항목 TapLeaf 대상
초기 stack 앞선 witness 항목 tapscript 입력

Internal key와 root로 output key를 복원합니다

t=hashTapTweak(p || k_m)를 secp256k1 order와 비교하고 Q=P+tG를 계산합니다. t가 curve order 이상이면 실패합니다. 계산한 x(Q)가 scriptPubKey의 32바이트 program q와 같고 y(Q) parity가 c[0] bit와 같아야 합니다. 둘 중 하나라도 다르면 다른 tree의 leaf입니다.

Merkle tree가 leaf 하나뿐이면 m=0이라 sibling이 없지만 root는 TapLeaf hash입니다. Script path가 전혀 없는 key-only output과 혼동하지 않습니다. Control block 33바이트라는 사실만으로 empty tree인 것이 아니라 단일 leaf proof일 수 있습니다.

  • annex 여부를 먼저 처리합니다.
  • control block 길이 33+32m을 검사합니다.
  • leaf version과 raw script로 TapLeaf를 계산합니다.
  • siblings를 lexicographic order로 hash합니다.
  • TapTweak Q의 x와 parity를 output에 대조합니다.
  • 마지막으로 tapscript를 실행합니다.

Proof는 다른 branches의 내용을 공개하지 않습니다

Sibling hashes는 선택하지 않은 scripts의 원문을 보여 주지 않습니다. Observer는 공개된 leaf와 tree depth, sibling commitments만 압니다. 같은 sibling hash나 internal key를 여러 outputs에서 재사용하면 wallet 구조를 연결하는 단서가 될 수 있어 key·policy reuse를 피합니다.

자주 쓸 leaf를 얕게 배치하면 control block이 짧아져 witness weight를 줄일 수 있습니다. 그러나 단순 balanced tree가 항상 최적은 아닙니다. 각 recovery path 사용 확률, 공개 민감도, 최악 fee를 함께 모델링하고 descriptor backup에 tree 구조를 보존합니다.

Decoder는 consensus 순서를 그대로 따라야 합니다

탐색기가 control block을 friendly fields로 보여 줘도 raw witness bytes, block height, leaf version을 기록합니다. Future leaf versions는 현재 tapscript와 다른 semantics가 적용될 수 있으므로 0xc0 규칙을 모든 version에 강제하지 않습니다. Unknown version 처리는 BIP341의 upgrade 규칙을 따라야 합니다.

테스트는 valid proof뿐 아니라 잘못된 길이, invalid internal key, sibling 순서 오류, tweak overflow, parity mismatch, script failure를 각각 포함합니다. Proof reconstruction 성공과 script execution 성공을 하나의 boolean 뒤에 숨기면 장애 원인을 찾기 어렵습니다.

자주 묻는 질문

Control block에 Merkle 방향 bit가 왜 없나요?

각 단계에서 두 hash를 lexicographic order로 정렬해 TapBranch를 계산하므로 좌우 방향을 별도 저장하지 않습니다.

33바이트 control block이면 script tree가 없나요?

아닙니다. Merkle sibling이 없는 단일 leaf script path일 수 있습니다.

Output key를 재구성하면 지출이 바로 유효한가요?

아닙니다. Proof 확인 후 초기 stack으로 tapscript 실행도 성공해야 합니다.

더 깊이 읽기

본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.

참고한 원문 자료

자료 확인 기준일 2026.09.27
  1. BIP 341: Taprootbips.dev
  2. BIP 342: Tapscriptbips.dev
자료 대조 기록과 확인 범위
출처 수집
원문 링크 2개 제공
핵심 주장 대조
완료 근거가 아직 기록되지 않았습니다.
분야 전문가 검수
별도 완료 기록이 없습니다.

원문 링크와 자료 확인일은 글 전체의 주장 대조나 전문가 검수 완료를 뜻하지 않습니다. 별도 확인이 필요한 절차는 원문의 적용 대상과 최신 안내를 함께 확인해 주세요.

AI 활용 안내

이 글은 초안 구성과 자료 정리에 AI를 활용했습니다. 글에 표시된 출처와 기준일을 함께 확인해 주세요. 별도 검토 정보가 없다면 전문가 검수를 뜻하지 않습니다.

이해를 위한 정보 콘텐츠

이 글은 특정 자산의 매수·매도 또는 수익을 권유하지 않습니다. 자료의 발표 시점과 이후 변경 사항을 함께 확인해 주세요.

편집 원칙 보기 →이 기사 정정 제보 →