diff --git a/appdx-scriptops.asciidoc b/appdx-scriptops.asciidoc index ac851a2c..a7c6e1d2 100644 --- a/appdx-scriptops.asciidoc +++ b/appdx-scriptops.asciidoc @@ -1,163 +1,179 @@ -[[tx_script_ops]] -[appendix] -== Appendix: Transaction Script Language Operators, Constants and Symbols - -[[tx_script_ops_table_pushdata]] -.Push Value onto Stack -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_0 or OP_FALSE | 0x00 | An empty array is pushed on to the stack -| 1-75 | 0x01-0x4b | Push the next N bytes onto the stack, where N is 1 to 75 bytes -| OP_PUSHDATA1 | 0x4c | The next script byte contains N, push the following N bytes onto the stack -| OP_PUSHDATA2 | 0x4d | The next two script bytes contain N, push the following N bytes onto the stack -| OP_PUSHDATA4 | 0x4e | The next four script bytes contain N, push the following N bytes onto the stack -| OP_1NEGATE | 0x4f | Push the value "-1" onto the stack -| OP_RESERVED | 0x50 | Halt - Invalid transaction unless found in an unexecuted OP_IF clause -| OP_1 or OP_TRUE| 0x51 | Push the value "1" onto the stack -| OP_2 to OP_16 | 0x52 to 0x60 | For OP_N, push the value "N" onto the stack. E.g., OP_2 pushes "2" -|======= - -[[tx_script_ops_table_control]] -.Conditional Flow Control -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_NOP | 0x61 | Do nothing -| OP_VER | 0x62 | Halt - Invalid transaction unless found in an unexecuted OP_IF clause -| OP_IF | 0x63 | Execute the statements following if top of stack is not 0 -| OP_NOTIF | 0x64 | Execute the statements following if top of stack is 0 -| OP_VERIF | 0x65 | Halt - Invalid transaction -| OP_VERNOTIF | 0x66 | Halt - Invalid transaction -| OP_ELSE | 0x67 | Execute only if the previous statements were not executed -| OP_ENDIF | 0x68 | Ends the OP_IF, OP_NOTIF, OP_ELSE block -| OP_VERIFY | 0x69 | Check the top of the stack, Halt and Invalidate transaction if not TRUE -| OP_RETURN | 0x6a | Halt and invalidate transaction -|======= - -[[tx_script_ops_table_stack]] -.Stack Operations -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_TOALTSTACK | 0x6b | Pop top item from stack and push to alternative stack -| OP_FROMALTSTACK | 0x6c | Pop top item from alternative stack and push to stack -| OP_2DROP | 0x6d | Pop top two stack items -| OP_2DUP | 0x6e | Duplicate top two stack items -| OP_3DUP | 0x6f | Duplicate top three stack items -| OP_2OVER | 0x70 | Copies the third and fourth items in the stack to the top -| OP_2ROT | 0x71 | Moves the fifth and sixth items in the stack to the top -| OP_2SWAP | 0x72 | Swap the two top pairs of items in the stack -| OP_IFDUP | 0x73 | Duplicate the top item in the stack if it is not 0 -| OP_DEPTH | 0x74 | Count the items on the stack and push the resulting count -| OP_DROP | 0x75 | Pop the top item in the stack -| OP_DUP | 0x76 | Duplicate the top item in the stack -| OP_NIP | 0x77 | Pop the second item in the stack -| OP_OVER | 0x78 | Copy the second item in the stack and push it on to the top -| OP_PICK | 0x79 | Pop value N from top, then copy the Nth item to the top of the stack -| OP_ROLL | 0x7a | Pop value N from top, then move the Nth item to the top of the stack -| OP_ROT | 0x7b | Rotate the top three items in the stack -| OP_SWAP | 0x7c | Swap the top three items in the stack -| OP_TUCK | 0x7d | Copy the top item and insert it between the top and second item. -|======= - -[[tx_script_ops_table_splice]] -.String Splice Operations -[options="header"] -|======= -| Symbol | Value (hex) | Description -| _OP_CAT_ | 0x7e | Disabled (Concatenates top two items) -| _OP_SUBSTR_ | 0x7f | Disabled (Returns substring) -| _OP_LEFT_ | 0x80 | Disabled (Returns left substring) -| _OP_RIGHT_ | 0x81 | Disabled (Returns right substring) -| OP_SIZE | 0x82 | Calculate string length of top item and push the result -|======= - -[[tx_script_ops_table_binmath]] -.Binary Arithmetic and Conditionals -[options="header"] -|======= -| Symbol | Value (hex) | Description -| _OP_INVERT_ | 0x83 | Disabled (Flip the bits of the top item) -| _OP_AND_ | 0x84 | Disabled (Boolean AND of two top items) -| _OP_OR_ | 0x85 | Disabled (Boolean OR of two top items) -| _OP_XOR_ | 0x86 | Disabled (Boolean XOR of two top items) -| OP_EQUAL | 0x87 | Push TRUE (1) if top two items are exactly equal, push FALSE (0) otherwise -| OP_EQUALVERIFY | 0x88 | Same as OP_EQUAL, but run OP_VERIFY after to halt if not TRUE -| OP_RESERVED1 | 0x89 | Halt - Invalid transaction unless found in an unexecuted OP_IF clause -| OP_RESERVED2 | 0x8a | Halt - Invalid transaction unless found in an unexecuted OP_IF clause -|======= - -[[tx_script_ops_table_numbers]] -.Numeric Operators -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_1ADD | 0x8b | Add 1 to the top item -| OP_1SUB | 0x8c | Subtract 1 from the top item -| _OP_2MUL_ | 0x8d | Disabled (Multiply top item by 2) -| _OP_2DIV_ | 0x8e | Disabled (Divide top item by 2) -| OP_NEGATE | 0x8f | Flip the sign of top item -| OP_ABS | 0x90 | Change the sign of the top item to positive -| OP_NOT | 0x91 | If top item is 0 or 1 boolean flip it, otherwise return 0 -| OP_0NOTEQUAL | 0x92 | If top item is 0 return 0, otherwise return 1 -| OP_ADD | 0x93 | Pop top two items, add them and push result -| OP_SUB | 0x94 | Pop top two items, subtract first form second, push result -| OP_MUL | 0x95 | Disabled (Multiply top two items) -| OP_DIV | 0x96 | Disabled (Divide second item by first item) -| OP_MOD | 0x97 | Disabled (Remainder divide second item by first item) -| OP_LSHIFT | 0x98 | Disabled (Shift second item left by first item number of bits) -| OP_RSHIFT | 0x99 | Disabled (Shift second item right by first item number of bits) -| OP_BOOLAND | 0x9a | Boolean AND of top two items -| OP_BOOLOR | 0x9b | Boolean OR of top two items -| OP_NUMEQUAL | 0x9c | Return TRUE if top two items are equal numbers -| OP_NUMEQUALVERIFY | 0x9d | Same as NUMEQUAL, then OP_VERIFY to halt if not TRUE -| OP_NUMNOTEQUAL | 0x9e | Return TRUE if top two items are not equal numbers -| OP_LESSTHAN | 0x9f | Return TRUE if second item is less than top item -| OP_GREATERTHAN | 0xa0 | Return TRUE if second item is greater than top item -| OP_LESSTHANOREQUAL | 0xa1 | Return TRUE if second item is less than or equal to top item -| OP_GREATERTHANOREQUAL | 0xa2 | Return TRUE if second item is great than or equal to top item -| OP_MIN | 0xa3 | Return the smaller of the two top items -| OP_MAX | 0xa4 | Return the larger of the two top items -| OP_WITHIN | 0xa5 | Return TRUE if the third item is between the second item (or equal) and first item -|======= - - -[[tx_script_ops_table_crypto]] -.Cryptographic and Hashing Operations -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_RIPEMD160 | 0xa6 | Return RIPEMD160 hash of top item -| OP_SHA1 | 0xa7 | Return SHA1 hash of top item -| OP_SHA256 | 0xa8 | Return SHA256 hash of top item -| OP_HASH160 | 0xa9 | Return RIPEMD160(SHA256(x)) hash of top item -| OP_HASH256 | 0xaa | Return SHA256(SHA256(x)) hash of top item -| OP_CODESEPARATOR | 0xab | Mark the beginning of signature-checked data -| OP_CHECKSIG | 0xac | Pop a public key and signature and validate the signature for the transaction's hashed data, return TRUE if matching -| OP_CHECKSIGVERIFY | 0xad | Same as CHECKSIG, then OP_VEIRFY to halt if not TRUE -| OP_CHECKMULTISIG | 0xae | Run CHECKSIG for each pair of signature and public key provided. All must match. Bug in implementation pops an extra value, prefix with OP_NOP as workaround -| OP_CHECKMULTISIGVERIFY | 0xaf | Same as CHECKMULTISIG, then OP_VERIFY to halt if not TRUE -|======= - -[[tx_script_ops_table_nop]] -.Non-Operators -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_NOP1-OP_NOP10 | 0xb0-0xb9 | Does nothing, ignored. -|======= - - -[[tx_script_ops_table_internal]] -.Reserved OP codes for internal use by the parser -[options="header"] -|======= -| Symbol | Value (hex) | Description -| OP_SMALLDATA | 0xf9 | Represents small data field -| OP_SMALLINTEGER | 0xfa | Represents small integer data field -| OP_PUBKEYS | 0xfb | Represents public key fields -| OP_PUBKEYHASH | 0xfd | Represents a public key hash field -| OP_PUBKEY | 0xfe | Represents a public key field -| OP_INVALIDOPCODE | 0xff | Represents any OP code not currently assigned -|======= +[[tx_script_ops]] +[appendix] +== Appendix: Transaction Script Language Operators, Constants, and Symbols + +<> shows operators for pushing values onto the stack. + +[[tx_script_ops_table_pushdata]] +.Push value onto stack +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_0 or OP_FALSE | 0x00 | An empty array is pushed on to the stack +| 1-75 | 0x01-0x4b | Push the next N bytes onto the stack, where N is 1 to 75 bytes +| OP_PUSHDATA1 | 0x4c | The next script byte contains N, push the following N bytes onto the stack +| OP_PUSHDATA2 | 0x4d | The next two script bytes contain N, push the following N bytes onto the stack +| OP_PUSHDATA4 | 0x4e | The next four script bytes contain N, push the following N bytes onto the stack +| OP_1NEGATE | 0x4f | Push the value "–1" onto the stack +| OP_RESERVED | 0x50 | Halt - Invalid transaction unless found in an unexecuted OP_IF clause +| OP_1 or OP_TRUE| 0x51 | Push the value "1" onto the stack +| OP_2 to OP_16 | 0x52 to 0x60 | For OP_N, push the value "N" onto the stack. E.g., OP_2 pushes "2" +|======= + +<> shows conditional flow control operators. + +[[tx_script_ops_table_control]] +.Conditional flow control +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_NOP | 0x61 | Do nothing +| OP_VER | 0x62 | Halt - Invalid transaction unless found in an unexecuted OP_IF clause +| OP_IF | 0x63 | Execute the statements following if top of stack is not 0 +| OP_NOTIF | 0x64 | Execute the statements following if top of stack is 0 +| OP_VERIF | 0x65 | Halt - Invalid transaction +| OP_VERNOTIF | 0x66 | Halt - Invalid transaction +| OP_ELSE | 0x67 | Execute only if the previous statements were not executed +| OP_ENDIF | 0x68 | End the OP_IF, OP_NOTIF, OP_ELSE block +| OP_VERIFY | 0x69 | Check the top of the stack, halt and invalidate transaction if not TRUE +| OP_RETURN | 0x6a | Halt and invalidate transaction +|======= + +<> shows operators used to manipulate the stack. + +[[tx_script_ops_table_stack]] +.Stack operations +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_TOALTSTACK | 0x6b | Pop top item from stack and push to alternative stack +| OP_FROMALTSTACK | 0x6c | Pop top item from alternative stack and push to stack +| OP_2DROP | 0x6d | Pop top two stack items +| OP_2DUP | 0x6e | Duplicate top two stack items +| OP_3DUP | 0x6f | Duplicate top three stack items +| OP_2OVER | 0x70 | Copy the third and fourth items in the stack to the top +| OP_2ROT | 0x71 | Move the fifth and sixth items in the stack to the top +| OP_2SWAP | 0x72 | Swap the two top pairs of items in the stack +| OP_IFDUP | 0x73 | Duplicate the top item in the stack if it is not 0 +| OP_DEPTH | 0x74 | Count the items on the stack and push the resulting count +| OP_DROP | 0x75 | Pop the top item in the stack +| OP_DUP | 0x76 | Duplicate the top item in the stack +| OP_NIP | 0x77 | Pop the second item in the stack +| OP_OVER | 0x78 | Copy the second item in the stack and push it on to the top +| OP_PICK | 0x79 | Pop value N from top, then copy the Nth item to the top of the stack +| OP_ROLL | 0x7a | Pop value N from top, then move the Nth item to the top of the stack +| OP_ROT | 0x7b | Rotate the top three items in the stack +| OP_SWAP | 0x7c | Swap the top three items in the stack +| OP_TUCK | 0x7d | Copy the top item and insert it between the top and second item. +|======= + +<> shows string operators. + +[[tx_script_ops_table_splice]] +.String splice operations +[options="header"] +|======= +| Symbol | Value (hex) | Description +| _OP_CAT_ | 0x7e | Disabled (Concatenates top two items) +| _OP_SUBSTR_ | 0x7f | Disabled (Returns substring) +| _OP_LEFT_ | 0x80 | Disabled (Returns left substring) +| _OP_RIGHT_ | 0x81 | Disabled (Returns right substring) +| OP_SIZE | 0x82 | Calculate string length of top item and push the result +|======= + +<> shows binary arithmetic and boolean logic operators. + +[[tx_script_ops_table_binmath]] +.Binary arithmetic and conditionals +[options="header"] +|======= +| Symbol | Value (hex) | Description +| _OP_INVERT_ | 0x83 | Disabled (Flip the bits of the top item) +| _OP_AND_ | 0x84 | Disabled (Boolean AND of two top items) +| _OP_OR_ | 0x85 | Disabled (Boolean OR of two top items) +| _OP_XOR_ | 0x86 | Disabled (Boolean XOR of two top items) +| OP_EQUAL | 0x87 | Push TRUE (1) if top two items are exactly equal, push FALSE (0) otherwise +| OP_EQUALVERIFY | 0x88 | Same as OP_EQUAL, but run OP_VERIFY after to halt if not TRUE +| OP_RESERVED1 | 0x89 | Halt - Invalid transaction unless found in an unexecuted OP_IF clause +| OP_RESERVED2 | 0x8a | Halt - Invalid transaction unless found in an unexecuted OP_IF clause +|======= + +<> shows numeric (arithmetic) operators. + +[[tx_script_ops_table_numbers]] +.Numeric Operators +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_1ADD | 0x8b | Add 1 to the top item +| OP_1SUB | 0x8c | Subtract 1 from the top item +| _OP_2MUL_ | 0x8d | Disabled (Multiply top item by 2) +| _OP_2DIV_ | 0x8e | Disabled (Divide top item by 2) +| OP_NEGATE | 0x8f | Flip the sign of top item +| OP_ABS | 0x90 | Change the sign of the top item to positive +| OP_NOT | 0x91 | If top item is 0 or 1 boolean flip it, otherwise return 0 +| OP_0NOTEQUAL | 0x92 | If top item is 0 return 0, otherwise return 1 +| OP_ADD | 0x93 | Pop top two items, add them and push result +| OP_SUB | 0x94 | Pop top two items, subtract first from second, push result +| OP_MUL | 0x95 | Disabled (Multiply top two items) +| OP_DIV | 0x96 | Disabled (Divide second item by first item) +| OP_MOD | 0x97 | Disabled (Remainder divide second item by first item) +| OP_LSHIFT | 0x98 | Disabled (Shift second item left by first item number of bits) +| OP_RSHIFT | 0x99 | Disabled (Shift second item right by first item number of bits) +| OP_BOOLAND | 0x9a | Boolean AND of top two items +| OP_BOOLOR | 0x9b | Boolean OR of top two items +| OP_NUMEQUAL | 0x9c | Return TRUE if top two items are equal numbers +| OP_NUMEQUALVERIFY | 0x9d | Same as NUMEQUAL, then OP_VERIFY to halt if not TRUE +| OP_NUMNOTEQUAL | 0x9e | Return TRUE if top two items are not equal numbers +| OP_LESSTHAN | 0x9f | Return TRUE if second item is less than top item +| OP_GREATERTHAN | 0xa0 | Return TRUE if second item is greater than top item +| OP_LESSTHANOREQUAL | 0xa1 | Return TRUE if second item is less than or equal to top item +| OP_GREATERTHANOREQUAL | 0xa2 | Return TRUE if second item is great than or equal to top item +| OP_MIN | 0xa3 | Return the smaller of the two top items +| OP_MAX | 0xa4 | Return the larger of the two top items +| OP_WITHIN | 0xa5 | Return TRUE if the third item is between the second item (or equal) and first item +|======= + +<> shows cryptographic function operators. + +[[tx_script_ops_table_crypto]] +.Cryptographic and hashing operations +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_RIPEMD160 | 0xa6 | Return RIPEMD160 hash of top item +| OP_SHA1 | 0xa7 | Return SHA1 hash of top item +| OP_SHA256 | 0xa8 | Return SHA256 hash of top item +| OP_HASH160 | 0xa9 | Return RIPEMD160(SHA256(x)) hash of top item +| OP_HASH256 | 0xaa | Return SHA256(SHA256(x)) hash of top item +| OP_CODESEPARATOR | 0xab | Mark the beginning of signature-checked data +| OP_CHECKSIG | 0xac | Pop a public key and signature and validate the signature for the transaction's hashed data, return TRUE if matching +| OP_CHECKSIGVERIFY | 0xad | Same as CHECKSIG, then OP_VERIFY to halt if not TRUE +| OP_CHECKMULTISIG | 0xae | Run CHECKSIG for each pair of signature and public key provided. All must match. Bug in implementation pops an extra value, prefix with OP_NOP as workaround +| OP_CHECKMULTISIGVERIFY | 0xaf | Same as CHECKMULTISIG, then OP_VERIFY to halt if not TRUE +|======= + +<> shows non-operator symbols + +[[tx_script_ops_table_nop]] +.Non-operators +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_NOP1-OP_NOP10 | 0xb0-0xb9 | Does nothing, ignored. +|======= + +<> shows operator codes reserved for use by the internal script parser. + +[[tx_script_ops_table_internal]] +.Reserved OP codes for internal use by the parser +[options="header"] +|======= +| Symbol | Value (hex) | Description +| OP_SMALLDATA | 0xf9 | Represents small data field +| OP_SMALLINTEGER | 0xfa | Represents small integer data field +| OP_PUBKEYS | 0xfb | Represents public key fields +| OP_PUBKEYHASH | 0xfd | Represents a public key hash field +| OP_PUBKEY | 0xfe | Represents a public key field +| OP_INVALIDOPCODE | 0xff | Represents any OP code not currently assigned +|=======