용어집 / 개발자 참고 자료
오피코드(Opcode)
별칭은 Opcode, 데이터 푸시 opcode, 비데이터 푸시 opcode입니다.
- 오피코드(Opcode)란 무엇입니까?
- 오피코드(Opcode)는 비트코인 스크립트의 1바이트 명령으로, 검증 노드에 다음에 무엇을 할지, 즉 데이터를 스택에 푸시할지 이미 스택에 있는 값에 대해 하나의 연산을 수행할지를 알려 줍니다.
Bitcoin Script는 256개의 가능한 바이트 값으로 이루어진 고정된 어휘를 가지고 있으며, 이는 리터럴 데이터를 푸시하는 opcode와 이미 푸시된 데이터에 작동하는 opcode로 나뉩니다. 레거시 스크립트는 최대 201개의 작동 opcode를 실행할 수 있고 10,000바이트를 초과할 수 없습니다. 비트코인을 구매하는 사람에게 이 작은 어휘는 지갑이 브로드캐스트 전에 수수료를 제시할 수 있는 이유이며, 비트코인에 통제 불능의 계약 버그가 발생할 표면이 없는 이유입니다.
작동 방식
검증 노드는 스크립트를 한 바이트씩 읽고 각 바이트를 고정된 표에서 찾습니다. 0x01부터 0x4b까지의 값은 명령이 아닙니다. 각 값은 다음 N바이트가 리터럴 데이터이며 스택에 속한다고 말하며, 그래서 33바이트 압축 공개 키가 스크립트에 0x21 다음에 키 자체가 오는 형태로 나타납니다. 세 가지 추가 푸시 코드인 OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4는 더 긴 항목을 담당하고, 0x51부터 0x60까지의 값은 정족수 개수에 나타나는 작은 정수 1부터 16까지를 푸시합니다.
0x60보다 큰 모든 값은 데이터를 운반하는 대신 작업을 수행하며, 비트코인이 세는 것은 바로 이것들입니다. Taproot 이전 스크립트는 이러한 opcode를 최대 201개 포함할 수 있고, 520바이트보다 큰 스택 요소를 가질 수 없으며, 스택에 1,000개를 초과하는 항목을 유지할 수 없고, 전체 길이가 10,000바이트를 초과할 수 없습니다. 네 가지 수치는 모두 Bitcoin Core의 script.h에서 나오며, 네 가지 모두 노드 운영자가 완화할 수 있는 선호가 아닌 합의 규칙입니다.
표에 열다섯 개의 opcode가 등재되어 있지만 사용할 수 없습니다. OP_CAT, OP_MUL, OP_LSHIFT와 열두 개의 다른 opcode는 충돌 버그 이후 2010년에 비활성화되었으며, 그중 하나를 포함하기만 하는 스크립트는 절대 실행되지 않는 분기 안에 있더라도 실패합니다. 다시 활성화된 것은 하나도 없습니다. 그 단일 결정이 비트코인의 스크립팅이 “프로그래밍 가능”이라는 단어가 기대하게 만드는 것보다 좁은 가장 큰 이유입니다.
Tapscript는 Taproot 지출의 회계 방식을 다시 썼습니다. 2021년 11월의 블록 709,632부터 적용된 BIP-342는 201개 명령 상한과 10,000바이트 크기 상한을 모두 없애고, 스크립트가 검사하는 서명마다 트랜잭션이 50 가중치 단위를 실어야 한다는 서명 예산으로 대체했습니다. 또한 정의되지 않은 바이트 값의 블록을 OP_SUCCESS 코드로 바꾸어, 하나를 포함하는 스크립트는 전혀 실행되지 않고도 유효합니다. 이는 미래의 업그레이드를 위해 의도적으로 남긴 여지입니다.
비트코인을 구매할 때 이것이 중요한 이유
opcode는 출금 비용을 결정합니다. 레거시 출력은 25바이트 안에 20바이트 해시를 둘러싼 네 개의 작동 명령을 적습니다. 네이티브 SegWit 출력은 버전 바이트와 푸시로 22바이트이며, Taproot 출력은 34바이트입니다. SegWit이 잠금 해제 부분을 가중치의 4분의 1로 위트니스로 옮겼기 때문에, bech32 출력을 지출하는 데는 대략 68 가상 바이트가 들고 같은 결제의 레거시 버전은 대략 148이 듭니다. 출금할 때 거래소가 제공하는 경우에는 bech32 또는 bech32m을 고르는 것은 이 용어집에서 거의 가장 저렴한 결정입니다.
opcode는 또한 서명 장치가 실제로 처리할 수 있는 것을 결정합니다. 표준 단일 키 템플릿만 인식하는 하드웨어 지갑은 시간 잠금 금고나 특이한 정책을 공동 서명할 수 없습니다. 따라서 상속 계획이나 멀티시그가 계획에 조금이라도 있다면, 코인이 이미 장치에 들어간 뒤가 아니라 장치를 구매하기 전에 리뷰에서 스크립트 지원을 확인하십시오.
이 좁음은 단점이 아니라 안전 속성입니다. 반복문이 없고, 다른 트랜잭션을 읽을 방법이 없으며, 지출 사이에 지속되는 상태가 없습니다. 그래서 프로그래밍 가능한 체인에서 수십억 달러를 빼낸 실패 방식, 즉 작성자가 고려하지 않은 입력에서 계약이 올바르게 작동하는 방식은 일어날 곳이 없습니다. 비트코인의 손실은 스크립트 엔진의 오작동이 아니라 거래소, 피싱, 분실된 백업에서 발생합니다.
실제 예시: OP_NOP2에 강제력이 생긴 날
OP_NOP2는 바이트 0xb1이었고 아무것도 하지 않았으며, 나중 사용을 위해 표에 남아 있는 열 개의 번호가 붙은 no-op 중 하나였습니다. BIP-65는 여기에 역할을 부여했습니다. 트랜잭션의 록타임이 지났는지 확인하고, 지나지 않았다면 스크립트를 실패시키는 것입니다. 시행은 2015년 12월 14일의 블록 388,381부터 시작되었고, 그 이후 이 opcode는 OP_CHECKLOCKTIMEVERIFY라고 불립니다.
비결은 오래된 소프트웨어가 여전히 아무것도 하지 않는 바이트로 보아, 여전히 새 트랜잭션을 유효한 것으로 받아들였다는 점입니다. 업그레이드된 노드만 시간 잠금을 시행했습니다. 그 비대칭성이 소프트 포크를 소프트 포크이게 하며, 같은 경로로 OP_NOP3은 2016년 7월의 블록 419,328에서 OP_CHECKSEQUENCEVERIFY가 되었습니다. 여덟 개의 예약된 no-op 자리가 남아 있으며, 이는 Taproot 이전 규칙 아래 비트코인에 남은 업그레이드 여지의 대부분이고, 설계 관심이 그토록 많이 Tapscript가 만든 OP_SUCCESS 값으로 옮겨간 큰 이유이기도 합니다.
Opcode vs Bitcoin Script
Bitcoin Script는 언어이고 opcode는 그 어휘의 한 단어입니다. 이 구별은 비트코인이 무엇을 할 수 있고 무엇을 할 수 없는지에 대한 주장을 읽을 때 중요합니다. 지난 10년의 거의 모든 진지한 제안은 주변 언어를 바꾸려는 것이 아니라 새로운 opcode 하나를 정의하려는 제안이었기 때문입니다. OP_CHECKTEMPLATEVERIFY, OP_CAT, OP_CHECKSIGADD는 각각 단일한 작업을 하는 단일 바이트이며, 코버넌트나 금고에 대한 공개 논쟁은 특정 바이트 하나가 무언가를 의미하도록 허용해야 하는지에 대한 논쟁입니다. 새 opcode가 도착해도 스택, 한도, 반복문의 부재는 그대로 유지됩니다.