CTV: 깊이 있는 계약 제안 분석 시리즈의 첫 번째 기사
이 기사는 개별 계약 제안에 대한 깊이 있는 분석 시리즈의 첫 번째 기사로, 이제 충분히 성숙한 상태에 도달한 제안들을 다루고 있습니다.
Jeremy Rubin의 BIP 119를 통한 CHECKTEMPLATEVERIFY(CTV)
CTV는 우리가 다룰 제안들 중에서, 그리고 전체 계약 제안들 중에서 가장 성숙하고 완전히 구체화된 제안입니다. 이 시리즈의 서론 기사에서 언급했듯이, 비트코인 생태계에는 계약이 지나치게 유연해서 비트코인에 매우 해로운 결과를 초래하는 우려가 있습니다.
CTV는 이러한 우려를 피하기 위해 그 기능을 철저하게 제한하도록 설계되었습니다. CTV가 어떻게 작동하는지 이해하려면, 먼저 비트코인 거래의 개별 요소를 이해할 필요가 있습니다.
비트코인 거래의 구조
이는 비트코인 거래의 매우 높은 수준의 개요입니다. 거래에는 입력, 즉 사용되지 않은 코인(UTXO)과 출력, 즉 거래가 블록에서 확인될 때 생성되는 새로운 사용되지 않은 코인이 포함됩니다. 우리는 더 많은 부분을 다룰 예정이지만, 거래 구조의 가장 높은 수준의 개요는 이와 같습니다.
각 거래는 또한 전체 거래에 대한 버전 번호 필드를 가지며, 이는 새로운 규칙이나 기능의 적합성을 나타냅니다. 또한 마커와 플래그가 설정되어 특정 값으로 거래가 Segwit을 사용한다는 것을 나타냅니다. 그 후에는 입력 수, 즉 거래에 포함된 입력의 수가 나타납니다. 그 후에 실제 입력이 이어집니다.
각 입력은 해당 입력이 사용될 때마다 생성된 거래의 TXID를 포함하고, VOUT는 해당 거래에서 사용될 출력이 무엇인지를 표시하며, ScriptSig의 크기와 ScriptSig는 입력이 잠금 해제되는 스크립트를 증명하는 역할을 합니다. 마지막으로, Sequence 번호는 상대 타임락 규칙을 따르고 있는지를 확인하는 데 사용됩니다. 즉, 입력이 생성된 이후 일정한 블록 수 또는 시간의 길이를 지나야 한다는 것을 의미합니다.
출력 수는 다음 데이터 조각이며, 거래에 포함된 출력의 수를 나타냅니다. 그 후에는 실제 출력이 이어지며, 출력에 할당된 사토시의 금액과 ScriptPubKey 크기, 그리고 실제 ScriptPubKey, 즉 해당 출력에 대한 잠금 스크립트가 포함됩니다. 마지막으로 nLocktime 필드는 전체 거래에 적용되는 타임락 값(타임스탬프나 블록 높이)을 적용합니다.
각 Segwit 거래에는 또한 Witness 섹션이 포함되어 있으며, 각 입력은 해당 입력에 대한 Witness를 포함하고 있습니다. 여기에는 Stack Items 수, 스크립트 스택에 추가될 항목의 수, 각 항목의 크기 필드, 그리고 실제 스택에 추가될 데이터 항목이 포함됩니다.
CTV의 작동 원리
CTV는 계약 제안들 중에서 가장 기본적인 형태의 introspection(내부 검사)과 데이터 전달 기능을 가능하게 하는 연산자입니다. 이는 스크립트가 미리 정의된 32바이트 해시를 사용하여, 실제 소비 거래의 대부분의 필드와 비교할 수 있게 합니다. 실제 소비 거래에서 생성된 해시가 미리 정의된 해시와 일치하지 않으면, 거래는 무효로 간주됩니다.
CTV가 커밋하는 필드는 다음과 같습니다:
- nVersion
- nLocktime
- 입력 수
- 모든 nSequence 필드의 해시
- 출력 수
- 모든 출력의 해시
- 입력 인덱스 (거래에서 해당 입력이 차지하는 위치, 1번째 입력, 2번째 입력 등)
이것들은 CTV 해시가 커밋하는 모든 필드이며, 선택적으로 고를 수 없습니다. CTV가 가능하게 하는 introspection의 정도는 “이 필드들의 해시가 소비 거래에서 잠금 해제되는 입력의 잠금 스크립트에 있는 해시와 일치하는가?”입니다. 이 해시는 기본적으로 전체 거래를 커밋하지만 실제 입력을 제외한 나머지를 포함합니다. 왜 입력이 포함되지 않는지에는 이유가 있습니다. CTV로 출력을 32바이트 해시로 잠그려면, 해당 거래의 해시를 알아야 합니다. 이 거래가 유일하게 소비되는 방법임을 보장하려면 해당 해시가 필요합니다. CTV로 잠긴 입력이 소비될 때, 해당 해시는 반드시 CTV와 비교하여 검증되어야 합니다. 따라서 이 해시는 거래가 완성되기 전에 필요합니다. 이는 불가능합니다.
CTV 스크립트를 중첩할 수도 있습니다. 즉, 초기 CTV 스크립트가 출력과 함께 CTV 스크립트를 포함하는 거래에 커밋할 수 있습니다. 이렇게 하면 CTV가 데이터를 “앞으로” 전달할 수 있습니다. 그러나 실제로 CTV가 전달하는 데이터는 거래 체인에 포함된 데이터입니다. 이론적으로는 무한한 깊이로 이를 수행할 수 있지만, 실제로는 시작부터 끝까지 뒤로 생성되어야 하기 때문에 유한한 깊이로 제한됩니다. 각 수준이나 “홉”마다 거래의 해시를 다음 거래로 전달해야 하므로, 이를 생성할 수 없습니다. 즉, 다음 거래를 알지 못하면 이전 거래를 생성할 수 없습니다.
CTV의 용도
CTV는 출력을 제한하여 정확히 정의된 거래에 의해서만 소비될 수 있도록 할 수 있습니다. 일부는 “이미 거래를 미리 서명할 수 있는데 왜 이게 중요한가?”라고 물을 수도 있습니다. 만약 introspection이 너무 제한적이라면, 우리가 이미 할 수 있는 일과 무엇이 다르냐는 것입니다.
먼저, 미리 서명된 거래는 항상 키홀더가 새로운 거래에 서명하여 다른 방식으로 코인을 소비할 가능성을 열어 둡니다. 키홀더가 이를 하지 않거나 서명에 필요한 키를 삭제할 것이라는 신뢰가 필요합니다. CTV는 이러한 신뢰를 완전히 제거합니다. 한 번 소비 거래가 정의되고, 해당 CTV 해시로 잠긴 출력이 생성되면, 그 다른 방식으로 소비될 가능성은 전혀 없습니다. 이는 합의에 의해 강제됩니다.
현재 그 신뢰를 피하는 유일한 방법은 multisig을 사용하여 거래를 미리 서명하는 것입니다. 그러면 다른 사람이 새로운 유효한 거래를 만들 수 없도록 완전히 확신할 수 있습니다. 하지만 더 많은 사람들이 참여하면, 모두가 동시에 거래를 미리 서명하도록 조정하는 것이 매우 어려워집니다. 적은 인원에서는 문제가 되지 않지만, 더 많은 사람들이 참여할 경우 신뢰할 수 있는 방식으로 거래를 서명하는 것은 매우 비효율적이 됩니다.
CTV는 사람들이 거래 세트가 커밋되었음을 알 수 있도록 해주며, 모든 사람이 동시에 온라인으로 서명할 필요 없이 이를 가능하게 만듭니다. 이는 정보를 언제든지 다른 사람에게 제공할 수 있게 해주며, 그 사람이 모든 사람의 정보를 얻으면 CTV 거래 체인을 생성할 수 있게 합니다. 그리고 모두가 그 결과가 유일한 가능한 것임을 확인할 수 있습니다.
이것은 매우 가치 있는 기능이지만, CTV는 또한 다른 연산자와 결합하여 더 중요한 것들을 가능하게 할 수 있습니다. 이를 다음 기사에서 다룰 예정입니다.
마지막 생각
CTV는 제한된 내부 검사와 데이터 전달 기능을 가능하게 하는 매우 제한된 계약입니다. 그 자체로 새로운 기능을 가능하게 하는 것에는 가치가 없지만, 현재 미리 서명된 거래로 구축할 수 있는 것의 효율성, 확장성 및 보안 보장을 크게 향상시킵니다. 이는 미리 서명된 거래를 사용하는 거의 모든 현재 배포된 프로토콜에 대해 매우 중요한 혜택이 됩니다.
이 제안이 다른 제안들에 비해 얼마나 철저히 구체화되고 탐구되었는지를 보여주는 프로젝트들이 있습니다:
- stutxo의 기본 결제 풀 예제.
- James O’Beirne의 CTV 볼트 구현, 이후 OP_VAULT를 제안 (여전히 CTV 사용).
- Steven Roose가 Ark 구현을 CTV로 포팅한 증명 개념.
- Jeremy Rubin의 Sapio Language, CTV로 계약을 구축하는 고급 언어 (미리 서명된 거래도 지원).
- John Law의 기본적인 코인풀 설계를 위한 Timeout Trees 제안.
- 최적화된 비밀 로그 계약(DLCs), 비대화형 Lightning 채널 및 채굴자들이 풀을 만드는 분산 방식 등의 여러 가능성.
CTV는 현재 매우 성숙한 제안으로, 가치가 높고 계약에 대한 우려를 촉발할 만한 위험이 없습니다. 이는 매우 진지하게 고려되어야 하며, 개인적으로는 몇 년 전에 활성화되었어야 했다고 생각합니다.