비트코인은 유효한 증인과 교환하여 자금을 잠금 해제하는 컴퓨터 프로그램에 의해 관리됩니다. 이러한 비트코인 스크립트는 유효한 증인과 그렇지 않은 증인을 정의하는 지불 조건을 인코딩합니다. 모든 트랜잭션은 이 메커니즘에 의존하죠. 이 메커니즘이 작동하는지 확인한다는 것은 트랜잭션이 작동하는지 확인하는 것을 의미합니다. 특히 복잡한 지불 조건을 인코딩할 때 이러한 프로그램이 올바른지 어떻게 확인할 수 있을까요? 복잡성을 어떻게 추적할 수 있을까요? Miniscript와 같은 트리 모양의 프로그램이 이 문제에 대한 해결책입니다.
엣지를 통해 연결된 노드 모음인 트리는 가장 기본적인 데이터 구조 중 하나입니다. 각 노드는 0개 이상의 자식에 연결되지만 하나의 부모에만 연결됩니다. 트리는 부모가 없는 특수 루트 노드에서 ‘성장’합니다. 결과적으로 우리는 어떤 노드를 선택해도 그 자손을 볼 수 있습니다. 더 작은 트리죠! 트리는 재귀적으로 많은 작은 트리로 구성됩니다. 즉, 데이터를 트리로 나타낼 수 있으면 재귀 알고리즘을 통해 데이터를 처리할 수 있으며 비트 단위로 분해할 수 있습니다. 이렇게 하면 데이터 분석과 같은 작업이 더 쉬워집니다.
비트코인에서 트리 찾기
Miniscript는 비트코인 스크립트의 하위 집합입니다. 스크립트의 각 부분이 수행하는 작업을 식별하는 트리 구조를 스크립트에 부과합니다. 어떤 부분은 서명을 요구하고 다른 부분은 해시 사전 이미지를 요구합니다. 일부는 타임락을 적용하고 다른 일부는 일부를 결합하여 더 큰 조건을 형성합니다. 트리 구조를 보면 스크립트의 의미가 명확해집니다. 각 부분은 트리에서 볼 수 있는 역할을 수행합니다.
상기는 비트코인 스크립트와 ‘위’에 있는 Miniscript 트리 구조의 예입니다.
추가된 구조는 정말 유용한 것으로 밝혀졌습니다. 스크립트의 속성은 트리를 따라 이동하여 정적으로 분석하고 귀납적으로 증명할 수 있습니다. 우리는 스크립트가 주어진 증인을 인정하거나 거부하는지, 주어진 수수료를 부과하는지 또는 실행 중에 리소스 제한에 도달하는지 쉽게 보여줄 수 있습니다. 지불 조건의 구성을 인코딩하는 두 개의 스크립트를 하나로 결합할 수도 있습니다. 이 툴킷을 사용하면 결과 스크립트가 정확하다는 확신을 가지고 복잡한 지불 조건을 인코딩할 수 있습니다.
원시 비트코인 스크립트는 이러한 편의성이 없기 때문에 사용하기 까다롭습니다. 스크립트의 의미는 C++ 구현에 의해 암시적으로 정의됩니다. 일반적으로 스크립트는 명확한 구조가 부족하고 추론하기 어렵습니다. 게다가 비트코인 스크립트 자체는 곱셈이나 연결과 같은 기본적인 연산조차 표현할 수 없습니다. 이러한 장애물로 인해 우리가 원하는 대로 지불 조건을 자유롭게 인코딩하기가 어렵습니다.
Miniscript는 스크립트가 트리 구조와 유사하도록 만들어 비트코인 스크립트의 핵심 기능을 개선합니다. 이 요구 사항에는 키, 해시 또는 타임락을 인코딩하는 작고 잘 작동하는 스크립트가 포함되며 다른 작업을 수행하는 이국적인 스크립트는 제외됩니다. Miniscript는 궁극적으로 위에 구조가 있는 비트코인 스크립트이기 때문에 이제 소프트 포크 없이 사용할 수 있습니다. 이 구조를 사용하려는 지갑과 기타 소프트웨어만 지원을 추가하기 위해 업데이트가 필요합니다.
한계를 뛰어넘다
유용한 속성을 유지하면서 Miniscript보다 더 많은 작업을 수행할 수 있는 방법은 무엇일까요? 시스템의 구조를 유지하면서 어떻게 시스템을 더욱 강력하게 만들 수 있을까요? 이러한 생각은 처음부터 비트코인 스크립트의 대안으로 고안된 새로운 블록체인 언어인 Simplicity로 이어집니다.
Simplicity 프로그램은 트리입니다. 루트 노드는 전체 프로그램을 나타내고 각 노드는 계산의 일부를 수행합니다. 구체적으로, 부모 노드는 자식 노드의 계산에 액세스할 수 있으며 일부 기능에 따라 결과를 집계합니다. 이는 공개 키나 증인 데이터와 같은 상수 값이 반환되는 리프에서 시작됩니다. 집계는 전체 결과가 루트에서 계산될 때까지 아래에서 위로 계속됩니다.
다음은 위의 비트코인 스크립트와 매치되는 Simplicity 프로그램의 스케치입니다. 구조가 Miniscript 트리 구조와 어떻게 같은지 확인하십시오. 실제 Simplicity 프로그램은 더 상세하지만(and, or, key, older는 결합자라고 불리는 더 작은 프로그램 조각으로 구성됨) 줌아웃하면 Simplicity와 Miniscript가 비슷하게 보입니다.
Simplicity는 임의의 부울 함수를 계산하기에 충분히 일반적입니다. 이들 각각은 증인을 수락하거나 거부하는 기능인 지불 조건으로 생각할 수 있습니다. Simplicity는 약정, 위임, 영지식 증명 등을 할 수 있습니다. 이 표현력은 어려워 보일 수 있지만 프로그래밍 방식의 정확성을 확인할 수 있습니다. Simplicity에는 명시적인 의미 체계가 있으므로 프로그램이 수행하는 작업이 명확합니다. 불필요한 놀라움은 없습니다. 또한 트리 구조를 사용하면 속성을 정적으로 분석하고 증명하기가 쉽습니다. 주어진 프로그램이 저렴하게 실행되고 주어진 지불 조건을 올바르게 인코딩한다는 것을 보여줄 수 있습니다. 우리는 Miniscript를 위한 것과 동일한 툴킷을 가지고 있지만 훨씬 더 큰 프로그램 세트를 위한 것입니다.
Miniscript와 달리 Simplicity는 비트코인에서 사용할 수 있는 소프트 포크가 필요합니다. 새로운 유형의 Taproot 리프에서 비트코인 스크립트(Miniscript) 옆에 존재할 것입니다. 다음 단계는 먼저 Liquid의 오픈소스 플랫폼인 Simplicity in Elements를 구현하여 비트코인의 잠재력을 입증하는 것입니다. 이것은 또한 최종 언어 디자인을 알려줄 것입니다.
Bridging the Languages 언어 연결하기
우리는 Miniscript와 Simplicity 사이에 연결 브리지를 놓고 있습니다. Miniscript 트리 구조는 Simplicity에서 쉽게 복제할 수 있으므로 비트코인 스크립트를 Simplicity 프로그램으로 변환할 수 있고 Miniscript는 Simplicity의 하위 집합이 됩니다. 기존 스크립트에서 프로그램을 생성하고, 프로그램과 스크립트가 의미상 동일한지 확인하고, 나중에 Miniscript가 표현할 수 있는 것 이상으로 프로그램을 구체화할 수 있습니다. Miniscript에 익숙한 사람들에게 이는 단순함의 세계에 대한 훌륭한 소개가 될 것입니다. 이 시리즈의 다음 글에서는 이 브리지에 대해 자세히 설명하겠습니다.
트리 모양의 미래
Miniscript와 같은 트리 모양의 프로그램은 읽고 분석하기 쉽습니다. 다양한 툴이 이러한 프로그램에서 작동하며 정확성을 추적하는 데 도움이 됩니다. Simplicity 도 마찬가지로 트리를 사용하여 임의의 계산을 가능하게 합니다. Miniscript보다 훨씬 강력하지만 그 구조 덕분에 여전히 잘 작동합니다. Miniscript의 장점은 Simplicity 로 이어집니다. 그 결과는 여전히 임의의 계산을 가능하게 하면서 트리의 이점을 누리는 언어입니다.
우리가 바라는 미래는 트리 모양입니다. 우리는 Simplicity를 현실로 만들기 위해 꾸준히 노력하고 있습니다. 브리지를 통해 Miniscript를 Simplicity로 변환하는 것은 시작하기에 좋은 방법입니다. 브리지를 사용하는 방법에 대한 다음 글을 기대해 주세요!