블록체인/레벨 IV · 프로토콜 심화/4.2 업그레이드/수업 2
탭스크립트와 스크립트 트리(MAST)
계약을 숨기는 트리
준비물위트니스 데이터를 확인할 수 있는 블록 탐색기스크립트 트리를 지원하는 탭루트 호환 지갑이진 머클 트리를 그려 볼 모눈종이
호기심
- 계약의 한 조항에 따라 지출하는데 왜 계약 전체를 공개해야 할까요?
- 협력적 지출을 단순한 서명과 구별할 수 없게 만드는 것은 무엇일까요?
- 하나의 키가 어떻게 숨겨진 지출 조건 전체 모음에 커밋할 수 있을까요?
탐구
- 머클화된 추상 구문 트리(Merkelized Abstract Syntax Trees, MAST)는 2013년 러셀 오코너가 처음 설명했으며, 2016년과 2017년의 제안들을 통해 발전했습니다. 이 개념은 대체 지출 조건들을 머클 트리에 넣어, 지출자가 실제로 사용하는 특정 분기만 공개할 수 있게 했습니다. '추상 구문 트리'라는 용어는 모든 조건이 새로운 노드를 만드는 컴파일러 구조를 가리켰지만, 비트코인의 구현은 다른 방향으로 발전했습니다. 이후 앤서니 타운스는 실제로 채택된 구조, 즉 지출 시점에 단 하나만 선택되는 완전하고 독립적인 스크립트들의 집합을 설명하기 위해 'Merklized Alternative Script Tree'라는 역두문자어(backronym)를 만들었습니다.
- 탭루트는 BIP341을 통해 이 트리 구조를 합의 규칙에 통합했습니다. 머클 트리의 각 리프에는 스크립트가 들어 있으며, 트리의 루트는 최종 출력 키에 반영됩니다. '스크립트 경로'로 자금을 지출할 때 지출자는 해당 리프 스크립트, 그 입력값, 그리고 각 레벨의 형제 노드 해시로 이루어진 머클 증명을 공개합니다. 사용되지 않은 분기는 온체인에서 숨겨진 채로 남아, 이전에는 P2SH 래퍼에 담아야 했던 멀티시그나 타임락 같은 복잡한 구성의 프라이버시가 보호됩니다.
- 탭스크립트(BIP342)는 이러한 리프 스크립트에 쓰이는 비트코인 스크립트의 변형으로, 기존 비트코인 스크립트와 몇 가지 중요한 점에서 다릅니다. 탭스크립트에서는 OP_CHECKMULTISIG가 비활성화되어 있습니다. 이를 대체하는 OP_CHECKSIGADD는 서명 하나를 키 하나와 대조해 검사하고 누적 카운트에 1을 더합니다. 빈 서명은 아무것도 더하지 않지만, 비어 있지 않은 유효하지 않은 서명은 스크립트 전체를 실패시킵니다. 스크립트는 키마다 OP_CHECKSIGADD를 하나씩 이어 붙인 뒤 카운트를 임계값과 비교합니다. 각 서명이 알려진 키와 짝지어지므로 시행착오식 매칭이 필요 없고, 서명을 일괄 검증할 수 있습니다.
- 탭스크립트는 OP_SUCCESS 옵코드로 업그레이드를 위한 여지도 남겨 둡니다. 현재는 이 옵코드가 하나라도 포함된 스크립트는 무조건 성공하므로 아무도 사용하지 않으며, 향후 소프트 포크를 통해 사용 중인 어떤 것도 무효화하지 않고 이 옵코드에 제한적인 의미를 부여할 수 있습니다. 탭스크립트에서는 기존의 10,000바이트 스크립트 크기 제한이 없어졌고, 대신 스크립트 크기는 블록 웨이트와 정책상 한도로만 제한됩니다. 또한 서명 연산 예산이 위트니스 크기에 비례해 정해지므로, 과도한 서명 검증을 이용한 서비스 거부 공격을 막을 수 있습니다.
- 실제 예를 생각해 봅시다. 사용자는 일상적인 지출을 위해 2-of-2 키 경로에 자금을 보관하며, 양측이 협력해 서명하면 표준 슈노어 서명 외에는 아무것도 드러나지 않습니다. 하지만 스크립트 트리에는 1년의 타임락이 지나면 키 하나로 단독 지출할 수 있는 숨겨진 리프가 들어 있습니다. 협력 상대가 응답하지 않게 되면 사용자는 이 복구 분기를 사용할 수 있습니다. 머클 증명은 해당 타임락 스크립트만 공개하므로, 소셜 리커버리나 해시락 같은 다른 잠재적 분기는 완전히 비공개로 유지됩니다.
- 이러한 동작을 확인하려면 블록 탐색기를 열고 스크립트 경로로 지출된 탭루트 트랜잭션을 찾아보세요. 위트니스를 살펴보면 스크립트의 입력값, 리프 스크립트 자체, 그리고 컨트롤 블록이 있습니다. 컨트롤 블록의 첫 바이트는 리프 버전(탭스크립트는 0xc0)과 패리티 비트를 합친 값이며, 그 뒤에 내부 키와 트리의 레벨마다 32바이트 해시 하나씩이 이어집니다. 같은 주소 유형의 키 경로 지출과 비교해 보세요. 키 경로 지출은 64바이트 또는 65바이트 서명만 드러내고 스크립트 데이터는 전혀 없으므로, 복잡한 계약이 사용되지 않는 한 보이지 않는다는 것을 알 수 있습니다.
핵심 사실
- MAST는 Merklized Alternative Script Tree의 약자로, 앤서니 타운스가 탭루트의 구조를 설명하기 위해 만든 역두문자어(backronym)입니다.
- 탭스크립트는 기존의 10,000바이트 스크립트 크기 제한을 없애고, 스크립트를 블록 웨이트와 정책으로만 제한합니다.
- 탭스크립트의 OP_CHECKSIGADD는 일괄 검증에 적합한 임계값 검사를 위해 OP_CHECKMULTISIG를 대체합니다.
- 스크립트 경로 지출은 리프 스크립트, 그 입력값, 그리고 형제 해시들로 이루어진 머클 증명을 공개합니다.
- OP_SUCCESS 옵코드는 기존 탭스크립트를 깨뜨리지 않고 향후 소프트 포크를 위한 여지를 남겨 둡니다.
- 리프 버전 0xc0는 탭스크립트를 나타냅니다. 알려지지 않은 리프 버전들은 향후 소프트 포크를 위해 제한 없이 그대로 유지됩니다.
연습 아홉, 여섯, 셋, 하나
9모으기탭루트 스크립트 트리에 넣을 수 있는 서로 다른 지출 조건 9가지(예: 멀티시그, 타임락, 해시락)를 나열하세요. 각 조건의 주요 목적도 함께 적으세요.
6묶기9가지 조건을 프라이버시 측면의 영향에 따라 6개 범주로 분류하세요: 완전히 숨겨짐, 일부 공개됨, 항상 드러남, 기타 구조적 제약 등.
3추리기6개 그룹을, 특정 스크립트 분기를 숨기는 것이 체인 효율성과 사용자 보안에 중요한 3가지 핵심 이유로 압축하세요.
1결정화머클 트리를 통해 하나의 공개 키가 어떻게 서로 배타적인 여러 지출 규칙을 공개하지 않고도 그 규칙들에 커밋할 수 있는지 한 문장으로 설명하세요.
팩트 체크
날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.
- BIP341: Taproot: SegWit version 1 spending rules
- BIP342: Validation of Taproot Scripts
- Bitcoin Optech, 'MAST' and 'Tapscript' topics
- Anthony Towns, 'Merklized Alternative Script Trees' proposal discussions