User talk:Smtp: Difference between revisions
Jump to navigation
Jump to search
→opcode overview: 4th |
|||
Line 91: | Line 91: | ||
| style="border:1px solid #aaaaaa; background-color:#ffff00;" | OP_PUSHDATA4 <br/> 0x4e <br/> 0 ; 1(0 - 2^32-1) | | style="border:1px solid #aaaaaa; background-color:#ffff00;" | OP_PUSHDATA4 <br/> 0x4e <br/> 0 ; 1(0 - 2^32-1) | ||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_1NEGATE <br/> 0x4f <br/> 0 ; 1(1) | | style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_1NEGATE <br/> 0x4f <br/> 0 ; 1(1) | ||
|- | |||
| style="border:1px solid #aaaaaa; background-color:#ffffff;" | OP_RESERVED <br/> 0x50 <br/> | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_1 <br/> 0x51 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_2 <br/> 0x52 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_3 <br/> 0x53 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_4 <br/> 0x54 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_5 <br/> 0x55 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_6 <br/> 0x56 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_7 <br/> 0x57 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_8 <br/> 0x58 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_9 <br/> 0x59 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_10 <br/> 0x5a <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_11 <br/> 0x5b <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_12 <br/> 0x5c <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_13 <br/> 0x5d <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_14 <br/> 0x5e <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_15 <br/> 0x5f <br/> 0 ; 1(1) | |||
|- | |||
| style="border:1px solid #aaaaaa; background-color:#ffb000;" | OP_16 <br/> 0x60 <br/> 0 ; 1(1) | |||
| style="border:1px solid #aaaaaa; background-color:#00d000;" | OP_NOP <br/> 0x61 <br/> 0 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#ffffff;" | OP_VER <br/> 0x62 <br/> | |||
| style="border:1px solid #aaaaaa; background-color:#00d000;" | OP_IF <br/> 0x63 <br/> 1 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#00d000;" | OP_NOTIF <br/> 0x64 <br/> 1 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#ffffff;" | OP_VERIF <br/> 0x65 <br/> | |||
| style="border:1px solid #aaaaaa; background-color:#ffffff;" | OP_VERNOTIF <br/> 0x66 <br/> | |||
| style="border:1px solid #aaaaaa; background-color:#00d000;" | OP_ELSE <br/> 0x67 <br/> 0 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#00d000;" | OP_ENDIF <br/> 0x68 <br/> 0 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#00ff00;" | OP_VERIFY <br/> 0x69 <br/> 2 ; 0/1 | |||
| style="border:1px solid #aaaaaa; background-color:#00ff00;" | OP_RETURN <br/> 0x6a <br/> 0 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#ff8080;" | OP_TOALTSTACK <br/> 0x6b <br/> 1 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#ff8080;" | OP_FROMALTSTACK <br/> 0x6c <br/> 0 ; 1 | |||
| style="border:1px solid #aaaaaa; background-color:#ff4040;" | OP_2DROP <br/> 0x6d <br/> 2 ; 0 | |||
| style="border:1px solid #aaaaaa; background-color:#ff4040;" | OP_2DUP <br/> 0x6e <br/> 2 ; 4 | |||
| style="border:1px solid #aaaaaa; background-color:#ff4040;" | OP_3DUP <br/> 0x6f <br/> 3 ; 6 | |||
|} | |} | ||
Revision as of 12:12, 2 January 2013
opcodes
opcode overview
For each opcode is given its nemonic, its hexadecimal bytevalue, the number of stack items poped (needed) during execution, the number of stack items pushed (after execution). Different colors indicate different semantic execution groups.
OP_FALSE 0x00 0 ; 1(0) |
- 0x01 0 ; 1(1) |
- 0x02 0 ; 1(2) |
- 0x03 0 ; 1(3) |
- 0x04 0 ; 1(4) |
- 0x04 0 ; 1(5) |
- 0x06 0 ; 1(6) |
- 0x07 0 ; 1(7) |
- 0x08 0 ; 1(8) |
- 0x09 0 ; 1(9) |
- 0x0a 0 ; 1(10) |
- 0x0b 0 ; 1(11) |
- 0x0c 0 ; 1(12) |
- 0x0d 0 ; 1(13) |
- 0x0e 0 ; 1(14) |
- 0x0f 0 ; 1(15) |
- 0x10 0 ; 1(16) |
- 0x11 0 ; 1(17) |
- 0x12 0 ; 1(18) |
- 0x13 0 ; 1(19) |
- 0x14 0 ; 1(20) |
- 0x15 0 ; 1(21) |
- 0x16 0 ; 1(22) |
- 0x17 0 ; 1(23) |
- 0x18 0 ; 1(24) |
- 0x19 0 ; 1(25) |
- 0x1a 0 ; 1(26) |
- 0x1b 0 ; 1(27) |
- 0x1c 0 ; 1(28) |
- 0x1d 0 ; 1(29) |
- 0x1e 0 ; 1(30) |
- 0x1f 0 ; 1(31) |
- 0x20 0 ; 1(32) |
- 0x21 0 ; 1(33) |
- 0x22 0 ; 1(34) |
- 0x23 0 ; 1(35) |
- 0x24 0 ; 1(36) |
- 0x25 0 ; 1(37) |
- 0x26 0 ; 1(38) |
- 0x27 0 ; 1(39) |
- 0x28 0 ; 1(40) |
- 0x29 0 ; 1(41) |
- 0x2a 0 ; 1(42) |
- 0x2b 0 ; 1(43) |
- 0x2c 0 ; 1(44) |
- 0x2d 0 ; 1(45) |
- 0x2e 0 ; 1(46) |
- 0x2f 0 ; 1(47) |
- 0x30 0 ; 1(48) |
- 0x31 0 ; 1(49) |
- 0x32 0 ; 1(50) |
- 0x33 0 ; 1(51) |
- 0x34 0 ; 1(52) |
- 0x35 0 ; 1(53) |
- 0x36 0 ; 1(54) |
- 0x37 0 ; 1(55) |
- 0x38 0 ; 1(56) |
- 0x39 0 ; 1(57) |
- 0x3a 0 ; 1(58) |
- 0x3b 0 ; 1(59) |
- 0x3c 0 ; 1(60) |
- 0x3d 0 ; 1(61) |
- 0x3e 0 ; 1(62) |
- 0x3f 0 ; 1(63) |
- 0x40 0 ; 1(64) |
- 0x41 0 ; 1(65) |
- 0x42 0 ; 1(66) |
- 0x43 0 ; 1(67) |
- 0x44 0 ; 1(68) |
- 0x45 0 ; 1(69) |
- 0x46 0 ; 1(70) |
- 0x47 0 ; 1(71) |
- 0x48 0 ; 1(72) |
- 0x49 0 ; 1(73) |
- 0x4a 0 ; 1(74) |
- 0x4b 0 ; 1(75) |
OP_PUSHDATA1 0x4c 0 ; 1(0 - 255) |
OP_PUSHDATA2 0x4d 0 ; 1(0 - 2^16-1) |
OP_PUSHDATA4 0x4e 0 ; 1(0 - 2^32-1) |
OP_1NEGATE 0x4f 0 ; 1(1) |
OP_RESERVED 0x50 |
OP_1 0x51 0 ; 1(1) |
OP_2 0x52 0 ; 1(1) |
OP_3 0x53 0 ; 1(1) |
OP_4 0x54 0 ; 1(1) |
OP_5 0x55 0 ; 1(1) |
OP_6 0x56 0 ; 1(1) |
OP_7 0x57 0 ; 1(1) |
OP_8 0x58 0 ; 1(1) |
OP_9 0x59 0 ; 1(1) |
OP_10 0x5a 0 ; 1(1) |
OP_11 0x5b 0 ; 1(1) |
OP_12 0x5c 0 ; 1(1) |
OP_13 0x5d 0 ; 1(1) |
OP_14 0x5e 0 ; 1(1) |
OP_15 0x5f 0 ; 1(1) |
OP_16 0x60 0 ; 1(1) |
OP_NOP 0x61 0 ; 0 |
OP_VER 0x62 |
OP_IF 0x63 1 ; 0 |
OP_NOTIF 0x64 1 ; 0 |
OP_VERIF 0x65 |
OP_VERNOTIF 0x66 |
OP_ELSE 0x67 0 ; 0 |
OP_ENDIF 0x68 0 ; 0 |
OP_VERIFY 0x69 2 ; 0/1 |
OP_RETURN 0x6a 0 ; 0 |
OP_TOALTSTACK 0x6b 1 ; 0 |
OP_FROMALTSTACK 0x6c 0 ; 1 |
OP_2DROP 0x6d 2 ; 0 |
OP_2DUP 0x6e 2 ; 4 |
OP_3DUP 0x6f 3 ; 6 |
Constants
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_FALSE | 0 | 0x00 | Nothing. | (empty value) | An empty array of bytes is pushed onto the stack. (This is not a no-op: an item is added to the stack.) |
N/A | 1-75 | 0x01-0x4b | (special) | data | The next opcode bytes is data to be pushed onto the stack |
OP_PUSHDATA1 | 76 | 0x4c | (special) | data | The next byte contains the number of bytes to be pushed onto the stack. |
OP_PUSHDATA2 | 77 | 0x4d | (special) | data | The next two bytes contain the number of bytes to be pushed onto the stack. |
OP_PUSHDATA4 | 78 | 0x4e | (special) | data | The next four bytes contain the number of bytes to be pushed onto the stack. |
OP_1NEGATE | 79 | 0x4f | Nothing. | -1 | The number -1 is pushed onto the stack. |
OP_1, OP_TRUE | 81 | 0x51 | Nothing. | 1 | The number 1 is pushed onto the stack. |
OP_2-OP_16 | 82-96 | 0x52-0x60 | Nothing. | 2-16 | The number in the word name (2-16) is pushed onto the stack. |
Flow control
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_NOP | 97 | 0x61 | Nothing | Nothing | Does nothing. |
OP_IF | 99 | 0x63 | <expression> if [statements] [else [statements]]* endif | If the top stack value is not 0, the statements are executed. The top stack value is removed. | |
OP_NOTIF | 100 | 0x64 | <expression> if [statements] [else [statements]]* endif | If the top stack value is 0, the statements are executed. The top stack value is removed. | |
OP_ELSE | 103 | 0x67 | <expression> if [statements] [else [statements]]* endif | If the preceding OP_IF or OP_NOTIF or OP_ELSE was not executed then these statements are and if the preceding OP_IF or OP_NOTIF or OP_ELSE was executed then these statements are not. | |
OP_ENDIF | 104 | 0x68 | <expression> if [statements] [else [statements]]* endif | Ends an if/else block. | |
OP_VERIFY | 105 | 0x69 | True / false | Nothing / False | Marks transaction as invalid if top stack value is not true. True is removed, but false is not. |
OP_RETURN | 106 | 0x6a | Nothing | Nothing | Marks transaction as invalid. |
Stack
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_TOALTSTACK | 107 | 0x6b | x1 | (alt)x1 | Puts the input onto the top of the alt stack. Removes it from the main stack. |
OP_FROMALTSTACK | 108 | 0x6c | (alt)x1 | x1 | Puts the input onto the top of the main stack. Removes it from the alt stack. |
OP_IFDUP | 115 | 0x73 | x | x / x x | If the top stack value is not 0, duplicate it. |
OP_DEPTH | 116 | 0x74 | Nothing | <Stack size> | Puts the number of stack items onto the stack. |
OP_DROP | 117 | 0x75 | x | Nothing | Removes the top stack item. |
OP_DUP | 118 | 0x76 | x | x x | Duplicates the top stack item. |
OP_NIP | 119 | 0x77 | x1 x2 | x2 | Removes the second-to-top stack item. |
OP_OVER | 120 | 0x78 | x1 x2 | x1 x2 x1 | Copies the second-to-top stack item to the top. |
OP_PICK | 121 | 0x79 | xn ... x2 x1 x0 <n> | xn ... x2 x1 x0 xn | The item n back in the stack is copied to the top. |
OP_ROLL | 122 | 0x7a | xn ... x2 x1 x0 <n> | ... x2 x1 x0 xn | The item n back in the stack is moved to the top. |
OP_ROT | 123 | 0x7b | x1 x2 x3 | x2 x3 x1 | The top three items on the stack are rotated to the left. |
OP_SWAP | 124 | 0x7c | x1 x2 | x2 x1 | The top two items on the stack are swapped. |
OP_TUCK | 125 | 0x7d | x1 x2 | x2 x1 x2 | The item at the top of the stack is copied and inserted before the second-to-top item. |
OP_2DROP | 109 | 0x6d | x1 x2 | Nothing | Removes the top two stack items. |
OP_2DUP | 110 | 0x6e | x1 x2 | x1 x2 x1 x2 | Duplicates the top two stack items. |
OP_3DUP | 111 | 0x6f | x1 x2 x3 | x1 x2 x3 x1 x2 x3 | Duplicates the top three stack items. |
OP_2OVER | 112 | 0x70 | x1 x2 x3 x4 | x1 x2 x3 x4 x1 x2 | Copies the pair of items two spaces back in the stack to the front. |
OP_2ROT | 113 | 0x71 | x1 x2 x3 x4 x5 x6 | x3 x4 x5 x6 x1 x2 | The fifth and sixth items back are moved to the top of the stack. |
OP_2SWAP | 114 | 0x72 | x1 x2 x3 x4 | x3 x4 x1 x2 | Swaps the top two pairs of items. |
Splice
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_CAT | 126 | 0x7e | x1 x2 | out | Concatenates two strings. Currently disabled. |
OP_SUBSTR | 127 | 0x7f | in begin size | out | Returns a section of a string. Currently disabled. |
OP_LEFT | 128 | 0x80 | in size | out | Keeps only characters left of the specified point in a string. Currently disabled. |
OP_RIGHT | 129 | 0x81 | in size | out | Keeps only characters right of the specified point in a string. Currently disabled. |
OP_SIZE | 130 | 0x82 | in | in size | Returns the length of the input string. |
Bitwise logic
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_INVERT | 131 | 0x83 | in | out | Flips all of the bits in the input. Currently disabled. |
OP_AND | 132 | 0x84 | x1 x2 | out | Boolean and between each bit in the inputs. Currently disabled. |
OP_OR | 133 | 0x85 | x1 x2 | out | Boolean or between each bit in the inputs. Currently disabled. |
OP_XOR | 134 | 0x86 | x1 x2 | out | Boolean exclusive or between each bit in the inputs. Currently disabled. |
OP_EQUAL | 135 | 0x87 | x1 x2 | True / false | Returns 1 if the inputs are exactly equal, 0 otherwise. |
OP_EQUALVERIFY | 136 | 0x88 | x1 x2 | True / false | Same as OP_EQUAL, but runs OP_VERIFY afterward. |
Arithmetic
Arithmetic is limited to max 4 byte integers
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_1ADD | 139 | 0x8b | in | out | 1 is added to the input. |
OP_1SUB | 140 | 0x8c | in | out | 1 is subtracted from the input. |
OP_2MUL | 141 | 0x8d | in | out | The input is multiplied by 2. Currently disabled. |
OP_2DIV | 142 | 0x8e | in | out | The input is divided by 2. Currently disabled. |
OP_NEGATE | 143 | 0x8f | in | out | The sign of the input is flipped. |
OP_ABS | 144 | 0x90 | in | out | The input is made positive. |
OP_NOT | 145 | 0x91 | in | out | If the input is 0 or 1, it is flipped. Otherwise the output will be 0. |
OP_0NOTEQUAL | 146 | 0x92 | in | out | Returns 0 if the input is 0. 1 otherwise. |
OP_ADD | 147 | 0x93 | a b | out | a is added to b. |
OP_SUB | 148 | 0x94 | a b | out | b is subtracted from a. |
OP_MUL | 149 | 0x95 | a b | out | a is multiplied by b. Currently disabled. |
OP_DIV | 150 | 0x96 | a b | out | a is divided by b. Currently disabled. |
OP_MOD | 151 | 0x97 | a b | out | Returns the remainder after dividing a by b. Currently disabled. |
OP_LSHIFT | 152 | 0x98 | a b | out | Shifts a left b bits, preserving sign. Currently disabled. |
OP_RSHIFT | 153 | 0x99 | a b | out | Shifts a right b bits, preserving sign. Currently disabled. |
OP_BOOLAND | 154 | 0x9a | a b | out | If both a and b are not 0, the output is 1. Otherwise 0. |
OP_BOOLOR | 155 | 0x9b | a b | out | If a or b is not 0, the output is 1. Otherwise 0. |
OP_NUMEQUAL | 156 | 0x9c | a b | out | Returns 1 if the numbers are equal, 0 otherwise. |
OP_NUMEQUALVERIFY | 157 | 0x9d | a b | out | Same as OP_NUMEQUAL, but runs OP_VERIFY afterward. |
OP_NUMNOTEQUAL | 158 | 0x9e | a b | out | Returns 1 if the numbers are not equal, 0 otherwise. |
OP_LESSTHAN | 159 | 0x9f | a b | out | Returns 1 if a is less than b, 0 otherwise. |
OP_GREATERTHAN | 160 | 0xa0 | a b | out | Returns 1 if a is greater than b, 0 otherwise. |
OP_LESSTHANOREQUAL | 161 | 0xa1 | a b | out | Returns 1 if a is less than or equal to b, 0 otherwise. |
OP_GREATERTHANOREQUAL | 162 | 0xa2 | a b | out | Returns 1 if a is greater than or equal to b, 0 otherwise. |
OP_MIN | 163 | 0xa3 | a b | out | Returns the smaller of a and b. |
OP_MAX | 164 | 0xa4 | a b | out | Returns the larger of a and b. |
OP_WITHIN | 165 | 0xa5 | x min max | out | Returns 1 if x is within the specified range (left-inclusive), 0 otherwise. |
Crypto
Nemonic | Decimal | Hex | Input | Output | Description |
---|---|---|---|---|---|
OP_RIPEMD160 | 166 | 0xa6 | in | hash | The input is hashed using RIPEMD-160. |
OP_SHA1 | 167 | 0xa7 | in | hash | The input is hashed using SHA-1. |
OP_SHA256 | 168 | 0xa8 | in | hash | The input is hashed using SHA-256. |
OP_HASH160 | 169 | 0xa9 | in | hash | The input is hashed twice: first with SHA-256 and then with RIPEMD-160. |
OP_HASH256 | 170 | 0xaa | in | hash | The input is hashed two times with SHA-256. |
OP_CODESEPARATOR | 171 | 0xab | Nothing | Nothing | All of the signature checking words will only match signatures to the data after the most recently-executed OP_CODESEPARATOR. |
OP_CHECKSIG | 172 | 0xac | sig pubkey | True / false | The entire transaction's outputs, inputs, and script (from the most recently-executed OP_CODESEPARATOR to the end) are hashed. The signature used by OP_CHECKSIG must be a valid signature for this hash and public key. If it is, 1 is returned, 0 otherwise. |
OP_CHECKSIGVERIFY | 173 | 0xad | sig pubkey | True / false | Same as OP_CHECKSIG, but OP_VERIFY is executed afterward. |
OP_CHECKMULTISIG | 174 | 0xae | x sig1 sig2 ... <number of signatures> pub1 pub2 <number of public keys> | True / False | For each signature and public key pair, OP_CHECKSIG is executed. If more public keys than signatures are listed, some key/sig pairs can fail. All signatures need to match a public key. If all signatures are valid, 1 is returned, 0 otherwise. Due to a bug, one extra unused value is removed from the stack. |
OP_CHECKMULTISIGVERIFY | 175 | 0xaf | x sig1 sig2 ... <number of signatures> pub1 pub2 ... <number of public keys> | True / False | Same as OP_CHECKMULTISIG, but OP_VERIFY is executed afterward. |
Pseudo-words
These words are used internally for assisting with transaction matching. They are invalid if used in actual scripts.
Nemonic | Decimal | Hex | Description |
---|---|---|---|
OP_PUBKEYHASH | 253 | 0xfd | Represents a public key hashed with OP_HASH160. |
OP_PUBKEY | 254 | 0xfe | Represents a public key compatible with OP_CHECKSIG. |
OP_INVALIDOPCODE | 255 | 0xff | Matches any opcode that is not yet assigned. |
Reserved words
Any opcode not assigned is also reserved. Using an unassigned opcode makes the transaction invalid.
Nemonic | Decimal | Hex | When used... |
---|---|---|---|
OP_RESERVED | 80 | 0x50 | Transaction is invalid unless occuring in an unexecuted OP_IF branch |
OP_VER | 98 | 0x62 | Transaction is invalid unless occuring in an unexecuted OP_IF branch |
OP_VERIF | 101 | 0x65 | Transaction is invalid even when occuring in an unexecuted OP_IF branch |
OP_VERNOTIF | 102 | 0x66 | Transaction is invalid even when occuring in an unexecuted OP_IF branch |
OP_RESERVED1 | 137 | 0x89 | Transaction is invalid unless occuring in an unexecuted OP_IF branch |
OP_RESERVED2 | 138 | 0x8a | Transaction is invalid unless occuring in an unexecuted OP_IF branch |
OP_NOP1-OP_NOP10 | 176-185 | 0xb0-0xb9 | The word is ignored. |