이 글은 개별 계약 제안에 대한 심층 분석 시리즈의 첫 번째 기사입니다.
CHECKTEMPLATEVERIFY (CTV)는 Jeremy Rubin이 BIP 119와 함께 제안한 가장 성숙하고 완전한 계약 제안으로, 우리가 다룰 제안들 중에서뿐만 아니라 모든 계약 제안 중에서도 가장 성숙한 것입니다. 이 시리즈의 소개 기사에서 언급했듯이, 너무 유연한 계약에 대한 생태계의 많은 우려가 있으며, 이는 비트코인에 매우 해로운 결과를 초래할 수 있습니다.
CTV는 이러한 우려를 피할 수 있도록 기능을 엄격하게 제한하도록 설계되었습니다. CTV가 어떻게 작동하는지 이해하기 위해서는 비트코인 거래의 개별 요소를 이해해야 합니다.
비트코인 거래의 매우 높은 수준의 개요입니다. 거래에는 입력 또는 사용되지 않은 동전(UTXOs)과 출력, 즉 거래가 블록에 확인될 때 생성되는 새로운 사용되지 않은 동전이 있습니다. 더 많은 요소가 있지만, 이것이 거래 구조의 가장 높은 수준의 개요입니다.
모든 거래에는 전체 거래에 대한 버전 번호 필드가 있어 새로운 규칙이나 기능의 적용 가능성을 나타냅니다. 또한 Segwit을 사용하고 있음을 나타내기 위해 특정 값으로 설정된 마커와 플래그가 있습니다. 그 다음은 거래의 입력 수입니다. 실제 입력이 이어집니다.
각 입력에는 사용되는 사용되지 않은 동전을 생성한 거래의 TXID, 해당 거래에서 사용되는 출력을 표시하는 VOUT, ScriptSig의 크기, 입력이 사용되고 있음을 증명하는 잠금 해제 스크립트인 ScriptSig, 마지막으로 상대 타임락 규칙을 따르도록 사용되는 시퀀스 번호가 포함됩니다. 즉, 입력은 생성 이후 특정 블록 수 또는 시간 동안 존재해야 합니다.
출력 수는 다음 데이터 조각으로, 거래의 출력 수입니다. 그 다음은 실제 출력으로, 해당 출력에 할당된 사토시의 양, ScriptPubKey 크기 및 해당 출력의 잠금 스크립트인 실제 ScriptPubKey가 포함됩니다. 마지막으로 nLocktime 필드는 전체 거래에 적용되는 타임락 값을 타임스탬프 또는 블록 높이로 적용합니다.
각 Segwit 거래에는 각 입력에 해당하는 증인 섹션이 포함되어 있으며, 여기에는 스크립트 스택에 놓일 항목 수, 각 항목의 크기 필드 및 스택에 놓일 실제 데이터 항목이 포함됩니다.
CTV의 작동 방식
CTV는 모든 계약 제안 중 가장 기본적인 형태의 내부 검사 및 데이터 전달을 가능하게 하는 opcode입니다. 이는 스크립트가 미리 정의된 32바이트 해시를 가져와 지출 거래의 대부분 필드의 해시와 비교할 수 있게 합니다. 실제 지출 거래에서 유도된 해시가 미리 정의된 해시와 일치하지 않으면 거래는 무효입니다.
CTV가 약속하는 필드는 다음과 같습니다:
- nVersion
- nLocktime
- 입력 수
- 모든 nSequence 필드의 해시
- 출력 수
- 모든 출력의 해시
- 입력 인덱스(거래에서 입력의 위치, 1번째 입력, 2번째 등)
이들은 CTV 해시가 약속하는 모든 필드로, 선택할 수 있는 능력이 없습니다. CTV가 가능하게 하는 내부 검사 수준은 “지출 거래의 이러한 필드의 해시가 사용되는 입력의 잠금 스크립트의 해시와 일치하는가”입니다. 해시는 본질적으로 실제 입력을 제외한 전체 거래에 약속됩니다. 해시가 입력을 포함하지 않는 이유가 있습니다. CTV를 사용하여 32바이트 해시에 출력을 잠그려면, 지출되는 유일한 방법을 보장하는 거래의 해시를 알아야 합니다. CTV로 잠긴 입력이 지출되려면 이 해시를 포함해야 하며, 이는 전체 거래를 생성하기 전에 해당 거래의 해시를 알아야 함을 의미합니다. 이는 불가능합니다.
CTV 스크립트를 중첩할 수도 있습니다. 즉, 초기 CTV 스크립트가 CTV 스크립트를 포함하는 출력을 가진 거래에 약속할 수 있습니다. 이것이 CTV가 데이터를 “전달”할 수 있게 해주는 것입니다. 그러나 실제로 전달되는 것은 거래 체인에 포함된 데이터입니다. 이론적으로 무한한 깊이까지 할 수 있지만, 실제로는 깊이가 유한하게 제한됩니다. 각 수준 또는 “홉”은 다음 거래로 이동하는 해시를 가져야 하므로, 그렇지 않으면 첫 번째로 잠금 스크립트를 생성할 수 없습니다. 다음 거래를 이미 알지 못하면 이전 거래를 생성할 수 없습니다.
CTV의 유용성
CTV는 출력을 제한하여 합의 규칙에 따라 정확히 미리 정의된 거래에 의해서만 지출될 수 있도록 합니다. 여러분 중 일부는 큰 문제가 무엇인지 물어볼 수 있습니다. 우리는 이미 거래를 미리 서명할 수 있습니다. 내부 검사 수준이 미리 서명하는 것만으로도 할 수 있는 것을 달성할 수 있을 만큼 제한적이라면, 가치 추가는 무엇인가요?
첫째, 미리 서명된 거래는 항상 키 소유자가 새로운 거래를 서명하고 다른 방식으로 해당 동전을 지출할 가능성을 열어둡니다. 키 소유자가 이를 하지 않을 것이라고 믿어야 하며, 서명하는 데 필요한 키를 삭제할 것이라고 믿어야 합니다(그것 또한 믿어야 합니다). CTV는 그 신뢰를 완전히 제거합니다. 지출 거래가 정의되고 해당 CTV 해시에 잠긴 출력이 생성되면, 다른 방식으로 지출될 가능성은 없으며, 이는 합의에 의해 강제됩니다.
현재 그 신뢰를 피하는 유일한 방법은 멀티시그를 사용하여 거래를 미리 서명하는 것입니다. 그러면 스스로 서명하기로 선택하지 않는 한, 다른 방식으로 동전을 지출하는 유효한 거래가 생성될 수 없다는 것을 완전히 확신할 수 있습니다. 문제는 더 많은 사람들이 참여할수록, 모두가 동시에 거래를 미리 서명하도록 조정하는 것이 더 어렵고 신뢰할 수 없게 된다는 것입니다. 소규모를 넘어가면 신뢰할 수 있는 문제를 해결하는 것이 완전히 비현실적인 문제가 됩니다.
CTV는 사람들이 모든 사람이 동시에 온라인에 접속하여 서명하지 않고도 거래 세트가 약속되었다는 것을 알 수 있는 방법을 제공합니다. 이는 모든 사람이 필요한 정보를 다른 사람에게 언제든지 전달할 수 있게 하여 조정 과정을 크게 단순화하며, 그 사람이 모든 정보를 갖게 되면 다른 사람의 참여 없이 CTV 거래 체인을 생성할 수 있고, 모든 사람이 올바른 결과가 유일한 가능한 결과라는 것을 확인할 수 있습니다.
이는 그 자체로 매우 가치가 있지만, CTV는 다른 opcode와 결합하여 더 가치 있는 것들을 가능하게 할 수 있으며, 이는 다음 기사에서 다룰 것입니다.
마무리 생각
CTV는 내부 검사 및 데이터 전달을 가능하게 하는 엄격하게 제한된 계약으로, 미리 서명된 거래로 할 수 있는 실제 기능을 초과하지 않는 매우 제한된 수준입니다. 가치 제안은 그 자체로 새로운 기능을 가능하게 하는 것이 아니라, 현재 미리 서명된 거래를 사용하여 구축할 수 있는 것의 효율성, 확장성 및 보안 보장을 크게 개선하는 것입니다. 이것만으로도 현재 미리 서명된 거래를 사용하는 거의 모든 프로토콜에 큰 이점이 됩니다.
다음은 이 특정 계약이 다른 계약과 비교하여 얼마나 철저하게 구체화되고 탐구되었는지를 보여주는 프로젝트들입니다:
- stutxo의 기본 결제 풀 예제.
- CTV 금고 구현을 제안한 James O’Beirne, 그는 OP_VAULT를 제안했습니다(여전히 CTV를 사용합니다).
- Steven Roose가 CTV를 사용하도록 변경한 미리 서명된 거래 기반 Ark 구현의 개념 증명 포트.
- Jeremy Rubin이 직접 만든 Sapio 언어, CTV로 계약을 구축하기 위한 고급 언어(미리 서명된 거래의 사용도 지원합니다).
- John Law의 매우 기본적인 코인풀 디자인을 위한 Timeout Trees 제안.
- 최적화된 비밀 로그 계약(DLC), 한 당사자가 다른 당사자 없이 열 수 있는 비대화형 라이트닝 채널, 심지어 광부들이 함께 풀링할 수 있는 분산 방식과 같은 수많은 다른 가능한 프로토콜.
현재 CTV는 매우 성숙한 제안으로, 높은 가치 추가가 있으며, 계약에 대한 우려를 유발하는 어떤 것도 활성화할 위험이 없습니다. 이는 매우 진지하게 고려되어야 하며, 개인적인 의견으로는 수년 전에 활성화되었어야 합니다.