옵코드
옵코드(OPCode)는 명령 또는 함수라고 하는 모든 스크립트 단어의 목록이며, 데이터를 푸시하거나 Pubkey 스크립트 또는 서명 스크립트 내에서 기능을 수행하는 비트코인(Bitcoin) 스크립트 언어의 작업 코드이다. 오피코드라고도 한다.
목차
개요
비트코인 노드에서 실행되는 소프트웨어는 프로그래밍 언어 C++로 작성되지만, 비트코인 트랜잭션에는 스크립트라는 비트코인 관련 언어로 작성된 명령이 포함될 수도 있다. 이더리움(Ethereum) 플랫폼에는 분산 애플리케이션 및 스마트 계약(Smart Contract)을 허용하는 Turing-complete 프로그래밍 언어가 있지만, 스크립트는 옵코드라는 일련의 명령으로 구성된 가능한 작은 범위의 작업만 허용하는 기본 언어이다.[1]
명령어
상수
- OP_0, OP_FALSE : 빈 바이트 배열이 스택으로 푸시된다.
- N/A : 다음 옵코드 바이트는 스택에 푸시 할 데이터이다.
- OP_PUSHDATA1 : 다음 바이트는 스택으로 푸시 될 바이트 수를 포함한다.
- OP_PUSHDATA2 : 다음 2 바이트에는 리틀 엔디안 순서로 스택에 푸시 할 바이트 수가 포함된다.
- OP_PUSHDATA4 : 다음 4 바이트에는 리틀 엔디안 순서로 스택에 푸시 할 바이트 수가 포함된다.
- OP_1NEGATE : 숫자 -1이 스택으로 푸시된다. 코드 숫자로는 79로 나타내고,
- OP_1, OP_TRUE : 숫자 1이 스택으로 푸시된다.
- OP_2-OP_16 : 단어 이름(2-16)의 숫자가 스택으로 푸시된다.
흐름제어
- OP_NOP : 아무것도 하지 않는다.
- OP_IF : 최상의 스택 값이 False가 아닌 경우 명령문이 실행된다. 상단 스택값이 제거된다.
- OP_NOTIF : 최상위 스택 값이 False일 경우 명령문이 실행된다. 상단 스택값이 제거된다.
- OP_ELSE : 앞에서 OP_IF 또는 OP_NOTIF가 실행되지 않은 경우 이 명령문이 실행되고 실행 된 경우 이 명령문이 실행되지 않는다.
- OP_ENDIF : If/Else 블록을 종료한다. 모든 블록이 종료되거나 트랜잭션이 유효하지 않으며, OP_IF가 없는 OP_ENDIF도 유효하지 않다.
- OP_VERIFY : 최상위 스택 값이 True가 아닌 경우 트랜잭션을 유효하지 않은 것으로 표시한다. 상단 스택 값이 제거된다.
- OP_RETURN : 트랜잭션을 유효하지 않은 것으로 표시한다. OP_RETURN 이후 푸시문의 시퀀스를 포함하는 OP_RETURN으로 단일 출력을 허용한다.
스택
- OP_TOALTSTACK : 입력을 Alt 스택의 맨 위에 놓는다. 기본 스택에서 제거한다.
- OP_FROMALTSTACK : 입력을 기본 스택의 맨 위에 놓는다. 대체 스택에서 제거한다.
- OP_IFDUP : 상단 스택 값이 0이 아니면 복제한다.
- OP_DEPTH : 스택 항목 수를 스택에 넣는다.
- OP_DROP : 상단 스택 항목을 제거한다.
- OP_DUP : 상단 스택 항목을 복제한다.
- OP_NIP : 두 번째부터 끝까지 쌓인 항목을 제거한다.
- OP_OVER : 두 번째에서 위쪽까지 스택 항목을 맨 위에 복사한다.
- OP_PICK : 스택에 있는 항목 n이 맨 위로 복사된다.
- OP_ROLL : 스택에 있는 항목 n이 맨 위로 이동한다.
- OP_ROT : 스택의 맨 위 3개 항목이 왼쪽으로 회전한다.
- OP_SWAP : 스택의 맨 위 두 항목이 바뀐다.
- OP_TUCK : 스택의 맨 위에 있는 항목이 두 번째에서 맨 위 항목보다 먼저 복사되고 삽입된다.
- OP_2DROP 맨 위 두개의 스택 항목을 제거한다.
- OP_2DUP : 상위 2개의 스택 항목을 복제한다.
- OP_3DUP : 상위 3개의 스택 항목을 복제한다.
- OP_2OVER : 한 쌍의 항목을 스택의 앞뒤로 두 칸 복사한다.
- OP_2ROT : 5번째와 6번째 항목은 스택의 맨위로 이동한다.
- OP_25WAP : 상위 두 쌍의 항목을 교환한다.
접착
- OP_CAT : 두 개의 문자열을 연결한다. 비활성화 되었다.
- OP_SUBSTR : 문자열의 섹션을 반환한다. 비활성화 되었다.
- OP_LEFT : 문자열에서 지정된 지점의 왼쪽 문자만 유지한다. 비활성화 되었다.
- OP_RIGHT : 문자열에서 지정된 지점의 문자만 유지한다. 비활성화 되었다.
- OP_SIZE : 스택 맨 위 요소의 문자열 길이를 펼치지 않는다.
비트 논리
- OP_INVERT : 입력의 모든 비트를 뒤집는다. 비활성화 되었다.
- OP_AND : 불린(boolean)과 입력의 각 비트 사이. 비활성화되었다.
- OP_OR : 불린 또는 입력의 각 비트 사이. 비활성화 되었다.
- OP_XOR : 불린 단독 또는 입력의 각 비트 사이. 비활성화되었다.
- OP_EQUAL : 입력 값이 정확히 같으면 1을, 그렇지 않으면 0을 반환한다.
- OP_EQUALVERIFY : OP_EQUAL과 동일하지만 나중에 OP_VERIFY를 실행한다.
산수
- OP_1ADD : 1이 입력에 추가된다.
- OP_1SUB : 입력에서 1을 뺍니다.
- OP_2MUL : 입력에 2가 곱해진다. 비활성화 되었다.
- OP_2DIV : 입력은 2로 나뉜다. 비활성화 되었다.
- OP_NEGATE : 입력 부호가 뒤집힌다.
- OP_ABS : 입력은 양수이다.
- OP_NOT : 입력이 0 또는 1이면 뒤집힌다. 그렇지 않으면 출력은 0이다.
- OP_0NOTEQUAL : 입력이 0이면 0을, 그렇지 않으면 1을 반환한다.
- OP_ADD : a가 b에 추가된다.
- OP_SUB : b에서 a를 뺀다.
- OP_MUL : a에 b를 곱한다. 비활성화 되었다.
- OP_DIV : a는 b로 나뉜다. 비활성화 되었다.
- OP_MOD : a를 b로 나눈 후 나머지를 반환한다. 비활성화 되었다.
- OP_LSHIFT : 부호를 유지하면서 왼쪽 b 비트를 이동한다. 비활성화 되었다.
- OP_RSHIFT : 부호를 유지하면서 오른쪽 b 비트를 이동한다. 비활성화 되었다.
- OP_BOOLAND : a와 b가 모두 0이 아닌 경우 출력은 1이다. 그렇지 않으면 0이다.
- OP_BOOLOR : a 또는 b가 0이 아닌 경우 출력은 1이다. 그렇지 않으면 0이다.
- OP_NUMEQUAL : 숫자가 같으면 1을, 그렇지 않으면 0을 반환한다.
- OP_NUMEQUALVERIFY : OP_NUMEQUAL과 동일하지만 나중에 OP_VERIFY를 실행한다.
- OP_NUMNOTEQUAL : 숫자가 같지 않으면 1을, 그렇지 않으면 0을 반환한다.
- OP_LESSTHAN : a가 b보다 작은 경우 1을, 그렇지 않으면 0을 반환한다.
- OP_GREATERTHAN : a가 b보다 크면 1을, 그렇지 않으면 0을 반환한다.
- OP_LESSTHANOREQUAL : a가 b보다 작거나 같으면 1을, 그렇지 않으면 0을 반환한다.
- OP_GREATERTHANOREQUAL : a가 b보다 크거나 같으면 1을, 그렇지 않으면 0을 반환한다.
- OP_MIN : a와 b중 작은 값을 반환한다.
- OP_MAX : a와 b중 큰 값을 반환한다.
- OP_WITHIN : x가 지정된 범위내에 있으면 1을, 그렇지 않으면 0을 반환한다.
암호화
- OP_RIPEMD160 : 입력은 RIPEMD-160을 사용하여 해시된다.
- OP_SHA1 : 입력은 SHA-1을 사용하여 해시된다.
- OP_SHA256 : 입력은 SHA-256을 사용하여 해시된다.
- OP_HASH160 : 입력은 두 번 해시된다. 먼저 SHA-266을 사용한 다음 RIPEMD-160을 사용한다.
- OP_HASH256 : 입력은 SHA-256으로 두 번 해시된다.
- OP_CODESEPARATOR : 모든 서명 확인 단어는 가장 최근에 실행 된 OP_CODESEPARATPR 이후의 데이터와만 서명을 일치시킨다.
- OP_CHECKSIG : 전체 트랜잭션의 출력, 입력 및 스크립트가 해시된다. OP_CHECKSIG에서 사용하는 서명은 이 해시와 공용키에 유효한 서명이어야 한다. 그래야만 1은 반환디고, 그렇지 않으면 0이 반환된다.
- OP_CHECKSIGVERIFY : OP_CHECKSIG와 동일하지만 나중에 OP_VERIFY가 실행된다.
- OP_CHECKMULTISIG : ECDSA 일치를 찾을 때 까지 첫 번째 서명을 각 공개키와 비교한다. 모든 서명이 유효하면 1이 반환되고 그렇지 않으면 0이 반환된다. 버그가 있어 스택에서 사용되지 않는 값이 하나 더 제거된다.
- OP_CHECKMULTISIGVERIFY : OP_CHECKMULTISIG와 동일하지만 나중에 OP_VERIFY가 실행된다.
잠금 시간
- OP_CHECKLOCKTIMEVERIFY(OP_NOP2) : 최상의 스택 항목이 트랜잭션의 nLockTime 필드보다 큰 경우 트랜잭션을 유효하지 않은 것으로 표시한다. 그렇지 않으면 OP_NOP사 실행 된 것처럼 스크립트 평가가 계속된다. 정확한 뜻은 BIP65에 설명되어 있다.
- OP_CHECKSEQUNECEVERIFY(OP_NOP3) : 입력의 상대 잠근 시간이 상위 스택 항목의 값보다 크거나 같지 않으면 트랜잭션을 유효하지 않은 것으로 표시한다. 정확한 뜻은 BIP112에 설명되어 있다.
유사어
- OP_PUBKEYHASH : OP_HASH160으로 해시 된 공개키를 나타낸다.
- OP_PUBKEY : OP_CHECKSIG와 호환되느 공개키를 나타낸다.
- OP_INVALIDOPCODE : 아직 할당되지 않은 옵코드와 일치한다.
예약어
- OP_RESERVED : 실행되지 않은 OP_IF 분기에서 발생 하지 않는 한 트랜잭션이 유효하지 않다.
- OP_VER : 실행되지 않은 OP_IF 분기에서 발생 하지 않는 한 트랜잭션이 유효하지 않다.
- OP_VERIF : 실행되지 않은 OP_IF 분기에서 발생하더라도 트랜잭션이 유효하지 않다.
- OP_VERNOTIF : 실행되지 않은 OP_IF 분기에서 발생하더라도 트랜잭션이 유효하지 않다.
- OP_RESERVED1 : 실행되지 않은 OP_IF 분기에서 발생 하지 않느 한 트랜잭션이 유효하지 않다.
- OP_RESERVED2 : 실행되지 않은 OP_IF 분기에서 발생 하지 않는 한 트랜잭션이 유효하지 않다.
- OP_NOP1, OP_NOP4-OP_NOP10 : 단어는 무시된다. 거래를 유효하지 않은 것으로 표시하지 않는다.
비활성화된 옵코드
2010년과 2011년에 심각한 버그가 발견되면서 비트코인 스크립트 언어에서 많은 옵코드가 비활성화되었다. 이러한 옵코드 중 일부가 비트코인캐시(BitcoinCash)에서 제공한 기능을 복원하고자 단순히 옵코드를 다시 활성화하는 대신, 제공하는 기능이 재검토되었으며 때에 따라 옵코드가 다시 설계되었거나 특정 문제를 해결하기 위해 새로운 옵코드가 추가되었다.[2]
활용
- "이더리움 특징을 도입하기 위해 옵코드를 추가할 것"이라고 예고했다. 비트코인 캐시에 이더리움의 스마트 계약과 같은 비슷한 기능이 도입된다는 얘기다. 곧, 비트코인 캐시가 이더리움처럼 금융 이외에도 다양한 산업의 플랫폼으로 쓰일 수 있디는 의미다.[3]
- 비트코인캐시는 편리하게 결제하고 거래할 수 있는 화폐가 되기 위해 6개월마다 정기적으로 네트워크 업그레이드를 위한 하드포크를 진행한다. 지난 5월 진행된 하드포크에서는 블록 크기를 32MB로 다시 한번 늘렸고, 확장성 및 안정성을 위해 다수의 옵코드를 도입했다.[4]
각주
- ↑ Corin Faife, 〈Nodes, Opcodes, and Satoshi's Vision: Today's Bitcoin Cash Hard Fork Explained〉, 《BREAKERMAG》, 2018-11-15
- ↑ 비트코인 캐시 공식 홈페이지 - https://www.bitcoincash.org/es/spec/may-2018-reenabled-opcodes.html
- ↑ 고란 기자, 〈"비트코인은 도박?...6개월 투자해 두배 먹을 생각이면 사지 마라"〉, 《중앙일보》, 2018-05-06
- ↑ 민서연 기자, 〈(신비한 코인사전)<27>끝나지 않은 하드포크 전쟁 '비트코인 캐시'〉, 《뉴스줌》, 2018-11-14
참고자료
- 비트코인재단 공식 홈페이지 - https://bitcoin.org/en/glossary/op-code
- 비트코인캐시 공식 홈페이지 - https://www.bitcoincash.org/es/spec/may-2018-reenabled-opcodes.html
- 〈Script〉, 《비트코인위키》
- Corin Faife, 〈Nodes, Opcodes, and Satoshi's Vision: Today's Bitcoin Cash Hard Fork Explained〉, 《BREAKERMAG》, 2018-11-15
같이 보기