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

"옵코드"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(활용)
잔글
 
(사용자 2명의 중간 판 8개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''옵코드'''(OPCode)는 명령 또는 함수라고 하는 모든 [[스크립트]] 단어의 목록이며, 데이터를 푸시하거나 Pubkey 스크립트 또는 서명 스크립트 내에서 기능을 수행하는 [[비트코인]](Bitcoin) 스크립트 언어의 작업 코드이다.
+
'''옵코드'''<!--옵 코드-->(OPCode)는 명령 또는 함수라고 하는 모든 [[스크립트]] 단어의 목록이며, 데이터를 푸시하거나 Pubkey 스크립트 또는 서명 스크립트 내에서 기능을 수행하는 [[비트코인]](Bitcoin) 스크립트 언어의 작업 코드이다. '''오피코드'''<!--오피 코드-->라고도 한다.
  
 
==개요==
 
==개요==
비트코인 [[노드]]에서 실행되는 [[소프트웨어]]는 프로그래밍 언어 [[C++]]로 작성되지만, 비트코인 [[트랜잭션]]에는 스크립트라는 비트코인 관련 언어로 작성된 명령이 포함될 수도 있다. [[이더리움]](Ethereum) [[플랫폼]]에는 분산 응용 프로그램 및 스마트 계약을 허용하는 [[Turing-complete]] 프로그래밍 언어가 있지만, 스크립트는 옵코드라는 일련의 명령으로 구성된 가능한 작은 범위의 작업만 허용하는 기본 언어이다.<ref>Corin Faife, 〈[https://breakermag.com/nodes-opcodes-and-satoshis-vision-the-bitcoin-cash-hard-fork-explained/ Nodes, Opcodes, and Satoshi's Vision: Today's Bitcoin Cash Hard Fork Explained]〉, 《BREAKERMAG》, 2018-11-15</ref>  
+
비트코인 [[노드]]에서 실행되는 [[소프트웨어]]는 프로그래밍 언어 [[C++]]로 작성되지만, 비트코인 [[트랜잭션]]에는 스크립트라는 비트코인 관련 언어로 작성된 명령이 포함될 수도 있다. [[이더리움]](Ethereum) [[플랫폼]]에는 분산 [[애플리케이션]] [[스마트 계약]](Smart Contract)을 허용하는 [[Turing-complete]] 프로그래밍 언어가 있지만, 스크립트는 옵코드라는 일련의 명령으로 구성된 가능한 작은 범위의 작업만 허용하는 기본 언어이다.<ref>Corin Faife, 〈[https://breakermag.com/nodes-opcodes-and-satoshis-vision-the-bitcoin-cash-hard-fork-explained/ Nodes, Opcodes, and Satoshi's Vision: Today's Bitcoin Cash Hard Fork Explained]〉, 《BREAKERMAG》, 2018-11-15</ref>
  
 
==명령어==
 
==명령어==
 
===상수===
 
===상수===
*'''OP_0''', '''OP_FALSE''' : 빈 바이트 배열이 [[스택으]]로 푸시된다.
+
*'''OP_0''', '''OP_FALSE''' : 빈 바이트 배열이 스택으로 푸시된다.
 
*'''N/A''' : 다음 옵코드 바이트는 스택에 푸시 할 데이터이다.
 
*'''N/A''' : 다음 옵코드 바이트는 스택에 푸시 할 데이터이다.
 
*'''OP_PUSHDATA1''' : 다음 바이트는 스택으로 푸시 될 바이트 수를 포함한다.  
 
*'''OP_PUSHDATA1''' : 다음 바이트는 스택으로 푸시 될 바이트 수를 포함한다.  
14번째 줄: 14번째 줄:
 
*'''OP_1''', '''OP_TRUE''' : 숫자 1이 스택으로 푸시된다.  
 
*'''OP_1''', '''OP_TRUE''' : 숫자 1이 스택으로 푸시된다.  
 
*'''OP_2-OP_16''' : 단어 이름(2-16)의 숫자가 스택으로 푸시된다.
 
*'''OP_2-OP_16''' : 단어 이름(2-16)의 숫자가 스택으로 푸시된다.
 +
 
===흐름제어===
 
===흐름제어===
 
*'''OP_NOP''' : 아무것도 하지 않는다.
 
*'''OP_NOP''' : 아무것도 하지 않는다.
53번째 줄: 54번째 줄:
 
===비트 논리===
 
===비트 논리===
 
*'''OP_INVERT''' : 입력의 모든 비트를 뒤집는다. 비활성화 되었다.
 
*'''OP_INVERT''' : 입력의 모든 비트를 뒤집는다. 비활성화 되었다.
*'''OP_AND''' : 불리언(Boolean)과 입력의 각 비트 사이. 비활성화 되었다.
+
*'''OP_AND''' : [[불린]](boolean)과 입력의 각 비트 사이. 비활성화되었다.
*'''OP_OR''' : 불리언 또는 입력의 각 비트 사이. 비활성화 되었다.
+
*'''OP_OR''' : 불린 또는 입력의 각 비트 사이. 비활성화 되었다.
*'''OP_XOR''' : 불리언 단독 또는 입력의 각 비트 사이. 비활성화 되었다.
+
*'''OP_XOR''' : 불린 단독 또는 입력의 각 비트 사이. 비활성화되었다.
 
*'''OP_EQUAL''' : 입력 값이 정확히 같으면 1을, 그렇지 않으면 0을 반환한다.
 
*'''OP_EQUAL''' : 입력 값이 정확히 같으면 1을, 그렇지 않으면 0을 반환한다.
 
*'''OP_EQUALVERIFY''' : OP_EQUAL과 동일하지만 나중에 OP_VERIFY를 실행한다.
 
*'''OP_EQUALVERIFY''' : OP_EQUAL과 동일하지만 나중에 OP_VERIFY를 실행한다.
122번째 줄: 123번째 줄:
  
 
==활용==
 
==활용==
*"이더리움 특징을 도입하기 위해 옵코드를 추가할 것"이라고 예고했다. 비트코인 캐시에 이더리움의 [[스마트 계약]](Smart Contract)같은 비슷한 기능이 도입된다는 얘기다. 곧, 비트코인 캐시가 이더리움처럼 금융 이외에도 다양한 산업의 플랫폼으로 쓰일 수 있디는 의미다.<ref>고란 기자, 〈[https://news.joins.com/article/22599382 "비트코인은 도박?...6개월 투자해 두배 먹을 생각이면 사지 마라"]〉, 《중앙일보》, 2018-05-06</ref>
+
*"이더리움 특징을 도입하기 위해 옵코드를 추가할 것"이라고 예고했다. 비트코인 캐시에 이더리움의 스마트 계약과 같은 비슷한 기능이 도입된다는 얘기다. 곧, 비트코인 캐시가 이더리움처럼 금융 이외에도 다양한 산업의 플랫폼으로 쓰일 수 있디는 의미다.<ref>고란 기자, 〈[https://news.joins.com/article/22599382 "비트코인은 도박?...6개월 투자해 두배 먹을 생각이면 사지 마라"]〉, 《중앙일보》, 2018-05-06</ref>
 
*비트코인캐시는 편리하게 결제하고 거래할 수 있는 화폐가 되기 위해 6개월마다 정기적으로 [[네트워크]] [[업그레이드]]를 위한 [[하드포크]]를 진행한다. 지난 5월 진행된 하드포크에서는 블록 크기를 32MB로 다시 한번 늘렸고, 확장성 및 안정성을 위해 다수의 옵코드를 도입했다.<ref>민서연 기자, 〈[http://news.zum.com/articles/48871397 (신비한 코인사전)<27>끝나지 않은 하드포크 전쟁 '비트코인 캐시']〉, 《뉴스줌》, 2018-11-14</ref>
 
*비트코인캐시는 편리하게 결제하고 거래할 수 있는 화폐가 되기 위해 6개월마다 정기적으로 [[네트워크]] [[업그레이드]]를 위한 [[하드포크]]를 진행한다. 지난 5월 진행된 하드포크에서는 블록 크기를 32MB로 다시 한번 늘렸고, 확장성 및 안정성을 위해 다수의 옵코드를 도입했다.<ref>민서연 기자, 〈[http://news.zum.com/articles/48871397 (신비한 코인사전)<27>끝나지 않은 하드포크 전쟁 '비트코인 캐시']〉, 《뉴스줌》, 2018-11-14</ref>
 
{{각주}}
 
{{각주}}
  
 
==참고자료==
 
==참고자료==
* 비트코인 공식 홈페이지 - https://bitcoin.org/en/glossary/op-code
+
* 비트코인재단 공식 홈페이지 - https://bitcoin.org/en/glossary/op-code
 +
* 비트코인캐시 공식 홈페이지 - https://www.bitcoincash.org/es/spec/may-2018-reenabled-opcodes.html
 
* 〈[https://en.bitcoin.it/wiki/Script Script]〉, 《비트코인위키》
 
* 〈[https://en.bitcoin.it/wiki/Script Script]〉, 《비트코인위키》
 
* Corin Faife, 〈[https://breakermag.com/nodes-opcodes-and-satoshis-vision-the-bitcoin-cash-hard-fork-explained/ Nodes, Opcodes, and Satoshi's Vision: Today's Bitcoin Cash Hard Fork Explained]〉, 《BREAKERMAG》, 2018-11-15
 
* Corin Faife, 〈[https://breakermag.com/nodes-opcodes-and-satoshis-vision-the-bitcoin-cash-hard-fork-explained/ 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
+
 
* 고란 기자, 〈[https://news.joins.com/article/22599382 "비트코인은 도박?...6개월 투자해 두배 먹을 생각이면 사지 마라"]〉, 《중앙일보》, 2018-05-06
+
==같이 보기==
==같이보기==
+
* [[오피리턴]]
 +
* [[스크립트]]
 +
 
 
{{블록체인 기술|검토 필요}}
 
{{블록체인 기술|검토 필요}}

2020년 8월 11일 (화) 22:14 기준 최신판

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