mirror of
https://github.com/bitcoinbook/bitcoinbook
synced 2024-12-24 15:38:08 +00:00
Merge branch 'develop'
This commit is contained in:
commit
47052c6322
163
appdx-scriptops.asciidoc
Normal file
163
appdx-scriptops.asciidoc
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
|
||||||
|
[[tx_script_ops]]
|
||||||
|
== 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
|
||||||
|
|=======
|
@ -154,7 +154,7 @@ Alice was introduced to bitcoin by a friend and so she has an easy way of gettin
|
|||||||
|
|
||||||
==== Sending and receiving bitcoins
|
==== Sending and receiving bitcoins
|
||||||
|
|
||||||
Alice has created her bitcoin web-wallet and she is now ready to receive funds. Her web-wallet application randomly generated a bitcoin address together with its corresponding key (an elliptic curve private key, described in more detail in <<private keys>>). At this point, her bitcoin address is not known to the bitcoin network or "registered" with any part of the bitcoin system. Her bitcoin address is simply a number that corresponds to a key that she can use to control access to the funds. There is no account or association between that address and an account. Until the moment this address is referenced as the recipient of value in a transaction posted on the bitcoin ledger (the blockchain), it is simply part of the vast number of possible addresses that are "valid" in bitcoin. Once it has been associated with a transaction, it becomes part of the known addresses in the network and anyone can check its balance on the public ledger.
|
Alice has created her bitcoin web-wallet and she is now ready to receive funds. Her web-wallet application randomly generated a bitcoin address together with its corresponding key (an elliptic curve private key, described in more detail in <<private keys>>). At this point, her bitcoin address is not known to the bitcoin network or "registered" with any part of the bitcoin system. Her bitcoin address is simply a number that corresponds to a key that she can use to control access to the funds. There is no account or association between that address and an account. Until the moment this address is referenced as the recipient of value in a transaction posted on the bitcoin ledger (the blockchain), it is simply part of the vast number of possible addresses that are "valid" in bitcoin. Once it has been associated with a transaction, it becomes part of the known addresses in the network and Alice can check its balance on the public ledger.
|
||||||
|
|
||||||
Alice meets her friend Joe who introduced her to bitcoin at a local restaurant so they can exchange some US dollars and put some bitcoins into her account. She has brought a print out of her address and the QR code as shown on the home page of her web-wallet. There is nothing sensitive from a security perspective about the bitcoin address. It can be posted anywhere without risking the security of her account and it can be changed by creating a new address at any time. Alice wants to convert just $10 US dollars into bitcoin, so as not to risk too much money on this new technology. She gives Joe a $10 bill and the printout of her address so that Joe can send her the equivalent amount of bitcoin.
|
Alice meets her friend Joe who introduced her to bitcoin at a local restaurant so they can exchange some US dollars and put some bitcoins into her account. She has brought a print out of her address and the QR code as shown on the home page of her web-wallet. There is nothing sensitive from a security perspective about the bitcoin address. It can be posted anywhere without risking the security of her account and it can be changed by creating a new address at any time. Alice wants to convert just $10 US dollars into bitcoin, so as not to risk too much money on this new technology. She gives Joe a $10 bill and the printout of her address so that Joe can send her the equivalent amount of bitcoin.
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ Transactions are like lines in a double-entry bookkeeping ledger. In simple term
|
|||||||
.Transaction as Double-Entry Bookkeeping
|
.Transaction as Double-Entry Bookkeeping
|
||||||
image::images/Transaction_Double_Entry.png["Transaction Double-Entry"]
|
image::images/Transaction_Double_Entry.png["Transaction Double-Entry"]
|
||||||
|
|
||||||
The transaction also contains proof of ownership for each amount of bitcoin (inputs) whose value is transferred, in the form of a digital signature from the owner, which can be independently validated by anyone. In bitcoin terms, "spending" is signing the value of a previous transaction for which you have the keys over to a new owner identified by a bitcoin address.
|
The transaction also contains proof of ownership for each amount of bitcoin (inputs) whose value is transferred, in the form of a digital signature from the owner, which can be independently validated by anyone. In bitcoin terms, "spending" is signing a transaction which transfers value from a previous transaction over to a new owner identified by a bitcoin address.
|
||||||
|
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
@ -93,7 +93,7 @@ _Transactions_ move value *from* _transaction inputs_ *to* _transaction outputs_
|
|||||||
|
|
||||||
|
|
||||||
[[blockchain-mnemonic]]
|
[[blockchain-mnemonic]]
|
||||||
.Transaction Chain
|
.A chain of transactions, where the output of one transaction is the input of the next transaction
|
||||||
image::images/Transaction_Chain.png["Transaction chain"]
|
image::images/Transaction_Chain.png["Transaction chain"]
|
||||||
|
|
||||||
Alice's payment to Bob's Cafe utilizes a previous transaction as its input. In the previous chapter Alice received bitcoin from her friend Joe in return for cash. That transaction has a number of bitcoins locked (encumbered) against Alice's key. Her new transaction to Bob's Cafe references the previous transaction as an input and creates new outputs to pay for the cup of coffee and receive change. The transactions form a chain, where the inputs from the latest transaction correspond to outputs from previous transactions. Alice's key provides the signature which unlocks those previous transaction outputs, thereby proving to the bitcoin network that she owns the funds. She attaches the payment for coffee to Bob's address, thereby "encumbering" that output with the requirement that Bob produces a signature in order to spend that amount. This represents a transfer of value between Alice and Bob.
|
Alice's payment to Bob's Cafe utilizes a previous transaction as its input. In the previous chapter Alice received bitcoin from her friend Joe in return for cash. That transaction has a number of bitcoins locked (encumbered) against Alice's key. Her new transaction to Bob's Cafe references the previous transaction as an input and creates new outputs to pay for the cup of coffee and receive change. The transactions form a chain, where the inputs from the latest transaction correspond to outputs from previous transactions. Alice's key provides the signature which unlocks those previous transaction outputs, thereby proving to the bitcoin network that she owns the funds. She attaches the payment for coffee to Bob's address, thereby "encumbering" that output with the requirement that Bob produces a signature in order to spend that amount. This represents a transfer of value between Alice and Bob.
|
||||||
@ -124,11 +124,11 @@ Alice's wallet application contains all the logic for selecting appropriate inpu
|
|||||||
|
|
||||||
==== Getting the right inputs
|
==== Getting the right inputs
|
||||||
|
|
||||||
Alice's wallet application will first have to find inputs that can pay for the amount she wants to send to Bob. Most wallet applications keep a small database of "unspent transaction outputs" that are locked (encumbered) with the wallet's own keys. Therefore, Alice's wallet would contain a copy of the transaction output from Joe's transaction which was created in exchange for cash (see <<getting bitcoin>>). A bitcoin wallet application that runs as a full-index client actually contains a copy of *every unspent output* from every transaction in the blockchain. This allows a wallet to construct transaction inputs as well as to quickly verify incoming transactions as having correct inputs.
|
Alice's wallet application will first have to find inputs that can pay for the amount she wants to send to Bob. Most wallet applications keep a small database of "unspent transaction outputs" that are locked (encumbered) with the wallet's own keys. Therefore, Alice's wallet would contain a copy of the transaction output from Joe's transaction which was created in exchange for cash (see <<getting bitcoin>>). A bitcoin wallet application that runs as a full-index client actually contains a copy of every unspent output from every transaction in the blockchain. This allows a wallet to construct transaction inputs as well as to quickly verify incoming transactions as having correct inputs. However, since a full-index client takes up a lot of disk space, most user wallets run "lightweight" clients that track only the user's own unspent outputs.
|
||||||
|
|
||||||
If the wallet application does not maintain a copy of unspent transaction outputs, it can query the bitcoin network to retrieve this information, using a variety of APIs available by different providers, or by asking a full-index node using the bitcoin JSON RPC API. Below we see an example of a RESTful API request, constructed as an HTTP GET command to a specific URL. This URL will return all the unspent transaction outputs for an address, giving any application the information it needs to construct transaction inputs for spending. We use the simple command-line HTTP client _cURL_ to retrieve the response:
|
If the wallet application does not maintain a copy of unspent transaction outputs, it can query the bitcoin network to retrieve this information, using a variety of APIs available by different providers, or by asking a full-index node using the bitcoin JSON RPC API. Below we see an example of a RESTful API request, constructed as an HTTP GET command to a specific URL. This URL will return all the unspent transaction outputs for an address, giving any application the information it needs to construct transaction inputs for spending. We use the simple command-line HTTP client _cURL_ to retrieve the response:
|
||||||
|
|
||||||
.Look up all the unspent outputs for Alice's address 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
|
.Look up all the unspent outputs for Alice's bitcoin address
|
||||||
----
|
----
|
||||||
$ curl https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
|
$ curl https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ The response above shows that the bitcoin network knows of one unspent output (o
|
|||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
Look up the transaction from Joe to Alice to see the information referenced above as it is stored in the bitcoin blockchain. Using the blockchain explorer web application, follow the URL below:
|
Use the following link to look up the transaction from Joe to Alice:
|
||||||
|
|
||||||
https://blockchain.info/tx/7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18
|
https://blockchain.info/tx/7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18
|
||||||
====
|
====
|
||||||
@ -176,13 +176,13 @@ The resulting transaction can be seen using a blockchain explorer web applicatio
|
|||||||
.Alice's transaction to Bob's Cafe
|
.Alice's transaction to Bob's Cafe
|
||||||
image::images/AliceCoffeeTransaction.png["Alice Coffee Transaction"]
|
image::images/AliceCoffeeTransaction.png["Alice Coffee Transaction"]
|
||||||
|
|
||||||
Use the following link to see the transaction on the bitcoin blockchain:
|
|
||||||
|
|
||||||
[[transaction-alice-url]]
|
[[transaction-alice-url]]
|
||||||
.Link to Alice's transaction on the bitcoin blockchain
|
[TIP]
|
||||||
----
|
====
|
||||||
|
Use the following link to look up the transaction from Alice to Bob's Cafe:
|
||||||
|
|
||||||
https://blockchain.info/tx/0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2
|
https://blockchain.info/tx/0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2
|
||||||
----
|
====
|
||||||
|
|
||||||
==== Adding the transaction to the ledger
|
==== Adding the transaction to the ledger
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ The bitcoin system of trust is based on computation. Transactions are bundled in
|
|||||||
* Mining creates new bitcoins in each block, almost like a central bank printing new money. The amount of bitcoin created per block is fixed and diminishes with time.
|
* Mining creates new bitcoins in each block, almost like a central bank printing new money. The amount of bitcoin created per block is fixed and diminishes with time.
|
||||||
* Mining creates trust by ensuring that transactions are only confirmed if enough computational power was devoted to the block that contains them. More blocks mean more computation which means more trust.
|
* Mining creates trust by ensuring that transactions are only confirmed if enough computational power was devoted to the block that contains them. More blocks mean more computation which means more trust.
|
||||||
|
|
||||||
A good way to describe mining is like a giant competitive game of sudoku that resets every time someone finds a solution and whose difficulty automatically adjusts so that it takes approximately 10 minutes to find a solution. Imagine a giant sudoku puzzle, several thousand rows and columns in size. If I show you a completed puzzle you can verify it quite quickly. If it is empty, however, it takes a lot of work to solve! The difficulty of the sudoku can be adjusted by changing its size (more or fewer rows and columns), but it can still be verified quite easily even if it is very large. The "puzzle" used in bitcoin is based on a cryptographic hash and exhibits similar characteristics: it is asymmetrically hard to solve but easy to verify, and its difficulty can be adjusted.
|
A good way to describe mining is like a giant competitive game of sudoku that resets every time someone finds a solution and whose difficulty automatically adjusts so that it takes approximately 10 minutes to find a solution. Imagine a giant sudoku puzzle, several thousand rows and columns in size. If I show you a completed puzzle you can verify it quite quickly. However, if the puzzle has a few squares filled and the rest is empty, it takes a lot of work to solve! The difficulty of the sudoku can be adjusted by changing its size (more or fewer rows and columns), but it can still be verified quite easily even if it is very large. The "puzzle" used in bitcoin is based on a cryptographic hash and exhibits similar characteristics: it is asymmetrically hard to solve but easy to verify, and its difficulty can be adjusted.
|
||||||
|
|
||||||
In <<user-stories>> we introduced Jing, a computer engineering student in Shanghai. Jing is participating in the bitcoin network as a miner. Every 10 minutes or so, Jing joins thousands of other miners in a global race to find a solution to a block of transactions. Finding such a solution, the so-called "Proof-of-Work", requires quadrillions of hashing operations per second across the entire bitcoin network. The algorithm for "Proof-of-Work" involves repeatedly hashing the header of the block and a random number with the SHA256 cryptographic algorithm until a solution matching a pre-determined pattern emerges. The first miner to find such a solution wins the round of competition and publishes that block into the blockchain.
|
In <<user-stories>> we introduced Jing, a computer engineering student in Shanghai. Jing is participating in the bitcoin network as a miner. Every 10 minutes or so, Jing joins thousands of other miners in a global race to find a solution to a block of transactions. Finding such a solution, the so-called "Proof-of-Work", requires quadrillions of hashing operations per second across the entire bitcoin network. The algorithm for "Proof-of-Work" involves repeatedly hashing the header of the block and a random number with the SHA256 cryptographic algorithm until a solution matching a pre-determined pattern emerges. The first miner to find such a solution wins the round of competition and publishes that block into the blockchain.
|
||||||
|
|
||||||
|
131
ch04.asciidoc
131
ch04.asciidoc
@ -11,55 +11,6 @@ In the payment portion of a bitcoin transaction, the recipient's public key is r
|
|||||||
|
|
||||||
In this chapter we will introduce wallets, which contain cryptographic keys. We will look at how keys are generated, stored and managed. We will review the various encoding formats used to represent private and public keys, addresses and script addresses. Finally we will look at special uses of keys: to sign messages, to prove ownership and to create vanity addresses and paper wallets.
|
In this chapter we will introduce wallets, which contain cryptographic keys. We will look at how keys are generated, stored and managed. We will review the various encoding formats used to represent private and public keys, addresses and script addresses. Finally we will look at special uses of keys: to sign messages, to prove ownership and to create vanity addresses and paper wallets.
|
||||||
|
|
||||||
|
|
||||||
=== ECDSA Arithmetic
|
|
||||||
|
|
||||||
Just as RSA uses integer arithmetic operators over a prime modulus to provide cryptographic functions, ECDSA defines an arithmetic that has some features in common with traditional arithmetic.
|
|
||||||
|
|
||||||
Wikipedia has a good article that explains the details of how arithmetic operations work on an elliptic curve. See http://en.wikipedia.org/wiki/Elliptic_curve_cryptography for more information.
|
|
||||||
|
|
||||||
Glossing over details, here are the fundamental facts:
|
|
||||||
|
|
||||||
An elliptic curve field is a set of points (x, y) each of which satisfies the equation
|
|
||||||
|
|
||||||
y^2^ = x^3^ + ax + b (mod P)
|
|
||||||
|
|
||||||
for some constants a, b and P (where P is prime). Bitcoin uses a curve known as secp256k1, where a=0, b=7, and P = 2^256^ - 2^32^ - 2^9^ - 2^8^ - 2^7^ - 2^6^ - 2^4^ - 1.
|
|
||||||
|
|
||||||
So for example, (55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424) is a point on the secp256k1 curve. You can check this yourself using Python.
|
|
||||||
|
|
||||||
----
|
|
||||||
Python 3.4.0 (default, Mar 30 2014, 19:23:13)
|
|
||||||
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin
|
|
||||||
Type "help", "copyright", "credits" or "license" for more information.
|
|
||||||
>>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
|
|
||||||
>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
|
|
||||||
>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
|
|
||||||
>>> (x ** 3 + 7 - y**2) % p
|
|
||||||
0
|
|
||||||
----
|
|
||||||
|
|
||||||
In addition, there is also a "point at infinity", which roughly corresponds to the role of 0 in addition. On computers, it's sometimes represented by x = y = 0 (which doesn't satisfy the elliptic curve equation -- but it's an easy separate case that can be checked).
|
|
||||||
|
|
||||||
There is also an operator "+", called "addition" which has some properties similar to the traditional addition of real numbers that grade school children learn. Given two points P~1~ and P~2~ on the elliptic curve, there is a third point P~3~ = P~1~ + P~2~, also on the elliptic curve.
|
|
||||||
|
|
||||||
Geometrically, this third point P~3~ is calculated by drawing a line between P~1~ and P~2~. This line will intersect the elliptic curve in exactly one additional place. Call this point P~3~' = (x, y). Then reflect in the X axis to get P~3~ = (x, -y).
|
|
||||||
|
|
||||||
There are a couple of special cases which explain the need for the "point at infinity".
|
|
||||||
|
|
||||||
If P~1~ and P~2~ are the same point, the line "between" P~1~ and P~2~ should extend to be the tangent on the curve at this point P~1~. This tangent will intersect the curve in exactly one new point. You can use techniques from calculus to determine the slope of the tangent line. These techniques curiously work even though we are restricting our interest to points on the curve with two integer coordinates!
|
|
||||||
|
|
||||||
In some cases (i.e., if P~1~ and P~2~ have the same x values but different y values), the tangent line will be exactly vertical, in which case P3 = "point at infinity".
|
|
||||||
|
|
||||||
If one of P~1~ is the "point at infinity", then the sum P~1~ + P~2~ = P~2~. Similary, if P~2~ is the point at infinity, then P~1~ + P~2~ = P~1~. This shows how the point at infinity plays the roll of 0.
|
|
||||||
|
|
||||||
It turns out that + is associative, which means that `(A+B)+C = A+(B+C)`. That means we can write A+B+C without parentheses without any ambiguity.
|
|
||||||
|
|
||||||
Now that we have defined addition, we can define multiplication in the standard way that extends addition. For a point P on the elliptic curve, if k is a whole number, then kP = P + P + P + ... + P (k times). Note that k is sometimes confusingly called an "exponent" in this case. (It would make a lot more sense to call it this if we used an operator that looked like multiplication rather than "+".)
|
|
||||||
|
|
||||||
|
|
||||||
=== Keys
|
|
||||||
|
|
||||||
==== Public key cryptography and crypto-currency
|
==== Public key cryptography and crypto-currency
|
||||||
((("public key")))
|
((("public key")))
|
||||||
Public key cryptography was invented in the 1970s and is a mathematical foundation for computer and information security.
|
Public key cryptography was invented in the 1970s and is a mathematical foundation for computer and information security.
|
||||||
@ -85,7 +36,6 @@ A bitcoin wallet contains a collection of key pairs, each consisting of a privat
|
|||||||
.Private Key, Public Key and Bitcoin Address
|
.Private Key, Public Key and Bitcoin Address
|
||||||
image::images/privk_to_pubK_to_addressA.png["privk_to_pubK_to_addressA"]
|
image::images/privk_to_pubK_to_addressA.png["privk_to_pubK_to_addressA"]
|
||||||
|
|
||||||
|
|
||||||
==== Private Keys
|
==== Private Keys
|
||||||
|
|
||||||
A +private key+ is simply a number, picked at random. Ownership and control over the private key is the root of user control over all funds associated with the corresponding bitcoin address. The private key is used to create signatures that are required to spend bitcoins by proving ownership of funds used in a transaction. The private key must remain secret at all times, as revealing it to a third party is equivalent to giving them control over the bitcoins secured by that key. The private key must also be backed up and protected from accidental loss, since if lost it cannot be recovered and the funds secured by it are forever lost too.
|
A +private key+ is simply a number, picked at random. Ownership and control over the private key is the root of user control over all funds associated with the corresponding bitcoin address. The private key is used to create signatures that are required to spend bitcoins by proving ownership of funds used in a transaction. The private key must remain secret at all times, as revealing it to a third party is equivalent to giving them control over the bitcoins secured by that key. The private key must also be backed up and protected from accidental loss, since if lost it cannot be recovered and the funds secured by it are forever lost too.
|
||||||
@ -103,7 +53,7 @@ More accurately, the private key can be any number between +1+ and +n - 1+, wher
|
|||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
Do not try and design your own pseudo random number generator (PRNG). Use a cryptographically-secure pseudo-random number generator (CSPRNG) with a seed from a source of sufficient entropy, the choice of which depends on the operating-system. Correct implementation of the CSPRNG is critical to the security of the keys. DIY is highly discouraged unless you are a professional cryptographer.
|
Do not write your own code to create a random number or use a "simple" random number generator offered by your programming language. Use a cryptographically-secure pseudo-random number generator (CSPRNG) with a seed from a source of sufficient entropy. Study the documentation of the random number generator library you choose to make sure it is cryptographically secure. Correct implementation of the CSPRNG is critical to the security of the keys.
|
||||||
====
|
====
|
||||||
|
|
||||||
Below is a randomly generated private key shown in hexadecimal format (256 binary digits shown as 64 hexadecimal digits, each 4 bits):
|
Below is a randomly generated private key shown in hexadecimal format (256 binary digits shown as 64 hexadecimal digits, each 4 bits):
|
||||||
@ -143,6 +93,7 @@ $ sx newkey
|
|||||||
|
|
||||||
The public key is calculated from the private key using elliptic curve multiplication, which is irreversible: latexmath:[\(K = k * G\)]+ where +k+ is the private key, +G+ is a constant point called the _Generator Point_ and +K+ is the resulting public key. The reverse operation, known as "finding the discrete logarithm" -- calculating +k+ if you know +K+ -- is as difficult as trying all possible values of +k+, i.e., a brute-force search. Before we demonstrate how to generate a public key from a private key, let's look at Elliptic Curve Cryptography in a bit more detail.
|
The public key is calculated from the private key using elliptic curve multiplication, which is irreversible: latexmath:[\(K = k * G\)]+ where +k+ is the private key, +G+ is a constant point called the _Generator Point_ and +K+ is the resulting public key. The reverse operation, known as "finding the discrete logarithm" -- calculating +k+ if you know +K+ -- is as difficult as trying all possible values of +k+, i.e., a brute-force search. Before we demonstrate how to generate a public key from a private key, let's look at Elliptic Curve Cryptography in a bit more detail.
|
||||||
|
|
||||||
|
|
||||||
[[elliptic_curve]]
|
[[elliptic_curve]]
|
||||||
==== Elliptic Curve Cryptography Explained
|
==== Elliptic Curve Cryptography Explained
|
||||||
((("elliptic curve cryptography", "ECC")))
|
((("elliptic curve cryptography", "ECC")))
|
||||||
@ -180,6 +131,43 @@ Because this curve is defined over a finite field of prime order instead of over
|
|||||||
.Elliptic Curve Cryptography: Visualizing an elliptic curve over F(p), with p=17
|
.Elliptic Curve Cryptography: Visualizing an elliptic curve over F(p), with p=17
|
||||||
image::images/ecc-over-F17-math.png["ecc-over-F17-math"]
|
image::images/ecc-over-F17-math.png["ecc-over-F17-math"]
|
||||||
|
|
||||||
|
So for example, below is a point P with coordinates (x,y) that is a point on the secp256k1 curve. You can check this yourself using Python:
|
||||||
|
----
|
||||||
|
P = (55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)
|
||||||
|
----
|
||||||
|
|
||||||
|
====
|
||||||
|
[source, pycon]
|
||||||
|
----
|
||||||
|
Python 3.4.0 (default, Mar 30 2014, 19:23:13)
|
||||||
|
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin
|
||||||
|
Type "help", "copyright", "credits" or "license" for more information.
|
||||||
|
>>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
|
||||||
|
>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
|
||||||
|
>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
|
||||||
|
>>> (x ** 3 + 7 - y**2) % p
|
||||||
|
0
|
||||||
|
----
|
||||||
|
====
|
||||||
|
|
||||||
|
In elliptic curve math, there is a point called the "point at infinity", which roughly corresponds to the role of 0 in addition. On computers, it's sometimes represented by x = y = 0 (which doesn't satisfy the elliptic curve equation -- but it's an easy separate case that can be checked).
|
||||||
|
|
||||||
|
There is also an operator "+", called "addition" which has some properties similar to the traditional addition of real numbers that grade school children learn. Given two points P~1~ and P~2~ on the elliptic curve, there is a third point P~3~ = P~1~ + P~2~, also on the elliptic curve.
|
||||||
|
|
||||||
|
Geometrically, this third point P~3~ is calculated by drawing a line between P~1~ and P~2~. This line will intersect the elliptic curve in exactly one additional place. Call this point P~3~' = (x, y). Then reflect in the X axis to get P~3~ = (x, -y).
|
||||||
|
|
||||||
|
There are a couple of special cases which explain the need for the "point at infinity".
|
||||||
|
|
||||||
|
If P~1~ and P~2~ are the same point, the line "between" P~1~ and P~2~ should extend to be the tangent on the curve at this point P~1~. This tangent will intersect the curve in exactly one new point. You can use techniques from calculus to determine the slope of the tangent line. These techniques curiously work even though we are restricting our interest to points on the curve with two integer coordinates!
|
||||||
|
|
||||||
|
In some cases (i.e., if P~1~ and P~2~ have the same x values but different y values), the tangent line will be exactly vertical, in which case P3 = "point at infinity".
|
||||||
|
|
||||||
|
If P~1~ is the "point at infinity", then the sum P~1~ + P~2~ = P~2~. Similary, if P~2~ is the point at infinity, then P~1~ + P~2~ = P~1~. This shows how the point at infinity plays the roll of 0.
|
||||||
|
|
||||||
|
It turns out that + is associative, which means that `(A+B)+C = A+(B+C)`. That means we can write A+B+C without parentheses without any ambiguity.
|
||||||
|
|
||||||
|
Now that we have defined addition, we can define multiplication in the standard way that extends addition. For a point P on the elliptic curve, if k is a whole number, then kP = P + P + P + ... + P (k times). Note that k is sometimes confusingly called an "exponent" in this case.
|
||||||
|
|
||||||
[[public_key_derivation]]
|
[[public_key_derivation]]
|
||||||
==== Generating a public key
|
==== Generating a public key
|
||||||
|
|
||||||
@ -192,7 +180,12 @@ Starting with a private key in the form of a randomly generated number +k+, we m
|
|||||||
\end{equation}
|
\end{equation}
|
||||||
++++
|
++++
|
||||||
|
|
||||||
where +k+ is the private key, +G+ is a fixed point on the curve called the _generator point_, ((("generator point"))) and +K+ is the resulting public key, another point on the curve. Since the generator point is always the same, a private key k multiplied with G will always produce the same public key K.
|
where +k+ is the private key, +G+ is the generator point, ((("generator point"))) and +K+ is the resulting public key, a point on the curve. Since the generator point is always the same for all bitcoin users, a private key k multiplied with G will always result in the same public key K. The relationship between k and K is fixed, but can only be calculated in one direction, from k to K. That's why a bitcoin address (derived from K) can be shared with anyone and does not reveal the user's private key (k).
|
||||||
|
|
||||||
|
[TIP]
|
||||||
|
====
|
||||||
|
A private key can be converted into a public key, but a public key cannot be converted back into a private key because the math only works one way.
|
||||||
|
====
|
||||||
|
|
||||||
Implementing the elliptic curve multiplication above, we take the private key generated previously and multiply it by G:
|
Implementing the elliptic curve multiplication above, we take the private key generated previously and multiply it by G:
|
||||||
|
|
||||||
@ -212,9 +205,7 @@ y = 07CF33DA18...505BDB
|
|||||||
|
|
||||||
To visualize multiplication of a point with an integer, we will use the simpler elliptic curve over the real numbers -- remember, the math is the same. Our goal is to find the multiple kG of the generator point G. That is the same as adding G to itself, k times in a row. In elliptic curves, adding a point to itself is the equivalent of drawing a tangent line on the point and finding where it intersects the curve again, then reflecting that point on the x-axis.
|
To visualize multiplication of a point with an integer, we will use the simpler elliptic curve over the real numbers -- remember, the math is the same. Our goal is to find the multiple kG of the generator point G. That is the same as adding G to itself, k times in a row. In elliptic curves, adding a point to itself is the equivalent of drawing a tangent line on the point and finding where it intersects the curve again, then reflecting that point on the x-axis.
|
||||||
|
|
||||||
Starting with the generator point G, we take the tangent of the curve at G until it crosses the curve again at another point. This new point is -2G. Reflecting that point across the x-axis gives us 2G. If we take the tangent at 2G, it crosses the curve at -4G, which again we reflect on the x-axis to find 4G. Continuing this process, we can bounce around the curve finding the multiples of G, 2G, 4G, 8G, etc. As you can see, a randomly selected large number k, when multiplied against the generator point G is like bouncing around the curve k times, until we land on the point kG which is the public key. This process is irreversible, meaning that it is infeasible to find the factor k (the secret k) in any way other than trying all multiples of G (1G, 2G, 4G, etc) in a brute-force search for k. Since k can be an enormous number, that brute-force search would take an infeasible amount of computation and time.
|
The diagram below shows the process for deriving G, 2G, 4G, as a geometric operation on the curve.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[[ecc_illustrated]]
|
[[ecc_illustrated]]
|
||||||
.Elliptic Curve Cryptography: Visualizing the multiplication of a point G by an integer k on an elliptic curve
|
.Elliptic Curve Cryptography: Visualizing the multiplication of a point G by an integer k on an elliptic curve
|
||||||
@ -222,14 +213,21 @@ image::images/ecc_illustrated.png["ecc_illustrated"]
|
|||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
A private key can be converted into a public key, but a public key cannot be converted back into a private key because the math only works one way.
|
Most bitcoin implementations use the OpenSSL cryptographic library to do the elliptic curve math. For example, to derive the public key, the function +EC_POINT_mul()+ is used. See http://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography
|
||||||
====
|
====
|
||||||
|
|
||||||
=== Bitcoin Addresses
|
=== Bitcoin Addresses
|
||||||
|
|
||||||
An address is a string of digits and characters that can be shared with anyone who wants to send you money. In bitcoin, addresses produced from public keys begin with the digit "1". The bitcoin address is what appears most commonly in a transaction as the "recipient" of the funds. If we were to compare a bitcoin transaction to a paper cheque, the bitcoin address is the beneficiary, which is what we write on the line after "Pay to the order of". On a paper cheque, that beneficiary can sometimes be the name of a bank account holder, but can also include corporations, institutions or even cash. Because paper cheques do not need to specify an account, but rather use an abstract name as the recipient of funds, that makes paper cheques very flexible as payment instruments. Bitcoin transactions use a similar abstraction, the bitcoin address, to make them very flexible. A bitcoin address can represent the owner of a private/public key pair, or it can represent something else, such as a payment script, as we will see in <<p2sh>>. For now, let's examine the simple case, a bitcoin address that represents, and is derived from, a public key.
|
A bitcoin address is a string of digits and characters that can be shared with anyone who wants to send you money. Addresses produced from public keys consist of a string of numbers and letters, beginning with the digit "1". Here's an example of a bitcoin address:
|
||||||
|
|
||||||
A bitcoin address derived from a public key is a string of numbers and letters that begins with the number one, such as +1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy+. The bitcoin address is derived from the public key through the use of one-way cryptographic hashing; a "hashing algorithm" or simply "hash algorithm" is a one-way function that produces a fingerprint or "hash" of an arbitrary sized input. Cryptographic hash functions are used extensively in bitcoin: in bitcoin addresses, in script addresses and in the mining "Proof-of-Work" algorithm. The algorithms used to make a bitcoin address from a public key are the Secure Hash Algorithm (SHA) and the RACE Integrity Primitives Evaluation Message Digest (RIPEMD), specifically SHA256 and RIPEMD160.
|
----
|
||||||
|
1thMirt546nngXqyPEz532S8fLwbozud8
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
|
The bitcoin address is what appears most commonly in a transaction as the "recipient" of the funds. If we were to compare a bitcoin transaction to a paper cheque, the bitcoin address is the beneficiary, which is what we write on the line after "Pay to the order of". On a paper cheque, that beneficiary can sometimes be the name of a bank account holder, but can also include corporations, institutions or even cash. Because paper cheques do not need to specify an account, but rather use an abstract name as the recipient of funds, that makes paper cheques very flexible as payment instruments. Bitcoin transactions use a similar abstraction, the bitcoin address, to make them very flexible. A bitcoin address can represent the owner of a private/public key pair, or it can represent something else, such as a payment script, as we will see in <<p2sh>>. For now, let's examine the simple case, a bitcoin address that represents, and is derived from, a public key.
|
||||||
|
|
||||||
|
The bitcoin address is derived from the public key through the use of one-way cryptographic hashing; a "hashing algorithm" or simply "hash algorithm" is a one-way function that produces a fingerprint or "hash" of an arbitrary sized input. Cryptographic hash functions are used extensively in bitcoin: in bitcoin addresses, in script addresses and in the mining "Proof-of-Work" algorithm. The algorithms used to make a bitcoin address from a public key are the Secure Hash Algorithm (SHA) and the RACE Integrity Primitives Evaluation Message Digest (RIPEMD), specifically SHA256 and RIPEMD160.
|
||||||
|
|
||||||
Starting with the public key K, we compute the SHA256 hash and then compute the RIPEMD160 hash of the result, producing a 160 bit (20 byte) number:
|
Starting with the public key K, we compute the SHA256 hash and then compute the RIPEMD160 hash of the result, producing a 160 bit (20 byte) number:
|
||||||
[latexmath]
|
[latexmath]
|
||||||
@ -240,6 +238,12 @@ Starting with the public key K, we compute the SHA256 hash and then compute the
|
|||||||
++++
|
++++
|
||||||
where K is the public key and A is the resulting bitcoin address.
|
where K is the public key and A is the resulting bitcoin address.
|
||||||
|
|
||||||
|
|
||||||
|
[TIP]
|
||||||
|
====
|
||||||
|
A bitcoin address is *not* the same as a public key. Bitcoin addresses are derived from a public key using a one-way function.
|
||||||
|
====
|
||||||
|
|
||||||
Bitcoin addresses are almost always presented to users in an encoding called "Base58Check" (see <<base58check>> below), which uses 58 characters (a base-58 number system) and a checksum to help human readability, avoid ambiguity and protect against errors in address transcription and entry. Base58Check is also used in many other ways in bitcoin, whenever there is a need for a user to read and correctly transcribe a number, such as a bitcoin address, a private key, an encrypted key, or a script hash. In the next section we will examine the mechanics of Base58Check encoding and decoding, and the resulting representations.
|
Bitcoin addresses are almost always presented to users in an encoding called "Base58Check" (see <<base58check>> below), which uses 58 characters (a base-58 number system) and a checksum to help human readability, avoid ambiguity and protect against errors in address transcription and entry. Base58Check is also used in many other ways in bitcoin, whenever there is a need for a user to read and correctly transcribe a number, such as a bitcoin address, a private key, an encrypted key, or a script hash. In the next section we will examine the mechanics of Base58Check encoding and decoding, and the resulting representations.
|
||||||
|
|
||||||
[[pubkey_to_adddress]]
|
[[pubkey_to_adddress]]
|
||||||
@ -318,10 +322,11 @@ The private key we generated earlier can be represented as:
|
|||||||
|
|
||||||
All of the above representations are different ways of showing the same number, the same private key. They look different, but any one format can easily be converted to any other format.
|
All of the above representations are different ways of showing the same number, the same private key. They look different, but any one format can easily be converted to any other format.
|
||||||
|
|
||||||
|
|
||||||
===== Decode from Base58Check to Hex
|
===== Decode from Base58Check to Hex
|
||||||
|
|
||||||
The sx-tools package (See <<sx_tools>>) makes Base58Check format decoding easy on the command line. We use the base58check-decode command:
|
The sx-tools package (See <<sx_tools>>) makes it easy to write shell-scripts and command-line "pipes" that manipulate bitcoin keys, addresses, and transactions. You can use sx-tools to decode the Base58Check format on the command line:
|
||||||
|
|
||||||
|
We use the base58check-decode command:
|
||||||
----
|
----
|
||||||
$ sx base58check-decode 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
|
$ sx base58check-decode 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
|
||||||
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128
|
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128
|
||||||
@ -331,7 +336,7 @@ The result is the hexadecimal key, followed by the Wallet Import Format (WIF) ve
|
|||||||
|
|
||||||
===== Encode from Hex to Base58Check
|
===== Encode from Hex to Base58Check
|
||||||
|
|
||||||
To encode into Base58Check, we provide the hex private key, followed by the Wallet Import Format (WIF) version prefix 128:
|
To encode into Base58Check (the opposite of the previous command), we provide the hex private key, followed by the Wallet Import Format (WIF) version prefix 128:
|
||||||
----
|
----
|
||||||
$ sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128
|
$ sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128
|
||||||
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
|
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
|
||||||
@ -459,7 +464,7 @@ Wallets contain keys, not coins. The coins are stored on the blockchain in the f
|
|||||||
|
|
||||||
==== Non-Deterministic (Random) Wallets
|
==== Non-Deterministic (Random) Wallets
|
||||||
|
|
||||||
In the first implementations of bitcoin clients, wallets were simply collections of randomly generated private keys. For example, the Bitcoin Core Client pre-generates 100 random private keys when first started and generates more keys as needed, trying to use each key only once. This type of wallet is nicknamed "Just a Bunch Of Keys", or JBOK, and such wallets are being replaced with deterministic wallets because they are cumbersome to manage, backup and import. The disadvantage of random keys is that if you generate many of them you must keep copies of all of them, meaning that the wallet must be backed-up frequently. Each key must be backed-up, or the funds it controls are irrevocably lost if the wallet becomes inaccessible. This conflicts directly with the principle of avoiding address re-use, by using each bitcoin address for only one transaction. Address re-use reduces privacy by associating multiple transactions and addresses with each other. A Type-0 wallet is a poor choice of wallet, especially if you want to avoid address re-use as that means managing many keys, which creates the need for very frequent backups. The Bitcoin Core Client includes a wallet that is implemented as a Type-0 wallet, but the use of this wallet is actively discouraged by the Bitcoin Core developers.
|
In the first implementations of bitcoin clients, wallets were simply collections of randomly generated private keys. The types of wallets are called _Type-0 Non-Deterministic Wallets_. For example, the Bitcoin Core Client pre-generates 100 random private keys when first started and generates more keys as needed, trying to use each key only once. This type of wallet is nicknamed "Just a Bunch Of Keys", or JBOK, and such wallets are being replaced with deterministic wallets because they are cumbersome to manage, backup and import. The disadvantage of random keys is that if you generate many of them you must keep copies of all of them, meaning that the wallet must be backed-up frequently. Each key must be backed-up, or the funds it controls are irrevocably lost if the wallet becomes inaccessible. This conflicts directly with the principle of avoiding address re-use, by using each bitcoin address for only one transaction. Address re-use reduces privacy by associating multiple transactions and addresses with each other. A Type-0 non-deterministic wallet is a poor choice of wallet, especially if you want to avoid address re-use as that means managing many keys, which creates the need for very frequent backups. The Bitcoin Core Client includes a wallet that is implemented as a Type-0 wallet, but the use of this wallet is actively discouraged by the Bitcoin Core developers.
|
||||||
|
|
||||||
[[Type0_wallet]]
|
[[Type0_wallet]]
|
||||||
.Type-0 Non-Deterministic (Random) Wallet: A Collection of Randomly Generated Keys
|
.Type-0 Non-Deterministic (Random) Wallet: A Collection of Randomly Generated Keys
|
||||||
@ -471,7 +476,7 @@ Deterministic, or "seeded" wallets are wallets that contain private keys which a
|
|||||||
|
|
||||||
==== Mnemonic Code Words (DRAFT:BIP0039)
|
==== Mnemonic Code Words (DRAFT:BIP0039)
|
||||||
|
|
||||||
Mnemonic codes are English word sequences that are generated from a random sequence and used to produce a seed for use in deterministic wallets. The sequence of words is sufficient to re-create the seed and from there re-create the wallet and all the derived keys. A wallet application that implements deterministic wallets with mnemonic code will show the user a sequence of 12-24 words when first creating a wallet. That sequence of words is the wallet backup and can be used to recover and re-create all the keys in the same or any compatible wallet application.
|
Mnemonic codes are English word sequences that represent (encode) a random number used as a seed to derive a deterministic wallet. The sequence of words is sufficient to re-create the seed and from there re-create the wallet and all the derived keys. A wallet application that implements deterministic wallets with mnemonic code will show the user a sequence of 12-24 words when first creating a wallet. That sequence of words is the wallet backup and can be used to recover and re-create all the keys in the same or any compatible wallet application. Mnemonic code words make it easier for users to back up wallets, as they are easy to read and correctly transcribe, as compared to a random sequence of numbers.
|
||||||
|
|
||||||
Mnemonic codes are defined in Bitcoin Improvement Proposal 39 (see <<bip0039>>), currently in Draft status. Note that BIP0039 is a draft proposal and not a standard. Specifically, there is a different standard, with a different set of words used by the Electrum wallet and _predating_ BIP0039. BIP0039 is used by the Trezor wallet and a few other wallets but is incompatible with Electrum's implementation.
|
Mnemonic codes are defined in Bitcoin Improvement Proposal 39 (see <<bip0039>>), currently in Draft status. Note that BIP0039 is a draft proposal and not a standard. Specifically, there is a different standard, with a different set of words used by the Electrum wallet and _predating_ BIP0039. BIP0039 is used by the Trezor wallet and a few other wallets but is incompatible with Electrum's implementation.
|
||||||
|
|
||||||
|
167
ch05.asciidoc
167
ch05.asciidoc
@ -58,7 +58,7 @@ A transaction contains a number of fields, as follows:
|
|||||||
| 4 bytes | Locktime | A unix timestamp or block number
|
| 4 bytes | Locktime | A unix timestamp or block number
|
||||||
|=======
|
|=======
|
||||||
|
|
||||||
Note: Locktime defines the earliest time that a transaction can be added to the blockchain. It is set to zero in most transactions to indicate immediate execution. If locktime is non-zero and below 500 million, it is interpreted as a block height, meaning the transaction is not included in the blockchain prior to the specified block height. If it is above 500 million, it is interpreted as a Unix Epoch timestamp (seconds since Jan-1-1970) and the transaction is not included in the blockchain prior to the specified time.
|
Note: Locktime defines the earliest time that a transaction can be added to the blockchain. It is set to zero in most transactions to indicate immediate execution. If locktime is non-zero and below 500 million, it is interpreted as a block height, meaning the transaction is not included in the blockchain prior to the specified block height. If it is above 500 million, it is interpreted as a Unix Epoch timestamp (seconds since Jan-1-1970) and the transaction is not included in the blockchain prior to the specified time. The use of locktime is equivalent to post-dating a paper cheque.
|
||||||
|
|
||||||
[[tx_inputs_outputs]]
|
[[tx_inputs_outputs]]
|
||||||
=== Transaction Outputs and Inputs
|
=== Transaction Outputs and Inputs
|
||||||
@ -72,7 +72,7 @@ There are no accounts or balances in bitcoin, there are only _unspent transactio
|
|||||||
|
|
||||||
A UTXO can have an arbitrary value denominated as a multiple of satoshis. Just like dollars can be divided down to two decimal places as cents, bitcoins can be divided down to eight decimal places as satoshis. While UTXO can be any arbitrary value, once created it is indivisible just like a coin that cannot be cut in half. If a UTXO is larger than the desired value of a transaction, it must still be consumed in its entirety and change must be generated in the transaction. In other words, if you have a 20 bitcoin UTXO and want to pay 1 bitcoin, your transaction must consume the entire 20 bitcoin UTXO and produce two outputs: one paying 1 bitcoin to your desired recipient and another paying 19 bitcoin in change back to your wallet. As a result, most bitcoin transactions will generate change.
|
A UTXO can have an arbitrary value denominated as a multiple of satoshis. Just like dollars can be divided down to two decimal places as cents, bitcoins can be divided down to eight decimal places as satoshis. While UTXO can be any arbitrary value, once created it is indivisible just like a coin that cannot be cut in half. If a UTXO is larger than the desired value of a transaction, it must still be consumed in its entirety and change must be generated in the transaction. In other words, if you have a 20 bitcoin UTXO and want to pay 1 bitcoin, your transaction must consume the entire 20 bitcoin UTXO and produce two outputs: one paying 1 bitcoin to your desired recipient and another paying 19 bitcoin in change back to your wallet. As a result, most bitcoin transactions will generate change.
|
||||||
|
|
||||||
In simple terms, transactions consume the sender's available UTXO and create new UTXO locked to the recipient's bitcoin address. Imagine a shopper buying a $1.50 beverage, reaching into their wallet and trying to find a combination of coins and bank notes to cover the $1.50 cost. The shopper will choose exact change if available (a dollar bill and two quarters), or a combination of smaller denominations (six quarters), or if necessary, a larger unit such as a five dollar bank note. If they hand too much money, say $5, to the shop owner they will expect $3.50 change, which they will return to their wallet and have available for future transactions. Similarly, a bitcoin transaction must be created from a user's UTXO in whatever denominations that user has available. They cannot cut a UTXO in half any more than they can cut a dollar bill in half and use it as currency. The user's wallet application will typically select from the user's available UTXO various units to compose an amount greater than or equal to the desired transaction amount. As with real life, the bitcoin application can use several strategies to satisfy the purchase amount: combining several smaller units, finding exact change, or using a single unit larger than the transaction value and making change.
|
In simple terms, transactions consume the sender's available UTXO and create new UTXO locked to the recipient's bitcoin address. Imagine a shopper buying a $1.50 beverage, reaching into their wallet and trying to find a combination of coins and bank notes to cover the $1.50 cost. The shopper will choose exact change if available (a dollar bill and two quarters), or a combination of smaller denominations (six quarters), or if necessary, a larger unit such as a five dollar bank note. If they hand too much money, say $5, to the shop owner they will expect $3.50 change, which they will return to their wallet and have available for future transactions. Similarly, a bitcoin transaction must be created from a user's UTXO in whatever denominations that user has available. They cannot cut a UTXO in half any more than they can cut a dollar bill in half and use it as currency. The user's wallet application will typically select from the user's available UTXO various units to compose an amount greater than or equal to the desired transaction amount. As with real life, the bitcoin application can use several strategies to satisfy the purchase amount: combining several smaller units, finding exact change, or using a single unit larger than the transaction value and making change. All of this complex assembly of spendable UTXO is done by the user's wallet automatically and is invisible to users. It is only relevant if you are programmatically constructing raw transactions from UTXO.
|
||||||
|
|
||||||
The UTXO consumed by a transaction are called transaction inputs, while the UTXO created by a transaction are called transaction outputs. This way, chunks of bitcoin value move forward from owner to owner in a chain of transactions consuming and creating UTXO. Transactions consume UTXO unlocking it with the signature of the current owner and create UTXO locking it to the bitcoin address of the new owner.
|
The UTXO consumed by a transaction are called transaction inputs, while the UTXO created by a transaction are called transaction outputs. This way, chunks of bitcoin value move forward from owner to owner in a chain of transactions consuming and creating UTXO. Transactions consume UTXO unlocking it with the signature of the current owner and create UTXO locking it to the bitcoin address of the new owner.
|
||||||
|
|
||||||
@ -552,166 +552,3 @@ Note that since the redeem script is not presented to the network until you atte
|
|||||||
====
|
====
|
||||||
P2SH locking scripts contain the hash of a redeem script which gives no clues as to the content of the redeem script itself. The P2SH transaction will be considered valid and accepted even if the redeem script is invalid. You may accidentally lock bitcoin in such a way that it cannot later be spent.
|
P2SH locking scripts contain the hash of a redeem script which gives no clues as to the content of the redeem script itself. The P2SH transaction will be considered valid and accepted even if the redeem script is invalid. You may accidentally lock bitcoin in such a way that it cannot later be spent.
|
||||||
====
|
====
|
||||||
|
|
||||||
[[tx_script_ops]]
|
|
||||||
=== 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
|
|
||||||
|=======
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 67 KiB |
Loading…
Reference in New Issue
Block a user