검수요청.png검수요청.png

옵코드

위키원
이동: 둘러보기, 검색

옵코드(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]

각주

참고자료

같이 보기


  검수요청.png검수요청.png 이 옵코드 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.