본문으로 건너뛰기
buybitcoinsmart

용어집 / 프로토콜과 업그레이드

OP_CAT

OP_CAT란 무엇입니까?
OP_CAT는 스크립트 스택의 맨 위 두 항목을 하나로 합치는 연산으로, 사토시가 2010년에 비활성화했고 BIP-347이 tapscript 안에서 복원할 것을 제안하는 연산입니다.

BIP-347에 명시되어 있습니다.

연결은 사소해 보이지만 그렇지 않습니다. 이것이 있으면 스크립트가 스택에 밀어 넣은 조각들로부터 트랜잭션의 서명 해시를 520바이트 이하의 청크 단위로 다시 조립한 뒤, 평범한 서명 검사로 그 해시를 확인할 수 있습니다. 위험하다는 이유로 꺼 두었던 옵코드가 코버넌트 목록에서 가장 많이 논의되는 항목이 된 경위가 바로 이것입니다.

작동 방식

상태: 2010년 8월부터 비활성화되어 있으며, 당시 스크립트 엔진을 방어적으로 정비하면서 문자열·산술 옵코드 한 묶음이 꺼졌습니다. BIP-347은 tapscript에서만 다시 활성화할 것을 제안합니다. 메인넷에서는 활성화되어 있지 않습니다.

연산 자체는 한 줄입니다. 두 요소를 꺼내고 그 바이트를 끝에서 끝으로 이어 붙여 밀어 넣습니다. 2010년에 이것이 위험했던 이유는 스택 요소가 얼마나 커질 수 있는지 아무것도 제한하지 않았기 때문입니다. 요소를 자기 자신과 연결하면 크기가 두 배가 되므로, 밀어 넣기와 연결을 짧게 반복하는 것만으로 몇 바이트가 기가바이트로 부풀어 노드의 메모리를 차지할 수 있었습니다. 현대 엔진은 스택 요소 하나에 520바이트라는 엄격한 한도를 두므로, BIP-347은 결과가 이 한도를 넘으면 연산을 그냥 실패시키고, 예전의 공격은 사라집니다.

번호 부여에 특이한 점이 있어서 되살리는 일이 유난히 깔끔합니다. OP_CAT는 옵코드 126입니다. BIP-342가 tapscript를 정의할 때 옵코드 126부터 129까지를 비롯한 여러 옵코드를 OP_SUCCESS로 선언했습니다. 하나를 만나면 스크립트가 그 자리에서 성공합니다. 그래서 구형 노드는 이미 바이트 126을 포함한 어떤 tapscript든 실행하지 않고 받아들입니다. 이를 연결을 수행하는 것으로 재정의하면 그 노드들이 허용했을 범위를 좁힐 뿐이므로, 이 변경은 체인 분열이 아니라 소프트포크가 됩니다.

연결이 열어 주는 것은 그 크기에 비해 터무니없이 큽니다. 바이트 문자열을 만들 수 있는 스크립트는 머클 증명을 검증할 수 있고, 타원 곡선이 아니라 해시로 만든 Lamport 또는 Winternitz 서명을 확인할 수 있으며, 서명이 고정된 nonce를 쓰도록 강제해 서명 방정식 자체가 지출 트랜잭션을 스크립트에 드러내게 할 수 있습니다. 마지막 기법이 OP_CAT를 코버넌트 전용 옵코드 없이 범용 코버넌트 도구로 바꾸는 것입니다.

볼 수 있는 곳

OP_CAT는 비트코인에서는 전혀 실행되지 않습니다. 실행되는 곳은 비트코인의 스크립트 엔진을 복사한 뒤 2010년의 결정을 뒤집은 사이드체인과 테스트 네트워크입니다.

Elements에는, 따라서 Liquid에도 이 옵코드가 활성화되어 있으며, 그래서 공개된 코버넌트 시연 대부분이 비트코인이 아니라 Liquid를 대상으로 작성됩니다. BIP-347 규칙을 담은 맞춤형 signet이 다른 무대이며, 이는 개발자들이 누구에게도 합의 변경을 요청하기 전에 먼저 만들어 볼 수 있도록 존재합니다.

코인을 구매하거나 보유하는 사람에게 실질적인 내용은 짧습니다. OP_CAT가 활성화되든 영원히 되지 않든 지갑, 주소, 백업에는 아무 변화가 없습니다. 이 이름을 알아 둘 가치는 비트코인이 얼마나 많은 프로그래머빌리티를 가져야 하는가에 대한 실제 이견의 한가운데에 있다는 점, 그리고 양자 컴퓨터가 있는 미래를 대비해 해시 기반 서명을 추가하려는 제안들이 대개 이곳을 거친다는 점에 있습니다.

자주 묻는 질문

OP_CAT는 애초에 왜 비활성화되었습니까?

스택 요소가 얼마나 커질 수 있는지 아무것도 제한하지 않았기 때문입니다. 요소를 자기 자신과 반복해서 연결하면 매번 크기가 두 배가 되어 노드의 메모리를 고갈시킬 수 있었습니다. 현재의 요소당 520바이트 한도가 그 위험을 없앱니다.

OP_CAT를 다시 활성화하려면 하드포크가 필요합니까?

아닙니다. tapscript에서 이 옵코드 번호는 이미 OP_SUCCESS로 취급되므로 구형 노드는 이것을 포함한 스크립트를 받아들입니다. 여기에 실제 동작을 부여하는 것은 그들이 이미 허용하는 범위를 좁힐 뿐이므로, 소프트포크가 됩니다.

다음에 읽을 글

관련 용어

프로토콜과 업그레이드 분야의 다른 용어

이 페이지를 영어로 읽기