용어집 / 프로토콜과 업그레이드
Taproot 애넥스
- Taproot 애넥스란 무엇입니까?
- Taproot 애넥스는 0x50 바이트로 태그가 붙는 예약된 위트니스 요소로, 합의 규칙은 서명에서 이 요소를 커밋하지만 검증 과정에서는 그 외에는 무시합니다.
BIP-341에 명시되어 있습니다.
BIP-341은 향후 소프트 포크를 위해 이 필드를 예약하고 아무런 의미도 부여하지 않았기 때문에 오늘날 어떤 노드도 그 내용을 읽지 않습니다. Bitcoin Core의 IsWitnessStandard는 0x50 태그가 붙은 애넥스를 담은 Taproot 지출을 거부하므로 해당 트랜잭션은 중계되지 않으며, BIP-341은 이것이 영구적인 자금 손실로 이어질 수 있다고 경고합니다. 지갑이 애넥스를 붙일 이유가 없으므로 비트코인을 구매하거나 보유할 때 하시는 어떤 행동도 애넥스에 의존하지 않습니다.
작동 방식
Taproot 애넥스는 트랜잭션 형식에서 이름이 붙은 필드가 아니라 위치로 식별됩니다. Taproot 입력이 최소 두 개의 위트니스 요소를 담고 있고 마지막 요소의 첫 바이트가 0x50이면, 그 요소가 애넥스이며 다른 어떤 것도 살펴보기 전에 위트니스 스택에서 제거됩니다. 그런 다음에야 노드는 무엇을 보고 있는지 판단합니다. 요소가 하나 남으면 키 경로 지출이고, 둘 이상 남으면 스크립트 경로 지출입니다.
BIP-341은 0x50을 의도적으로 골랐습니다. 리프 버전은 짝수와 홀수의 쌍으로 존재하며 P2WPKH나 P2WSH 위트니스의 첫 바이트와 혼동되어서는 안 되는데, 0x50은 짝이 없는 나머지 값이어서 향후 스크립트 버전을 가장 적게 소비했습니다. 이 규칙은 반대 방향으로도 적용됩니다. 리프 버전은 0x50이 될 수 없는데, 그 바이트로 시작하는 컨트롤 블록은 애넥스와 구별할 수 없기 때문입니다.
애넥스가 하지 않는 일은 검증에 영향을 주는 것입니다. BIP-341은 이 필드가 "is always covered by the signature and contributes to transaction weight, but is otherwise ignored during taproot validation."라고 밝힙니다. 모든 Taproot 서명 메시지는 (ext_flag * 2) + annex_present와 같은 1바이트 spend_type을 담고, 애넥스가 있으면 메시지는 애넥스의 길이 접두사와 애넥스 자체(0x50 바이트 포함)의 32바이트 SHA256인 sha_annex도 담습니다. 부재도 존재만큼 확고하게 서명되므로 아무도 멤풀에서 여러분의 트랜잭션에 애넥스를 덧붙이거나 하나를 떼어낼 수 없습니다. BIP-341은 서명 메시지를 174바이트로 두고, ANYONECANPAY에는 49를 빼고, NONE에는 32를 빼며, 애넥스가 있으면 32를 더하고, 최대 206으로 제한합니다.
확인할 수 있는 곳
일반적인 사용에서는 Taproot 애넥스를 볼 수 없으며, 이것이 설계가 작동하고 있음을 보여줍니다. src/policy/policy.cpp에 있는 Bitcoin Core의 중계 정책은 32바이트 프로그램을 가진 모든 위트니스 버전 1 입력을 검사하고, 위트니스가 둘 이상의 요소를 담고 마지막 요소가 src/script/script.h에 0x50으로 정의된 ANNEX_TAG 상수로 시작하면 false를 반환합니다. 그 검사 옆의 주석이 정책의 전부입니다. "Annexes are nonstandard as long as no semantics are defined for them." 애넥스를 담은 트랜잭션은 합의상 유효하지만 실제로는 전달되지 않습니다. 기본 설정의 노드는 이를 중계하지 않고 버립니다.
애넥스가 실제로 나타나는 곳은 한 군데입니다. 지금까지 여러분이 만든 모든 Taproot 서명의 spend_type에는 여기에 애넥스가 없다는 것을 알리는 0 비트가 담겨 있습니다. 이 커밋이 바로 향후 소프트 포크를 쓸 수 있게 하는 요소입니다. BIP-341은 의도된 용도로 비용이 많이 드는 새 옵코드의 검증 비용을 표시하되 노드가 지출되는 출력을 가져오지 않아도 되게 하는 것을 꼽습니다.
Taproot 애넥스 vs OP_RETURN
OP_RETURN은 아무도 지출하지 않을 바이트를 게시하기 위해 비트코인이 지정한 자리이고, Taproot 애넥스는 게시용 자리가 전혀 아닙니다. 둘 다 합의가 무시하는 데이터를 위한 공간으로 설명되지만 서로 반대로 작동합니다. OP_RETURN 데이터는 출력에 존재하고 모든 노드가 검증하는 트랜잭션의 일부이며, 여기에는 지출할 수 있는 것이 없다는 합의된 하나의 의미를 알립니다. 애넥스 바이트는 위트니스에 존재하고 스택을 읽기 전에 제거되며, 명세 자체의 경고를 담고 있습니다. "users SHOULD NOT include annex in transactions, or it may lead to PERMANENT FUND LOSS."
그 경고는 장식이 아닙니다. 소프트 포크는 규칙만 추가할 수 있으므로 오늘 무시되는 바이트가 내일 거부될 수 있고, 여러분의 서명이 애넥스를 커밋하므로 이미 서명한 트랜잭션에서 애넥스를 제거할 수 없습니다. 금고나 라이트닝 채널처럼 몇 년 앞서 지출에 미리 서명하는 사람은 아무도 의미를 아직 쓰지 않은 필드를 고정하게 됩니다.