mirror of
https://github.com/bitcoinbook/bitcoinbook
synced 2024-11-22 08:08:11 +00:00
Merge remote-tracking branch 'github/develop' into second_edition
This commit is contained in:
commit
9dacbb40e3
21
.travis.yml
Normal file
21
.travis.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- 2.7
|
||||||
|
- 3.6
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- develop
|
||||||
|
- first_edition
|
||||||
|
- second_edition
|
||||||
|
install:
|
||||||
|
- pip install flake8 # pytest # add other testing frameworks later
|
||||||
|
before_script:
|
||||||
|
# stop the build if there are Python syntax errors or undefined names
|
||||||
|
- time flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics
|
||||||
|
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
||||||
|
- time flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
||||||
|
script:
|
||||||
|
- true # add other tests here
|
||||||
|
notifications:
|
||||||
|
on_success: change
|
||||||
|
on_failure: always
|
@ -3,7 +3,7 @@
|
|||||||
== pycoin, ku, and tx
|
== pycoin, ku, and tx
|
||||||
|
|
||||||
|
|
||||||
((("pycoin library")))The Python library http://github.com/richardkiss/pycoin[+pycoin+], originally written and maintained by Richard Kiss, is a Python-based library that supports manipulation of bitcoin keys and transactions, even supporting the scripting language enough to properly deal with nonstandard transactions.
|
((("pycoin library")))The Python library http://github.com/richardkiss/pycoin[+pycoin+], originally written and maintained by Richard Kiss, is a Python-based library that supports manipulation of bitcoin keys and transactions, even supporting the scripting language enough to properly deal with nonstandard transactions.
|
||||||
|
|
||||||
The pycoin library supports both Python 2 (2.7.x) and Python 3 (after 3.3) and comes with some handy command-line utilities, +ku+ and +tx+.
|
The pycoin library supports both Python 2 (2.7.x) and Python 3 (after 3.3) and comes with some handy command-line utilities, +ku+ and +tx+.
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ hash160 : 5d353a2ecdb262477172852d57a3f11de0c19286
|
|||||||
Bitcoin address : 19Vqc8uLTfUonmxUEZac7fz1M5c5ZZbAii
|
Bitcoin address : 19Vqc8uLTfUonmxUEZac7fz1M5c5ZZbAii
|
||||||
uncompressed : 1MwkRkogzBRMehBntgcq2aJhXCXStJTXHT
|
uncompressed : 1MwkRkogzBRMehBntgcq2aJhXCXStJTXHT
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
Get info as JSON:
|
Get info as JSON:
|
||||||
|
|
||||||
@ -97,25 +97,25 @@ $ ku P:foo -P -j
|
|||||||
[source,json]
|
[source,json]
|
||||||
----
|
----
|
||||||
{
|
{
|
||||||
"y_parity": "even",
|
"y_parity": "even",
|
||||||
"public_pair_y_hex": "826d8b4d3010aea16ff4c1c1d3ae68541d9a04df54a2c48cc241c2983544de52",
|
"public_pair_y_hex": "826d8b4d3010aea16ff4c1c1d3ae68541d9a04df54a2c48cc241c2983544de52",
|
||||||
"private_key": "no",
|
"private_key": "no",
|
||||||
"parent_fingerprint": "00000000",
|
"parent_fingerprint": "00000000",
|
||||||
"tree_depth": "0",
|
"tree_depth": "0",
|
||||||
"network": "Bitcoin",
|
"network": "Bitcoin",
|
||||||
"btc_address_uncompressed": "1MwkRkogzBRMehBntgcq2aJhXCXStJTXHT",
|
"btc_address_uncompressed": "1MwkRkogzBRMehBntgcq2aJhXCXStJTXHT",
|
||||||
"key_pair_as_sec_uncompressed": "04b4e599dfa44555a4ed38bcfff0071d5af676a86abf123c5b4b4e8e67a0b0b13f826d8b4d3010aea16ff4c1c1d3ae68541d9a04df54a2c48cc241c2983544de52",
|
"key_pair_as_sec_uncompressed": "04b4e599dfa44555a4ed38bcfff0071d5af676a86abf123c5b4b4e8e67a0b0b13f826d8b4d3010aea16ff4c1c1d3ae68541d9a04df54a2c48cc241c2983544de52",
|
||||||
"public_pair_x_hex": "b4e599dfa44555a4ed38bcfff0071d5af676a86abf123c5b4b4e8e67a0b0b13f",
|
"public_pair_x_hex": "b4e599dfa44555a4ed38bcfff0071d5af676a86abf123c5b4b4e8e67a0b0b13f",
|
||||||
"wallet_key": "xpub661MyMwAqRbcFVF9ULcqLdsEa5WnCCugQAcgNd9iEMQ31tgH6u4DLQWoQayvtSVYFvXz2vPPpbXE1qpjoUFidhjFj82pVShWu9curWmb2zy",
|
"wallet_key": "xpub661MyMwAqRbcFVF9ULcqLdsEa5WnCCugQAcgNd9iEMQ31tgH6u4DLQWoQayvtSVYFvXz2vPPpbXE1qpjoUFidhjFj82pVShWu9curWmb2zy",
|
||||||
"chain_code": "5eeb1023fd6dd1ae52a005ce0e73420821e1d90e08be980a85e9111fd7646bbc",
|
"chain_code": "5eeb1023fd6dd1ae52a005ce0e73420821e1d90e08be980a85e9111fd7646bbc",
|
||||||
"child_index": "0",
|
"child_index": "0",
|
||||||
"hash160_uncompressed": "e5bd3a7e6cb62b4c820e51200fb1c148d79e67da",
|
"hash160_uncompressed": "e5bd3a7e6cb62b4c820e51200fb1c148d79e67da",
|
||||||
"btc_address": "19Vqc8uLTfUonmxUEZac7fz1M5c5ZZbAii",
|
"btc_address": "19Vqc8uLTfUonmxUEZac7fz1M5c5ZZbAii",
|
||||||
"fingerprint": "5d353a2e",
|
"fingerprint": "5d353a2e",
|
||||||
"hash160": "5d353a2ecdb262477172852d57a3f11de0c19286",
|
"hash160": "5d353a2ecdb262477172852d57a3f11de0c19286",
|
||||||
"input": "P:foo",
|
"input": "P:foo",
|
||||||
"public_pair_x": "81821982719381104061777349269130419024493616650993589394553404347774393168191",
|
"public_pair_x": "81821982719381104061777349269130419024493616650993589394553404347774393168191",
|
||||||
"public_pair_y": "58994218069605424278320703250689780154785099509277691723126325051200459038290",
|
"public_pair_y": "58994218069605424278320703250689780154785099509277691723126325051200459038290",
|
||||||
"key_pair_as_sec": "02b4e599dfa44555a4ed38bcfff0071d5af676a86abf123c5b4b4e8e67a0b0b13f"
|
"key_pair_as_sec": "02b4e599dfa44555a4ed38bcfff0071d5af676a86abf123c5b4b4e8e67a0b0b13f"
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
@ -329,7 +329,8 @@ Dogecoin address : DFpN6QqFfUm3gKNaxN6tNcab1FArL9cZLE
|
|||||||
|
|
||||||
==== Transaction Utility (TX)
|
==== Transaction Utility (TX)
|
||||||
|
|
||||||
((("transaction utility (TX)", id="TX18")))The command-line utility +tx+ will display transactions in human-readable form, fetch base transactions from pycoin's transaction cache or from web services (pass:[<a href="https://blockchain.info/" class="orm:hideurl"><em>blockchain.info</em></a> and <a href="https://www.biteasy.com/" class="orm:hideurl"><em>biteasy.com</em></a>] are currently supported), merge transactions, add or delete inputs or outputs, and sign transactions.
|
((("transaction utility (TX)", id="TX18")))
|
||||||
|
The command-line utility +tx+ will display transactions in human-readable form, fetch base transactions from pycoin's transaction cache or from web services (blockchain.info, blockcypher.com, blockr.io and chain.so are currently supported), merge transactions, add or delete inputs or outputs, and sign transactions.
|
||||||
|
|
||||||
Following are some examples.
|
Following are some examples.
|
||||||
|
|
||||||
@ -340,7 +341,7 @@ View the famous "pizza" transaction:
|
|||||||
----
|
----
|
||||||
$ tx 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a
|
$ tx 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a
|
||||||
warning: consider setting environment variable PYCOIN_CACHE_DIR=~/.pycoin_cache to cache transactions fetched via web services
|
warning: consider setting environment variable PYCOIN_CACHE_DIR=~/.pycoin_cache to cache transactions fetched via web services
|
||||||
warning: no service providers found for get_tx; consider setting environment variable PYCOIN_SERVICE_PROVIDERS=BLOCKR_IO:BLOCKCHAIN_INFO:BITEASY:BLOCKEXPLORER
|
warning: no service providers found for get_tx; consider setting environment variable PYCOIN_BTC_PROVIDERS
|
||||||
usage: tx [-h] [-t TRANSACTION_VERSION] [-l LOCK_TIME] [-n NETWORK] [-a]
|
usage: tx [-h] [-t TRANSACTION_VERSION] [-l LOCK_TIME] [-n NETWORK] [-a]
|
||||||
[-i address] [-f path-to-private-keys] [-g GPG_ARGUMENT]
|
[-i address] [-f path-to-private-keys] [-g GPG_ARGUMENT]
|
||||||
[--remove-tx-in tx_in_index_to_delete]
|
[--remove-tx-in tx_in_index_to_delete]
|
||||||
@ -357,8 +358,8 @@ Oops! We don't have web services set up. Let's do that now:
|
|||||||
[source,bash]
|
[source,bash]
|
||||||
----
|
----
|
||||||
$ PYCOIN_CACHE_DIR=~/.pycoin_cache
|
$ PYCOIN_CACHE_DIR=~/.pycoin_cache
|
||||||
$ PYCOIN_SERVICE_PROVIDERS=BLOCKR_IO:BLOCKCHAIN_INFO:BITEASY:BLOCKEXPLORER
|
$ PYCOIN_BTC_PROVIDERS="block.io blockchain.info blockexplorer.com"
|
||||||
$ export PYCOIN_CACHE_DIR PYCOIN_SERVICE_PROVIDERS
|
$ export PYCOIN_CACHE_DIR PYCOIN_BTC_PROVIDERS
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
@ -368,7 +369,7 @@ Let's try again:
|
|||||||
|
|
||||||
----
|
----
|
||||||
$ tx 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a
|
$ tx 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a
|
||||||
Version: 1 tx hash 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a 159 bytes
|
Version: 1 tx hash 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a 159 bytes
|
||||||
TxIn count: 1; TxOut count: 1
|
TxIn count: 1; TxOut count: 1
|
||||||
Lock time: 0 (valid anytime)
|
Lock time: 0 (valid anytime)
|
||||||
Input:
|
Input:
|
||||||
@ -388,7 +389,7 @@ The final line appears because to validate the transactions' signatures, you tec
|
|||||||
$ tx -a 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a
|
$ tx -a 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a
|
||||||
warning: transaction fees recommendations casually calculated and estimates may be incorrect
|
warning: transaction fees recommendations casually calculated and estimates may be incorrect
|
||||||
warning: transaction fee lower than (casually calculated) expected value of 0.1 mBTC, transaction might not propogate
|
warning: transaction fee lower than (casually calculated) expected value of 0.1 mBTC, transaction might not propogate
|
||||||
Version: 1 tx hash 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a 159 bytes
|
Version: 1 tx hash 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a 159 bytes
|
||||||
TxIn count: 1; TxOut count: 1
|
TxIn count: 1; TxOut count: 1
|
||||||
Lock time: 0 (valid anytime)
|
Lock time: 0 (valid anytime)
|
||||||
Input:
|
Input:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
[appendix]
|
[appendix]
|
||||||
== Segregated Witness
|
== Segregated Witness
|
||||||
|
|
||||||
((("segwit (Segregated Witness)", id="segwit16")))Segregated Witness (segwit) is an upgrade to the bitcoin consensus rules and network protocol, proposed and implemented as a BIP-9 soft-fork that is currently (mid-2017) pending activation.
|
((("segwit (Segregated Witness)", id="segwit16")))Segregated Witness (segwit) is an upgrade to the bitcoin consensus rules and network protocol, proposed and implemented as a BIP-9 soft-fork that is currently (mid-2017) pending activation.
|
||||||
|
|
||||||
In cryptography, the term "witness" is used to describe a solution to a cryptographic puzzle. In bitcoin terms, the witness satisfies a cryptographic condition placed on a unspent transaction output (UTXO).
|
In cryptography, the term "witness" is used to describe a solution to a cryptographic puzzle. In bitcoin terms, the witness satisfies a cryptographic condition placed on a unspent transaction output (UTXO).
|
||||||
|
|
||||||
@ -10,14 +10,14 @@ In the context of bitcoin, a digital signature is _one type of witness_, but a w
|
|||||||
|
|
||||||
Before segwit’s introduction, every input in a transaction was followed by the witness data that unlocked it. The witness data was embedded in the transaction as part of each input. The term _segregated witness_, or _segwit_ for short, simply means separating the signature or unlocking script of a specific output. Think "separate scriptSig," or “separate signature” in the simplest form.
|
Before segwit’s introduction, every input in a transaction was followed by the witness data that unlocked it. The witness data was embedded in the transaction as part of each input. The term _segregated witness_, or _segwit_ for short, simply means separating the signature or unlocking script of a specific output. Think "separate scriptSig," or “separate signature” in the simplest form.
|
||||||
|
|
||||||
Segregated Witness therefore is an architectural change to bitcoin that aims to move the witness data from the +scriptSig+ (unlocking script) field of a transaction into a separate a _witness_ data structure that accompanies a transaction. Clients may request transaction data with or without the accompanying witness data.
|
Segregated Witness therefore is an architectural change to bitcoin that aims to move the witness data from the +scriptSig+ (unlocking script) field of a transaction into a separate _witness_ data structure that accompanies a transaction. Clients may request transaction data with or without the accompanying witness data.
|
||||||
|
|
||||||
In this section we will look at some of the benefits of Segregated Witness, describe the mechanism used to deploy and implement this architecture change, and demonstrate the use of Segregated Witness in transactions and addresses.
|
In this section we will look at some of the benefits of Segregated Witness, describe the mechanism used to deploy and implement this architecture change, and demonstrate the use of Segregated Witness in transactions and addresses.
|
||||||
|
|
||||||
[role="pagebreak-before"]
|
[role="pagebreak-before"]
|
||||||
Segregated Witness is defined by the following BIPs:
|
Segregated Witness is defined by the following BIPs:
|
||||||
|
|
||||||
https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki[BIP-141] :: The main definition of Segregated Witness.
|
https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki[BIP-141] :: The main definition of Segregated Witness.
|
||||||
|
|
||||||
https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki[BIP-143] :: Transaction Signature Verification for Version 0 Witness Program
|
https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki[BIP-143] :: Transaction Signature Verification for Version 0 Witness Program
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ Finally, the P2SH script is converted to a P2SH bitcoin address:
|
|||||||
37Lx99uaGn5avKBxiW26HjedQE3LrDCZru
|
37Lx99uaGn5avKBxiW26HjedQE3LrDCZru
|
||||||
----
|
----
|
||||||
|
|
||||||
Now, Bob can display this address for customers to pay for their coffee. Alice's wallet can make a payment to +3deadbeef+, just as it would to any other bitcoin address. Even though Alice's wallet has no support for segwit, the payment it creates can be spent by Bob with a segwit transaction.((("", startref="aliced")))
|
Now, Bob can display this address for customers to pay for their coffee. Alice's wallet can make a payment to +37Lx99uaGn5avKBxiW26HjedQE3LrDCZru+, just as it would to any other bitcoin address. Even though Alice's wallet has no support for segwit, the payment it creates can be spent by Bob with a segwit transaction.((("", startref="aliced")))
|
||||||
|
|
||||||
===== Pay-to-Witness-Script-Hash inside Pay-to-Script-Hash
|
===== Pay-to-Witness-Script-Hash inside Pay-to-Script-Hash
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
"dedication.html",
|
"dedication.html",
|
||||||
"toc.html",
|
"toc.html",
|
||||||
"preface.asciidoc",
|
"preface.asciidoc",
|
||||||
|
"glossary.asciidoc",
|
||||||
"ch01.asciidoc",
|
"ch01.asciidoc",
|
||||||
"ch02.asciidoc",
|
"ch02.asciidoc",
|
||||||
"ch03.asciidoc",
|
"ch03.asciidoc",
|
||||||
|
@ -10,7 +10,7 @@ Users can transfer bitcoin over the network to do just about anything that can b
|
|||||||
|
|
||||||
Unlike traditional currencies, bitcoin are entirely virtual. There are no physical coins or even digital coins per se. The coins are implied in transactions that transfer value from sender to recipient. Users of bitcoin own keys that allow them to prove ownership of bitcoin in the bitcoin network. With these keys they can sign transactions to unlock the value and spend it by transferring it to a new owner. Keys are often stored in a digital wallet on each user’s computer or smartphone. Possession of the key that can sign a transaction is the only prerequisite to spending bitcoin, putting the control entirely in the hands of each user.
|
Unlike traditional currencies, bitcoin are entirely virtual. There are no physical coins or even digital coins per se. The coins are implied in transactions that transfer value from sender to recipient. Users of bitcoin own keys that allow them to prove ownership of bitcoin in the bitcoin network. With these keys they can sign transactions to unlock the value and spend it by transferring it to a new owner. Keys are often stored in a digital wallet on each user’s computer or smartphone. Possession of the key that can sign a transaction is the only prerequisite to spending bitcoin, putting the control entirely in the hands of each user.
|
||||||
|
|
||||||
Bitcoin is a distributed, peer-to-peer system. As such there is no "central" server or point of control. Bitcoin are created through a process called "mining," which involves competing to find solutions to a mathematical problem while processing bitcoin transactions. Any participant in the bitcoin network (i.e., anyone using a device running the full bitcoin protocol stack) may operate as a miner, using their computer's processing power to verify and record transactions. Every 10 minutes, on average, someone is able to validate the transactions of the past 10 minutes and is rewarded with brand new bitcoin. Essentially, bitcoin mining decentralizes the currency-issuance and clearing functions of a central bank and replaces the need for any central bank.
|
Bitcoin is a distributed, peer-to-peer system. As such there is no "central" server or point of control. Bitcoin are created through a process called "mining," which involves competing to find solutions to a mathematical problem while processing bitcoin transactions. Any participant in the bitcoin network (i.e., anyone using a device running the full bitcoin protocol stack) may operate as a miner, using their computer's processing power to verify and record transactions. Every 10 minutes, on average, a bitcoin miner is able to validate the transactions of the past 10 minutes and is rewarded with brand new bitcoin. Essentially, bitcoin mining decentralizes the currency-issuance and clearing functions of a central bank and replaces the need for any central bank.
|
||||||
|
|
||||||
The bitcoin protocol includes built-in algorithms that regulate the mining function across the network. The difficulty of the processing task that miners must perform is adjusted dynamically so that, on average, someone succeeds every 10 minutes regardless of how many miners (and how much processing) are competing at any moment. The protocol also halves the rate at which new bitcoin are created every 4 years, and limits the total number of bitcoin that will be created to a fixed total just below 21 million coins. The result is that the number of bitcoin in circulation closely follows an easily predictable curve that approaches 21 million by the year 2140. Due to bitcoin's diminishing rate of issuance, over the long term, the bitcoin currency is deflationary. Furthermore, bitcoin cannot be inflated by "printing" new money above and beyond the expected issuance rate.
|
The bitcoin protocol includes built-in algorithms that regulate the mining function across the network. The difficulty of the processing task that miners must perform is adjusted dynamically so that, on average, someone succeeds every 10 minutes regardless of how many miners (and how much processing) are competing at any moment. The protocol also halves the rate at which new bitcoin are created every 4 years, and limits the total number of bitcoin that will be created to a fixed total just below 21 million coins. The result is that the number of bitcoin in circulation closely follows an easily predictable curve that approaches 21 million by the year 2140. Due to bitcoin's diminishing rate of issuance, over the long term, the bitcoin currency is deflationary. Furthermore, bitcoin cannot be inflated by "printing" new money above and beyond the expected issuance rate.
|
||||||
|
|
||||||
@ -33,8 +33,8 @@ In this chapter we'll get started by explaining some of the main concepts and te
|
|||||||
|
|
||||||
1. Can I trust that the money is authentic and not counterfeit?
|
1. Can I trust that the money is authentic and not counterfeit?
|
||||||
2. Can I trust that the digital money can only be spent once (known as the “double-spend” problem)?
|
2. Can I trust that the digital money can only be spent once (known as the “double-spend” problem)?
|
||||||
3. Can I be sure that no one else can claim this money belongs to them and not me?
|
3. Can I be sure that no one else can claim this money belongs to them and not me?
|
||||||
|
|
||||||
Issuers of paper money are constantly battling the counterfeiting problem by using increasingly sophisticated papers and printing technology. Physical money addresses the double-spend issue easily because the same paper note cannot be in two places at once. Of course, conventional money is also often stored and transmitted digitally. In these cases, the counterfeiting and double-spend issues are handled by clearing all electronic transactions through central authorities that have a global view of the currency in circulation. For digital money, which cannot take advantage of esoteric inks or holographic strips, cryptography provides the basis for trusting the legitimacy of a user’s claim to value. Specifically, cryptographic digital signatures enable a user to sign a digital asset or transaction proving the ownership of that asset. With the appropriate architecture, digital signatures also can be used to address the double-spend issue.
|
Issuers of paper money are constantly battling the counterfeiting problem by using increasingly sophisticated papers and printing technology. Physical money addresses the double-spend issue easily because the same paper note cannot be in two places at once. Of course, conventional money is also often stored and transmitted digitally. In these cases, the counterfeiting and double-spend issues are handled by clearing all electronic transactions through central authorities that have a global view of the currency in circulation. For digital money, which cannot take advantage of esoteric inks or holographic strips, cryptography provides the basis for trusting the legitimacy of a user’s claim to value. Specifically, cryptographic digital signatures enable a user to sign a digital asset or transaction proving the ownership of that asset. With the appropriate architecture, digital signatures also can be used to address the double-spend issue.
|
||||||
|
|
||||||
When cryptography started becoming more broadly available and understood in the late 1980s, many researchers began trying to use cryptography to build digital currencies. These early digital currency projects issued digital money, usually backed by a national currency or precious metal such as gold.
|
When cryptography started becoming more broadly available and understood in the late 1980s, many researchers began trying to use cryptography to build digital currencies. These early digital currency projects issued digital money, usually backed by a national currency or precious metal such as gold.
|
||||||
@ -182,7 +182,7 @@ In addition to these various sites and applications, most bitcoin wallets will a
|
|||||||
==== Sending and Receiving Bitcoin
|
==== Sending and Receiving Bitcoin
|
||||||
|
|
||||||
|
|
||||||
((("getting started", "sending and receiving bitcoin", id="GSsend01")))((("spending bitcoin", "bitcoin wallet quick start example")))((("spending bitcoin", see="also transactions")))Alice has decided to convert $10 US dollars into bitcoin, so as not to risk too much money on this new technology. She gives Joe $10 in cash, opens her Mycelium wallet application, and selects Receive. This displays a QR code with Alice's first bitcoin address.
|
((("getting started", "sending and receiving bitcoin", id="GSsend01")))((("spending bitcoin", "bitcoin wallet quick start example")))((("spending bitcoin", see="also transactions")))Alice has decided to exchange $10 US dollars for bitcoin, so as not to risk too much money on this new technology. She gives Joe $10 in cash, opens her Mycelium wallet application, and selects Receive. This displays a QR code with Alice's first bitcoin address.
|
||||||
|
|
||||||
Joe then selects Send on his smartphone wallet and is presented with a screen containing two inputs:
|
Joe then selects Send on his smartphone wallet and is presented with a screen containing two inputs:
|
||||||
|
|
||||||
@ -208,5 +208,3 @@ Meanwhile, Alice's wallet is constantly "listening" to published transactions on
|
|||||||
****
|
****
|
||||||
|
|
||||||
Alice is now the proud owner of 0.10 BTC that she can spend. In the next chapter we will look at her first purchase with bitcoin, and examine the underlying transaction and propagation technologies in more detail.((("", startref="BCbasic01")))((("use cases", "buying coffee", startref="aliceone")))
|
Alice is now the proud owner of 0.10 BTC that she can spend. In the next chapter we will look at her first purchase with bitcoin, and examine the underlying transaction and propagation technologies in more detail.((("", startref="BCbasic01")))((("use cases", "buying coffee", startref="aliceone")))
|
||||||
|
|
||||||
|
|
||||||
|
226
ch03.asciidoc
226
ch03.asciidoc
@ -25,7 +25,7 @@ image::images/mbc2_0301.png["Bitcoin Core Architecture"]
|
|||||||
[[compiling_core]]
|
[[compiling_core]]
|
||||||
=== Compiling Bitcoin Core from the Source Code
|
=== Compiling Bitcoin Core from the Source Code
|
||||||
|
|
||||||
((("Bitcoin Core", "compiling from source code", id="BCsource03")))((("Bitcoin Core", "compiling from source code", "downloading")))((("code examples, obtaining and using")))Bitcoin Core's source code can be downloaded as a ZIP archive or by cloning the authoritative source repository from GitHub. ((("GitHub bitcoin page")))On the https://github.com/bitcoin/bitcoin[GitHub bitcoin page], select Download ZIP from the sidebar. Alternatively, use the git command line to create a local copy of the source code on your system.
|
((("Bitcoin Core", "compiling from source code", id="BCsource03")))((("Bitcoin Core", "compiling from source code", "downloading")))((("code examples, obtaining and using")))Bitcoin Core's source code can be downloaded as a archive or by cloning the authoritative source repository from GitHub. ((("Bitcoin Core downloads")))On the https://bitcoincore.org/bin/[Bitcoin Core download page], select the most recent version and download the compressed archive of the source code, e.g. +bitcoin-0.15.0.2.tar.gz+. ((("GitHub bitcoin page")))Alternatively, use the git command line to create a local copy of the source code from the https://github.com/bitcoin/bitcoin[GitHub bitcoin page].
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
@ -37,10 +37,11 @@ image::images/mbc2_0301.png["Bitcoin Core Architecture"]
|
|||||||
----
|
----
|
||||||
$ git clone https://github.com/bitcoin/bitcoin.git
|
$ git clone https://github.com/bitcoin/bitcoin.git
|
||||||
Cloning into 'bitcoin'...
|
Cloning into 'bitcoin'...
|
||||||
remote: Counting objects: 66193, done.
|
remote: Counting objects: 102071, done.
|
||||||
remote: Total 66193 (delta 0), reused 0 (delta 0), pack-reused 66193
|
remote: Compressing objects: 100% (10/10), done.
|
||||||
Receiving objects: 100% (66193/66193), 63.39 MiB | 574.00 KiB/s, done.
|
Receiving objects: 100% (102071/102071), 86.38 MiB | 730.00 KiB/s, done.
|
||||||
Resolving deltas: 100% (48395/48395), done.
|
remote: Total 102071 (delta 4), reused 5 (delta 1), pack-reused 102060
|
||||||
|
Resolving deltas: 100% (76168/76168), done.
|
||||||
Checking connectivity... done.
|
Checking connectivity... done.
|
||||||
$
|
$
|
||||||
----
|
----
|
||||||
@ -72,18 +73,18 @@ v0.12.0rc2
|
|||||||
...
|
...
|
||||||
----
|
----
|
||||||
|
|
||||||
The list of tags shows all the released versions of bitcoin. By convention, _release candidates_, which are intended for testing, have the suffix "rc." Stable releases that can be run on production systems have no suffix. From the preceding list, select the highest version release, which at the time of writing was v0.11.2. To synchronize the local code with this version, use the +git checkout+ command:
|
The list of tags shows all the released versions of bitcoin. By convention, _release candidates_, which are intended for testing, have the suffix "rc." Stable releases that can be run on production systems have no suffix. From the preceding list, select the highest version release, which at the time of writing was v0.15.0. To synchronize the local code with this version, use the +git checkout+ command:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ git checkout v0.11.2
|
$ git checkout v0.15.0
|
||||||
HEAD is now at 7e27892... Merge pull request #6975
|
HEAD is now at 3751912... Merge #11295: doc: Old fee_estimates.dat are discarded by 0.15.0
|
||||||
----
|
----
|
||||||
|
|
||||||
You can confirm you have the desired version "checked out" by issuing the command +git status+:
|
You can confirm you have the desired version "checked out" by issuing the command +git status+:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ git status
|
$ git status
|
||||||
HEAD detached at v0.11.2
|
HEAD detached at v0.15.0
|
||||||
nothing to commit, working directory clean
|
nothing to commit, working directory clean
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -93,11 +94,6 @@ nothing to commit, working directory clean
|
|||||||
|
|
||||||
Carefully review the build prerequisites, which are in the first part of the build documentation. These are libraries that must be present on your system before you can begin to compile bitcoin. If these prerequisites are missing, the build process will fail with an error. If this happens because you missed a prerequisite, you can install it and then resume the build process from where you left off. Assuming the prerequisites are installed, you start the build process by generating a set of build scripts using the _autogen.sh_ script.
|
Carefully review the build prerequisites, which are in the first part of the build documentation. These are libraries that must be present on your system before you can begin to compile bitcoin. If these prerequisites are missing, the build process will fail with an error. If this happens because you missed a prerequisite, you can install it and then resume the build process from where you left off. Assuming the prerequisites are installed, you start the build process by generating a set of build scripts using the _autogen.sh_ script.
|
||||||
|
|
||||||
[NOTE]
|
|
||||||
====
|
|
||||||
((("autogen/configure/make system", seealso="Bitcoin Core")))The Bitcoin Core build process was changed to use the autogen/configure/make system starting with version 0.9. Older versions use a simple Makefile and work slightly differently from the following example. Follow the instructions for the version you want to compile. The autogen/configure/make introduced in 0.9 is likely to be the build system used for all future versions of the code and is the system demonstrated in the following examples.
|
|
||||||
====
|
|
||||||
|
|
||||||
----
|
----
|
||||||
$ ./autogen.sh
|
$ ./autogen.sh
|
||||||
...
|
...
|
||||||
@ -119,7 +115,7 @@ The _autogen.sh_ script creates a set of automatic configuration scripts that wi
|
|||||||
|
|
||||||
----
|
----
|
||||||
$ ./configure --help
|
$ ./configure --help
|
||||||
`configure' configures Bitcoin Core 0.11.2 to adapt to many kinds of systems.
|
`configure' configures Bitcoin Core 0.15.0 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: ./configure [OPTION]... [VAR=VALUE]...
|
Usage: ./configure [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@ -198,10 +194,10 @@ Making all in src
|
|||||||
$
|
$
|
||||||
----
|
----
|
||||||
|
|
||||||
If all goes well, Bitcoin Core is now compiled. The final step is to install the various executables on your system using the +sudo make install+ command. You may be prompted for your user password, because this step requires administrative privileges:
|
On a fast system with more than one CPU, you might want to set the number of parallel compile jobs. For instance, +make -j 2+ will use two cores if they are available. If all goes well, Bitcoin Core is now compiled. You should run the unit test suite with +make check+ to ensure the linked libraries are not broken in obvious ways. The final step is to install the various executables on your system using the +make install+ command. You may be prompted for your user password, because this step requires administrative privileges:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ sudo make install
|
$ make check && sudo make install
|
||||||
Password:
|
Password:
|
||||||
Making install in src
|
Making install in src
|
||||||
../build-aux/install-sh -c -d '/usr/local/lib'
|
../build-aux/install-sh -c -d '/usr/local/lib'
|
||||||
@ -247,43 +243,28 @@ Why would you want to run a node? Here are some of the most common reasons:
|
|||||||
|
|
||||||
If you're reading this book and interested in developing bitcoin software, you should be running your own node.
|
If you're reading this book and interested in developing bitcoin software, you should be running your own node.
|
||||||
|
|
||||||
==== Running Bitcoin Core for the First Time
|
|
||||||
|
|
||||||
((("security", see="also warnings and cautions")))((("passwords", "core node first run")))((("Bitcoin Core", "running core nodes", "first run")))When you first run +bitcoind+, it will remind you to create a configuration file with a strong password for the JSON-RPC interface. This password controls access to the application programming interface (API) offered by Bitcoin Core.
|
|
||||||
|
|
||||||
Run +bitcoind+ by typing ++**bitcoind**++ into the terminal:
|
|
||||||
|
|
||||||
----
|
|
||||||
$ bitcoind
|
|
||||||
Error: To use the "-server" option, you must set a rpcpassword in the configuration file:
|
|
||||||
/home/ubuntu/.bitcoin/bitcoin.conf
|
|
||||||
It is recommended you use the following random password:
|
|
||||||
rpcuser=bitcoinrpc
|
|
||||||
rpcpassword=2XA4DuKNCbtZXsBQRRNDEwEY2nM6M4H9Tx5dFjoAVVbK
|
|
||||||
(you do not need to remember this password)
|
|
||||||
The username and password MUST NOT be the same.
|
|
||||||
If the file does not exist, create it with owner-readable-only file permissions.
|
|
||||||
It is also recommended to set alertnotify so you are notified of problems;
|
|
||||||
for example: alertnotify=echo %s | mail -s "Bitcoin Alert" admin@foo.com
|
|
||||||
----
|
|
||||||
|
|
||||||
As you can see, the first time you run +bitcoind+ it tells you that you need to build a configuration file, with at least an +rpcuser+ and +rpcpassword+ entry. Additionally, it is recommended that you set up the alerting mechanism. In the next section we will examine the various configuration options and set up a configuration file.
|
|
||||||
|
|
||||||
==== Configuring the Bitcoin Core Node
|
==== Configuring the Bitcoin Core Node
|
||||||
|
|
||||||
((("Bitcoin Core", "running core nodes", "configuring")))((("warnings and cautions", "password creation")))((("passwords", "creating")))((("security", "passwords")))Edit the configuration file in your preferred editor and set the parameters, replacing the password with a strong password as recommended by +bitcoind+. Do _not_ use the password shown in the book. Create a file inside the _.bitcoin_ directory (under your user's home directory) so that it is named _.bitcoin/bitcoin.conf_ and provide a username and password:
|
((("Bitcoin Core", "running core nodes", "configuring")))((("warnings and cautions", "password creation")))((("passwords", "creating")))((("security", "passwords")))Bitcoin Core will look for a configuration file in its data directory on every start. In this section we will examine the various configuration options and set up a configuration file. To locate the configuration file, run +bitcoind -printtoconsole+ in your terminal and look for the first couple of lines.
|
||||||
|
|
||||||
[source,ini]
|
|
||||||
----
|
|
||||||
rpcuser=bitcoinrpc
|
|
||||||
rpcpassword=CHANGE_THIS
|
|
||||||
----
|
|
||||||
|
|
||||||
In addition to the +rpcuser+ and +rpcpassword+ options, Bitcoin Core offers more than 100 configuration options that modify the behavior of the network node, the storage of the blockchain, and many other aspects of its operation. To see a listing of these options, run +bitcoind --help+:
|
|
||||||
|
|
||||||
----
|
----
|
||||||
bitcoind --help
|
$ bitcoind -printtoconsole
|
||||||
Bitcoin Core Daemon version v0.11.2
|
Bitcoin version v0.15.0
|
||||||
|
Using the 'standard' SHA256 implementation
|
||||||
|
Using data directory /home/ubuntu/.bitcoin/
|
||||||
|
Using config file /home/ubuntu/.bitcoin/bitcoin.conf
|
||||||
|
...
|
||||||
|
[a lot more debug output]
|
||||||
|
...
|
||||||
|
----
|
||||||
|
|
||||||
|
You can hit Ctrl-C to shutdown the node once you determined the location of the config file. Usually the configuration file is inside the _.bitcoin_ data directory under your user's home directory. Open the configuration file in your preferred editor.
|
||||||
|
|
||||||
|
Bitcoin Core offers more than 100 configuration options that modify the behavior of the network node, the storage of the blockchain, and many other aspects of its operation. To see a listing of these options, run +bitcoind --help+:
|
||||||
|
|
||||||
|
----
|
||||||
|
$ bitcoind --help
|
||||||
|
Bitcoin Core Daemon version v0.15.0
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
bitcoind [options] Start Bitcoin Core Daemon
|
bitcoind [options] Start Bitcoin Core Daemon
|
||||||
@ -291,10 +272,10 @@ Usage:
|
|||||||
Options:
|
Options:
|
||||||
|
|
||||||
-?
|
-?
|
||||||
This help message
|
Print this help message and exit
|
||||||
|
|
||||||
-alerts
|
-version
|
||||||
Receive and display P2P network alerts (default: 1)
|
Print version and exit
|
||||||
|
|
||||||
-alertnotify=<cmd>
|
-alertnotify=<cmd>
|
||||||
Execute command when a relevant alert is received or we see a really
|
Execute command when a relevant alert is received or we see a really
|
||||||
@ -303,9 +284,8 @@ Options:
|
|||||||
[many more options]
|
[many more options]
|
||||||
...
|
...
|
||||||
|
|
||||||
-rpcsslciphers=<ciphers>
|
-rpcthreads=<n>
|
||||||
Acceptable ciphers (default:
|
Set the number of threads to service RPC calls (default: 4)
|
||||||
TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)
|
|
||||||
----
|
----
|
||||||
|
|
||||||
((("configuration options", seealso="Bitcoin Core")))Here are some of the most important options that you can set in the configuration file, or as command-line parameters to +bitcoind+:
|
((("configuration options", seealso="Bitcoin Core")))Here are some of the most important options that you can set in the configuration file, or as command-line parameters to +bitcoind+:
|
||||||
@ -320,13 +300,15 @@ prune:: Reduce the disk space requirements to this many megabytes, by deleting o
|
|||||||
|
|
||||||
txindex:: Maintain an index of all transactions. This means a complete copy of the blockchain that allows you to programmatically retrieve any transaction by ID.
|
txindex:: Maintain an index of all transactions. This means a complete copy of the blockchain that allows you to programmatically retrieve any transaction by ID.
|
||||||
|
|
||||||
|
dbcache:: The size of the UTXO cache. The default is 300 MiB. Increase this on high-end hardware and reduce the size on low-end hardware to save memory at the expense of slow disk IO.
|
||||||
|
|
||||||
maxconnections:: Set the maximum number of nodes from which to accept connections. Reducing this from the default will reduce your bandwidth consumption. Use if you have a data cap or pay by the gigabyte.
|
maxconnections:: Set the maximum number of nodes from which to accept connections. Reducing this from the default will reduce your bandwidth consumption. Use if you have a data cap or pay by the gigabyte.
|
||||||
|
|
||||||
maxmempool:: Limit the transaction memory pool to this many megabytes. Use it to reduce memory use of the node.
|
maxmempool:: Limit the transaction memory pool to this many megabytes. Use it to reduce memory use on memory-constrained nodes.
|
||||||
|
|
||||||
maxreceivebuffer/maxsendbuffer:: Limit per-connection memory buffer to this many multiples of 1000 bytes. Use on memory-constrained nodes.
|
maxreceivebuffer/maxsendbuffer:: Limit per-connection memory buffer to this many multiples of 1000 bytes. Use on memory-constrained nodes.
|
||||||
|
|
||||||
minrelaytxfee:: Set the minimum fee transaction you will relay. Below this value, the transaction is treated as zero fee. Use this on memory-constrained nodes to reduce the size of the in-memory transaction pool.
|
minrelaytxfee:: Set the minimum fee rate for transaction you will relay. Below this value, the transaction is treated nonstandard, rejected from the transaction pool and not relayed.
|
||||||
|
|
||||||
|
|
||||||
[[txindex]]
|
[[txindex]]
|
||||||
@ -344,8 +326,6 @@ minrelaytxfee:: Set the minimum fee transaction you will relay. Below this value
|
|||||||
alertnotify=myemailscript.sh "Alert: %s"
|
alertnotify=myemailscript.sh "Alert: %s"
|
||||||
datadir=/lotsofspace/bitcoin
|
datadir=/lotsofspace/bitcoin
|
||||||
txindex=1
|
txindex=1
|
||||||
rpcuser=bitcoinrpc
|
|
||||||
rpcpassword=CHANGE_THIS
|
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
@ -358,12 +338,10 @@ rpcpassword=CHANGE_THIS
|
|||||||
alertnotify=myemailscript.sh "Alert: %s"
|
alertnotify=myemailscript.sh "Alert: %s"
|
||||||
maxconnections=15
|
maxconnections=15
|
||||||
prune=5000
|
prune=5000
|
||||||
minrelaytxfee=0.0001
|
dbcache=150
|
||||||
maxmempool=200
|
maxmempool=150
|
||||||
maxreceivebuffer=2500
|
maxreceivebuffer=2500
|
||||||
maxsendbuffer=500
|
maxsendbuffer=500
|
||||||
rpcuser=bitcoinrpc
|
|
||||||
rpcpassword=CHANGE_THIS
|
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
@ -372,26 +350,32 @@ Once you've edited the configuration file and set the options that best represen
|
|||||||
----
|
----
|
||||||
$ bitcoind -printtoconsole
|
$ bitcoind -printtoconsole
|
||||||
|
|
||||||
Bitcoin version v0.11.20.0
|
Bitcoin version v0.15.0
|
||||||
Using OpenSSL version OpenSSL 1.0.2e 3 Dec 2015
|
InitParameterInteraction: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1
|
||||||
Startup time: 2015-01-02 19:56:17
|
Assuming ancestors of block 0000000000000000003b9ce759c2a087d52abc4266f8f4ebd6d768b89defa50a have valid signatures.
|
||||||
Using data directory /tmp/bitcoin
|
Using the 'standard' SHA256 implementation
|
||||||
Using config file /tmp/bitcoin/bitcoin.conf
|
Default data directory /home/ubuntu/.bitcoin
|
||||||
Using at most 125 connections (275 file descriptors available)
|
Using data directory /lotsofspace/.bitcoin
|
||||||
|
Using config file /home/ubuntu/.bitcoin/bitcoin.conf
|
||||||
|
Using at most 125 automatic connections (1048576 file descriptors available)
|
||||||
|
Using 16 MiB out of 32/2 requested for signature cache, able to store 524288 elements
|
||||||
|
Using 16 MiB out of 32/2 requested for script execution cache, able to store 524288 elements
|
||||||
Using 2 threads for script verification
|
Using 2 threads for script verification
|
||||||
scheduler thread start
|
|
||||||
HTTP: creating work queue of depth 16
|
HTTP: creating work queue of depth 16
|
||||||
No rpcpassword set - using random cookie authentication
|
No rpcpassword set - using random cookie authentication
|
||||||
Generated RPC authentication cookie /tmp/bitcoin/.cookie
|
Generated RPC authentication cookie /lotsofspace/.bitcoin/.cookie
|
||||||
HTTP: starting 4 worker threads
|
HTTP: starting 4 worker threads
|
||||||
Bound to [::]:8333
|
init message: Verifying wallet(s)...
|
||||||
Bound to 0.0.0.0:8333
|
Using BerkeleyDB version Berkeley DB 4.8.30: (April 9, 2010)
|
||||||
|
Using wallet wallet.dat
|
||||||
|
CDBEnv::Open: LogDir=/lotsofspace/.bitcoin/database ErrorFile=/lotsofspace/.bitcoin/db.log
|
||||||
|
scheduler thread start
|
||||||
Cache configuration:
|
Cache configuration:
|
||||||
* Using 2.0MiB for block index database
|
* Using 250.0MiB for block index database
|
||||||
* Using 32.5MiB for chain state database
|
* Using 8.0MiB for chain state database
|
||||||
* Using 65.5MiB for in-memory UTXO set
|
* Using 1742.0MiB for in-memory UTXO set (plus up to 286.1MiB of unused mempool space)
|
||||||
init message: Loading block index...
|
init message: Loading block index...
|
||||||
Opening LevelDB in /tmp/bitcoin/blocks/index
|
Opening LevelDB in /lotsofspace/.bitcoin/blocks/index
|
||||||
Opened LevelDB successfully
|
Opened LevelDB successfully
|
||||||
|
|
||||||
[... more startup messages ...]
|
[... more startup messages ...]
|
||||||
@ -401,29 +385,29 @@ You can hit Ctrl-C to interrupt the process once you are satisfied that it is lo
|
|||||||
|
|
||||||
To run Bitcoin Core in the background as a process, start it with the +daemon+ option, as +bitcoind -daemon+.
|
To run Bitcoin Core in the background as a process, start it with the +daemon+ option, as +bitcoind -daemon+.
|
||||||
|
|
||||||
To monitor the progress and runtime status of your bitcoin node, use the command +bitcoin-cli getinfo+:
|
To monitor the progress and runtime status of your bitcoin node, use the command +bitcoin-cli getblockchaininfo+:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ bitcoin-cli getinfo
|
$ bitcoin-cli getblockchaininfo
|
||||||
----
|
----
|
||||||
|
|
||||||
[source,json]
|
[source,json]
|
||||||
----
|
----
|
||||||
{
|
{
|
||||||
"version" : 110200,
|
"chain": "main",
|
||||||
"protocolversion" : 70002,
|
"blocks": 0,
|
||||||
"blocks" : 396328,
|
"headers": 83999,
|
||||||
"timeoffset" : 0,
|
"bestblockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
|
||||||
"connections" : 15,
|
"difficulty": 1,
|
||||||
"proxy" : "",
|
"mediantime": 1231006505,
|
||||||
"difficulty" : 120033340651.23696899,
|
"verificationprogress": 3.783041623201835e-09,
|
||||||
"testnet" : false,
|
"chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
|
||||||
"relayfee" : 0.00010000,
|
"pruned": false,
|
||||||
"errors" : ""
|
[...]
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
This shows a node running Bitcoin Core version 0.11.2, with a blockchain height of 396328 blocks and 15 active network connections.
|
This shows a node with a blockchain height of 0 blocks and 83999 headers. The node currently fetches the block headers of the best chain and afterward continues to download the full blocks.
|
||||||
|
|
||||||
Once you are happy with the configuration options you have selected, you should add bitcoin to the startup scripts in your operating system, so that it runs continuously and restarts when the operating system restarts. You will find a number of example startup scripts for various operating systems in bitcoin's source directory under _contrib/init_ and a _README.md_ file showing which system uses which script.((("", startref="BCnode03")))((("", startref="BNcore03")))
|
Once you are happy with the configuration options you have selected, you should add bitcoin to the startup scripts in your operating system, so that it runs continuously and restarts when the operating system restarts. You will find a number of example startup scripts for various operating systems in bitcoin's source directory under _contrib/init_ and a _README.md_ file showing which system uses which script.((("", startref="BCnode03")))((("", startref="BNcore03")))
|
||||||
|
|
||||||
@ -453,12 +437,12 @@ Each of these commands may take a number of parameters. To get additional help,
|
|||||||
|
|
||||||
----
|
----
|
||||||
$ bitcoin-cli help getblockhash
|
$ bitcoin-cli help getblockhash
|
||||||
getblockhash index
|
getblockhash height
|
||||||
|
|
||||||
Returns hash of block in best-block-chain at index provided.
|
Returns hash of block in best-block-chain at height provided.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
1. index (numeric, required) The block index
|
1. height (numeric, required) The height index
|
||||||
|
|
||||||
Result:
|
Result:
|
||||||
"hash" (string) The block hash
|
"hash" (string) The block hash
|
||||||
@ -481,35 +465,42 @@ In the next sections we will demonstrate some very useful RPC commands and their
|
|||||||
|
|
||||||
==== Getting Information on the Bitcoin Core Client Status
|
==== Getting Information on the Bitcoin Core Client Status
|
||||||
|
|
||||||
((("Bitcoin Core", "Bitcoin Core API", "status information")))Command: +getinfo+
|
((("Bitcoin Core", "Bitcoin Core API", "status information")))Bitcoin Core provides status reports on diffent modules through the JSON-RPC interface. The most important commands include +getblockchaininfo+, +getmempoolinfo+, +getnetworkinfo+ and +getwalletinfo+.
|
||||||
|
|
||||||
Bitcoin's +getinfo+ RPC command displays basic information about the status of the bitcoin network node, the wallet, and the blockchain database. Use +bitcoin-cli+ to run it:
|
Bitcoin's +getblockchaininfo+ RPC command was introduced earlier. The +getnetworkinfo+ command displays basic information about the status of the bitcoin network node. Use +bitcoin-cli+ to run it:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ bitcoin-cli getinfo
|
$ bitcoin-cli getnetworkinfo
|
||||||
----
|
----
|
||||||
[source,json]
|
[source,json]
|
||||||
----
|
----
|
||||||
{
|
"version": 150000,
|
||||||
"version" : 110200,
|
"subversion": "/Satoshi:0.15.0/",
|
||||||
"protocolversion" : 70002,
|
"protocolversion": 70015,
|
||||||
"blocks" : 396367,
|
"localservices": "000000000000000d",
|
||||||
"timeoffset" : 0,
|
"localrelay": true,
|
||||||
"connections" : 15,
|
"timeoffset": 0,
|
||||||
"proxy" : "",
|
"networkactive": true,
|
||||||
"difficulty" : 120033340651.23696899,
|
"connections": 8,
|
||||||
"testnet" : false,
|
"networks": [
|
||||||
"relayfee" : 0.00010000,
|
...
|
||||||
"errors" : ""
|
detailed information about all networks (ipv4, ipv6 or onion)
|
||||||
|
...
|
||||||
|
],
|
||||||
|
"relayfee": 0.00001000,
|
||||||
|
"incrementalfee": 0.00001000,
|
||||||
|
"localaddresses": [
|
||||||
|
],
|
||||||
|
"warnings": ""
|
||||||
}
|
}
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
The data is returned in JavaScript Object Notation (JSON), a format that can easily be "consumed" by all programming languages but is also quite human-readable. Among this data we see the version numbers for the bitcoin software client (110200) and bitcoin protocol (70002). We see the current block height, showing us how many blocks are known to this client (396367). We also see various statistics about the bitcoin network and the settings related to this client.
|
The data is returned in JavaScript Object Notation (JSON), a format that can easily be "consumed" by all programming languages but is also quite human-readable. Among this data we see the version numbers for the bitcoin software client (150000) and bitcoin protocol (70015). We see the current number of connections (8) and various information about the bitcoin network and the settings related to this client.
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
It will take some time, perhaps more than a day, for the +bitcoind+ client to "catch up" to the current blockchain height as it downloads blocks from other bitcoin clients. You can check its progress using +getinfo+ to see the number of known blocks.
|
It will take some time, perhaps more than a day, for the +bitcoind+ client to "catch up" to the current blockchain height as it downloads blocks from other bitcoin clients. You can check its progress using +getblockchaininfo+ to see the number of known blocks.
|
||||||
====
|
====
|
||||||
|
|
||||||
[[exploring_and_decoding_transanctions]]
|
[[exploring_and_decoding_transanctions]]
|
||||||
@ -609,7 +600,7 @@ d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8&#x
|
|||||||
</pre>
|
</pre>
|
||||||
++++
|
++++
|
||||||
|
|
||||||
The transaction decode shows all the components of this transaction, including the transaction inputs and outputs. In this case we see that the transaction that credited our new address with 50 millibits used one input and generated two outputs. The input to this transaction was the output from a previously confirmed transaction (shown as the vin txid starting with +7957a35fe+). The two outputs correspond to the 50 millibit credit and an output with change back to the sender.
|
The transaction decode shows all the components of this transaction, including the transaction inputs and outputs. In this case we see that the transaction that credited our new address with 15 millibits used one input and generated two outputs. The input to this transaction was the output from a previously confirmed transaction (shown as the vin txid starting with +7957a35fe+). The two outputs correspond to the 15 millibit credit and an output with change back to the sender.
|
||||||
|
|
||||||
We can further explore the blockchain by examining the previous transaction referenced by its txid in this transaction using the same commands (e.g., +getrawtransaction+). Jumping from transaction to transaction we can follow a chain of transactions back as the coins are transmitted from owner address to owner address.
|
We can further explore the blockchain by examining the previous transaction referenced by its txid in this transaction using the same commands (e.g., +getrawtransaction+). Jumping from transaction to transaction we can follow a chain of transactions back as the coins are transmitted from owner address to owner address.
|
||||||
|
|
||||||
@ -688,19 +679,21 @@ Bitcoin Core's API is a JSON-RPC interface. JSON stands for JavaScript Object No
|
|||||||
When we used the +bitcoin-cli+ command to get help on a command, it showed us an example of using +curl+, the versatile command-line HTTP client to construct one of these JSON-RPC calls:
|
When we used the +bitcoin-cli+ command to get help on a command, it showed us an example of using +curl+, the versatile command-line HTTP client to construct one of these JSON-RPC calls:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getinfo", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/
|
$ curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockchaininfo", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/
|
||||||
----
|
----
|
||||||
|
|
||||||
This command shows that +curl+ submits an HTTP request to the local host (127.0.0.1), connecting to the default bitcoin port (8332), and submitting a +jsonrpc+ request for the +getinfo+ method using +text/plain+ encoding.
|
This command shows that +curl+ submits an HTTP request to the local host (127.0.0.1), connecting to the default bitcoin port (8332), and submitting a +jsonrpc+ request for the +getblockchaininfo+ method using +text/plain+ encoding.
|
||||||
|
|
||||||
|
You might notice that curl will ask for credentials to be sent along with the request. Bitcoin Core will create a random password on each start and place it in the data directory under the name +.cookie+. The +bitcoin-cli+ helper can read this password file given the data directory. Similarly, you can copy the password and pass it to curl (or any higher level Bitcoin Core RPC wrappers). Alternatively, you can create a static password with the helper script provided in _./share/rpcuser/rpcuser.py_ in Bitcoin Core's source directory.
|
||||||
|
|
||||||
If you're implementing a JSON-RPC call in your own program, you can use a generic HTTP library to construct the call, similar to what is shown in the preceding +curl+ example.
|
If you're implementing a JSON-RPC call in your own program, you can use a generic HTTP library to construct the call, similar to what is shown in the preceding +curl+ example.
|
||||||
|
|
||||||
However, there are libraries in most every programming language that "wrap" the Bitcoin Core API in a way that makes this a lot simpler. We will use the +python-bitcoinlib+ library to simplify API access. Remember, this requires you to have a running Bitcoin Core instance, which will be used to make JSON-RPC calls.
|
However, there are libraries in most every programming language that "wrap" the Bitcoin Core API in a way that makes this a lot simpler. We will use the +python-bitcoinlib+ library to simplify API access. Remember, this requires you to have a running Bitcoin Core instance, which will be used to make JSON-RPC calls.
|
||||||
|
|
||||||
The Python script in <<rpc_example>> makes a simple +getinfo+ call and prints the +block+ parameter from the data returned by Bitcoin Core.
|
The Python script in <<rpc_example>> makes a simple +getblockchaininfo+ call and prints the +block+ parameter from the data returned by Bitcoin Core.
|
||||||
|
|
||||||
[[rpc_example]]
|
[[rpc_example]]
|
||||||
.Running getinfo via Bitcoin Core's JSON-RPC API
|
.Running getblockchaininfo via Bitcoin Core's JSON-RPC API
|
||||||
====
|
====
|
||||||
[source,python]
|
[source,python]
|
||||||
----
|
----
|
||||||
@ -781,6 +774,9 @@ https://github.com/bitcoinjs/bitcoinjs-lib[BitcoinJS] :: A pure JavaScript Bitco
|
|||||||
https://bitcoinj.github.io[bitcoinj]:: A Java full-node client library
|
https://bitcoinj.github.io[bitcoinj]:: A Java full-node client library
|
||||||
https://bitsofproof.com[Bits of Proof (BOP)]:: A Java enterprise-class implementation of bitcoin
|
https://bitsofproof.com[Bits of Proof (BOP)]:: A Java enterprise-class implementation of bitcoin
|
||||||
|
|
||||||
|
==== PHP
|
||||||
|
https://github.com/bit-wasp/bitcoin-php[bitwasp/bitcoin]:: A PHP bitcoin library, and related projects
|
||||||
|
|
||||||
==== Python
|
==== Python
|
||||||
https://github.com/petertodd/python-bitcoinlib[python-bitcoinlib]:: A Python bitcoin library, consensus library, and node by Peter Todd
|
https://github.com/petertodd/python-bitcoinlib[python-bitcoinlib]:: A Python bitcoin library, consensus library, and node by Peter Todd
|
||||||
https://github.com/richardkiss/pycoin[pycoin]:: A Python bitcoin library by Richard Kiss
|
https://github.com/richardkiss/pycoin[pycoin]:: A Python bitcoin library by Richard Kiss
|
||||||
|
@ -60,7 +60,7 @@ The bitcoin private key is just a number. You can pick your private keys randoml
|
|||||||
|
|
||||||
The first and most important step in generating keys is to find a secure source of entropy, or randomness. Creating a bitcoin key is essentially the same as "Pick a number between 1 and 2^256^." The exact method you use to pick that number does not matter as long as it is not predictable or repeatable. Bitcoin software uses the underlying operating system's random number generators to produce 256 bits of entropy (randomness). Usually, the OS random number generator is initialized by a human source of randomness, which is why you may be asked to wiggle your mouse around for a few seconds.
|
The first and most important step in generating keys is to find a secure source of entropy, or randomness. Creating a bitcoin key is essentially the same as "Pick a number between 1 and 2^256^." The exact method you use to pick that number does not matter as long as it is not predictable or repeatable. Bitcoin software uses the underlying operating system's random number generators to produce 256 bits of entropy (randomness). Usually, the OS random number generator is initialized by a human source of randomness, which is why you may be asked to wiggle your mouse around for a few seconds.
|
||||||
|
|
||||||
More precisely, the private key can be any number between +1+ and +n - 1+, where n is a constant (n = 1.158 * 10^77^, slightly less than 2^256^) defined as the order of the elliptic curve used in bitcoin (see <<elliptic_curve>>). To create such a key, we randomly pick a 256-bit number and check that it is less than +n - 1+. In programming terms, this is usually achieved by feeding a larger string of random bits, collected from a cryptographically secure source of randomness, into the SHA256 hash algorithm, which will conveniently produce a 256-bit number. If the result is less than +n - 1+, we have a suitable private key. Otherwise, we simply try again with another random number.
|
More precisely, the private key can be any number between +0+ and +n - 1+ inclusive, where n is a constant (n = 1.158 * 10^77^, slightly less than 2^256^) defined as the order of the elliptic curve used in bitcoin (see <<elliptic_curve>>). To create such a key, we randomly pick a 256-bit number and check that it is less than +n+. In programming terms, this is usually achieved by feeding a larger string of random bits, collected from a cryptographically secure source of randomness, into the SHA256 hash algorithm, which will conveniently produce a 256-bit number. If the result is less than +n+, we have a suitable private key. Otherwise, we simply try again with another random number.
|
||||||
|
|
||||||
[WARNING]
|
[WARNING]
|
||||||
====
|
====
|
||||||
@ -650,7 +650,7 @@ script hash = RIPEMD160(SHA256(script))
|
|||||||
The resulting "script hash" is encoded with Base58Check with a version prefix of 5, which results in an encoded address starting with a +3+. An example of a P2SH address is +3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM+, which can be derived using the Bitcoin Explorer commands +script-encode+, +sha256+, +ripemd160+, and +base58check-encode+ (see <<appdx_bx>>) as follows:
|
The resulting "script hash" is encoded with Base58Check with a version prefix of 5, which results in an encoded address starting with a +3+. An example of a P2SH address is +3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM+, which can be derived using the Bitcoin Explorer commands +script-encode+, +sha256+, +ripemd160+, and +base58check-encode+ (see <<appdx_bx>>) as follows:
|
||||||
|
|
||||||
----
|
----
|
||||||
$ echo dup hash160 [ 89abcdefabbaabbaabbaabbaabbaabbaabbaabba ] equalverify checksig > script
|
$ echo dup hash160 [89abcdefabbaabbaabbaabbaabbaabbaabbaabba] equalverify checksig > script
|
||||||
$ bx script-encode < script | bx sha256 | bx ripemd160 | bx base58check-encode --version 5
|
$ bx script-encode < script | bx sha256 | bx ripemd160 | bx base58check-encode --version 5
|
||||||
3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM
|
3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM
|
||||||
----
|
----
|
||||||
|
118
ch05.asciidoc
118
ch05.asciidoc
@ -1,17 +1,17 @@
|
|||||||
[[ch05_wallets]]
|
[[ch05_wallets]]
|
||||||
== Wallets
|
== Wallets
|
||||||
|
|
||||||
((("wallets", "defined")))The word "wallet" is used to describe a few different things in bitcoin.
|
((("wallets", "defined")))The word "wallet" is used to describe a few different things in bitcoin.
|
||||||
|
|
||||||
At a high level, a wallet is an application that serves as the primary user interface. The wallet controls access to a user's money, managing keys and addresses, tracking the balance, and creating and signing transactions.
|
At a high level, a wallet is an application that serves as the primary user interface. The wallet controls access to a user's money, managing keys and addresses, tracking the balance, and creating and signing transactions.
|
||||||
|
|
||||||
More narrowly, from a programmer's perspective, the word "wallet" refers to the data structure used to store and manage a user's keys.
|
More narrowly, from a programmer's perspective, the word "wallet" refers to the data structure used to store and manage a user's keys.
|
||||||
|
|
||||||
In this chapter we will look at the second meaning, where wallets are containers for private keys, usually implemented as structured files or simple databases.
|
In this chapter we will look at the second meaning, where wallets are containers for private keys, usually implemented as structured files or simple databases.
|
||||||
|
|
||||||
=== Wallet Technology Overview
|
=== Wallet Technology Overview
|
||||||
|
|
||||||
In this section we summarize the various technologies used to construct user-friendly, secure, and flexible bitcoin wallets.
|
In this section we summarize the various technologies used to construct user-friendly, secure, and flexible bitcoin wallets.
|
||||||
|
|
||||||
((("wallets", "contents of")))A common misconception about bitcoin is that bitcoin wallets contain bitcoin. In fact, the wallet contains only keys. The "coins" are recorded in the blockchain on the bitcoin network. Users control the coins on the network by signing transactions with the keys in their wallets. ((("keychains")))In a sense, a bitcoin wallet is a _keychain_.
|
((("wallets", "contents of")))A common misconception about bitcoin is that bitcoin wallets contain bitcoin. In fact, the wallet contains only keys. The "coins" are recorded in the blockchain on the bitcoin network. Users control the coins on the network by signing transactions with the keys in their wallets. ((("keychains")))In a sense, a bitcoin wallet is a _keychain_.
|
||||||
|
|
||||||
@ -20,15 +20,15 @@ In this section we summarize the various technologies used to construct user-fri
|
|||||||
Bitcoin wallets contain keys, not coins. Each user has a wallet containing keys. Wallets are really keychains containing pairs of private/public keys (see <<private_public_keys>>). Users sign transactions with the keys, thereby proving they own the transaction outputs (their coins). The coins are stored on the blockchain in the form of transaction outputs (often noted as vout or txout).
|
Bitcoin wallets contain keys, not coins. Each user has a wallet containing keys. Wallets are really keychains containing pairs of private/public keys (see <<private_public_keys>>). Users sign transactions with the keys, thereby proving they own the transaction outputs (their coins). The coins are stored on the blockchain in the form of transaction outputs (often noted as vout or txout).
|
||||||
====
|
====
|
||||||
|
|
||||||
((("wallets", "types of", "primary distinctions")))There are two primary types of wallets, distinguished by whether the keys they contain are related to each other or not.
|
((("wallets", "types of", "primary distinctions")))There are two primary types of wallets, distinguished by whether the keys they contain are related to each other or not.
|
||||||
|
|
||||||
((("JBOK wallets", seealso="wallets")))((("wallets", "types of", "JBOK wallets")))((("nondeterministic wallets", seealso="wallets")))The first type is a _nondeterministic wallet_, where each key is independently generated from a random number. The keys are not related to each other. This type of wallet is also known as a JBOK wallet from the phrase "Just a Bunch Of Keys."
|
((("JBOK wallets", seealso="wallets")))((("wallets", "types of", "JBOK wallets")))((("nondeterministic wallets", seealso="wallets")))The first type is a _nondeterministic wallet_, where each key is independently generated from a random number. The keys are not related to each other. This type of wallet is also known as a JBOK wallet from the phrase "Just a Bunch Of Keys."
|
||||||
|
|
||||||
((("deterministic wallets", seealso="wallets")))The second type of wallet is a _deterministic wallet_, where all the keys are derived from a single master key, known as the _seed_. All the keys in this type of wallet are related to each other and can be generated again if one has the original seed. ((("key derivation methods")))There are a number of different _key derivation_ methods used in deterministic wallets. ((("hierarchical deterministic (HD) wallets", seealso="wallets")))The most commonly used derivation method uses a tree-like structure and is known as a _hierarchical deterministic_ or _HD_ wallet.
|
((("deterministic wallets", seealso="wallets")))The second type of wallet is a _deterministic wallet_, where all the keys are derived from a single master key, known as the _seed_. All the keys in this type of wallet are related to each other and can be generated again if one has the original seed. ((("key derivation methods")))There are a number of different _key derivation_ methods used in deterministic wallets. ((("hierarchical deterministic (HD) wallets", seealso="wallets")))The most commonly used derivation method uses a tree-like structure and is known as a _hierarchical deterministic_ or _HD_ wallet.
|
||||||
|
|
||||||
((("mnemonic code words")))Deterministic wallets are initialized from a seed. To make these easier to use, seeds are encoded as English words, also known as _mnemonic code words_.
|
((("mnemonic code words")))Deterministic wallets are initialized from a seed. To make these easier to use, seeds are encoded as English words, also known as _mnemonic code words_.
|
||||||
|
|
||||||
The next few sections introduce each of these technologies at a high level.
|
The next few sections introduce each of these technologies at a high level.
|
||||||
|
|
||||||
[[random_wallet]]
|
[[random_wallet]]
|
||||||
==== Nondeterministic (Random) Wallets
|
==== Nondeterministic (Random) Wallets
|
||||||
@ -37,7 +37,7 @@ The next few sections introduce each of these technologies at a high level.
|
|||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
The use of nondeterministic wallets is discouraged for anything other than simple tests. They are simply too cumbersome to back up and use. Instead, use an industry-standard–based _HD wallet_ with a _mnemonic_ seed for backup.
|
The use of nondeterministic wallets is discouraged for anything other than simple tests. They are simply too cumbersome to back up and use. Instead, use an industry-standard–based _HD wallet_ with a _mnemonic_ seed for backup.
|
||||||
====
|
====
|
||||||
|
|
||||||
[[Type0_wallet]]
|
[[Type0_wallet]]
|
||||||
@ -63,9 +63,9 @@ image::images/mbc2_0502.png["Deterministic Wallet"]
|
|||||||
.Type-2 HD wallet: a tree of keys generated from a single seed
|
.Type-2 HD wallet: a tree of keys generated from a single seed
|
||||||
image::images/mbc2_0503.png["HD wallet"]
|
image::images/mbc2_0503.png["HD wallet"]
|
||||||
|
|
||||||
HD wallets offer two major advantages over random (nondeterministic) keys. First, the tree structure can be used to express additional organizational meaning, such as when a specific branch of subkeys is used to receive incoming payments and a different branch is used to receive change from outgoing payments. Branches of keys can also be used in corporate settings, allocating different branches to departments, subsidiaries, specific functions, or accounting categories.
|
HD wallets offer two major advantages over random (nondeterministic) keys. First, the tree structure can be used to express additional organizational meaning, such as when a specific branch of subkeys is used to receive incoming payments and a different branch is used to receive change from outgoing payments. Branches of keys can also be used in corporate settings, allocating different branches to departments, subsidiaries, specific functions, or accounting categories.
|
||||||
|
|
||||||
The second advantage of HD wallets is that users can create a sequence of public keys without having access to the corresponding private keys. This allows HD wallets to be used on an insecure server or in a receive-only capacity, issuing a different public key for each transaction. The public keys do not need to be preloaded or derived in advance, yet the server doesn't have the private keys that can spend the funds.
|
The second advantage of HD wallets is that users can create a sequence of public keys without having access to the corresponding private keys. This allows HD wallets to be used on an insecure server or in a receive-only capacity, issuing a different public key for each transaction. The public keys need to be preloaded or derived in advance, yet the server doesn't have the private keys that can spend the funds.
|
||||||
|
|
||||||
==== Seeds and Mnemonic Codes (BIP-39)
|
==== Seeds and Mnemonic Codes (BIP-39)
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ Let's look at this from a practical perspective. Which of the following seeds is
|
|||||||
|
|
||||||
.A seed for an deterministic wallet, from a 12-word mnemonic
|
.A seed for an deterministic wallet, from a 12-word mnemonic
|
||||||
----
|
----
|
||||||
army van defense carry jealous true
|
army van defense carry jealous true
|
||||||
garbage claim echo media make crunch
|
garbage claim echo media make crunch
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -95,22 +95,22 @@ garbage claim echo media make crunch
|
|||||||
|
|
||||||
These standards may change or may become obsolete by future developments, but for now they form a set of interlocking technologies that have become the de facto wallet standard for bitcoin.
|
These standards may change or may become obsolete by future developments, but for now they form a set of interlocking technologies that have become the de facto wallet standard for bitcoin.
|
||||||
|
|
||||||
The standards have been adopted by a broad range of software and hardware bitcoin wallets, making all these wallets interoperable. A user can export a mnemonic generated on one of these wallets and import it in another wallet, recovering all transactions, keys, and addresses.
|
The standards have been adopted by a broad range of software and hardware bitcoin wallets, making all these wallets interoperable. A user can export a mnemonic generated on one of these wallets and import it in another wallet, recovering all transactions, keys, and addresses.
|
||||||
|
|
||||||
((("hardware wallets")))((("hardware wallets", see="also wallets")))Some example of software wallets supporting these standards include (listed alphabetically) Breadwallet, Copay, Multibit HD, and Mycelium. Examples of hardware wallets supporting these standards include (listed alphabetically) Keepkey, Ledger, and Trezor.
|
((("hardware wallets")))((("hardware wallets", see="also wallets")))Some example of software wallets supporting these standards include (listed alphabetically) Breadwallet, Copay, Multibit HD, and Mycelium. Examples of hardware wallets supporting these standards include (listed alphabetically) Keepkey, Ledger, and Trezor.
|
||||||
|
|
||||||
The following sections examine each of these technologies in detail.
|
The following sections examine each of these technologies in detail.
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
If you are implementing a bitcoin wallet, it should be built as a HD wallet, with a seed encoded as mnemonic code for backup, following the BIP-32, BIP-39, BIP-43, and BIP-44 standards, as described in the following sections.
|
If you are implementing a bitcoin wallet, it should be built as a HD wallet, with a seed encoded as mnemonic code for backup, following the BIP-32, BIP-39, BIP-43, and BIP-44 standards, as described in the following sections.
|
||||||
====
|
====
|
||||||
|
|
||||||
==== Using a Bitcoin Wallet
|
==== Using a Bitcoin Wallet
|
||||||
|
|
||||||
((("wallets", "using bitcoin wallets")))In <<user-stories>> we introduced Gabriel, ((("use cases", "web store", id="gabrielfive")))an enterprising young teenager in Rio de Janeiro, who is running a simple web store that sells bitcoin-branded t-shirts, coffee mugs, and stickers.
|
((("wallets", "using bitcoin wallets")))In <<user-stories>> we introduced Gabriel, ((("use cases", "web store", id="gabrielfive")))an enterprising young teenager in Rio de Janeiro, who is running a simple web store that sells bitcoin-branded t-shirts, coffee mugs, and stickers.
|
||||||
|
|
||||||
((("wallets", "types of", "hardware wallets")))Gabriel uses a Trezor bitcoin hardware wallet (<<a_trezor_device>>) to securely manage his bitcoin. The Trezor is a simple USB device with two buttons that stores keys (in the form of an HD wallet) and signs transactions. Trezor wallets implement all the industry standards discussed in this chapter, so Gabriel is not reliant on any proprietary technology or single vendor solution.
|
((("wallets", "types of", "hardware wallets")))Gabriel uses a Trezor bitcoin hardware wallet (<<a_trezor_device>>) to securely manage his bitcoin. The Trezor is a simple USB device with two buttons that stores keys (in the form of an HD wallet) and signs transactions. Trezor wallets implement all the industry standards discussed in this chapter, so Gabriel is not reliant on any proprietary technology or single vendor solution.
|
||||||
|
|
||||||
[[a_trezor_device]]
|
[[a_trezor_device]]
|
||||||
.A Trezor device: a bitcoin HD wallet in hardware
|
.A Trezor device: a bitcoin HD wallet in hardware
|
||||||
@ -122,7 +122,7 @@ When Gabriel used the Trezor for the first time, the device generated a mnemonic
|
|||||||
.Trezor displaying one of the mnemonic words
|
.Trezor displaying one of the mnemonic words
|
||||||
image::images/mbc2_0505.png["Trezor wallet display of mnemonic word"]
|
image::images/mbc2_0505.png["Trezor wallet display of mnemonic word"]
|
||||||
|
|
||||||
By writing down this mnemonic, Gabriel created a backup (see <<mnemonic_paper_backup>>) that can be used for recovery in the case of loss or damage to the Trezor device. This mnemonic can be used for recovery in a new Trezor or in any one of the many compatible software or hardware wallets. Note that the sequence of words is important, so mnemonic paper backups have numbered spaces for each word. Gabriel had to carefully record each word in the numbered space to preserve the correct sequence.
|
By writing down this mnemonic, Gabriel created a backup (see <<mnemonic_paper_backup>>) that can be used for recovery in the case of loss or damage to the Trezor device. This mnemonic can be used for recovery in a new Trezor or in any one of the many compatible software or hardware wallets. Note that the sequence of words is important, so mnemonic paper backups have numbered spaces for each word. Gabriel had to carefully record each word in the numbered space to preserve the correct sequence.
|
||||||
|
|
||||||
[[mnemonic_paper_backup]]
|
[[mnemonic_paper_backup]]
|
||||||
.Gabriel's paper backup of the mnemonic
|
.Gabriel's paper backup of the mnemonic
|
||||||
@ -150,7 +150,7 @@ Let's now examine each of the important industry standards that are used by many
|
|||||||
[[mnemonic_code_words]]
|
[[mnemonic_code_words]]
|
||||||
==== Mnemonic Code Words (BIP-39)
|
==== Mnemonic Code Words (BIP-39)
|
||||||
|
|
||||||
((("wallets", "technology of", "mnemonic code words")))((("mnemonic code words", id="mnemonic05")))((("bitcoin improvement proposals", "Mnemonic Code Words (BIP-39)", id="BIP3905")))Mnemonic code words are 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 words will show the user a sequence of 12 to 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 words make it easier for users to back up wallets because they are easy to read and correctly transcribe, as compared to a random sequence of numbers.
|
((("wallets", "technology of", "mnemonic code words")))((("mnemonic code words", id="mnemonic05")))((("bitcoin improvement proposals", "Mnemonic Code Words (BIP-39)", id="BIP3905")))Mnemonic code words are 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 words will show the user a sequence of 12 to 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 words make it easier for users to back up wallets because they are easy to read and correctly transcribe, as compared to a random sequence of numbers.
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
@ -158,7 +158,7 @@ Let's now examine each of the important industry standards that are used by many
|
|||||||
====
|
====
|
||||||
|
|
||||||
Mnemonic codes are defined in BIP-39 (see <<appdxbitcoinimpproposals>>). Note that BIP-39 is one implementation of a mnemonic code standard. ((("Electrum wallet", seealso="wallets")))There is a different standard, with a different set of words, used by the Electrum wallet and predating BIP-39. BIP-39 was proposed by the company behind the Trezor hardware wallet and is incompatible with Electrum's implementation. However, BIP-39 has now achieved broad industry support across dozens of interoperable implementations and should be considered the de facto industry standard.
|
Mnemonic codes are defined in BIP-39 (see <<appdxbitcoinimpproposals>>). Note that BIP-39 is one implementation of a mnemonic code standard. ((("Electrum wallet", seealso="wallets")))There is a different standard, with a different set of words, used by the Electrum wallet and predating BIP-39. BIP-39 was proposed by the company behind the Trezor hardware wallet and is incompatible with Electrum's implementation. However, BIP-39 has now achieved broad industry support across dozens of interoperable implementations and should be considered the de facto industry standard.
|
||||||
|
|
||||||
BIP-39 defines the creation of a mnemonic code and seed, which we describe here in nine steps. For clarity, the process is split into two parts: steps 1 through 6 are shown in <<generating_mnemonic_words>> and steps 7 through 9 are shown in <<mnemonic_to_seed>>.
|
BIP-39 defines the creation of a mnemonic code and seed, which we describe here in nine steps. For clarity, the process is split into two parts: steps 1 through 6 are shown in <<generating_mnemonic_words>> and steps 7 through 9 are shown in <<mnemonic_to_seed>>.
|
||||||
|
|
||||||
[[generating_mnemonic_words]]
|
[[generating_mnemonic_words]]
|
||||||
@ -252,7 +252,7 @@ Tables pass:[<a data-type="xref" href="#mnemonic_128_no_pass" data-xrefstyle="se
|
|||||||
[cols="h,"]
|
[cols="h,"]
|
||||||
|=======
|
|=======
|
||||||
| *Entropy input (256 bits)* | +2041546864449caff939d32d574753fe684d3c947c3346713dd8423e74abcf8c+
|
| *Entropy input (256 bits)* | +2041546864449caff939d32d574753fe684d3c947c3346713dd8423e74abcf8c+
|
||||||
| *Mnemonic (24 words)* | +cake apple borrow silk endorse fitness top denial coil riot stay wolf
|
| *Mnemonic (24 words)* | +cake apple borrow silk endorse fitness top denial coil riot stay wolf
|
||||||
luggage oxygen faint major edit measure invite love trap field dilemma oblige+
|
luggage oxygen faint major edit measure invite love trap field dilemma oblige+
|
||||||
| *Passphrase*| (none)
|
| *Passphrase*| (none)
|
||||||
| *Seed (512 bits)* | +3269bce2674acbd188d4f120072b13b088a0ecf87c6e4cae41657a0bb78f5315b33b3a04356e53d062e5+
|
| *Seed (512 bits)* | +3269bce2674acbd188d4f120072b13b088a0ecf87c6e4cae41657a0bb78f5315b33b3a04356e53d062e5+
|
||||||
@ -262,7 +262,7 @@ luggage oxygen faint major edit measure invite love trap field dilemma oblige+
|
|||||||
[[mnemonic_passphrase]]
|
[[mnemonic_passphrase]]
|
||||||
===== Optional passphrase in BIP-39
|
===== Optional passphrase in BIP-39
|
||||||
|
|
||||||
((("passphrases")))The BIP-39 standard allows the use of an optional passphrase in the derivation of the seed. If no passphrase is used, the mnemonic is stretched with a salt consisting of the constant string +"mnemonic"+, producing a specific 512-bit seed from any given mnemonic. If a passphrase is used, the stretching function produces a _different_ seed from that same mnemonic. In fact, given a single mnemonic, every possible passphrase leads to a different seed. Essentially, there is no "wrong" passphrase. All passphrases are valid and they all lead to different seeds, forming a vast set of possible uninitialized wallets. The set of possible wallets is so large (2^512^) that there is no practical possibility of brute-forcing or accidentally guessing one that is in use.
|
((("passphrases")))The BIP-39 standard allows the use of an optional passphrase in the derivation of the seed. If no passphrase is used, the mnemonic is stretched with a salt consisting of the constant string +"mnemonic"+, producing a specific 512-bit seed from any given mnemonic. If a passphrase is used, the stretching function produces a _different_ seed from that same mnemonic. In fact, given a single mnemonic, every possible passphrase leads to a different seed. Essentially, there is no "wrong" passphrase. All passphrases are valid and they all lead to different seeds, forming a vast set of possible uninitialized wallets. The set of possible wallets is so large (2^512^) that there is no practical possibility of brute-forcing or accidentally guessing one that is in use.
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
@ -279,9 +279,9 @@ However, it is important to note that the use of a passphrase also introduces th
|
|||||||
|
|
||||||
* If the wallet owner is incapacitated or dead and no one else knows the passphrase, the seed is useless and all the funds stored in the wallet are lost forever.
|
* If the wallet owner is incapacitated or dead and no one else knows the passphrase, the seed is useless and all the funds stored in the wallet are lost forever.
|
||||||
|
|
||||||
* Conversely, if the owner backs up the passphrase in the same place as the seed, it defeats the purpose of a second factor.
|
* Conversely, if the owner backs up the passphrase in the same place as the seed, it defeats the purpose of a second factor.
|
||||||
|
|
||||||
While passphrases are very useful, they should only be used in combination with a carefully planned process for backup and recovery, considering the possibility of surviving the owner and allowing his or her family to recover the cryptocurrency estate.
|
While passphrases are very useful, they should only be used in combination with a carefully planned process for backup and recovery, considering the possibility of surviving the owner and allowing his or her family to recover the cryptocurrency estate.
|
||||||
|
|
||||||
===== Working with mnemonic codes
|
===== Working with mnemonic codes
|
||||||
|
|
||||||
@ -299,11 +299,11 @@ There is also a BIP-39 generator implemented in a standalone webpage, which is e
|
|||||||
.A BIP-39 generator as a standalone web page
|
.A BIP-39 generator as a standalone web page
|
||||||
image::images/mbc2_0508.png["BIP-39 generator web-page"]
|
image::images/mbc2_0508.png["BIP-39 generator web-page"]
|
||||||
|
|
||||||
((("", startref="mnemonic05")))((("", startref="BIP3905")))The page can be used offline in a browser, or https://dcpos.github.io/bip39/[accessed online].
|
((("", startref="mnemonic05")))((("", startref="BIP3905")))The page ( https://iancoleman.github.io/bip39/) can be used offline in a browser, or accessed online.
|
||||||
|
|
||||||
==== Creating an HD Wallet from the Seed
|
==== Creating an HD Wallet from the Seed
|
||||||
|
|
||||||
((("wallets", "technology of", "creating HD wallets from root seed")))((("root seeds")))((("hierarchical deterministic (HD) wallets")))HD wallets are created from a single _root seed_, which is a 128-, 256-, or 512-bit random number. Most commonly, this seed is generated from a _mnemonic_ as detailed in the previous section.
|
((("wallets", "technology of", "creating HD wallets from root seed")))((("root seeds")))((("hierarchical deterministic (HD) wallets")))HD wallets are created from a single _root seed_, which is a 128-, 256-, or 512-bit random number. Most commonly, this seed is generated from a _mnemonic_ as detailed in the previous section.
|
||||||
|
|
||||||
Every key in the HD wallet is deterministically derived from this root seed, which makes it possible to re-create the entire HD wallet from that seed in any compatible HD wallet. This makes it easy to back up, restore, export, and import HD wallets containing thousands or even millions of keys by simply transferring only the mnemonic that the root seed is derived from.
|
Every key in the HD wallet is deterministically derived from this root seed, which makes it possible to re-create the entire HD wallet from that seed in any compatible HD wallet. This makes it easy to back up, restore, export, and import HD wallets containing thousands or even millions of keys by simply transferring only the mnemonic that the root seed is derived from.
|
||||||
|
|
||||||
@ -313,7 +313,7 @@ The process of creating the master keys and master chain code for an HD wallet i
|
|||||||
.Creating master keys and chain code from a root seed
|
.Creating master keys and chain code from a root seed
|
||||||
image::images/mbc2_0509.png["HDWalletFromRootSeed"]
|
image::images/mbc2_0509.png["HDWalletFromRootSeed"]
|
||||||
|
|
||||||
The root seed is input into the HMAC-SHA512 algorithm and the resulting hash is used to create a _master private key_ (m) and a _master chain code_ (c).
|
The root seed is input into the HMAC-SHA512 algorithm and the resulting hash is used to create a _master private key_ (m) and a _master chain code_ (c).
|
||||||
|
|
||||||
The master private key (m) then generates a corresponding master public key (M) using the normal elliptic curve multiplication process +m * G+ that we saw in <<pubkey>>.
|
The master private key (m) then generates a corresponding master public key (M) using the normal elliptic curve multiplication process +m * G+ that we saw in <<pubkey>>.
|
||||||
|
|
||||||
@ -321,19 +321,19 @@ The chain code (c) is used to introduce entropy in the function that creates chi
|
|||||||
|
|
||||||
===== Private child key derivation
|
===== Private child key derivation
|
||||||
|
|
||||||
((("child key derivation (CKD)")))((("public and private keys", "child key derivation (CKD)")))HD wallets use a _child key derivation_ (CKD) function to derive child keys from parent keys.
|
((("child key derivation (CKD)")))((("public and private keys", "child key derivation (CKD)")))HD wallets use a _child key derivation_ (CKD) function to derive child keys from parent keys.
|
||||||
|
|
||||||
The child key derivation functions are based on a one-way hash function that combines:
|
The child key derivation functions are based on a one-way hash function that combines:
|
||||||
|
|
||||||
* A parent private or public key (ECDSA uncompressed key)
|
* A parent private or public key (ECDSA uncompressed key)
|
||||||
* A seed called a chain code (256 bits)
|
* A seed called a chain code (256 bits)
|
||||||
* An index number (32 bits)
|
* An index number (32 bits)
|
||||||
|
|
||||||
The chain code is used to introduce deterministic random data to the process, so that knowing the index and a child key is not sufficient to derive other child keys. Knowing a child key does not make it possible to find its siblings, unless you also have the chain code. The initial chain code seed (at the root of the tree) is made from the seed, while subsequent child chain codes are derived from each parent chain code.
|
The chain code is used to introduce deterministic random data to the process, so that knowing the index and a child key is not sufficient to derive other child keys. Knowing a child key does not make it possible to find its siblings, unless you also have the chain code. The initial chain code seed (at the root of the tree) is made from the seed, while subsequent child chain codes are derived from each parent chain code.
|
||||||
|
|
||||||
These three items (parent key, chain code, and index) are combined and hashed to generate children keys, as follows.
|
These three items (parent key, chain code, and index) are combined and hashed to generate children keys, as follows.
|
||||||
|
|
||||||
The parent public key, chain code, and the index number are combined and hashed with the HMAC-SHA512 algorithm to produce a 512-bit hash. This 512-bit hash is split into two 256-bit halves. The right-half 256 bits of the hash output become the chain code for the child. The left-half 256 bits of the hash and the index number are added to the parent private key to produce the child private key. In <<CKDpriv>>, we see this illustrated with the index set to 0 to produce the "zero" (first by index) child of the parent.
|
The parent public key, chain code, and the index number are combined and hashed with the HMAC-SHA512 algorithm to produce a 512-bit hash. This 512-bit hash is split into two 256-bit halves. The right-half 256 bits of the hash output become the chain code for the child. The left-half 256 bits of the hash are added to the parent private key to produce the child private key. In <<CKDpriv>>, we see this illustrated with the index set to 0 to produce the "zero" (first by index) child of the parent.
|
||||||
|
|
||||||
[[CKDpriv]]
|
[[CKDpriv]]
|
||||||
.Extending a parent private key to create a child private key
|
.Extending a parent private key to create a child private key
|
||||||
@ -341,22 +341,22 @@ image::images/mbc2_0510.png["ChildPrivateDerivation"]
|
|||||||
|
|
||||||
Changing the index allows us to extend the parent and create the other children in the sequence, e.g., Child 0, Child 1, Child 2, etc. Each parent key can have 2,147,483,647 (2^31^) children (2^31^ is half of the entire 2^32^ range available because the other half is reserved for a special type of derivation we will talk about later in this chapter).
|
Changing the index allows us to extend the parent and create the other children in the sequence, e.g., Child 0, Child 1, Child 2, etc. Each parent key can have 2,147,483,647 (2^31^) children (2^31^ is half of the entire 2^32^ range available because the other half is reserved for a special type of derivation we will talk about later in this chapter).
|
||||||
|
|
||||||
Repeating the process one level down the tree, each child can in turn become a parent and create its own children, in an infinite number of generations.
|
Repeating the process one level down the tree, each child can in turn become a parent and create its own children, in an infinite number of generations.
|
||||||
|
|
||||||
===== Using derived child keys
|
===== Using derived child keys
|
||||||
|
|
||||||
Child private keys are indistinguishable from nondeterministic (random) keys. Because the derivation function is a one-way function, the child key cannot be used to find the parent key. The child key also cannot be used to find any siblings. If you have the n~th~ child, you cannot find its siblings, such as the n–1 child or the n+1 child, or any other children that are part of the sequence. Only the parent key and chain code can derive all the children. Without the child chain code, the child key cannot be used to derive any grandchildren either. You need both the child private key and the child chain code to start a new branch and derive grandchildren.
|
Child private keys are indistinguishable from nondeterministic (random) keys. Because the derivation function is a one-way function, the child key cannot be used to find the parent key. The child key also cannot be used to find any siblings. If you have the n~th~ child, you cannot find its siblings, such as the n–1 child or the n+1 child, or any other children that are part of the sequence. Only the parent key and chain code can derive all the children. Without the child chain code, the child key cannot be used to derive any grandchildren either. You need both the child private key and the child chain code to start a new branch and derive grandchildren.
|
||||||
|
|
||||||
So what can the child private key be used for on its own? It can be used to make a public key and a bitcoin address. Then, it can be used to sign transactions to spend anything paid to that address.
|
So what can the child private key be used for on its own? It can be used to make a public key and a bitcoin address. Then, it can be used to sign transactions to spend anything paid to that address.
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
A child private key, the corresponding public key, and the bitcoin address are all indistinguishable from keys and addresses created randomly. The fact that they are part of a sequence is not visible outside of the HD wallet function that created them. Once created, they operate exactly as "normal" keys.
|
A child private key, the corresponding public key, and the bitcoin address are all indistinguishable from keys and addresses created randomly. The fact that they are part of a sequence is not visible outside of the HD wallet function that created them. Once created, they operate exactly as "normal" keys.
|
||||||
====
|
====
|
||||||
|
|
||||||
===== Extended keys
|
===== Extended keys
|
||||||
|
|
||||||
((("public and private keys", "extended keys")))((("extended keys")))As we saw earlier, the key derivation function can be used to create children at any level of the tree, based on the three inputs: a key, a chain code, and the index of the desired child. The two essential ingredients are the key and chain code, and combined these are called an _extended key_. The term "extended key" could also be thought of as "extensible key" because such a key can be used to derive children.
|
((("public and private keys", "extended keys")))((("extended keys")))As we saw earlier, the key derivation function can be used to create children at any level of the tree, based on the three inputs: a key, a chain code, and the index of the desired child. The two essential ingredients are the key and chain code, and combined these are called an _extended key_. The term "extended key" could also be thought of as "extensible key" because such a key can be used to derive children.
|
||||||
|
|
||||||
Extended keys are stored and represented simply as the concatenation of the 256-bit key and 256-bit chain code into a 512-bit sequence. There are two types of extended keys. An extended private key is the combination of a private key and chain code and can be used to derive child private keys (and from them, child public keys). An extended public key is a public key and chain code, which can be used to create child public keys (_public only_), as described in <<public_key_derivation>>.
|
Extended keys are stored and represented simply as the concatenation of the 256-bit key and 256-bit chain code into a 512-bit sequence. There are two types of extended keys. An extended private key is the combination of a private key and chain code and can be used to derive child private keys (and from them, child public keys). An extended public key is a public key and chain code, which can be used to create child public keys (_public only_), as described in <<public_key_derivation>>.
|
||||||
|
|
||||||
@ -364,8 +364,8 @@ Think of an extended key as the root of a branch in the tree structure of the HD
|
|||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
====
|
====
|
||||||
An extended key consists of a private or public key and chain code. An extended key can create children, generating its own branch in the tree structure. Sharing an extended key gives access to the entire branch.
|
An extended key consists of a private or public key and chain code. An extended key can create children, generating its own branch in the tree structure. Sharing an extended key gives access to the entire branch.
|
||||||
====
|
====
|
||||||
|
|
||||||
Extended keys are encoded using Base58Check, to easily export and import between different BIP-32–compatible wallets. The Base58Check coding for extended keys uses a special version number that results in the prefix "xprv" and "xpub" when encoded in Base58 characters to make them easily recognizable. Because the extended key is 512 or 513 bits, it is also much longer than other Base58Check-encoded strings we have seen previously.
|
Extended keys are encoded using Base58Check, to easily export and import between different BIP-32–compatible wallets. The Base58Check coding for extended keys uses a special version number that results in the prefix "xprv" and "xpub" when encoded in Base58 characters to make them easily recognizable. Because the extended key is 512 or 513 bits, it is also much longer than other Base58Check-encoded strings we have seen previously.
|
||||||
|
|
||||||
@ -384,15 +384,15 @@ xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECeeMVKZBPLr
|
|||||||
[[public__child_key_derivation]]
|
[[public__child_key_derivation]]
|
||||||
===== Public child key derivation
|
===== Public child key derivation
|
||||||
|
|
||||||
((("public and private keys", "public child key derivation")))As mentioned previously, a very useful characteristic of HD wallets is the ability to derive public child keys from public parent keys, _without_ having the private keys. This gives us two ways to derive a child public key: either from the child private key, or directly from the parent public key.
|
((("public and private keys", "public child key derivation")))As mentioned previously, a very useful characteristic of HD wallets is the ability to derive public child keys from public parent keys, _without_ having the private keys. This gives us two ways to derive a child public key: either from the child private key, or directly from the parent public key.
|
||||||
|
|
||||||
An extended public key can be used, therefore, to derive all of the _public_ keys (and only the public keys) in that branch of the HD wallet structure.
|
An extended public key can be used, therefore, to derive all of the _public_ keys (and only the public keys) in that branch of the HD wallet structure.
|
||||||
|
|
||||||
This shortcut can be used to create very secure public key–only deployments where a server or application has a copy of an extended public key and no private keys whatsoever. That kind of deployment can produce an infinite number of public keys and bitcoin addresses, but cannot spend any of the money sent to those addresses. Meanwhile, on another, more secure server, the extended private key can derive all the corresponding private keys to sign transactions and spend the money.
|
This shortcut can be used to create very secure public key–only deployments where a server or application has a copy of an extended public key and no private keys whatsoever. That kind of deployment can produce an infinite number of public keys and bitcoin addresses, but cannot spend any of the money sent to those addresses. Meanwhile, on another, more secure server, the extended private key can derive all the corresponding private keys to sign transactions and spend the money.
|
||||||
|
|
||||||
One common application of this solution is to install an extended public key on a web server that serves an ecommerce application. The web server can use the public key derivation function to create a new bitcoin address for every transaction (e.g., for a customer shopping cart). The web server will not have any private keys that would be vulnerable to theft. Without HD wallets, the only way to do this is to generate thousands of bitcoin addresses on a separate secure server and then preload them on the ecommerce server. That approach is cumbersome and requires constant maintenance to ensure that the ecommerce server doesn't "run out" of keys.
|
One common application of this solution is to install an extended public key on a web server that serves an ecommerce application. The web server can use the public key derivation function to create a new bitcoin address for every transaction (e.g., for a customer shopping cart). The web server will not have any private keys that would be vulnerable to theft. Without HD wallets, the only way to do this is to generate thousands of bitcoin addresses on a separate secure server and then preload them on the ecommerce server. That approach is cumbersome and requires constant maintenance to ensure that the ecommerce server doesn't "run out" of keys.
|
||||||
|
|
||||||
((("cold storage")))((("storage", "cold storage")))((("hardware wallets")))Another common application of this solution is for cold-storage or hardware wallets. In that scenario, the extended private key can be stored on a paper wallet or hardware device (such as a Trezor hardware wallet), while the extended public key can be kept online. The user can create "receive" addresses at will, while the private keys are safely stored offline. To spend the funds, the user can use the extended private key on an offline signing bitcoin client or sign transactions on the hardware wallet device (e.g., Trezor). <<CKDpub>> illustrates the mechanism for extending a parent public key to derive child public keys.
|
((("cold storage")))((("storage", "cold storage")))((("hardware wallets")))Another common application of this solution is for cold-storage or hardware wallets. In that scenario, the extended private key can be stored on a paper wallet or hardware device (such as a Trezor hardware wallet), while the extended public key can be kept online. The user can create "receive" addresses at will, while the private keys are safely stored offline. To spend the funds, the user can use the extended private key on an offline signing bitcoin client or sign transactions on the hardware wallet device (e.g., Trezor). <<CKDpub>> illustrates the mechanism for extending a parent public key to derive child public keys.
|
||||||
|
|
||||||
[[CKDpub]]
|
[[CKDpub]]
|
||||||
.Extending a parent public key to create a child public key
|
.Extending a parent public key to create a child public key
|
||||||
@ -400,9 +400,9 @@ image::images/mbc2_0511.png["ChildPublicDerivation"]
|
|||||||
|
|
||||||
==== Using an Extended Public Key on a Web Store
|
==== Using an Extended Public Key on a Web Store
|
||||||
|
|
||||||
((("wallets", "technology of", "using extended public keys on web stores")))Let's see how HD wallets are used by continuing our story with Gabriel's web store.((("use cases", "web store", id="gabrielfivetwo")))
|
((("wallets", "technology of", "using extended public keys on web stores")))Let's see how HD wallets are used by continuing our story with Gabriel's web store.((("use cases", "web store", id="gabrielfivetwo")))
|
||||||
|
|
||||||
Gabriel first set up his web store as a hobby, based on a simple hosted Wordpress page. His store was quite basic with only a few pages and an order form with a single bitcoin address.
|
Gabriel first set up his web store as a hobby, based on a simple hosted Wordpress page. His store was quite basic with only a few pages and an order form with a single bitcoin address.
|
||||||
|
|
||||||
Gabriel used the first bitcoin address generated by his Trezor device as the main bitcoin address for his store. This way, all incoming payments would be paid to an address controlled by his Trezor hardware wallet.
|
Gabriel used the first bitcoin address generated by his Trezor device as the main bitcoin address for his store. This way, all incoming payments would be paid to an address controlled by his Trezor hardware wallet.
|
||||||
|
|
||||||
@ -422,7 +422,7 @@ Gabriel copies the xpub to his web store's bitcoin shop software. He uses _Mycel
|
|||||||
|
|
||||||
===== Hardened child key derivation
|
===== Hardened child key derivation
|
||||||
|
|
||||||
((("public and private keys", "hardened child key derivation")))((("hardened derivation")))The ability to derive a branch of public keys from an xpub is very useful, but it comes with a potential risk. Access to an xpub does not give access to child private keys. However, because the xpub contains the chain code, if a child private key is known, or somehow leaked, it can be used with the chain code to derive all the other child private keys. A single leaked child private key, together with a parent chain code, reveals all the private keys of all the children. Worse, the child private key together with a parent chain code can be used to deduce the parent private key.
|
((("public and private keys", "hardened child key derivation")))((("hardened derivation")))The ability to derive a branch of public keys from an xpub is very useful, but it comes with a potential risk. Access to an xpub does not give access to child private keys. However, because the xpub contains the chain code, if a child private key is known, or somehow leaked, it can be used with the chain code to derive all the other child private keys. A single leaked child private key, together with a parent chain code, reveals all the private keys of all the children. Worse, the child private key together with a parent chain code can be used to deduce the parent private key.
|
||||||
|
|
||||||
To counter this risk, HD wallets use an alternative derivation function called _hardened derivation_, which "breaks" the relationship between parent public key and child chain code. The hardened derivation function uses the parent private key to derive the child chain code, instead of the parent public key. This creates a "firewall" in the parent/child sequence, with a chain code that cannot be used to compromise a parent or sibling private key. The hardened derivation function looks almost identical to the normal child private key derivation, except that the parent private key is used as input to the hash function, instead of the parent public key, as shown in the diagram in <<CKDprime>>.
|
To counter this risk, HD wallets use an alternative derivation function called _hardened derivation_, which "breaks" the relationship between parent public key and child chain code. The hardened derivation function uses the parent private key to derive the child chain code, instead of the parent public key. This creates a "firewall" in the parent/child sequence, with a chain code that cannot be used to compromise a parent or sibling private key. The hardened derivation function looks almost identical to the normal child private key derivation, except that the parent private key is used as input to the hash function, instead of the parent public key, as shown in the diagram in <<CKDprime>>.
|
||||||
|
|
||||||
@ -430,20 +430,20 @@ To counter this risk, HD wallets use an alternative derivation function called _
|
|||||||
.Hardened derivation of a child key; omits the parent public key
|
.Hardened derivation of a child key; omits the parent public key
|
||||||
image::images/mbc2_0513.png["ChildHardPrivateDerivation"]
|
image::images/mbc2_0513.png["ChildHardPrivateDerivation"]
|
||||||
|
|
||||||
When the hardened private derivation function is used, the resulting child private key and chain code are completely different from what would result from the normal derivation function. The resulting "branch" of keys can be used to produce extended public keys that are not vulnerable, because the chain code they contain cannot be exploited to reveal any private keys. Hardened derivation is therefore used to create a "gap" in the tree above the level where extended public keys are used.
|
When the hardened private derivation function is used, the resulting child private key and chain code are completely different from what would result from the normal derivation function. The resulting "branch" of keys can be used to produce extended public keys that are not vulnerable, because the chain code they contain cannot be exploited to reveal any private keys. Hardened derivation is therefore used to create a "gap" in the tree above the level where extended public keys are used.
|
||||||
|
|
||||||
In simple terms, if you want to use the convenience of an xpub to derive branches of public keys, without exposing yourself to the risk of a leaked chain code, you should derive it from a hardened parent, rather than a normal parent. As a best practice, the level-1 children of the master keys are always derived through the hardened derivation, to prevent compromise of the master keys.
|
In simple terms, if you want to use the convenience of an xpub to derive branches of public keys, without exposing yourself to the risk of a leaked chain code, you should derive it from a hardened parent, rather than a normal parent. As a best practice, the level-1 children of the master keys are always derived through the hardened derivation, to prevent compromise of the master keys.
|
||||||
|
|
||||||
===== Index numbers for normal and hardened derivation
|
===== Index numbers for normal and hardened derivation
|
||||||
|
|
||||||
The index number used in the derivation function is a 32-bit integer. To easily distinguish between keys derived through the normal derivation function versus keys derived through hardened derivation, this index number is split into two ranges. Index numbers between 0 and 2^31^–1 (0x0 to 0x7FFFFFFF) are used _only_ for normal derivation. Index numbers between 2^31^ and 2^32^–1 (0x80000000 to 0xFFFFFFFF) are used _only_ for hardened derivation. Therefore, if the index number is less than 2^31^, the child is normal, whereas if the index number is equal or above 2^31^, the child is hardened.
|
The index number used in the derivation function is a 32-bit integer. To easily distinguish between keys derived through the normal derivation function versus keys derived through hardened derivation, this index number is split into two ranges. Index numbers between 0 and 2^31^–1 (0x0 to 0x7FFFFFFF) are used _only_ for normal derivation. Index numbers between 2^31^ and 2^32^–1 (0x80000000 to 0xFFFFFFFF) are used _only_ for hardened derivation. Therefore, if the index number is less than 2^31^, the child is normal, whereas if the index number is equal or above 2^31^, the child is hardened.
|
||||||
|
|
||||||
To make the index number easier to read and display, the index number for hardened children is displayed starting from zero, but with a prime symbol. The first normal child key is therefore displayed as 0, whereas the first hardened child (index 0x80000000) is displayed as 0++'++. In sequence then, the second hardened key would have index 0x80000001 and would be displayed as 1++'++, and so on. When you see an HD wallet index i++'++, that means 2^31^+i.
|
To make the index number easier to read and display, the index number for hardened children is displayed starting from zero, but with a prime symbol. The first normal child key is therefore displayed as 0, whereas the first hardened child (index 0x80000000) is displayed as 0++'++. In sequence then, the second hardened key would have index 0x80000001 and would be displayed as 1++'++, and so on. When you see an HD wallet index i++'++, that means 2^31^+i.
|
||||||
|
|
||||||
===== HD wallet key identifier (path)
|
===== HD wallet key identifier (path)
|
||||||
|
|
||||||
((("hierarchical deterministic (HD) wallets")))Keys in an HD wallet are identified using a "path" naming convention, with each level of the tree separated by a slash (/) character (see <<table_4-8>>). Private keys derived from the master private key start with "m." Public keys derived from the master public key start with "M." Therefore, the first child private key of the master private key is m/0. The first child public key is M/0. The second grandchild of the first child is m/0/1, and so on.
|
((("hierarchical deterministic (HD) wallets")))Keys in an HD wallet are identified using a "path" naming convention, with each level of the tree separated by a slash (/) character (see <<table_4-8>>). Private keys derived from the master private key start with "m." Public keys derived from the master public key start with "M." Therefore, the first child private key of the master private key is m/0. The first child public key is M/0. The second grandchild of the first child is m/0/1, and so on.
|
||||||
|
|
||||||
The "ancestry" of a key is read from right to left, until you reach the master key from which it was derived. For example, identifier m/x/y/z describes the key that is the z-th child of key m/x/y, which is the y-th child of key m/x, which is the x-th child of m.
|
The "ancestry" of a key is read from right to left, until you reach the master key from which it was derived. For example, identifier m/x/y/z describes the key that is the z-th child of key m/x/y, which is the y-th child of key m/x, which is the x-th child of m.
|
||||||
|
|
||||||
[[table_4-8]]
|
[[table_4-8]]
|
||||||
@ -452,19 +452,19 @@ The "ancestry" of a key is read from right to left, until you reach the master k
|
|||||||
|=======
|
|=======
|
||||||
|HD path | Key described
|
|HD path | Key described
|
||||||
| m/0 | The first (0) child private key from the master private key (m)
|
| m/0 | The first (0) child private key from the master private key (m)
|
||||||
| m/0/0 | The first grandchild private key of the first child (m/0)
|
| m/0/0 | The first grandchild private key from the first child (m/0)
|
||||||
| m/0'/0 | The first normal grandchild of the first _hardened_ child (m/0')
|
| m/0'/0 | The first normal grandchild from the first _hardened_ child (m/0')
|
||||||
| m/1/0 | The first grandchild private key of the second child (m/1)
|
| m/1/0 | The first grandchild private key from the second child (m/1)
|
||||||
| M/23/17/0/0 | The first great-great-grandchild public key of the first great-grandchild of the 18th grandchild of the 24th child
|
| M/23/17/0/0 | The first great-great-grandchild public key from the first great-grandchild from the 18th grandchild from the 24th child
|
||||||
|=======
|
|=======
|
||||||
|
|
||||||
===== Navigating the HD wallet tree structure
|
===== Navigating the HD wallet tree structure
|
||||||
|
|
||||||
The HD wallet tree structure offers tremendous flexibility. Each parent extended key can have 4 billion children: 2 billion normal children and 2 billion hardened children. Each of those children can have another 4 billion children, and so on. The tree can be as deep as you want, with an infinite number of generations. With all that flexibility, however, it becomes quite difficult to navigate this infinite tree. It is especially difficult to transfer HD wallets between implementations, because the possibilities for internal organization into branches and subbranches are endless.
|
The HD wallet tree structure offers tremendous flexibility. Each parent extended key can have 4 billion children: 2 billion normal children and 2 billion hardened children. Each of those children can have another 4 billion children, and so on. The tree can be as deep as you want, with an infinite number of generations. With all that flexibility, however, it becomes quite difficult to navigate this infinite tree. It is especially difficult to transfer HD wallets between implementations, because the possibilities for internal organization into branches and subbranches are endless.
|
||||||
|
|
||||||
Two BIPs offer a solution to this complexity by creating some proposed standards for the structure of HD wallet trees. BIP-43 proposes the use of the first hardened child index as a special identifier that signifies the "purpose" of the tree structure. Based on BIP-43, an HD wallet should use only one level-1 branch of the tree, with the index number identifying the structure and namespace of the rest of the tree by defining its purpose. For example, an HD wallet using only branch m/i++'++/ is intended to signify a specific purpose and that purpose is identified by index number "i."
|
Two BIPs offer a solution to this complexity by creating some proposed standards for the structure of HD wallet trees. BIP-43 proposes the use of the first hardened child index as a special identifier that signifies the "purpose" of the tree structure. Based on BIP-43, an HD wallet should use only one level-1 branch of the tree, with the index number identifying the structure and namespace of the rest of the tree by defining its purpose. For example, an HD wallet using only branch m/i++'++/ is intended to signify a specific purpose and that purpose is identified by index number "i."
|
||||||
|
|
||||||
Extending that specification, BIP-44 proposes a multiaccount structure as "purpose" number +44'+ under BIP-43. All HD wallets following the BIP-44 structure are identified by the fact that they only used one branch of the tree: m/44'/.
|
Extending that specification, BIP-44 proposes a multiaccount structure as "purpose" number +44'+ under BIP-43. All HD wallets following the BIP-44 structure are identified by the fact that they only used one branch of the tree: m/44'/.
|
||||||
|
|
||||||
BIP-44 specifies the structure as consisting of five predefined tree levels:
|
BIP-44 specifies the structure as consisting of five predefined tree levels:
|
||||||
|
|
||||||
@ -472,9 +472,9 @@ BIP-44 specifies the structure as consisting of five predefined tree levels:
|
|||||||
m / purpose' / coin_type' / account' / change / address_index
|
m / purpose' / coin_type' / account' / change / address_index
|
||||||
-----
|
-----
|
||||||
|
|
||||||
The first-level "purpose" is always set to +44'+. The second-level "coin_type" specifies the type of cryptocurrency coin, allowing for multicurrency HD wallets where each currency has its own subtree under the second level. There are three currencies defined for now: Bitcoin is m/44'/0', Bitcoin Testnet is m/44++'++/1++'++, and Litecoin is m/44++'++/2++'++.
|
The first-level "purpose" is always set to +44'+. The second-level "coin_type" specifies the type of cryptocurrency coin, allowing for multicurrency HD wallets where each currency has its own subtree under the second level. There are three currencies defined for now: Bitcoin is m/44'/0', Bitcoin Testnet is m/44++'++/1++'++, and Litecoin is m/44++'++/2++'++.
|
||||||
|
|
||||||
The third level of the tree is "account," which allows users to subdivide their wallets into separate logical subaccounts, for accounting or organizational purposes. For example, an HD wallet might contain two bitcoin "accounts": m/44++'++/0++'++/0++'++ and m/44++'++/0++'++/1++'++. Each account is the root of its own subtree.
|
The third level of the tree is "account," which allows users to subdivide their wallets into separate logical subaccounts, for accounting or organizational purposes. For example, an HD wallet might contain two bitcoin "accounts": m/44++'++/0++'++/0++'++ and m/44++'++/0++'++/1++'++. Each account is the root of its own subtree.
|
||||||
|
|
||||||
((("keys and addresses", see="also public and private keys")))On the fourth level, "change," an HD wallet has two subtrees, one for creating receiving addresses and one for creating change addresses. Note that whereas the previous levels used hardened derivation, this level uses normal derivation. This is to allow this level of the tree to export extended public keys for use in a nonsecured environment. Usable addresses are derived by the HD wallet as children of the fourth level, making the fifth level of the tree the "address_index." For example, the third receiving address for bitcoin payments in the primary account would be M/44++'++/0++'++/0++'++/0/2. <<table_4-9>> shows a few more examples.
|
((("keys and addresses", see="also public and private keys")))On the fourth level, "change," an HD wallet has two subtrees, one for creating receiving addresses and one for creating change addresses. Note that whereas the previous levels used hardened derivation, this level uses normal derivation. This is to allow this level of the tree to export extended public keys for use in a nonsecured environment. Usable addresses are derived by the HD wallet as children of the fourth level, making the fifth level of the tree the "address_index." For example, the third receiving address for bitcoin payments in the primary account would be M/44++'++/0++'++/0++'++/0/2. <<table_4-9>> shows a few more examples.
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ You may also notice a lot of strange and indecipherable fields and hexadecimal s
|
|||||||
|
|
||||||
((("change, making")))If an 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 UTXO worth 20 bitcoin and want to pay only 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 of the indivisible nature of transaction outputs, most bitcoin transactions will have to generate change.
|
((("change, making")))If an 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 UTXO worth 20 bitcoin and want to pay only 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 of the indivisible nature of transaction outputs, most bitcoin transactions will have to generate change.
|
||||||
|
|
||||||
Imagine a shopper buying a $1.50 beverage, reaching into her 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 (e.g., a dollar bill and two quarters), or a combination of smaller denominations (six quarters), or if necessary, a larger unit such as a $5 note. If she hands too much money, say $5, to the shop owner, she will expect $3.50 change, which she will return to her wallet and have available for future transactions.
|
Imagine a shopper buying a $1.50 beverage, reaching into her 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 e.g. a dollar bill and two quarters (a quarter is $0.25), or a combination of smaller denominations (six quarters), or if necessary, a larger unit such as a $5 note. If she hands too much money, say $5, to the shop owner, she will expect $3.50 change, which she will return to her 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. Users cannot cut an 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 to compose an amount greater than or equal to the desired transaction amount.
|
Similarly, a bitcoin transaction must be created from a user's UTXO in whatever denominations that user has available. Users cannot cut an 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 to compose an amount greater than or equal to the desired transaction amount.
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ Here are some hints:
|
|||||||
|
|
||||||
To build a transaction, a wallet selects from the UTXO it controls, UTXO with enough value to make the requested payment. Sometimes one UTXO is enough, other times more than one is needed. For each UTXO that will be consumed to make this payment, the wallet creates one input pointing to the UTXO and unlocks it with an unlocking script.
|
To build a transaction, a wallet selects from the UTXO it controls, UTXO with enough value to make the requested payment. Sometimes one UTXO is enough, other times more than one is needed. For each UTXO that will be consumed to make this payment, the wallet creates one input pointing to the UTXO and unlocks it with an unlocking script.
|
||||||
|
|
||||||
Let's look at the components of an input in greater detail. The first part of an input is a pointer to an UTXO by reference to the transaction hash and sequence number where the UTXO is recorded in the blockchain. The second part is an unlocking script, which the wallet constructs in order to satisfy the spending conditions set in the UTXO. Most often, the unlocking script is a digital signature and public key proving ownership of the bitcoin. However, not all unlocking scripts contain signatures. The third part is a sequence number, which will be discussed later.
|
Let's look at the components of an input in greater detail. The first part of an input is a pointer to an UTXO by reference to the transaction hash and an output index, which identifies the specific UTXO in that transaction. The second part is an unlocking script, which the wallet constructs in order to satisfy the spending conditions set in the UTXO. Most often, the unlocking script is a digital signature and public key proving ownership of the bitcoin. However, not all unlocking scripts contain signatures. The third part is a sequence number, which will be discussed later.
|
||||||
|
|
||||||
Consider our example in <<transactions_behind_the_scenes>>. The transaction inputs are an array (list) called +vin+:
|
Consider our example in <<transactions_behind_the_scenes>>. The transaction inputs are an array (list) called +vin+:
|
||||||
|
|
||||||
@ -586,7 +586,7 @@ The signature verification algorithm takes the message (a hash of the transactio
|
|||||||
|
|
||||||
((("digital signatures", "signature hash types")))((("commitment")))Digital signatures are applied to messages, which in the case of bitcoin, are the transactions themselves. The signature implies a _commitment_ by the signer to specific transaction data. In the simplest form, the signature applies to the entire transaction, thereby committing all the inputs, outputs, and other transaction fields. However, a signature can commit to only a subset of the data in a transaction, which is useful for a number of scenarios as we will see in this section.
|
((("digital signatures", "signature hash types")))((("commitment")))Digital signatures are applied to messages, which in the case of bitcoin, are the transactions themselves. The signature implies a _commitment_ by the signer to specific transaction data. In the simplest form, the signature applies to the entire transaction, thereby committing all the inputs, outputs, and other transaction fields. However, a signature can commit to only a subset of the data in a transaction, which is useful for a number of scenarios as we will see in this section.
|
||||||
|
|
||||||
((("SIGHASH flags")))Bitcoin signatures have a way of indicating which part of a transaction's data is included in the hash signed by the private key using a +SIGHASH+ flag. The +SIGHASH+ flag is a single byte that is appended to the signature. Every signature has a +SIGHASH+ flag and the flag can be different from to input to input. A transaction with three signed inputs may have three signatures with different +SIGHASH+ flags, each signature signing (committing) different parts of the transaction.
|
((("SIGHASH flags")))Bitcoin signatures have a way of indicating which part of a transaction's data is included in the hash signed by the private key using a +SIGHASH+ flag. The +SIGHASH+ flag is a single byte that is appended to the signature. Every signature has a +SIGHASH+ flag and the flag can be different from input to input. A transaction with three signed inputs may have three signatures with different +SIGHASH+ flags, each signature signing (committing) different parts of the transaction.
|
||||||
|
|
||||||
Remember, each input may contain a signature in its unlocking script. As a result, a transaction that contains several inputs may have signatures with different +SIGHASH+ flags that commit different parts of the transaction in each of the inputs. Note also that bitcoin transactions may contain inputs from different "owners," who may sign only one input in a partially constructed (and invalid) transaction, collaborating with others to gather all the necessary signatures to make a valid transaction. Many of the +SIGHASH+ flag types only make sense if you think of multiple participants collaborating outside the bitcoin network and updating a partially signed transaction.
|
Remember, each input may contain a signature in its unlocking script. As a result, a transaction that contains several inputs may have signatures with different +SIGHASH+ flags that commit different parts of the transaction in each of the inputs. Note also that bitcoin transactions may contain inputs from different "owners," who may sign only one input in a partially constructed (and invalid) transaction, collaborating with others to gather all the necessary signatures to make a valid transaction. Many of the +SIGHASH+ flag types only make sense if you think of multiple participants collaborating outside the bitcoin network and updating a partially signed transaction.
|
||||||
|
|
||||||
@ -610,8 +610,8 @@ In addition, there is a modifier flag +SIGHASH_ANYONECANPAY+, which can be combi
|
|||||||
[options="header"]
|
[options="header"]
|
||||||
|=======================
|
|=======================
|
||||||
|SIGHASH flag| Value | Description
|
|SIGHASH flag| Value | Description
|
||||||
| ALL\|ANYONECANPAY | 0x81 | Signature applies to one inputs and all outputs
|
| ALL\|ANYONECANPAY | 0x81 | Signature applies to one input and all outputs
|
||||||
| NONE\|ANYONECANPAY | 0x82 | Signature applies to one inputs, none of the outputs
|
| NONE\|ANYONECANPAY | 0x82 | Signature applies to one input, none of the outputs
|
||||||
| SINGLE\|ANYONECANPAY | 0x83 | Signature applies to one input and the output with the same index number
|
| SINGLE\|ANYONECANPAY | 0x83 | Signature applies to one input and the output with the same index number
|
||||||
|=======================
|
|=======================
|
||||||
|
|
||||||
|
@ -172,7 +172,7 @@ P2SH addresses hide all of the complexity, so that the person making a payment d
|
|||||||
* Complex scripts are replaced by shorter fingerprints in the transaction output, making the transaction smaller.
|
* Complex scripts are replaced by shorter fingerprints in the transaction output, making the transaction smaller.
|
||||||
* Scripts can be coded as an address, so the sender and the sender's wallet don't need complex engineering to implement P2SH.
|
* Scripts can be coded as an address, so the sender and the sender's wallet don't need complex engineering to implement P2SH.
|
||||||
* P2SH shifts the burden of constructing the script to the recipient, not the sender.
|
* P2SH shifts the burden of constructing the script to the recipient, not the sender.
|
||||||
* P2SH shifts the burden in data storage for the long script from the output (which is in the UTXO set) to the input (stored on the blockchain).
|
* P2SH shifts the burden in data storage for the long script from the output (which additionally to being stored on the blockchain is in the UTXO set) to the input (only stored on the blockchain).
|
||||||
* P2SH shifts the burden in data storage for the long script from the present time (payment) to a future time (when it is spent).
|
* P2SH shifts the burden in data storage for the long script from the present time (payment) to a future time (when it is spent).
|
||||||
* P2SH shifts the transaction fee cost of a long script from the sender to the recipient, who has to include the long redeem script to spend it.
|
* P2SH shifts the transaction fee cost of a long script from the sender to the recipient, who has to include the long redeem script to spend it.
|
||||||
|
|
||||||
@ -251,7 +251,7 @@ It is important to understand the limitations of transaction +nLocktime+. The on
|
|||||||
|
|
||||||
==== Check Lock Time Verify (CLTV)
|
==== Check Lock Time Verify (CLTV)
|
||||||
|
|
||||||
((("Check Lock Time Verify (CLTV)", id="cltv07")))((("timelocks", "Check Lock Time Verify (CLTV)")))((("scripting", "timelocks", "Check Lock Time Verify (CLTV)")))((("bitcoin improvement proposals", "CHECKLOCKTIMEVERIFY (BIP-65)")))In December 2015, a new form of timelock was introduced to bitcoin as a soft fork upgrade. Based on a specifications in BIP-65, a new script operator called _CHECKLOCKTIMEVERIFY_ (_CLTV_) was added to the scripting language. +CLTV+ is a per-output timelock, rather than a per-transaction timelock as is the case with +nLocktime+. This allows for much greater flexibility in the way timelocks are applied.
|
((("Check Lock Time Verify (CLTV)", id="cltv07")))((("timelocks", "Check Lock Time Verify (CLTV)")))((("scripting", "timelocks", "Check Lock Time Verify (CLTV)")))((("bitcoin improvement proposals", "CHECKLOCKTIMEVERIFY (BIP-65)")))In December 2015, a new form of timelock was introduced to bitcoin as a soft fork upgrade. Based on a specification in BIP-65, a new script operator called _CHECKLOCKTIMEVERIFY_ (_CLTV_) was added to the scripting language. +CLTV+ is a per-output timelock, rather than a per-transaction timelock as is the case with +nLocktime+. This allows for much greater flexibility in the way timelocks are applied.
|
||||||
|
|
||||||
In simple terms, by adding the +CLTV+ opcode in the redeem script of an output it restricts the output, so that it can only be spent after the specified time has elapsed.
|
In simple terms, by adding the +CLTV+ opcode in the redeem script of an output it restricts the output, so that it can only be spent after the specified time has elapsed.
|
||||||
|
|
||||||
@ -321,9 +321,9 @@ BIP-68 and BIP-112 were activated in May 2016 as a soft fork upgrade to the cons
|
|||||||
|
|
||||||
===== Original meaning of nSequence
|
===== Original meaning of nSequence
|
||||||
|
|
||||||
The +nSequence+ field was originally intended (but never properly implemented) to allow modification of transactions in the mempool. In that use, a transaction containing inputs with +nSequence+ value below 2^32^ (0xFFFFFFFF) indicated a transaction that was not yet "finalized." Such a transaction would be held in the mempool until it was replaced by another transaction spending the same inputs with a higher +nSequence+ value. Once a transaction was received whose inputs had an +nSequence+ value of 2^32^ it would be considered "finalized" and mined.
|
The +nSequence+ field was originally intended (but never properly implemented) to allow modification of transactions in the mempool. In that use, a transaction containing inputs with +nSequence+ value below 2^32^ - 1 (0xFFFFFFFF) indicated a transaction that was not yet "finalized." Such a transaction would be held in the mempool until it was replaced by another transaction spending the same inputs with a higher +nSequence+ value. Once a transaction was received whose inputs had an +nSequence+ value of 0xFFFFFFFF it would be considered "finalized" and mined.
|
||||||
|
|
||||||
The original meaning of +nSequence+ was never properly implemented and the value of +nSequence+ is customarily set to 2^32^ in transactions that do not utilize timelocks. For transactions with nLocktime or +CHECKLOCKTIMEVERIFY+, the +nSequence+ value must be set to less than 2^32^ for the timelock guards to have effect. Customarily, it is set to pass:[<span class="keep-together">2<sup>32</sup> – 1</span>] (0xFFFFFFFE).
|
The original meaning of +nSequence+ was never properly implemented and the value of +nSequence+ is customarily set to 0xFFFFFFFF in transactions that do not utilize timelocks. For transactions with nLocktime or +CHECKLOCKTIMEVERIFY+, the +nSequence+ value must be set to less than 2^31^ for the timelock guards to have effect, as explained below.
|
||||||
|
|
||||||
===== nSequence as a consensus-enforced relative timelock
|
===== nSequence as a consensus-enforced relative timelock
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ If there is no traffic on a connection, nodes will periodically send a message t
|
|||||||
|
|
||||||
((("blocks", "genesis block")))((("genesis block")))((("blockchain (the)", "genesis block")))Full blockchain nodes maintain a complete and up-to-date copy of the bitcoin blockchain with all the transactions, which they independently build and verify, starting with the very first block (genesis block) and building up to the latest known block in the network. A full blockchain node can independently and authoritatively verify any transaction without recourse or reliance on any other node or source of information. The full blockchain node relies on the network to receive updates about new blocks of transactions, which it then verifies and incorporates into its local copy of the blockchain.
|
((("blocks", "genesis block")))((("genesis block")))((("blockchain (the)", "genesis block")))Full blockchain nodes maintain a complete and up-to-date copy of the bitcoin blockchain with all the transactions, which they independently build and verify, starting with the very first block (genesis block) and building up to the latest known block in the network. A full blockchain node can independently and authoritatively verify any transaction without recourse or reliance on any other node or source of information. The full blockchain node relies on the network to receive updates about new blocks of transactions, which it then verifies and incorporates into its local copy of the blockchain.
|
||||||
|
|
||||||
((("bitcoin nodes", "full nodes")))Running a full blockchain node gives you the pure bitcoin experience: independent verification of all transactions without the need to rely on, or trust, any other systems. It's easy to tell if you're running a full node because it requires 20+ gigabytes of persistent storage (disk space) to store the full blockchain. If you need a lot of disk and it takes two to three days to sync to the network, you are running a full node. That is the price of complete independence and freedom from central authority.
|
((("bitcoin nodes", "full nodes")))Running a full blockchain node gives you the pure bitcoin experience: independent verification of all transactions without the need to rely on, or trust, any other systems. It's easy to tell if you're running a full node because it requires more than one hundred gigabytes of persistent storage (disk space) to store the full blockchain. If you need a lot of disk and it takes two to three days to sync to the network, you are running a full node. That is the price of complete independence and freedom from central authority.
|
||||||
|
|
||||||
((("Satoshi client")))There are a few alternative implementations of full blockchain bitcoin clients, built using different programming languages and software architectures. However, the most common implementation is the reference client Bitcoin Core, also known as the Satoshi client. More than 75% of the nodes on the bitcoin network run various versions of Bitcoin Core. It is identified as "Satoshi" in the sub-version string sent in the +version+ message and shown by the command +getpeerinfo+ as we saw earlier; for example, +/Satoshi:0.8.6/+.
|
((("Satoshi client")))There are a few alternative implementations of full blockchain bitcoin clients, built using different programming languages and software architectures. However, the most common implementation is the reference client Bitcoin Core, also known as the Satoshi client. More than 75% of the nodes on the bitcoin network run various versions of Bitcoin Core. It is identified as "Satoshi" in the sub-version string sent in the +version+ message and shown by the command +getpeerinfo+ as we saw earlier; for example, +/Satoshi:0.8.6/+.
|
||||||
|
|
||||||
@ -295,7 +295,7 @@ As a way to increase the privacy and security of the bitcoin P2P network, there
|
|||||||
|
|
||||||
==== Tor Transport
|
==== Tor Transport
|
||||||
|
|
||||||
((("Tor network")))((("The Onion Routing network (Tor)")))Tor, which stands for _The Onion Routing network_, is a software project and network that offers encryption and encapsulation of data through randomized network paths that offer anonymity, untraceability and privacy.
|
((("Tor network")))((("The Onion Routing network (Tor)")))Tor, which stands for _The Onion Routing network_, is a software project and network that offers encryption and encapsulation of data through randomized network paths that offer anonymity, untraceability and privacy.
|
||||||
|
|
||||||
Bitcoin Core offers several configuration options that allow you to run a bitcoin node with its traffic transported over the Tor network. In addition, Bitcoin Core can also offer a Tor hidden service allowing other Tor nodes to connect to your node directly over Tor.
|
Bitcoin Core offers several configuration options that allow you to run a bitcoin node with its traffic transported over the Tor network. In addition, Bitcoin Core can also offer a Tor hidden service allowing other Tor nodes to connect to your node directly over Tor.
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ image::images/mbc2_0903.png["merkle_tree_odd"]
|
|||||||
|
|
||||||
The same method for constructing a tree from four transactions can be generalized to construct trees of any size. In bitcoin it is common to have several hundred to more than a thousand transactions in a single block, which are summarized in exactly the same way, producing just 32 bytes of data as the single merkle root. In <<merkle_tree_large>>, you will see a tree built from 16 transactions. Note that although the root looks bigger than the leaf nodes in the diagram, it is the exact same size, just 32 bytes. Whether there is one transaction or a hundred thousand transactions in the block, the merkle root always summarizes them into 32 bytes.
|
The same method for constructing a tree from four transactions can be generalized to construct trees of any size. In bitcoin it is common to have several hundred to more than a thousand transactions in a single block, which are summarized in exactly the same way, producing just 32 bytes of data as the single merkle root. In <<merkle_tree_large>>, you will see a tree built from 16 transactions. Note that although the root looks bigger than the leaf nodes in the diagram, it is the exact same size, just 32 bytes. Whether there is one transaction or a hundred thousand transactions in the block, the merkle root always summarizes them into 32 bytes.
|
||||||
|
|
||||||
((("authentication paths")))To prove that a specific transaction is included in a block, a node only needs to produce +log~2~(N)+ 32-byte hashes, constituting an _authentication path_ or _merkle path_ connecting the specific transaction to the root of the tree. This is especially important as the number of transactions increases, because the base-2 logarithm of the number of transactions increases much more slowly. This allows bitcoin nodes to efficiently produce paths of 10 or 12 hashes (320–384 bytes), which can provide proof of a single transaction out of more than a thousand transactions in a megabyte-size block.
|
((("authentication paths")))To prove that a specific transaction is included in a block, a node only needs to produce +log~2~(N)+ 32-byte hashes, constituting an _authentication path_ or _merkle path_ connecting the specific transaction to the root of the tree. This is especially important as the number of transactions increases, because the base-2 logarithm of the number of transactions increases much more slowly. This allows bitcoin nodes to efficiently produce paths of 10 or 12 hashes (320–384 bytes), which can provide proof of a single transaction out of more than a thousand transactions in a megabyte-sized block.
|
||||||
|
|
||||||
[[merkle_tree_large]]
|
[[merkle_tree_large]]
|
||||||
.A merkle tree summarizing many data elements
|
.A merkle tree summarizing many data elements
|
||||||
@ -301,29 +301,6 @@ bitcoind: Using data directory /home/username/.bitcoin/testnet3
|
|||||||
|
|
||||||
To connect to bitcoind, you use the +bitcoin-cli+ command-line tool, but you must also switch it to testnet mode:
|
To connect to bitcoind, you use the +bitcoin-cli+ command-line tool, but you must also switch it to testnet mode:
|
||||||
|
|
||||||
----
|
|
||||||
$ bitcoin-cli -testnet getinfo
|
|
||||||
{
|
|
||||||
"version": 130200,
|
|
||||||
"protocolversion": 70015,
|
|
||||||
"walletversion": 130000,
|
|
||||||
"balance": 0.00000000,
|
|
||||||
"blocks": 416,
|
|
||||||
"timeoffset": 0,
|
|
||||||
"connections": 3,
|
|
||||||
"proxy": "",
|
|
||||||
"difficulty": 1,
|
|
||||||
"testnet": true,
|
|
||||||
"keypoololdest": 1484801486,
|
|
||||||
"keypoolsize": 100,
|
|
||||||
"paytxfee": 0.00000000,
|
|
||||||
"relayfee": 0.00001000,
|
|
||||||
"errors": ""
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
You can also use the +getblockchaininfo+ command to confirm the details of the testnet3 blockchain and your sync progress:
|
|
||||||
|
|
||||||
----
|
----
|
||||||
$ bitcoin-cli -testnet getblockchaininfo
|
$ bitcoin-cli -testnet getblockchaininfo
|
||||||
{
|
{
|
||||||
@ -343,7 +320,7 @@ $ bitcoin-cli -testnet getblockchaininfo
|
|||||||
|
|
||||||
You can also run on testnet3 with other full-node implementations, such as +btcd+ (written in Go) and +bcoin+ (written in JavaScript), to experiment and learn in other programming languages and frameworks.
|
You can also run on testnet3 with other full-node implementations, such as +btcd+ (written in Go) and +bcoin+ (written in JavaScript), to experiment and learn in other programming languages and frameworks.
|
||||||
|
|
||||||
In early 2017, testnet3 supports all the features of mainnet, in addition to Segregated Witness (see <<segwit>>), which has yet to activate on mainnet. Therefore, testnet3 can also be used to test Segregated Witness features.((("", startref="testnet09")))
|
In early 2017, testnet3 supports all the features of mainnet, including Segregated Witness (see <<segwit>>). Therefore, testnet3 can also be used to test Segregated Witness features.((("", startref="testnet09")))
|
||||||
|
|
||||||
==== Segnet—The Segregated Witness Testnet
|
==== Segnet—The Segregated Witness Testnet
|
||||||
|
|
||||||
|
@ -281,7 +281,7 @@ The initial subsidy is calculated in satoshis by multiplying 50 with the +COIN+
|
|||||||
|
|
||||||
The maximum number of halvings allowed is 64, so the code imposes a zero reward (returns only the fees) if the 64 halvings is exceeded.
|
The maximum number of halvings allowed is 64, so the code imposes a zero reward (returns only the fees) if the 64 halvings is exceeded.
|
||||||
|
|
||||||
Next, the function uses the binary-right-shift operator to divide the reward (+nSubsidy+) by two for each round of halving. In the case of block 277,316, this would binary-right-shift the reward of 5 billion satoshis once (one halving) and result in 2.5 billion satoshis, or 25 bitcoin. The binary-right-shift operator is used because it is more efficient for division by two than integer or floating-point division.
|
Next, the function uses the binary-right-shift operator to divide the reward (+nSubsidy+) by two for each round of halving. In the case of block 277,316, this would binary-right-shift the reward of 5 billion satoshis once (one halving) and result in 2.5 billion satoshis, or 25 bitcoins. The binary-right-shift operator is used because it is more efficient than multiple repeated divisions. To avoid a potential bug, the shift operation is skipped after 63 halvings, and the subsidy is set to 0.
|
||||||
|
|
||||||
Finally, the coinbase reward (+nSubsidy+) is added to the transaction fees (+nFees+), and the sum is returned.
|
Finally, the coinbase reward (+nSubsidy+) is added to the transaction fees (+nFees+), and the sum is returned.
|
||||||
|
|
||||||
@ -587,7 +587,7 @@ Hashing Power: 127141 hashes per second
|
|||||||
|
|
||||||
As you can see, increasing the difficulty by 1 bit causes a doubling in the time it takes to find a solution. If you think of the entire 256-bit number space, each time you constrain one more bit to zero, you decrease the search space by half. In <<pow_example_outputs>>, it takes 84 million hash attempts to find a nonce that produces a hash with 26 leading bits as zero. Even at a speed of more than 120,000 hashes per second, it still requires 10 minutes on a laptop to find this solution.
|
As you can see, increasing the difficulty by 1 bit causes a doubling in the time it takes to find a solution. If you think of the entire 256-bit number space, each time you constrain one more bit to zero, you decrease the search space by half. In <<pow_example_outputs>>, it takes 84 million hash attempts to find a nonce that produces a hash with 26 leading bits as zero. Even at a speed of more than 120,000 hashes per second, it still requires 10 minutes on a laptop to find this solution.
|
||||||
|
|
||||||
At the time of writing, the network is attempting to find a block whose header hash is less than:
|
At the time of writing, the network is attempting to find a block whose header hash is less than:
|
||||||
|
|
||||||
----
|
----
|
||||||
0000000000000000029AB9000000000000000000000000000000000000000000
|
0000000000000000029AB9000000000000000000000000000000000000000000
|
||||||
@ -701,10 +701,10 @@ The difficulty of mining is closely related to the cost of electricity and the e
|
|||||||
|
|
||||||
((("mining and consensus", "mining the block", "successful completion")))((("use cases", "mining for bitcoin", id="jingtentwo")))As we saw earlier, Jing's node has constructed a candidate block and prepared it for mining. Jing has several hardware mining rigs with application-specific integrated circuits, where hundreds of thousands of integrated circuits run the SHA256 algorithm in parallel at incredible speeds. Many of these specialized machines are connected to his mining node over USB or a local area network. Next, the mining node running on Jing's desktop transmits the block header to his mining hardware, which starts testing trillions of nonces per second.
|
((("mining and consensus", "mining the block", "successful completion")))((("use cases", "mining for bitcoin", id="jingtentwo")))As we saw earlier, Jing's node has constructed a candidate block and prepared it for mining. Jing has several hardware mining rigs with application-specific integrated circuits, where hundreds of thousands of integrated circuits run the SHA256 algorithm in parallel at incredible speeds. Many of these specialized machines are connected to his mining node over USB or a local area network. Next, the mining node running on Jing's desktop transmits the block header to his mining hardware, which starts testing trillions of nonces per second.
|
||||||
|
|
||||||
Almost 11 minutes after starting to mine block 277,316, one of the hardware mining machines finds a solution and sends it back to the mining node. When inserted into the block header, the nonce 4,215,469,401 produces a block hash of:
|
Almost 11 minutes after starting to mine block 277,316, one of the hardware mining machines finds a solution and sends it back to the mining node. When inserted into the block header, the nonce 924,591,752 produces a block hash of:
|
||||||
|
|
||||||
----
|
----
|
||||||
0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569
|
0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
|
||||||
----
|
----
|
||||||
|
|
||||||
which is less than the target:
|
which is less than the target:
|
||||||
@ -773,14 +773,14 @@ image::images/mbc2_1002.png["Before the fork - all nodes have the same perspecti
|
|||||||
|
|
||||||
A "fork" occurs whenever there are two candidate blocks competing to form the longest blockchain. This occurs under normal conditions whenever two miners solve the Proof-of-Work algorithm within a short period of time from each other. As both miners discover a solution for their respective candidate blocks, they immediately broadcast their own "winning" block to their immediate neighbors who begin propagating the block across the network. Each node that receives a valid block will incorporate it into its blockchain, extending the blockchain by one block. If that node later sees another candidate block extending the same parent, it connects the second candidate on a secondary chain. As a result, some nodes will "see" one candidate block first, while other nodes will see the other candidate block and two competing versions of the blockchain will emerge.
|
A "fork" occurs whenever there are two candidate blocks competing to form the longest blockchain. This occurs under normal conditions whenever two miners solve the Proof-of-Work algorithm within a short period of time from each other. As both miners discover a solution for their respective candidate blocks, they immediately broadcast their own "winning" block to their immediate neighbors who begin propagating the block across the network. Each node that receives a valid block will incorporate it into its blockchain, extending the blockchain by one block. If that node later sees another candidate block extending the same parent, it connects the second candidate on a secondary chain. As a result, some nodes will "see" one candidate block first, while other nodes will see the other candidate block and two competing versions of the blockchain will emerge.
|
||||||
|
|
||||||
In <<fork2>>, we see two miners (Node A and Node B) who mine two different blocks almost simultaneously. Both of these blocks are children of the star block, and extend the chain by building on top of the star block. To help us track it, one is visualized as a triangle block originating from Node A, and the other is shown as an upside-down triangle block originating from Node B.
|
In <<fork2>>, we see two miners (Node X and Node Y) who mine two different blocks almost simultaneously. Both of these blocks are children of the star block, and extend the chain by building on top of the star block. To help us track it, one is visualized as a triangle block originating from Node X, and the other is shown as an upside-down triangle block originating from Node Y.
|
||||||
|
|
||||||
[[fork2]]
|
[[fork2]]
|
||||||
[role="smallersixty"]
|
[role="smallersixty"]
|
||||||
.Visualization of a blockchain fork event: two blocks found simultaneously
|
.Visualization of a blockchain fork event: two blocks found simultaneously
|
||||||
image::images/mbc2_1003.png["Visualization of a blockchain fork event: two blocks found simultaneously"]
|
image::images/mbc2_1003.png["Visualization of a blockchain fork event: two blocks found simultaneously"]
|
||||||
|
|
||||||
Let's assume, for example, that a miner Node A finds a Proof-of-Work solution for a block "triangle" that extends the blockchain, building on top of the parent block "star." Almost simultaneously, the miner Node B who was also extending the chain from block "star" finds a solution for block "upside-down triangle," his candidate block. Now, there are two possible blocks; one we call "triangle," originating in Node A; and one we call "upside-down triangle," originating in Node B. Both blocks are valid, both blocks contain a valid solution to the Proof-of-Work, and both blocks extend the same parent (block "star"). Both blocks likely contain most of the same transactions, with only perhaps a few differences in the order of transactions.
|
Let's assume, for example, that a miner Node X finds a Proof-of-Work solution for a block "triangle" that extends the blockchain, building on top of the parent block "star." Almost simultaneously, the miner Node Y who was also extending the chain from block "star" finds a solution for block "upside-down triangle," his candidate block. Now, there are two possible blocks; one we call "triangle," originating in Node X; and one we call "upside-down triangle," originating in Node Y. Both blocks are valid, both blocks contain a valid solution to the Proof-of-Work, and both blocks extend the same parent (block "star"). Both blocks likely contain most of the same transactions, with only perhaps a few differences in the order of transactions.
|
||||||
|
|
||||||
As the two blocks propagate, some nodes receive block "triangle" first and some receive block "upside-down triangle" first. As shown in <<fork3>>, the network splits into two different perspectives of the blockchain; one side topped with a triangle block, the other with the upside-down-triangle block.
|
As the two blocks propagate, some nodes receive block "triangle" first and some receive block "upside-down triangle" first. As shown in <<fork3>>, the network splits into two different perspectives of the blockchain; one side topped with a triangle block, the other with the upside-down-triangle block.
|
||||||
|
|
||||||
@ -822,7 +822,7 @@ Bitcoin's block interval of 10 minutes is a design compromise between fast confi
|
|||||||
|
|
||||||
((("mining and consensus", "hashing power race", id="MAChash10")))Bitcoin mining is an extremely competitive industry. The hashing power has increased exponentially every year of bitcoin's existence. Some years the growth has reflected a complete change of technology, such as in 2010 and 2011 when many miners switched from using CPU mining to GPU mining and field programmable gate array (FPGA) mining. In 2013 the introduction of ASIC mining lead to another giant leap in mining power, by placing the SHA256 function directly on silicon chips specialized for the purpose of mining. The first such chips could deliver more mining power in a single box than the entire bitcoin network in 2010.
|
((("mining and consensus", "hashing power race", id="MAChash10")))Bitcoin mining is an extremely competitive industry. The hashing power has increased exponentially every year of bitcoin's existence. Some years the growth has reflected a complete change of technology, such as in 2010 and 2011 when many miners switched from using CPU mining to GPU mining and field programmable gate array (FPGA) mining. In 2013 the introduction of ASIC mining lead to another giant leap in mining power, by placing the SHA256 function directly on silicon chips specialized for the purpose of mining. The first such chips could deliver more mining power in a single box than the entire bitcoin network in 2010.
|
||||||
|
|
||||||
The following list shows the total hashing power of the bitcoin network, over the first five years of operation:
|
The following list shows the total hashing power of the bitcoin network, over the first eight years of operation:
|
||||||
|
|
||||||
2009:: 0.5 MH/sec–8 MH/sec (16× growth)
|
2009:: 0.5 MH/sec–8 MH/sec (16× growth)
|
||||||
2010:: 8 MH/sec–116 GH/sec (14,500× growth)
|
2010:: 8 MH/sec–116 GH/sec (14,500× growth)
|
||||||
@ -857,7 +857,7 @@ In the last two years, the ASIC mining chips have become increasingly denser, ap
|
|||||||
|
|
||||||
((("mining pools", id="MACoverpool10")))((("mining pools", "benefits of")))In this highly competitive environment, individual miners working alone (also known as solo miners) don't stand a chance. The likelihood of them finding a block to offset their electricity and hardware costs is so low that it represents a gamble, like playing the lottery. Even the fastest consumer ASIC mining system cannot keep up with commercial systems that stack tens of thousands of these chips in giant warehouses near hydroelectric powerstations. Miners now collaborate to form mining pools, pooling their hashing power and sharing the reward among thousands of participants. By participating in a pool, miners get a smaller share of the overall reward, but typically get rewarded every day, reducing uncertainty.
|
((("mining pools", id="MACoverpool10")))((("mining pools", "benefits of")))In this highly competitive environment, individual miners working alone (also known as solo miners) don't stand a chance. The likelihood of them finding a block to offset their electricity and hardware costs is so low that it represents a gamble, like playing the lottery. Even the fastest consumer ASIC mining system cannot keep up with commercial systems that stack tens of thousands of these chips in giant warehouses near hydroelectric powerstations. Miners now collaborate to form mining pools, pooling their hashing power and sharing the reward among thousands of participants. By participating in a pool, miners get a smaller share of the overall reward, but typically get rewarded every day, reducing uncertainty.
|
||||||
|
|
||||||
Let's look at a specific example. Assume a miner has purchased mining hardware with a combined hashing rate of 14,000 gigahashes per second (GH/s), or 14 TH/s. In 2017 this equipment costs approximately $2,500 USD. The hardware consumes 1375 watts (1.3 kW) of electricity when running, 32 kW-hours a day, at a cost of $1 to $2 per day at very low electricity rates. At current bitcoin difficulty, the miner will be able to solo mine a block approximately once every 4 years. If the miner does find a single block in that timeframe, the payout of 12.5 bitcoin, at approximately $1,000 per bitcoin, will result in a single payout of $12,500, which will not even cover the entire cost of the hardware and the electricity consumed over the time period, leaving a net loss of approximately $1,000. However, the chance of finding a block in a 4-year period depends on the miner's luck. He might find two blocks in 4 years and make a very large profit. Or he might not find a block for 5 years and suffer a bigger financial loss. Even worse, the difficulty of the bitcoin Proof-of-Work algorithm is likely to go up significantly over that period, at the current rate of growth of hashing power, meaning the miner has, at most, one year to break even before the hardware is effectively obsolete and must be replaced by more powerful mining hardware. If this miner participates in a mining pool, instead of waiting for a once-in-four-years $12,500 windfall, he will be able to earn approximately $50 to $60 per week. The regular payouts from a mining pool will help him amortize the cost of hardware and electricity over time without taking an enormous risk. The hardware will still be obsolete in one or two years and the risk is still high, but the revenue is at least regular and reliable over that period. Financially this only makes sense at very low electricity cost (less than 1 cent per kW) and only at very large scale.
|
Let's look at a specific example. Assume a miner has purchased mining hardware with a combined hashing rate of 14,000 gigahashes per second (GH/s), or 14 TH/s. In 2017 this equipment costs approximately $2,500 USD. The hardware consumes 1375 watts (1.3 kW) of electricity when running, 32 kW-hours a day, at a cost of $1 to $2 per day at very low electricity rates. At current bitcoin difficulty, the miner will be able to solo mine a block approximately once every 4 years. If the miner does find a single block in that timeframe, the payout of 12.5 bitcoin, at approximately $1,000 per bitcoin, will result in a single payout of $12,500, which will not even cover the entire cost of the hardware and the electricity consumed over the time period, leaving a net loss of approximately $1,000. However, the chance of finding a block in a 4-year period depends on the miner's luck. He might find two blocks in 4 years and make a very large profit. Or he might not find a block for 5 years and suffer a bigger financial loss. Even worse, the difficulty of the bitcoin Proof-of-Work algorithm is likely to go up significantly over that period, at the current rate of growth of hashing power, meaning the miner has, at most, one year to break even before the hardware is effectively obsolete and must be replaced by more powerful mining hardware. If this miner participates in a mining pool, instead of waiting for a once-in-four-years $12,500 windfall, he will be able to earn approximately $50 to $60 per week. The regular payouts from a mining pool will help him amortize the cost of hardware and electricity over time without taking an enormous risk. The hardware will still be obsolete in one or two years and the risk is still high, but the revenue is at least regular and reliable over that period. Financially this only makes sense at very low electricity cost (less than 1 cent per kW-hour) and only at very large scale.
|
||||||
|
|
||||||
Mining pools coordinate many hundreds or thousands of miners, over specialized pool-mining protocols. The individual miners configure their mining equipment to connect to a pool server, after creating an account with the pool. Their mining hardware remains connected to the pool server while mining, synchronizing their efforts with the other miners. Thus, the pool miners share the effort to mine a block and then share in the rewards.
|
Mining pools coordinate many hundreds or thousands of miners, over specialized pool-mining protocols. The individual miners configure their mining equipment to connect to a pool server, after creating an account with the pool. Their mining hardware remains connected to the pool server while mining, synchronizing their efforts with the other miners. Thus, the pool miners share the effort to mine a block and then share in the rewards.
|
||||||
|
|
||||||
|
@ -263,7 +263,7 @@ The funding transaction consumes one or more inputs from Emma's wallet, sourcing
|
|||||||
|
|
||||||
Once the funding transaction is confirmed, Emma can start streaming video. Emma's software creates and signs a commitment transaction that changes the channel balance to credit 0.01 millibit to Fabian's address and refund 35.99 millibits back to Emma. The transaction signed by Emma consumes the 36 millibits output created by the funding transaction and creates two outputs: one for her refund, the other for Fabian's payment. The transaction is only partially signed—it requires two signatures (2-of-2), but only has Emma's signature. When Fabian's server receives this transaction, it adds the second signature (for the 2-of-2 input) and returns it to Emma together with 1 second worth of video. Now both parties have a fully signed commitment transaction that either can redeem, representing the correct up-to-date balance of the channel. Neither party broadcasts this transaction to the network.
|
Once the funding transaction is confirmed, Emma can start streaming video. Emma's software creates and signs a commitment transaction that changes the channel balance to credit 0.01 millibit to Fabian's address and refund 35.99 millibits back to Emma. The transaction signed by Emma consumes the 36 millibits output created by the funding transaction and creates two outputs: one for her refund, the other for Fabian's payment. The transaction is only partially signed—it requires two signatures (2-of-2), but only has Emma's signature. When Fabian's server receives this transaction, it adds the second signature (for the 2-of-2 input) and returns it to Emma together with 1 second worth of video. Now both parties have a fully signed commitment transaction that either can redeem, representing the correct up-to-date balance of the channel. Neither party broadcasts this transaction to the network.
|
||||||
|
|
||||||
In the next round, Emma's software creates and signs another commitment transaction (commitment #2) that consumes the _same_ 2-of-2 output from the funding transaction. The second commitment transaction allocates one output of 0.2 millibits to Fabian's address and one output of 35.98 millibits back to Emma's address. This new transaction is payment for two cumulative seconds of video. Fabian's software signs and returns the second commitment transaction, together with the another second of video.
|
In the next round, Emma's software creates and signs another commitment transaction (commitment #2) that consumes the _same_ 2-of-2 output from the funding transaction. The second commitment transaction allocates one output of 0.02 millibits to Fabian's address and one output of 35.98 millibits back to Emma's address. This new transaction is payment for two cumulative seconds of video. Fabian's software signs and returns the second commitment transaction, together with another second of video.
|
||||||
|
|
||||||
In this way, Emma's software continues to send commitment transactions to Fabian's server in exchange for streaming video. The balance of the channel gradually accumulates in favor of Fabian, as Emma consumes more seconds of video. Let's say Emma watches 600 seconds (10 minutes) of video, creating and signing 600 commitment transactions. The last commitment transaction (#600) will have two outputs, splitting the balance of the channel, 6 millibits to Fabian and 30 millibits to Emma.
|
In this way, Emma's software continues to send commitment transactions to Fabian's server in exchange for streaming video. The balance of the channel gradually accumulates in favor of Fabian, as Emma consumes more seconds of video. Let's say Emma watches 600 seconds (10 minutes) of video, creating and signing 600 commitment transactions. The last commitment transaction (#600) will have two outputs, splitting the balance of the channel, 6 millibits to Fabian and 30 millibits to Emma.
|
||||||
|
|
||||||
@ -293,7 +293,7 @@ The refund transaction acts as the first commitment transaction and its timelock
|
|||||||
|
|
||||||
Now that Emma has a fully signed refund transaction, she can confidently transmit the signed funding transaction knowing that she can eventually, after the timelock expires, redeem the refund transaction even if Fabian disappears.
|
Now that Emma has a fully signed refund transaction, she can confidently transmit the signed funding transaction knowing that she can eventually, after the timelock expires, redeem the refund transaction even if Fabian disappears.
|
||||||
|
|
||||||
Every commitment transaction the parties exchange during the life of the channel will be timelocked into the future. But the delay will be slightly shorter for each commitment so the most recent commitment can be redeemed before the prior commitment it invalidates. Because of the +nLocktime+, neither party can successfully propagate any of the commitment transactions until their timelock expires. If all goes well, they will cooperate and close the channel gracefully with a settlement transaction, making it unnecessary to transmit an intermediate commitment transaction. In essence, the commitment transactions are only used when one party disconnects and the other party has to close the channel unilaterally.
|
Every commitment transaction the parties exchange during the life of the channel will be timelocked into the future. But the delay will be slightly shorter for each commitment so the most recent commitment can be redeemed before the prior commitment it invalidates. Because of the nLockTime, neither party can successfully propagate any of the commitment transactions until their timelock expires. If all goes well, they will cooperate and close the channel gracefully with a settlement transaction, making it unnecessary to transmit an intermediate commitment transaction. If not, the most recent commitment transaction can be propagated to settle the account and invalidate all prior commitment transactions.
|
||||||
|
|
||||||
For example, if commitment transaction #1 is timelocked to 4320 blocks in the future, then commitment transaction #2 is timelocked to 4319 blocks in the future. Commitment transaction #600 can be spent 600 blocks before commitment transaction #1 becomes valid.
|
For example, if commitment transaction #1 is timelocked to 4320 blocks in the future, then commitment transaction #2 is timelocked to 4319 blocks in the future. Commitment transaction #600 can be spent 600 blocks before commitment transaction #1 becomes valid.
|
||||||
|
|
||||||
@ -432,7 +432,7 @@ ENDIF
|
|||||||
|
|
||||||
Anyone who knows the secret +R+, which when hashed equals to +H+, can redeem this output by exercising the first clause of the +IF+ flow.
|
Anyone who knows the secret +R+, which when hashed equals to +H+, can redeem this output by exercising the first clause of the +IF+ flow.
|
||||||
|
|
||||||
If the secret is not revealed and the HTLC claimed, after a certain number of blocks the payee can claim a refund using the second clause in the +IF+ flow.
|
If the secret is not revealed and the HTLC claimed, after a certain number of blocks the payer can claim a refund using the second clause in the +IF+ flow.
|
||||||
|
|
||||||
This is a basic implementation of an HTLC. This type of HTLC can be redeemed by _anyone_ who has the secret +R+. An HTLC can take many different forms with slight variations to the script. For example, adding a +CHECKSIG+ operator and a public key in the first clause restricts redemption of the hash to a named recipient, who must also know the secret +R+.((("", startref="BCApayment12")))
|
This is a basic implementation of an HTLC. This type of HTLC can be redeemed by _anyone_ who has the secret +R+. An HTLC can take many different forms with slight variations to the script. For example, adding a +CHECKSIG+ operator and a public key in the first clause restricts redemption of the hash to a named recipient, who must also know the secret +R+.((("", startref="BCApayment12")))
|
||||||
|
|
||||||
|
@ -2,23 +2,29 @@
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// Private secret key.
|
// Private secret key string as base16
|
||||||
bc::ec_secret secret;
|
bc::ec_secret decoded;
|
||||||
bool success = bc::decode_base16(secret,
|
bc::decode_base16(decoded,
|
||||||
"038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776");
|
"038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776");
|
||||||
assert(success);
|
|
||||||
|
bc::wallet::ec_private secret(
|
||||||
|
decoded, bc::wallet::ec_private::mainnet_p2kh);
|
||||||
|
|
||||||
// Get public key.
|
// Get public key.
|
||||||
bc::ec_point public_key = bc::secret_to_public_key(secret);
|
bc::wallet::ec_public public_key(secret);
|
||||||
std::cout << "Public key: " << bc::encode_hex(public_key) << std::endl;
|
std::cout << "Public key: " << public_key.encoded() << std::endl;
|
||||||
|
|
||||||
// Create Bitcoin address.
|
// Create Bitcoin address.
|
||||||
// Normally you can use:
|
// Normally you can use:
|
||||||
// bc::payment_address payaddr;
|
// bc::wallet::payment_address payaddr =
|
||||||
// bc::set_public_key(payaddr, public_key);
|
// public_key.to_payment_address(
|
||||||
// const std::string address = payaddr.encoded();
|
// bc::wallet::ec_public::mainnet_p2kh);
|
||||||
|
// const std::string address = payaddr.encoded();
|
||||||
|
|
||||||
// Compute hash of public key for P2PKH address.
|
// Compute hash of public key for P2PKH address.
|
||||||
const bc::short_hash hash = bc::bitcoin_short_hash(public_key);
|
bc::data_chunk public_key_data;
|
||||||
|
public_key.to_data(public_key_data);
|
||||||
|
const auto hash = bc::bitcoin_short_hash(public_key_data);
|
||||||
|
|
||||||
bc::data_chunk unencoded_address;
|
bc::data_chunk unencoded_address;
|
||||||
// Reserve 25 bytes
|
// Reserve 25 bytes
|
||||||
|
@ -17,15 +17,15 @@ while (line[0] != "|"):
|
|||||||
line = f.readline()
|
line = f.readline()
|
||||||
|
|
||||||
while (line[1] == '-'):
|
while (line[1] == '-'):
|
||||||
line_num = f.readline()
|
line_num = f.readline()
|
||||||
line_layer = f.readline()[2:-1]
|
line_layer = f.readline()[2:-1]
|
||||||
line_title = f.readline()[2:-1]
|
line_title = f.readline()[2:-1]
|
||||||
line_owner = f.readline()[2:-1]
|
line_owner = f.readline()[2:-1]
|
||||||
line_type = f.readline()[2:-1]
|
line_type = f.readline()[2:-1]
|
||||||
line_status = f.readline()[2:-1]
|
line_status = f.readline()[2:-1]
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
while (line[0] != "|"):
|
while (line[0] != "|"):
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
|
|
||||||
num = regex_num.match(line_num)
|
num = regex_num.match(line_num)
|
||||||
alt_num = regex_altnum.match(line_num)
|
alt_num = regex_altnum.match(line_num)
|
||||||
@ -34,6 +34,10 @@ while (line[1] == '-'):
|
|||||||
elif alt_num:
|
elif alt_num:
|
||||||
bip_num = alt_num.group(1)
|
bip_num = alt_num.group(1)
|
||||||
|
|
||||||
print "|[[bip-{0}]]https://github.com/bitcoin/bips/blob/master/bip-{0:04d}.mediawiki[BIP-{0}] |{1} |{2} |{3} |{4} ".format(int(bip_num), line_title, line_owner, line_type, line_status)
|
print("|[[bip-{0}]]https://github.com/bitcoin/bips/blob/master/bip-{0:04d}"
|
||||||
|
".mediawiki[BIP-{0}] |{1} |{2} |{3} |{4} ".format(int(bip_num),
|
||||||
|
line_title,
|
||||||
|
line_owner,
|
||||||
|
line_type,
|
||||||
|
line_status))
|
||||||
f.close()
|
f.close()
|
||||||
|
@ -1,31 +1,34 @@
|
|||||||
import ecdsa
|
import ecdsa
|
||||||
import os
|
import os
|
||||||
from ecdsa.util import string_to_number, number_to_string
|
|
||||||
|
|
||||||
# secp256k1, http://www.oid-info.com/get/1.3.132.0.10
|
# secp256k1, http://www.oid-info.com/get/1.3.132.0.10
|
||||||
_p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2FL
|
_p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
|
||||||
_r = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141L
|
_r = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
|
||||||
_b = 0x0000000000000000000000000000000000000000000000000000000000000007L
|
_b = 0x0000000000000000000000000000000000000000000000000000000000000007
|
||||||
_a = 0x0000000000000000000000000000000000000000000000000000000000000000L
|
_a = 0x0000000000000000000000000000000000000000000000000000000000000000
|
||||||
_Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798L
|
_Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
|
||||||
_Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8L
|
_Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
|
||||||
curve_secp256k1 = ecdsa.ellipticcurve.CurveFp(_p, _a, _b)
|
curve_secp256k1 = ecdsa.ellipticcurve.CurveFp(_p, _a, _b)
|
||||||
generator_secp256k1 = ecdsa.ellipticcurve.Point(curve_secp256k1, _Gx, _Gy, _r)
|
generator_secp256k1 = ecdsa.ellipticcurve.Point(curve_secp256k1, _Gx, _Gy, _r)
|
||||||
oid_secp256k1 = (1, 3, 132, 0, 10)
|
oid_secp256k1 = (1, 3, 132, 0, 10)
|
||||||
SECP256k1 = ecdsa.curves.Curve("SECP256k1", curve_secp256k1, generator_secp256k1, oid_secp256k1)
|
SECP256k1 = ecdsa.curves.Curve("SECP256k1", curve_secp256k1,
|
||||||
|
generator_secp256k1, oid_secp256k1)
|
||||||
ec_order = _r
|
ec_order = _r
|
||||||
|
|
||||||
curve = curve_secp256k1
|
curve = curve_secp256k1
|
||||||
generator = generator_secp256k1
|
generator = generator_secp256k1
|
||||||
|
|
||||||
|
|
||||||
def random_secret():
|
def random_secret():
|
||||||
convert_to_int = lambda array: int("".join(array).encode("hex"), 16)
|
convert_to_int = lambda array: int("".join(array).encode("hex"), 16)
|
||||||
|
|
||||||
# Collect 256 bits of random data from the OS's cryptographically secure random number generator
|
# Collect 256 bits of random data from the OS's cryptographically secure
|
||||||
|
# random generator
|
||||||
byte_array = os.urandom(32)
|
byte_array = os.urandom(32)
|
||||||
|
|
||||||
return convert_to_int(byte_array)
|
return convert_to_int(byte_array)
|
||||||
|
|
||||||
|
|
||||||
def get_point_pubkey(point):
|
def get_point_pubkey(point):
|
||||||
if (point.y() % 2) == 1:
|
if (point.y() % 2) == 1:
|
||||||
key = '03' + '%064x' % point.x()
|
key = '03' + '%064x' % point.x()
|
||||||
@ -33,24 +36,24 @@ def get_point_pubkey(point):
|
|||||||
key = '02' + '%064x' % point.x()
|
key = '02' + '%064x' % point.x()
|
||||||
return key.decode('hex')
|
return key.decode('hex')
|
||||||
|
|
||||||
|
|
||||||
def get_point_pubkey_uncompressed(point):
|
def get_point_pubkey_uncompressed(point):
|
||||||
key = '04' + \
|
key = ('04' +
|
||||||
'%064x' % point.x() + \
|
'%064x' % point.x() +
|
||||||
'%064x' % point.y()
|
'%064x' % point.y())
|
||||||
return key.decode('hex')
|
return key.decode('hex')
|
||||||
|
|
||||||
|
|
||||||
# Generate a new private key.
|
# Generate a new private key.
|
||||||
secret = random_secret()
|
secret = random_secret()
|
||||||
print "Secret: ", secret
|
print("Secret: ", secret)
|
||||||
|
|
||||||
# Get the public key point.
|
# Get the public key point.
|
||||||
point = secret * generator
|
point = secret * generator
|
||||||
print "EC point:", point
|
print("EC point:", point)
|
||||||
|
|
||||||
print "BTC public key:", get_point_pubkey(point).encode("hex")
|
print("BTC public key:", get_point_pubkey(point).encode("hex"))
|
||||||
|
|
||||||
# Given the point (x, y) we can create the object using:
|
# Given the point (x, y) we can create the object using:
|
||||||
point1 = ecdsa.ellipticcurve.Point(curve, point.x(), point.y(), ec_order)
|
point1 = ecdsa.ellipticcurve.Point(curve, point.x(), point.y(), ec_order)
|
||||||
assert point1 == point
|
assert(point1 == point)
|
||||||
|
|
||||||
|
@ -25,4 +25,7 @@ resp = requests.get('https://blockchain.info/unspent?active=%s' % address)
|
|||||||
utxo_set = json.loads(resp.text)["unspent_outputs"]
|
utxo_set = json.loads(resp.text)["unspent_outputs"]
|
||||||
|
|
||||||
for utxo in utxo_set:
|
for utxo in utxo_set:
|
||||||
print "%s:%d - %ld Satoshis" % (utxo['tx_hash'], utxo['tx_output_n'], utxo['value'])
|
print("%s:%d - %ld Satoshis" % (utxo['tx_hash'], utxo['tx_output_n'],
|
||||||
|
utxo['value']))
|
||||||
|
# Or try...
|
||||||
|
# print("{tx_hash}:{tx_output_n} - {value} Satoshis".format(**utxo))
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
|
|
||||||
# example of iterating a nonce in a hashing algorithm's input
|
# example of iterating a nonce in a hashing algorithm's input
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
text = "I am Satoshi Nakamoto"
|
text = "I am Satoshi Nakamoto"
|
||||||
|
|
||||||
# iterate nonce from 0 to 19
|
# iterate nonce from 0 to 19
|
||||||
for nonce in xrange(20):
|
for nonce in range(20):
|
||||||
|
|
||||||
# add the nonce to the end of the text
|
# add the nonce to the end of the text
|
||||||
input_data = text + str(nonce)
|
input_data = text + str(nonce)
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from __future__ import print_function
|
||||||
import bitcoin
|
import bitcoin
|
||||||
|
|
||||||
# Generate a random private key
|
# Generate a random private key
|
||||||
@ -5,45 +6,41 @@ valid_private_key = False
|
|||||||
while not valid_private_key:
|
while not valid_private_key:
|
||||||
private_key = bitcoin.random_key()
|
private_key = bitcoin.random_key()
|
||||||
decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
|
decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
|
||||||
valid_private_key = 0 < decoded_private_key < bitcoin.N
|
valid_private_key = 0 < decoded_private_key < bitcoin.N
|
||||||
|
|
||||||
print "Private Key (hex) is: ", private_key
|
print("Private Key (hex) is: ", private_key)
|
||||||
print "Private Key (decimal) is: ", decoded_private_key
|
print("Private Key (decimal) is: ", decoded_private_key)
|
||||||
|
|
||||||
# Convert private key to WIF format
|
# Convert private key to WIF format
|
||||||
wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
|
wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
|
||||||
print "Private Key (WIF) is: ", wif_encoded_private_key
|
print("Private Key (WIF) is: ", wif_encoded_private_key)
|
||||||
|
|
||||||
# Add suffix "01" to indicate a compressed private key
|
# Add suffix "01" to indicate a compressed private key
|
||||||
compressed_private_key = private_key + '01'
|
compressed_private_key = private_key + '01'
|
||||||
print "Private Key Compressed (hex) is: ", compressed_private_key
|
print("Private Key Compressed (hex) is: ", compressed_private_key)
|
||||||
|
|
||||||
# Generate a WIF format from the compressed private key (WIF-compressed)
|
# Generate a WIF format from the compressed private key (WIF-compressed)
|
||||||
wif_compressed_private_key = bitcoin.encode_privkey(
|
wif_compressed_private_key = bitcoin.encode_privkey(
|
||||||
bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
|
bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
|
||||||
print "Private Key (WIF-Compressed) is: ", wif_compressed_private_key
|
print("Private Key (WIF-Compressed) is: ", wif_compressed_private_key)
|
||||||
|
|
||||||
# Multiply the EC generator point G with the private key to get a public key point
|
# Multiply the EC generator point G with the private key to get a public key point
|
||||||
public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
|
public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
|
||||||
print "Public Key (x,y) coordinates is:", public_key
|
print("Public Key (x,y) coordinates is:", public_key)
|
||||||
|
|
||||||
# Encode as hex, prefix 04
|
# Encode as hex, prefix 04
|
||||||
hex_encoded_public_key = bitcoin.encode_pubkey(public_key,'hex')
|
hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
|
||||||
print "Public Key (hex) is:", hex_encoded_public_key
|
print("Public Key (hex) is:", hex_encoded_public_key)
|
||||||
|
|
||||||
# Compress public key, adjust prefix depending on whether y is even or odd
|
# Compress public key, adjust prefix depending on whether y is even or odd
|
||||||
(public_key_x, public_key_y) = public_key
|
(public_key_x, public_key_y) = public_key
|
||||||
if (public_key_y % 2) == 0:
|
compressed_prefix = '02' if (public_key_y % 2) == 0 else '03'
|
||||||
compressed_prefix = '02'
|
hex_compressed_public_key = compressed_prefix + (bitcoin.encode(public_key_x, 16).zfill(64))
|
||||||
else:
|
print("Compressed Public Key (hex) is:", hex_compressed_public_key)
|
||||||
compressed_prefix = '03'
|
|
||||||
hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
|
|
||||||
print "Compressed Public Key (hex) is:", hex_compressed_public_key
|
|
||||||
|
|
||||||
# Generate bitcoin address from public key
|
# Generate bitcoin address from public key
|
||||||
print "Bitcoin Address (b58check) is:", bitcoin.pubkey_to_address(public_key)
|
print("Bitcoin Address (b58check) is:", bitcoin.pubkey_to_address(public_key))
|
||||||
|
|
||||||
# Generate compressed bitcoin address from compressed public key
|
# Generate compressed bitcoin address from compressed public key
|
||||||
print "Compressed Bitcoin Address (b58check) is:", \
|
print("Compressed Bitcoin Address (b58check) is:",
|
||||||
bitcoin.pubkey_to_address(hex_compressed_public_key)
|
bitcoin.pubkey_to_address(hex_compressed_public_key))
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ start_block_reward = 50
|
|||||||
# 210000 is around every 4 years with a 10 minute block interval
|
# 210000 is around every 4 years with a 10 minute block interval
|
||||||
reward_interval = 210000
|
reward_interval = 210000
|
||||||
|
|
||||||
|
|
||||||
def max_money():
|
def max_money():
|
||||||
# 50 BTC = 50 0000 0000 Satoshis
|
# 50 BTC = 50 0000 0000 Satoshis
|
||||||
current_reward = 50 * 10**8
|
current_reward = 50 * 10**8
|
||||||
@ -12,5 +13,5 @@ def max_money():
|
|||||||
current_reward /= 2
|
current_reward /= 2
|
||||||
return total
|
return total
|
||||||
|
|
||||||
print "Total BTC to ever be created:", max_money(), "Satoshis"
|
|
||||||
|
|
||||||
|
print("Total BTC to ever be created:", max_money(), "Satoshis")
|
||||||
|
@ -24,10 +24,10 @@ bc::hash_digest create_merkle(bc::hash_list& merkle)
|
|||||||
{
|
{
|
||||||
// Join both current hashes together (concatenate).
|
// Join both current hashes together (concatenate).
|
||||||
bc::data_chunk concat_data(bc::hash_size * 2);
|
bc::data_chunk concat_data(bc::hash_size * 2);
|
||||||
auto concat = bc::make_serializer(concat_data.begin());
|
auto concat = bc::serializer<
|
||||||
|
decltype(concat_data.begin())>(concat_data.begin());
|
||||||
concat.write_hash(*it);
|
concat.write_hash(*it);
|
||||||
concat.write_hash(*(it + 1));
|
concat.write_hash(*(it + 1));
|
||||||
assert(concat.iterator() == concat_data.end());
|
|
||||||
// Hash both of the hashes.
|
// Hash both of the hashes.
|
||||||
bc::hash_digest new_root = bc::bitcoin_hash(concat_data);
|
bc::hash_digest new_root = bc::bitcoin_hash(concat_data);
|
||||||
// Add this to the new list.
|
// Add this to the new list.
|
||||||
@ -39,7 +39,7 @@ bc::hash_digest create_merkle(bc::hash_list& merkle)
|
|||||||
// DEBUG output -------------------------------------
|
// DEBUG output -------------------------------------
|
||||||
std::cout << "Current merkle hash list:" << std::endl;
|
std::cout << "Current merkle hash list:" << std::endl;
|
||||||
for (const auto& hash: merkle)
|
for (const auto& hash: merkle)
|
||||||
std::cout << " " << bc::encode_hex(hash) << std::endl;
|
std::cout << " " << bc::encode_base16(hash) << std::endl;
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
}
|
}
|
||||||
@ -56,7 +56,7 @@ int main()
|
|||||||
bc::hash_literal("0000000000000000000000000000000000000000000000000000000000000022"),
|
bc::hash_literal("0000000000000000000000000000000000000000000000000000000000000022"),
|
||||||
}};
|
}};
|
||||||
const bc::hash_digest merkle_root = create_merkle(tx_hashes);
|
const bc::hash_digest merkle_root = create_merkle(tx_hashes);
|
||||||
std::cout << "Result: " << bc::encode_hex(merkle_root) << std::endl;
|
std::cout << "Result: " << bc::encode_base16(merkle_root) << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,60 +4,61 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
import time
|
import time
|
||||||
|
|
||||||
max_nonce = 2 ** 32 # 4 billion
|
try:
|
||||||
|
long # Python 2
|
||||||
|
xrange
|
||||||
|
except NameError:
|
||||||
|
long = int # Python 3
|
||||||
|
xrange = range
|
||||||
|
|
||||||
|
max_nonce = 2 ** 32 # 4 billion
|
||||||
|
|
||||||
|
|
||||||
def proof_of_work(header, difficulty_bits):
|
def proof_of_work(header, difficulty_bits):
|
||||||
|
|
||||||
# calculate the difficulty target
|
# calculate the difficulty target
|
||||||
target = 2 ** (256-difficulty_bits)
|
target = 2 ** (256 - difficulty_bits)
|
||||||
|
|
||||||
for nonce in xrange(max_nonce):
|
for nonce in xrange(max_nonce):
|
||||||
hash_result = hashlib.sha256(str(header)+str(nonce)).hexdigest()
|
hash_result = hashlib.sha256(str(header) + str(nonce)).hexdigest()
|
||||||
|
|
||||||
# check if this is a valid result, below the target
|
# check if this is a valid result, below the target
|
||||||
if long(hash_result, 16) < target:
|
if long(hash_result, 16) < target:
|
||||||
print "Success with nonce %d" % nonce
|
print("Success with nonce %d" % nonce)
|
||||||
print "Hash is %s" % hash_result
|
print("Hash is %s" % hash_result)
|
||||||
return (hash_result,nonce)
|
return (hash_result, nonce)
|
||||||
|
|
||||||
print "Failed after %d (max_nonce) tries" % nonce
|
print("Failed after %d (max_nonce) tries" % nonce)
|
||||||
return nonce
|
return nonce
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
nonce = 0
|
nonce = 0
|
||||||
hash_result = ''
|
hash_result = ''
|
||||||
|
|
||||||
# difficulty from 0 to 31 bits
|
# difficulty from 0 to 31 bits
|
||||||
for difficulty_bits in xrange(32):
|
for difficulty_bits in xrange(32):
|
||||||
|
|
||||||
difficulty = 2 ** difficulty_bits
|
difficulty = 2 ** difficulty_bits
|
||||||
print "Difficulty: %ld (%d bits)" % (difficulty, difficulty_bits)
|
print("Difficulty: %ld (%d bits)" % (difficulty, difficulty_bits))
|
||||||
|
print("Starting search...")
|
||||||
print "Starting search..."
|
|
||||||
|
|
||||||
# checkpoint the current time
|
# checkpoint the current time
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
|
|
||||||
# make a new block which includes the hash from the previous block
|
# make a new block which includes the hash from the previous block
|
||||||
# we fake a block of transactions - just a string
|
# we fake a block of transactions - just a string
|
||||||
new_block = 'test block with transactions' + hash_result
|
new_block = 'test block with transactions' + hash_result
|
||||||
|
|
||||||
# find a valid nonce for the new block
|
# find a valid nonce for the new block
|
||||||
(hash_result, nonce) = proof_of_work(new_block, difficulty_bits)
|
(hash_result, nonce) = proof_of_work(new_block, difficulty_bits)
|
||||||
|
|
||||||
# checkpoint how long it took to find a result
|
# checkpoint how long it took to find a result
|
||||||
end_time = time.time()
|
end_time = time.time()
|
||||||
|
|
||||||
elapsed_time = end_time - start_time
|
elapsed_time = end_time - start_time
|
||||||
print "Elapsed Time: %.4f seconds" % elapsed_time
|
print("Elapsed Time: %.4f seconds" % elapsed_time)
|
||||||
|
|
||||||
if elapsed_time > 0:
|
if elapsed_time > 0:
|
||||||
|
|
||||||
# estimate the hashes per second
|
# estimate the hashes per second
|
||||||
hash_power = float(long(nonce)/elapsed_time)
|
hash_power = float(long(nonce) / elapsed_time)
|
||||||
print "Hashing Power: %ld hashes per second" % hash_power
|
print("Hashing Power: %ld hashes per second" % hash_power)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
from pycoin.key import Key
|
from pycoin.key import Key
|
||||||
|
|
||||||
from pycoin.key.validate import is_address_valid, is_wif_valid
|
from pycoin.key.validate import is_address_valid, is_wif_valid
|
||||||
|
@ -3,8 +3,8 @@ from bitcoin.rpc import RawProxy
|
|||||||
# Create a connection to local Bitcoin Core node
|
# Create a connection to local Bitcoin Core node
|
||||||
p = RawProxy()
|
p = RawProxy()
|
||||||
|
|
||||||
# Run the getinfo command, store the resulting data in info
|
# Run the getblockchaininfo command, store the resulting data in info
|
||||||
info = p.getinfo()
|
info = p.getblockchaininfo()
|
||||||
|
|
||||||
# Retrieve the 'blocks' element from the info
|
# Retrieve the 'blocks' element from the info
|
||||||
print(info['blocks'])
|
print(info['blocks'])
|
||||||
|
@ -7,20 +7,19 @@
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// Create genesis block.
|
// Create genesis block.
|
||||||
const bc::block_type block = bc::genesis_block();
|
bc::chain::block block = bc::chain::block::genesis_mainnet();
|
||||||
// Genesis block contains a single coinbase transaction.
|
// Genesis block contains a single coinbase transaction.
|
||||||
assert(block.transactions.size() == 1);
|
assert(block.transactions().size() == 1);
|
||||||
// Get first transaction in block (coinbase).
|
// Get first transaction in block (coinbase).
|
||||||
const bc::transaction_type& coinbase_tx = block.transactions[0];
|
const bc::chain::transaction& coinbase_tx = block.transactions()[0];
|
||||||
// Coinbase tx has a single input.
|
// Coinbase tx has a single input.
|
||||||
assert(coinbase_tx.inputs.size() == 1);
|
assert(coinbase_tx.inputs().size() == 1);
|
||||||
const bc::transaction_input_type& coinbase_input = coinbase_tx.inputs[0];
|
const bc::chain::input& coinbase_input = coinbase_tx.inputs()[0];
|
||||||
// Convert the input script to its raw format.
|
// Convert the input script to its raw format.
|
||||||
const bc::data_chunk raw_message = save_script(coinbase_input.script);
|
const auto prefix = false;
|
||||||
// Convert this to an std::string.
|
const bc::data_chunk& raw_message = coinbase_input.script().to_data(prefix);
|
||||||
std::string message;
|
// Convert this to a std::string.
|
||||||
message.resize(raw_message.size());
|
std::string message(raw_message.begin(), raw_message.end());
|
||||||
std::copy(raw_message.begin(), raw_message.end(), message.begin());
|
|
||||||
// Display the genesis block message.
|
// Display the genesis block message.
|
||||||
std::cout << message << std::endl;
|
std::cout << message << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2,8 +2,13 @@
|
|||||||
|
|
||||||
from sys import argv
|
from sys import argv
|
||||||
|
|
||||||
class OutputInfo:
|
try:
|
||||||
|
long # Python 2
|
||||||
|
except NameError:
|
||||||
|
long = int # Python 3
|
||||||
|
|
||||||
|
|
||||||
|
class OutputInfo:
|
||||||
def __init__(self, tx_hash, tx_index, value):
|
def __init__(self, tx_hash, tx_index, value):
|
||||||
self.tx_hash = tx_hash
|
self.tx_hash = tx_hash
|
||||||
self.tx_index = tx_index
|
self.tx_index = tx_index
|
||||||
@ -13,6 +18,7 @@ class OutputInfo:
|
|||||||
return "<%s:%s with %s Satoshis>" % (self.tx_hash, self.tx_index,
|
return "<%s:%s with %s Satoshis>" % (self.tx_hash, self.tx_index,
|
||||||
self.value)
|
self.value)
|
||||||
|
|
||||||
|
|
||||||
# Select optimal outputs for a send from unspent outputs list.
|
# Select optimal outputs for a send from unspent outputs list.
|
||||||
# Returns output list and remaining change to be sent to
|
# Returns output list and remaining change to be sent to
|
||||||
# a change address.
|
# a change address.
|
||||||
@ -44,6 +50,7 @@ def select_outputs_greedy(unspent, min_value):
|
|||||||
# No results found.
|
# No results found.
|
||||||
return None, 0
|
return None, 0
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
unspent = [
|
unspent = [
|
||||||
OutputInfo("ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167", 1, 8000000),
|
OutputInfo("ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167", 1, 8000000),
|
||||||
@ -54,15 +61,11 @@ def main():
|
|||||||
OutputInfo("12b6a7934c1df821945ee9ee3b3326d07ca7a65fd6416ea44ce8c3db0c078c64", 0, 10000000),
|
OutputInfo("12b6a7934c1df821945ee9ee3b3326d07ca7a65fd6416ea44ce8c3db0c078c64", 0, 10000000),
|
||||||
OutputInfo("7f42eda67921ee92eae5f79bd37c68c9cb859b899ce70dba68c48338857b7818", 0, 16100000),
|
OutputInfo("7f42eda67921ee92eae5f79bd37c68c9cb859b899ce70dba68c48338857b7818", 0, 16100000),
|
||||||
]
|
]
|
||||||
|
target = long(argv[1]) if len(argv) > 1 else 55000000
|
||||||
if len(argv) > 1:
|
print("For transaction amount %d Satoshis (%f bitcoin) use: " %
|
||||||
target = long(argv[1])
|
(target, target / 10.0 ** 8))
|
||||||
else:
|
print(select_outputs_greedy(unspent, target))
|
||||||
target = 55000000
|
|
||||||
|
|
||||||
print "For transaction amount %d Satoshis (%f bitcoin) use: " % (target, target/10.0**8)
|
|
||||||
print select_outputs_greedy(unspent, target)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <random>
|
||||||
#include <bitcoin/bitcoin.hpp>
|
#include <bitcoin/bitcoin.hpp>
|
||||||
|
|
||||||
// The string we are searching for
|
// The string we are searching for
|
||||||
@ -30,7 +31,7 @@ int main()
|
|||||||
{
|
{
|
||||||
// Success!
|
// Success!
|
||||||
std::cout << "Found vanity address! " << address << std::endl;
|
std::cout << "Found vanity address! " << address << std::endl;
|
||||||
std::cout << "Secret: " << bc::encode_hex(secret) << std::endl;
|
std::cout << "Secret: " << bc::encode_base16(secret) << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -51,11 +52,9 @@ bc::ec_secret random_secret(std::default_random_engine& engine)
|
|||||||
|
|
||||||
std::string bitcoin_address(const bc::ec_secret& secret)
|
std::string bitcoin_address(const bc::ec_secret& secret)
|
||||||
{
|
{
|
||||||
// Convert secret to pubkey...
|
// Convert secret to payment address
|
||||||
bc::ec_point pubkey = bc::secret_to_public_key(secret);
|
bc::wallet::ec_private private_key(secret);
|
||||||
// Finally create address.
|
bc::wallet::payment_address payaddr(private_key);
|
||||||
bc::payment_address payaddr;
|
|
||||||
bc::set_public_key(payaddr, pubkey);
|
|
||||||
// Return encoded form.
|
// Return encoded form.
|
||||||
return payaddr.encoded();
|
return payaddr.encoded();
|
||||||
}
|
}
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
== Colored Coins
|
|
||||||
|
|
||||||
The term _Colored Coins_ refers to a set of similar technologies that use bitcoin transactions to record the creation, ownership and transfer of extrinsic assets other than bitcoin. By "extrinsic" we mean assets that are not stored directly on the bitcoin blockchain, as opposed to bitcoin itself which is an asset intrinsic to the blockchain.
|
|
||||||
|
|
||||||
Colored coins are used to track digital assets as well as physical assets held by third parties and traded through colored coins certificates of ownership. Digital asset colored coins can represent intangible assets such as a stock certificate, license, virtual property (game items), or most any form of licensed intellectual property (trademarks, copyrights, etc). Tangible asset colored coins can represent certificates of ownership of commodities (gold, silver, oil), land title, automobiles, boats, aircraft, etc.
|
|
||||||
|
|
||||||
The term derives from the idea of "coloring" or marking a nominal amount of bitcoin, for example a single satoshi, to represent something other than the bitcoin value itself. As an analogy, consider stamping a $1 note with a message saying "This is a stock certificate of ACME" or "This note can be redeemed for 1 oz of silver" and then trading the $1 note as a certificate of ownership of this other asset. The first implementation of colored coins, named _Enhanced Padded-Order-Based Coloring_ or _EPOBC_ assigned extrinsic assets to a 1 satoshi output. In this way, it was a true "colored coin".
|
|
||||||
|
|
||||||
After _EPOBC_, more recent implementations of colored coins use the OP_RETURN script to store metadata about extrinsic assets. In a sense these systems are not true colored coins as no coins are "colored". Instead, transactions with OP_RETURN metadata are used to create and track ownership in conjunction with external data stores which associate the metadata to specific assets.
|
|
||||||
|
|
||||||
The two most prominent implementations of colored coins today are http://www.openassets.org/[_Open Assets_] and https://coloredcoins.org[_Colored Coins by Colu_]. These two systems use different approaches to colored coins and are not compatible. Colored coins created in one system cannot be seen or used in the other system.
|
|
||||||
|
|
||||||
==== Using Colored Coins
|
|
||||||
|
|
||||||
Colored coins are created, transfered and generally viewed in special wallets that can interpret the colored coins protocol metadata attached to bitcoin transactions. Special care must be taken to avoid using a colored coin related key in a regular bitcoin wallet, as the regular wallet may destroy the metadata. Similarly, colored coins should not be sent to addresses managed by regular wallets, but only to addresses that are managed by wallets that are colored-coin-aware. Both Colu and Open Assets systems use special colored-coin addresses to address this risk and to ensure that colored coins are not sent to unaware wallets.
|
|
||||||
|
|
||||||
Colored coins are also not visible to most general-purpose blockchain explorers. Instead, you must use a colored-coins explorer to interpret the metadata of a colored coins transaction.
|
|
||||||
|
|
||||||
Am Open Assets compatible wallet application and blockchain explorer can be found at:
|
|
||||||
|
|
||||||
coinprism: https://www.coinprism.info[https://www.coinprism.info]
|
|
||||||
|
|
||||||
A Colu Colored Coins compatible wallet application and blockchain explorer can be found at:
|
|
||||||
|
|
||||||
Blockchain Explorer: http://coloredcoins.org/explorer/[http://coloredcoins.org/explorer/]
|
|
||||||
|
|
||||||
Copay wallet plugin:
|
|
||||||
http://coloredcoins.org/colored-coins-copay-addon/[http://coloredcoins.org/colored-coins-copay-addon/]
|
|
||||||
|
|
||||||
==== Creating Colored Coins
|
|
||||||
|
|
||||||
Each of the colored coins implementations has a different way of creating colored coins, but they all provide similar functionality. The process of creating a colored coin asset is called _issuance_. An initial transaction, the _issuance transaction_ registers the asset on the bitcoin blockchain and creates an _asset ID_ that is used to reference the asset. Once issued, assets can be transferred between addresses using _transfer transactions_.
|
|
||||||
|
|
||||||
Assets issued as colored coins can have multiple properties. They can be _divisible_ or _indivisible_, meaning that the amount of asset in a transfer can be an integer (eg. 5) or have decimal subdivision (eg. 4.321). Assets can also have _fixed issuance_, meaning a certain amount are issued only once, or can be _reissued_, meaning that new units of the asset can be issued by the original issuer after the initial issuance.
|
|
||||||
|
|
||||||
Finally, some colored coins enable the issuance of _dividends_, allowing the distribution of bitcoin payments to the owners of a colored coin asset in proportion to their ownership.
|
|
@ -1,244 +1,249 @@
|
|||||||
[preface]
|
[preface]
|
||||||
== Quick Glossary
|
== Quick Glossary
|
||||||
|
|
||||||
This quick glossary contains many of the terms used in relation to bitcoin. These terms are used throughout the book, so bookmark this for a quick reference.
|
This quick glossary contains many of the terms used in relation to bitcoin. These terms are used throughout the book, so bookmark this for a quick reference.
|
||||||
|
|
||||||
address::
|
address::
|
||||||
A bitcoin address looks like +1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV+. It consists of a string of letters and numbers. It's really an encoded base58check version of a public key 160-bit hash. Just like you ask others to send an email to your email address, you would ask others to send you bitcoin to one of your bitcoin addresses.
|
A bitcoin address looks like +1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV+. It consists of a string of letters and numbers. It's really an encoded base58check version of a public key 160-bit hash. Just like you ask others to send an email to your email address, you would ask others to send you bitcoin to one of your bitcoin addresses.
|
||||||
|
|
||||||
bip::
|
bip::
|
||||||
Bitcoin Improvement Proposals. A set of proposals that members of the bitcoin community have submitted to improve bitcoin. For example, BIP-21 is a proposal to improve the bitcoin uniform resource identifier (URI) scheme.
|
Bitcoin Improvement Proposals. A set of proposals that members of the bitcoin community have submitted to improve bitcoin. For example, BIP-21 is a proposal to improve the bitcoin uniform resource identifier (URI) scheme.
|
||||||
|
|
||||||
bitcoin::
|
bitcoin::
|
||||||
The name of the currency unit (the coin), the network, and the software.
|
The name of the currency unit (the coin), the network, and the software.
|
||||||
|
|
||||||
block::
|
block::
|
||||||
A grouping of transactions, marked with a timestamp, and a fingerprint of the previous block. The block header is hashed to produce a proof of work, thereby validating the transactions. Valid blocks are added to the main blockchain by network consensus.
|
A grouping of transactions, marked with a timestamp, and a fingerprint of the previous block. The block header is hashed to produce a proof of work, thereby validating the transactions. Valid blocks are added to the main blockchain by network consensus.
|
||||||
|
|
||||||
blockchain::
|
blockchain::
|
||||||
A list of validated blocks, each linking to its predecessor all the way to the genesis block.
|
A list of validated blocks, each linking to its predecessor all the way to the genesis block.
|
||||||
|
|
||||||
Byzantine Generals Problem::
|
Byzantine Generals Problem::
|
||||||
A reliable computer system must be able to cope with the failure of one or more of its components. A failed component may exhibit a type of behavior that is often overlooked--namely, sending conflicting information to different parts of the system. The problem of coping with this type of failure is expressed abstractly as the Byzantine Generals Problem.
|
A reliable computer system must be able to cope with the failure of one or more of its components. A failed component may exhibit a type of behavior that is often overlooked--namely, sending conflicting information to different parts of the system. The problem of coping with this type of failure is expressed abstractly as the Byzantine Generals Problem.
|
||||||
|
|
||||||
coinbase::
|
coinbase::
|
||||||
A special field used as the sole input for coinbase transactions. The coinbase allows claiming the block reward and provides up to 100 bytes for arbitrary data.
|
A special field used as the sole input for coinbase transactions. The coinbase allows claiming the block reward and provides up to 100 bytes for arbitrary data.
|
||||||
Not to be confused with Coinbase transaction.
|
Not to be confused with Coinbase transaction.
|
||||||
|
|
||||||
coinbase transaction::
|
coinbase transaction::
|
||||||
The first transaction in a block. Always created by a miner, it includes a single coinbase.
|
The first transaction in a block. Always created by a miner, it includes a single coinbase.
|
||||||
Not to be confused with Coinbase.
|
Not to be confused with Coinbase.
|
||||||
|
|
||||||
cold storage::
|
cold storage::
|
||||||
Refers to keeping a reserve of bitcoin offline. Cold storage is achieved when Bitcoin private keys are created and stored in a secure offline environment. Cold storage is important for anyone with bitcoin holdings. Online computers are vulnerable to hackers and should not be used to store a significant amount of bitcoin.
|
Refers to keeping a reserve of bitcoin offline. Cold storage is achieved when Bitcoin private keys are created and stored in a secure offline environment. Cold storage is important for anyone with bitcoin holdings. Online computers are vulnerable to hackers and should not be used to store a significant amount of bitcoin.
|
||||||
|
|
||||||
Colored coins::
|
Colored coins::
|
||||||
It's an open source Bitcoin 2.0 protocol that enables developers to create digital assets on top of Bitcoin Blockchain utilizing its functionalities beyond currency.
|
It's an open source Bitcoin 2.0 protocol that enables developers to create digital assets on top of Bitcoin Blockchain utilizing its functionalities beyond currency.
|
||||||
|
|
||||||
confirmations::
|
confirmations::
|
||||||
Once a transaction is included in a block, it has one confirmation. As soon as _another_ block is mined on the same blockchain, the transaction has two confirmations, and so on. Six or more confirmations is considered sufficient proof that a transaction cannot be reversed.
|
Once a transaction is included in a block, it has one confirmation. As soon as _another_ block is mined on the same blockchain, the transaction has two confirmations, and so on. Six or more confirmations is considered sufficient proof that a transaction cannot be reversed.
|
||||||
|
|
||||||
consensus::
|
consensus::
|
||||||
When several nodes, usually most nodes on the network, all have the same blocks in their locally-validated best block chain.
|
When several nodes, usually most nodes on the network, all have the same blocks in their locally-validated best block chain.
|
||||||
Not to be confused with consensus rules.
|
Not to be confused with consensus rules.
|
||||||
|
|
||||||
consensus rules::
|
consensus rules::
|
||||||
The block validation rules that full nodes follow to stay in consensus with other nodes.
|
The block validation rules that full nodes follow to stay in consensus with other nodes.
|
||||||
Not to be confused with consensus.
|
Not to be confused with consensus.
|
||||||
|
|
||||||
difficulty::
|
difficulty::
|
||||||
A network-wide setting that controls how much computation is required to produce a proof of work.
|
A network-wide setting that controls how much computation is required to produce a proof of work.
|
||||||
|
|
||||||
difficulty retargeting::
|
difficulty retargeting::
|
||||||
A network-wide recalculation of the difficulty that occurs once every 2,016 blocks and considers the hashing power of the previous 2,016 blocks.
|
A network-wide recalculation of the difficulty that occurs once every 2,016 blocks and considers the hashing power of the previous 2,016 blocks.
|
||||||
|
|
||||||
difficulty target::
|
difficulty target::
|
||||||
A difficulty at which all the computation in the network will find blocks approximately every 10 minutes.
|
A difficulty at which all the computation in the network will find blocks approximately every 10 minutes.
|
||||||
|
|
||||||
Double spending::
|
Double spending::
|
||||||
Double-spending is the result of successfully spending some money more than once. Bitcoin protects against double spending by verifying each transaction added to the block chain to ensure that the inputs for the transaction had not previously already been spent.
|
Double-spending is the result of successfully spending some money more than once. Bitcoin protects against double spending by verifying each transaction added to the block chain to ensure that the inputs for the transaction had not previously already been spent.
|
||||||
|
|
||||||
ECDSA::
|
ECDSA::
|
||||||
Elliptic Curve Digital Signature Algorithm or ECDSA is a cryptographic algorithm used by Bitcoin to ensure that funds can only be spent by their rightful owners.
|
Elliptic Curve Digital Signature Algorithm or ECDSA is a cryptographic algorithm used by Bitcoin to ensure that funds can only be spent by their rightful owners.
|
||||||
|
|
||||||
Extra Nonce::
|
Extra Nonce::
|
||||||
As difficulty increased, miners often cycled through all 4 billion values of the nonce without finding a block. Because the coinbase script can store between 2 and 100 bytes of data, miners started using that space as extra nonce space, allowing them to explore a much larger range of block header values to find valid blocks. (("Extra Nonce")))
|
As difficulty increased, miners often cycled through all 4 billion values of the nonce without finding a block. Because the coinbase script can store between 2 and 100 bytes of data, miners started using that space as extra nonce space, allowing them to explore a much larger range of block header values to find valid blocks.
|
||||||
|
|
||||||
fees::
|
fees::
|
||||||
The sender of a transaction often includes a fee to the network for processing the requested transaction. Most transactions require a minimum fee of 0.5 mBTC.
|
The sender of a transaction often includes a fee to the network for processing the requested transaction. Most transactions require a minimum fee of 0.5 mBTC.
|
||||||
|
|
||||||
fork::
|
fork::
|
||||||
Fork, also known as accidental fork, occurs when two or more blocks have the same block height, forking the block chain. Typically occurs when two or more miners find blocks at nearly the same time. Can also happen as part of an attack.
|
Fork, also known as accidental fork, occurs when two or more blocks have the same block height, forking the block chain. Typically occurs when two or more miners find blocks at nearly the same time. Can also happen as part of an attack.
|
||||||
|
|
||||||
genesis block::
|
genesis block::
|
||||||
The first block in the blockchain, used to initialize the cryptocurrency.
|
The first block in the blockchain, used to initialize the cryptocurrency.
|
||||||
|
|
||||||
Hard Fork::
|
Hard Fork::
|
||||||
Hard Fork, also known as Hard-Forking Change, is a permanent divergence in the blockchain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.
|
Hard Fork, also known as Hard-Forking Change, is a permanent divergence in the blockchain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.
|
||||||
Not to be confused with Fork, Soft fork, Software fork or Git fork.
|
Not to be confused with Fork, Soft fork, Software fork or Git fork.
|
||||||
|
|
||||||
Hardware Wallet::
|
Hardware Wallet::
|
||||||
A hardware Wallet is a special type of bitcoin wallet which stores the user's private keys in a secure hardware device.
|
A hardware Wallet is a special type of bitcoin wallet which stores the user's private keys in a secure hardware device.
|
||||||
|
|
||||||
hash::
|
hash::
|
||||||
A digital fingerprint of some binary input.
|
A digital fingerprint of some binary input.
|
||||||
|
|
||||||
hashlocks::
|
hashlocks::
|
||||||
A Hashlock is a type of encumbrance that restricts the spending of an output until a specified piece of data is publicly revealed. Hashlocks have the useful property that once any hashlock is opened publicly, any other hashlock secured using the same key can also be opened. This makes it possible to create multiple outputs that are all encumbered by the same hashlock and which all become spendable at the same time.
|
A Hashlock is a type of encumbrance that restricts the spending of an output until a specified piece of data is publicly revealed. Hashlocks have the useful property that once any hashlock is opened publicly, any other hashlock secured using the same key can also be opened. This makes it possible to create multiple outputs that are all encumbered by the same hashlock and which all become spendable at the same time.
|
||||||
|
|
||||||
HD Protocol::
|
HD Protocol::
|
||||||
The Hierarchical Deterministic (HD) key creation and transfer protocol (BIP32), which allows creating child keys from parent keys in a hierarchy.
|
The Hierarchical Deterministic (HD) key creation and transfer protocol (BIP32), which allows creating child keys from parent keys in a hierarchy.
|
||||||
|
|
||||||
HD Wallet::
|
HD Wallet::
|
||||||
Wallets using the Hierarchical Deterministic (HD Protocol) key creation and transfer protocol (BIP32).
|
Wallets using the Hierarchical Deterministic (HD Protocol) key creation and transfer protocol (BIP32).
|
||||||
|
|
||||||
HD Wallet Seed::
|
HD Wallet Seed::
|
||||||
HD Wallet Seed or Root Seed is a potentially-short value used as a seed to generate the master private key and master chain code for an HD wallet.
|
HD Wallet Seed or Root Seed is a potentially-short value used as a seed to generate the master private key and master chain code for an HD wallet.
|
||||||
|
|
||||||
HTLC::
|
HTLC::
|
||||||
A Hashed TimeLock Contract or HTLC is a class of payments that use hashlocks and timelocks to require that the receiver of a payment either acknowledge receiving the payment prior to a deadline by generating cryptographic proof of payment or forfeit the ability to claim the payment, returning it to the payer.
|
A Hashed TimeLock Contract or HTLC is a class of payments that use hashlocks and timelocks to require that the receiver of a payment either acknowledge receiving the payment prior to a deadline by generating cryptographic proof of payment or forfeit the ability to claim the payment, returning it to the payer.
|
||||||
|
|
||||||
KYC::
|
KYC::
|
||||||
Know your customer (KYC) is the process of a business, identifying and verifying the identity of its clients. The term is also used to refer to the bank regulation which governs these activities.
|
Know your customer (KYC) is the process of a business, identifying and verifying the identity of its clients. The term is also used to refer to the bank regulation which governs these activities.
|
||||||
|
|
||||||
LevelDB::
|
LevelDB::
|
||||||
LevelDB is an open source on-disk key-value store. LevelDB is a light-weight, single-purpose library for persistence with bindings to many platforms.
|
LevelDB is an open source on-disk key-value store. LevelDB is a light-weight, single-purpose library for persistence with bindings to many platforms.
|
||||||
|
|
||||||
Lightning networks::
|
Lightning networks::
|
||||||
Lightning Network is a proposed implementation of Hashed Timelock Contracts (HTLCs) with bi-directional payment channels which allows payments to be securely routed across multiple peer-to-peer payment channels. This allows the formation of a network where any peer on the network can pay any other peer even if they don't directly have a channel open between each other.
|
Lightning Network is a proposed implementation of Hashed Timelock Contracts (HTLCs) with bi-directional payment channels which allows payments to be securely routed across multiple peer-to-peer payment channels. This allows the formation of a network where any peer on the network can pay any other peer even if they don't directly have a channel open between each other.
|
||||||
|
|
||||||
Locktime::
|
Locktime::
|
||||||
Locktime, or more technically nLockTime, is the part of a transaction which indicates the earliest time or earliest block when that transaction may be added to the block chain.
|
Locktime, or more technically nLockTime, is the part of a transaction which indicates the earliest time or earliest block when that transaction may be added to the block chain.
|
||||||
|
|
||||||
mempool::
|
mempool::
|
||||||
The bitcoin Mempool (memory pool) is a collection of all transaction data in a block that have been verified by bitcoin nodes, but are not yet confirmed.
|
The bitcoin Mempool (memory pool) is a collection of all transaction data in a block that have been verified by bitcoin nodes, but are not yet confirmed.
|
||||||
|
|
||||||
Merkle Root::
|
Merkle Root::
|
||||||
The root node of a merkle tree, a descendant of all the hashed pairs in the tree. Block headers must include a valid merkle root descended from all transactions in that block.
|
The root node of a merkle tree, a descendant of all the hashed pairs in the tree. Block headers must include a valid merkle root descended from all transactions in that block.
|
||||||
|
|
||||||
Merkle Tree::
|
Merkle Tree::
|
||||||
A tree constructed by hashing paired data (the leaves), then pairing and hashing the results until a single hash remains, the merkle root. In Bitcoin, the leaves are almost always transactions from a single block.
|
A tree constructed by hashing paired data (the leaves), then pairing and hashing the results until a single hash remains, the merkle root. In Bitcoin, the leaves are almost always transactions from a single block.
|
||||||
|
|
||||||
miner::
|
miner::
|
||||||
A network node that finds valid proof of work for new blocks, by repeated hashing.
|
A network node that finds valid proof of work for new blocks, by repeated hashing.
|
||||||
|
|
||||||
Multisignature::
|
Multisignature::
|
||||||
Multisignature (multisig) refers to requiring more than one key to authorize a Bitcoin transaction.
|
Multisignature (multisig) refers to requiring more than one key to authorize a Bitcoin transaction.
|
||||||
|
|
||||||
network::
|
network::
|
||||||
A peer-to-peer network that propagates transactions and blocks to every bitcoin node on the network.
|
A peer-to-peer network that propagates transactions and blocks to every bitcoin node on the network.
|
||||||
|
|
||||||
Nonce::
|
Nonce::
|
||||||
The "nonce" in a Bitcoin block is a 32-bit (4-byte) field whose value is set so that the hash of the block will contain a run of leading zeros. The rest of the fields may not be changed, as they have a defined meaning.
|
The "nonce" in a Bitcoin block is a 32-bit (4-byte) field whose value is set so that the hash of the block will contain a run of leading zeros. The rest of the fields may not be changed, as they have a defined meaning.
|
||||||
|
|
||||||
Off-Chain Transactions::
|
Off-Chain Transactions::
|
||||||
An off-chain transaction is the movement of value outside of the block chain. While an on-chain transaction - usually referred to as simply 'a transaction' - modifies the blockchain and depends on the blockchain to determine its validity an off-chain transaction relies on other methods to record and validate the transaction.
|
An off-chain transaction is the movement of value outside of the block chain. While an on-chain transaction - usually referred to as simply 'a transaction' - modifies the blockchain and depends on the blockchain to determine its validity an off-chain transaction relies on other methods to record and validate the transaction.
|
||||||
|
|
||||||
Opcode::
|
Opcode::
|
||||||
Operation codes from the Bitcoin Script language which push data or perform functions within a pubkey script or signature script.
|
Operation codes from the Bitcoin Script language which push data or perform functions within a pubkey script or signature script.
|
||||||
|
|
||||||
Open Assets Protocol::
|
Open Assets Protocol::
|
||||||
The Open Assets Protocol is a simple and powerful protocol built on top of the Bitcoin Blockchain. It allows issuance and transfer of user-created assets. The Open Assets Protocol is an evolution of the concept of colored coins.
|
The Open Assets Protocol is a simple and powerful protocol built on top of the Bitcoin Blockchain. It allows issuance and transfer of user-created assets. The Open Assets Protocol is an evolution of the concept of colored coins.
|
||||||
|
|
||||||
OP_RETURN::
|
OP_RETURN::
|
||||||
An opcode used in one of the outputs in an OP_RETURN transaction. Not to be confused with OP_RETURN transaction.
|
An opcode used in one of the outputs in an OP_RETURN transaction. Not to be confused with OP_RETURN transaction.
|
||||||
|
|
||||||
OP_RETURN transaction::
|
OP_RETURN transaction::
|
||||||
A transaction type relayed and mined by default in Bitcoin Core 0.9.0 and later that adds arbitrary data to a provably unspendable pubkey script that full nodes don’t have to store in their UTXO database. Not to be confused with OP_RETURN opcode.
|
A transaction type that adds arbitrary data to a provably unspendable pubkey script that full nodes don’t have to store in their UTXO database. Not to be confused with OP_RETURN opcode.
|
||||||
|
|
||||||
Orphan Block::
|
Orphan Block::
|
||||||
Blocks whose parent block has not been processed by the local node, so they can’t be fully validated yet.
|
Blocks whose parent block has not been processed by the local node, so they can’t be fully validated yet. Not to be confused with stale block.
|
||||||
|
|
||||||
Orphan Transactions::
|
Orphan Transactions::
|
||||||
Transactions that can't go into the pool due to one or more missing input transactions.
|
Transactions that can't go into the pool due to one or more missing input transactions.
|
||||||
|
|
||||||
Output::
|
Output::
|
||||||
Output, Transaction Output or TxOut is an output in a transaction which contains two fields: a value field for transferring zero or more satoshis and a pubkey script for indicating what conditions must be fulfilled for those satoshis to be further spent.
|
Output, Transaction Output or TxOut is an output in a transaction which contains two fields: a value field for transferring zero or more satoshis and a pubkey script for indicating what conditions must be fulfilled for those satoshis to be further spent.
|
||||||
|
|
||||||
P2PKH::
|
P2PKH::
|
||||||
Transactions that pay a bitcoin address contain P2PKH or Pay To PubKey Hash scripts. An output locked by a P2PKH script can be unlocked (spent) by presenting a public key and a digital signature created by the corresponding private key.
|
Transactions that pay a bitcoin address contain P2PKH or Pay To PubKey Hash scripts. An output locked by a P2PKH script can be unlocked (spent) by presenting a public key and a digital signature created by the corresponding private key.
|
||||||
|
|
||||||
P2SH::
|
P2SH::
|
||||||
P2SH or Pay To Script Hash is a powerful new type of transaction that greatly simplifies the use of complex transaction scripts. With P2SH the complex script that details the conditions for spending the output (redeem script) is not presented in the locking script. Instead, only a hash of it is in the locking script.
|
P2SH or Pay To Script Hash is a powerful new type of transaction that greatly simplifies the use of complex transaction scripts. With P2SH the complex script that details the conditions for spending the output (redeem script) is not presented in the locking script. Instead, only a hash of it is in the locking script.
|
||||||
|
|
||||||
P2SH address::
|
P2SH address::
|
||||||
P2SH addresses are Base58Check encodings of the 20-byte hash of a script, P2SH addresses use the version prefix "5", which results in Base58Check-encoded addresses that start with a "3". P2SH addresses hide all of the complexity, so that the person making a payment does not see the script.
|
P2SH addresses are Base58Check encodings of the 20-byte hash of a script, P2SH addresses use the version prefix "5", which results in Base58Check-encoded addresses that start with a "3". P2SH addresses hide all of the complexity, so that the person making a payment does not see the script.
|
||||||
|
|
||||||
P2WPKH::
|
P2WPKH::
|
||||||
The signature of a P2WPKH (Pay to Witness Public Key Hash) contains the same information as a P2PKH spending, but is located in the witness field instead of the scriptSig field. The scriptPubKey is also modified.
|
The signature of a P2WPKH (Pay to Witness Public Key Hash) contains the same information as a P2PKH spending, but is located in the witness field instead of the scriptSig field. The scriptPubKey is also modified.
|
||||||
|
|
||||||
P2WSH::
|
P2WSH::
|
||||||
The difference between P2SH and P2WSH (Pay to Witness Script Hash) is about the cryptographic proof location change from the scriptSig field to the witness field and the scriptPubKey that is also modified.
|
The difference between P2SH and P2WSH (Pay to Witness Script Hash) is about the cryptographic proof location change from the scriptSig field to the witness field and the scriptPubKey that is also modified.
|
||||||
|
|
||||||
Paper wallet::
|
Paper wallet::
|
||||||
In the most specific sense, a paper wallet is a document containing all of the data necessary to generate any number of Bitcoin private keys, forming a wallet of keys. However, people often use the term to mean any way of storing bitcoin offline as a physical document. This second definition also includes paper keys and redeemable codes.
|
In the most specific sense, a paper wallet is a document containing all of the data necessary to generate any number of Bitcoin private keys, forming a wallet of keys. However, people often use the term to mean any way of storing bitcoin offline as a physical document. This second definition also includes paper keys and redeemable codes.
|
||||||
|
|
||||||
Payment channels::
|
Payment channels::
|
||||||
A Micropayment Channel or Payment Channel is class of techniques designed to allow users to make multiple Bitcoin transactions without committing all of the transactions to the Bitcoin block chain. In a typical payment channel, only two transactions are added to the block chain but an unlimited or nearly unlimited number of payments can be made between the participants.
|
A Micropayment Channel or Payment Channel is a class of techniques designed to allow users to make multiple Bitcoin transactions without committing all of the transactions to the Bitcoin block chain. In a typical payment channel, only two transactions are added to the block chain but an unlimited or nearly unlimited number of payments can be made between the participants.
|
||||||
|
|
||||||
Pooled mining::
|
Pooled mining::
|
||||||
Pooled mining is a mining approach where multiple generating clients contribute to the generation of a block, and then split the block reward according the contributed processing power.
|
Pooled mining is a mining approach where multiple generating clients contribute to the generation of a block, and then split the block reward according the contributed processing power.
|
||||||
|
|
||||||
Proof-of-stake::
|
Proof-of-stake::
|
||||||
Proof-of-stake (PoS) is a method by which a cryptocurrency blockchain network aims to achieve distributed consensus. Proof of stake asks users to prove ownership of a certain amount of currency (their "stake" in the currency).
|
Proof-of-stake (PoS) is a method by which a cryptocurrency blockchain network aims to achieve distributed consensus. Proof of stake asks users to prove ownership of a certain amount of currency (their "stake" in the currency).
|
||||||
|
|
||||||
Proof-Of-Work::
|
Proof-Of-Work::
|
||||||
A piece of data that requires significant computation to find. In bitcoin, miners must find a numeric solution to the SHA256 algorithm that meets a network-wide target, the difficulty target.
|
A piece of data that requires significant computation to find. In bitcoin, miners must find a numeric solution to the SHA256 algorithm that meets a network-wide target, the difficulty target.
|
||||||
|
|
||||||
reward::
|
reward::
|
||||||
An amount included in each new block as a reward by the network to the miner who found the Proof-Of-Work solution. It is currently 12.5BTC per block.
|
An amount included in each new block as a reward by the network to the miner who found the Proof-Of-Work solution. It is currently 12.5BTC per block.
|
||||||
|
|
||||||
RIPEMD-160::
|
RIPEMD-160::
|
||||||
RIPEMD-160 is a 160-bit cryptographic hash function. RIPEMD-160 is a strengthened version of RIPEMD with a 160-bit hash result, and is expected to be secure for the next ten years or more.
|
RIPEMD-160 is a 160-bit cryptographic hash function. RIPEMD-160 is a strengthened version of RIPEMD with a 160-bit hash result, and is expected to be secure for the next ten years or more.
|
||||||
|
|
||||||
Satoshi Nakamoto::
|
satoshi::
|
||||||
Satoshi Nakamoto is the name used by the person or people who designed Bitcoin and created its original reference implementation, Bitcoin Core. As a part of the implementation, they also devised the first blockchain database. In the process they were the first to solve the double spending problem for digital currency. Their real identity remains unknown.
|
A satoshi is the smallest denomination of bitcoin that can be recorded on the blockchain. It is the equivalent of 0.00000001 bitcoin and is named after the creator of Bitcoin, Satoshi Nakamoto. ((("satoshi")))
|
||||||
|
|
||||||
Script::
|
Satoshi Nakamoto::
|
||||||
Bitcoin uses a scripting system for transactions. Forth-like, Script is simple, stack-based, and processed from left to right. It is purposefully not Turing-complete, with no loops.
|
Satoshi Nakamoto is the name used by the person or people who designed Bitcoin and created its original reference implementation, Bitcoin Core. As a part of the implementation, they also devised the first blockchain database. In the process they were the first to solve the double spending problem for digital currency. Their real identity remains unknown.
|
||||||
|
|
||||||
ScriptPubKey (aka Pubkey Script)::
|
Script::
|
||||||
ScriptPubKey or Pubkey Script, is a script included in outputs which sets the conditions that must be fulfilled for those satoshis to be spent. Data for fulfilling the conditions can be provided in a signature script.
|
Bitcoin uses a scripting system for transactions. Forth-like, Script is simple, stack-based, and processed from left to right. It is purposefully not Turing-complete, with no loops.
|
||||||
|
|
||||||
ScriptSig (aka Signature Script)::
|
ScriptPubKey (aka Pubkey Script)::
|
||||||
ScriptSig or Signature Script, is the data generated by a spender which is almost always used as variables to satisfy a pubkey script.
|
ScriptPubKey or Pubkey Script, is a script included in outputs which sets the conditions that must be fulfilled for those satoshis to be spent. Data for fulfilling the conditions can be provided in a signature script.
|
||||||
|
|
||||||
secret key (aka private key)::
|
ScriptSig (aka Signature Script)::
|
||||||
The secret number that unlocks bitcoin sent to the corresponding address. A secret key looks like +5J76sF8L5jTtzE96r66Sf8cka9y44wdpJjMwCxR3tzLh3ibVPxh+.
|
ScriptSig or Signature Script, is the data generated by a spender which is almost always used as variables to satisfy a pubkey script.
|
||||||
|
|
||||||
Segregated Witness::
|
secret key (aka private key)::
|
||||||
Segregated Witness is a proposed upgrade to the Bitcoin protocol which technological innovation separates signature data from Bitcoin transactions. Segregated Witness is a proposed soft fork; a change that technically makes Bitcoin’s protocol rules more restrictive.
|
The secret number that unlocks bitcoin sent to the corresponding address. A secret key looks like +5J76sF8L5jTtzE96r66Sf8cka9y44wdpJjMwCxR3tzLh3ibVPxh+.
|
||||||
|
|
||||||
SHA::
|
Segregated Witness::
|
||||||
The Secure Hash Algorithm or SHA is a family of cryptographic hash functions published by the National Institute of Standards and Technology (NIST).
|
Segregated Witness is a proposed upgrade to the Bitcoin protocol which technological innovation separates signature data from Bitcoin transactions. Segregated Witness is a proposed soft fork; a change that technically makes Bitcoin’s protocol rules more restrictive.
|
||||||
|
|
||||||
Soft Fork::
|
SHA::
|
||||||
Soft Fork or Soft-Forking Change is a temporary fork in the Blockchain which commonly occurs when miners using non-upgraded nodes don't follow a new consensus rule their nodes don’t know about.
|
The Secure Hash Algorithm or SHA is a family of cryptographic hash functions published by the National Institute of Standards and Technology (NIST).
|
||||||
Not to be confused with Fork, Hard fork, Software fork or Git fork.
|
|
||||||
|
Soft Fork::
|
||||||
SPV (aka Simplified Payment Verification)::
|
Soft Fork or Soft-Forking Change is a temporary fork in the Blockchain which commonly occurs when miners using non-upgraded nodes don't follow a new consensus rule their nodes don’t know about.
|
||||||
SPV or Simplified Payment Verification is a method for verifying particular transactions were included in a block without downloading the entire block. The method is used by some lightweight Bitcoin clients.
|
Not to be confused with Fork, Hard fork, Software fork or Git fork.
|
||||||
|
|
||||||
Stale Block::
|
SPV (aka Simplified Payment Verification)::
|
||||||
Block which were successfully mined but which isn’t included on the current best block chain, likely because some other block at the same height had its chain extended first.
|
SPV or Simplified Payment Verification is a method for verifying particular transactions were included in a block without downloading the entire block. The method is used by some lightweight Bitcoin clients.
|
||||||
|
|
||||||
timelocks::
|
Stale Block::
|
||||||
A Timelock is a type of encumbrance that restricts the spending of some bitcoin until a specified future time or block height. Timelocks feature prominently in many Bitcoin contracts, including payment channels and hashed timelock contracts.
|
Block which were successfully mined but which isn’t included on the current best block chain, likely because some other block at the same height had its chain extended first. Not to be confused with orphan block.
|
||||||
|
|
||||||
transaction::
|
timelocks::
|
||||||
In simple terms, a transfer of bitcoin from one address to another. More precisely, a transaction is a signed data structure expressing a transfer of value. Transactions are transmitted over the bitcoin network, collected by miners, and included into blocks, made permanent on the blockchain.
|
A Timelock is a type of encumbrance that restricts the spending of some bitcoin until a specified future time or block height. Timelocks feature prominently in many Bitcoin contracts, including payment channels and hashed timelock contracts.
|
||||||
|
|
||||||
Transaction Pool::
|
transaction::
|
||||||
An unordered collection of transactions that are not in blocks in the main chain, but for which we have input transactions.
|
In simple terms, a transfer of bitcoin from one address to another. More precisely, a transaction is a signed data structure expressing a transfer of value. Transactions are transmitted over the bitcoin network, collected by miners, and included into blocks, made permanent on the blockchain.
|
||||||
|
|
||||||
Turing completeness::
|
Transaction Pool::
|
||||||
A program language is called "Turing complete", if that it can run any program that a Turing machine can run given enough time and memory.
|
An unordered collection of transactions that are not in blocks in the main chain, but for which we have input transactions.
|
||||||
|
|
||||||
UTXO (aka Unspent Transaction Output)::
|
Turing completeness::
|
||||||
UTXO is an Unspent Transaction Output that can be spent as an input in a new transaction.
|
A program language is called "Turing complete" if it can run any program that a Turing machine can run, given enough time and memory.
|
||||||
|
|
||||||
wallet::
|
UTXO (aka Unspent Transaction Output)::
|
||||||
Software that holds all your bitcoin addresses and secret keys. Use it to send, receive, and store your bitcoin.
|
UTXO is an Unspent Transaction Output that can be spent as an input in a new transaction.
|
||||||
|
|
||||||
WIF (aka Wallet Import Format)::
|
wallet::
|
||||||
WIF or Wallet Import Format is a data interchange format designed to allow exporting and importing a single private key with a flag indicating whether or not it uses a compressed public key.
|
Software that holds all your bitcoin addresses and secret keys. Use it to send, receive, and store your bitcoin.
|
||||||
|
|
||||||
|
WIF (aka Wallet Import Format)::
|
||||||
|
WIF or Wallet Import Format is a data interchange format designed to allow exporting and importing a single private key with a flag indicating whether or not it uses a compressed public key.
|
||||||
|
|
||||||
|
Some contributed definitions have been sourced under a CC-BY license from the bitcoin Wiki (https://en.bitcoin.it/wiki/Main_Page[https://en.bitcoin.it/wiki/Main_Page]), or from other open-source documentation sources.
|
||||||
|
BIN
images/mbc2_0204.png
Executable file → Normal file
BIN
images/mbc2_0204.png
Executable file → Normal file
Binary file not shown.
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 166 KiB |
Binary file not shown.
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 66 KiB |
BIN
images/mbc2_0511.png
Executable file → Normal file
BIN
images/mbc2_0511.png
Executable file → Normal file
Binary file not shown.
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 28 KiB |
@ -51,7 +51,7 @@ This icon indicates a warning or caution.
|
|||||||
|
|
||||||
=== Code Examples
|
=== Code Examples
|
||||||
|
|
||||||
((("code examples, obtaining and using", id="codeuse00")))The examples are illustrated in Python, C++, and using the command line of a Unix-like operating system such as Linux or macOS. All code snippets are available in the https://github.com/aantonop/bitcoinbook[GitHub repository] in the _code_ subdirectory of the main repo. Fork the book code, try the code examples, or submit corrections via GitHub.
|
((("code examples, obtaining and using", id="codeuse00")))The examples are illustrated in Python, C++, and using the command line of a Unix-like operating system such as Linux or macOS. All code snippets are available in the GitHub repository (https://github.com/bitcoinbook/bitcoinbook[https://github.com/bitcoinbook/bitcoinbook]) in the _code_ subdirectory of the main repo. Fork the book code, try the code examples, or submit corrections via GitHub.
|
||||||
|
|
||||||
All the code snippets can be replicated on most operating systems with a minimal installation of compilers and interpreters for the corresponding languages. Where necessary, we provide basic installation instructions and step-by-step examples of the output of those instructions.
|
All the code snippets can be replicated on most operating systems with a minimal installation of compilers and interpreters for the corresponding languages. Where necessary, we provide basic installation instructions and step-by-step examples of the output of those instructions.
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ All the code snippets use real values and calculations where possible, so that y
|
|||||||
|
|
||||||
This book is here to help you get your job done. In general, if example code is offered with this book, you may use it in your programs and documentation. You do not need to contact us for permission unless you’re reproducing a significant portion of the code. For example, writing a program that uses several chunks of code from this book does not require permission. Selling or distributing a CD-ROM of examples from O’Reilly books does require permission. Answering a question by citing this book and quoting example code does not require permission. Incorporating a significant amount of example code from this book into your product’s documentation does require permission.
|
This book is here to help you get your job done. In general, if example code is offered with this book, you may use it in your programs and documentation. You do not need to contact us for permission unless you’re reproducing a significant portion of the code. For example, writing a program that uses several chunks of code from this book does not require permission. Selling or distributing a CD-ROM of examples from O’Reilly books does require permission. Answering a question by citing this book and quoting example code does not require permission. Incorporating a significant amount of example code from this book into your product’s documentation does require permission.
|
||||||
|
|
||||||
((("attribution")))We appreciate, but do not require, attribution. An attribution usually includes the title, author, publisher, and ISBN. For example: “_Mastering Bitcoin_ by Andreas M. Antonopoulos (O’Reilly). Copyright 2017 Andreas M. Antonopoulos, 978-1-491-95438-6.”
|
((("attribution")))We appreciate, but do not require, attribution. An attribution usually includes the title, author, publisher, and ISBN. For example: “_Mastering Bitcoin_ by Andreas M. Antonopoulos (O’Reilly). Copyright 2018 Andreas M. Antonopoulos, 978-1-491-95438-6.”
|
||||||
|
|
||||||
((("open source licenses")))Some editions of this book are offered under an open source license, such as https://creativecommons.org/licenses/by-nc/4.0/[CC-BY-NC], in which case the terms of that license apply.
|
((("open source licenses")))Some editions of this book are offered under an open source license, such as https://creativecommons.org/licenses/by-nc/4.0/[CC-BY-NC], in which case the terms of that license apply.
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ During the development of the book, I made early drafts available on GitHub and
|
|||||||
|
|
||||||
Once the book was drafted, it went through several rounds of technical review. Thanks to Cricket Liu and Lorne Lantz for their thorough review, comments, and support.
|
Once the book was drafted, it went through several rounds of technical review. Thanks to Cricket Liu and Lorne Lantz for their thorough review, comments, and support.
|
||||||
|
|
||||||
Several bitcoin developers contributed code samples, reviews, comments, and encouragement. Thanks to Amir Taaki and Eric Voskuil for example code snippets and many great comments; Chris Kleeschulte for contributing the Bitcore appendix; Vitalik Buterin and Richard Kiss for help with elliptic curve math and code contributions; Gavin Andresen for corrections, comments, and encouragement; Michalis Kargakis for comments, contributions, and btcd writeup; and Robin Inge for errata submissions improving the second print. In the second edition, I again received a lot of help from many Bitcoin Core developers, including Eric Lombrozo who demystified Segregated Witness, Luke-Jr who helped improve the chapter on transactions, Johnson Lau who reviewed Segregated Witness and other chapters, and many others. I owe thanks to Joseph Poon, Tadge Dryja, and Olaoluwa Osuntokun who explained Lightning Network, reviewed my writing, and answered questions when I got stuck.
|
Several bitcoin developers contributed code samples, reviews, comments, and encouragement. Thanks to Amir Taaki and Eric Voskuil for example code snippets and many great comments; Chris Kleeschulte for contributing the Bitcore appendix; Vitalik Buterin and Richard Kiss for help with elliptic curve math and code contributions; Gavin Andresen for corrections, comments, and encouragement; Michalis Kargakis for comments, contributions, and btcd writeup; and Robin Inge for errata submissions improving the second print. In the second edition, I again received a lot of help from many Bitcoin Core developers, including Eric Lombrozo who demystified Segregated Witness, Luke Dashjr who helped improve the chapter on transactions, Johnson Lau who reviewed Segregated Witness and other chapters, and many others. I owe thanks to Joseph Poon, Tadge Dryja, and Olaoluwa Osuntokun who explained Lightning Network, reviewed my writing, and answered questions when I got stuck.
|
||||||
|
|
||||||
I owe my love of words and books to my mother, Theresa, who raised me in a house with books lining every wall. My mother also bought me my first computer in 1982, despite being a self-described technophobe. My father, Menelaos, a civil engineer who just published his first book at 80 years old, was the one who taught me logical and analytical thinking and a love of science and engineering.
|
I owe my love of words and books to my mother, Theresa, who raised me in a house with books lining every wall. My mother also bought me my first computer in 1982, despite being a self-described technophobe. My father, Menelaos, a civil engineer who just published his first book at 80 years old, was the one who taught me logical and analytical thinking and a love of science and engineering.
|
||||||
|
|
||||||
@ -169,17 +169,21 @@ Many contributors offered comments, corrections, and additions to the early-rele
|
|||||||
|
|
||||||
Following is a list of notable GitHub contributors, including their GitHub ID in parentheses:
|
Following is a list of notable GitHub contributors, including their GitHub ID in parentheses:
|
||||||
|
|
||||||
|
* Akira Chiku (achiku)
|
||||||
* Alex Waters (alexwaters)
|
* Alex Waters (alexwaters)
|
||||||
* Andrew Donald Kennedy (grkvlt)
|
* Andrew Donald Kennedy (grkvlt)
|
||||||
* bitcoinctf
|
* bitcoinctf
|
||||||
* Bryan Gmyrek (physicsdude)
|
* Bryan Gmyrek (physicsdude)
|
||||||
* Casey Flynn (cflynn07)
|
* Casey Flynn (cflynn07)
|
||||||
|
* cclauss
|
||||||
* Chapman Shoop (belovachap)
|
* Chapman Shoop (belovachap)
|
||||||
* Christie D'Anna (avocadobreath)
|
* Christie D'Anna (avocadobreath)
|
||||||
* Cody Scott (Siecje)
|
* Cody Scott (Siecje)
|
||||||
* coinradar
|
* coinradar
|
||||||
* Cragin Godley (cgodley)
|
* Cragin Godley (cgodley)
|
||||||
|
* Craig Dodd (cdodd)
|
||||||
* dallyshalla
|
* dallyshalla
|
||||||
|
* Darius Kramer (dkrmr)
|
||||||
* Diego Viola (diegoviola)
|
* Diego Viola (diegoviola)
|
||||||
* Dirk Jäckel (biafra23)
|
* Dirk Jäckel (biafra23)
|
||||||
* Dimitris Tsapakidis (dimitris-t)
|
* Dimitris Tsapakidis (dimitris-t)
|
||||||
@ -203,6 +207,7 @@ Following is a list of notable GitHub contributors, including their GitHub ID in
|
|||||||
* Holger Schinzel (schinzelh)
|
* Holger Schinzel (schinzelh)
|
||||||
* Ioannis Cherouvim (cherouvim)
|
* Ioannis Cherouvim (cherouvim)
|
||||||
* Ish Ot Jr. (ishotjr)
|
* Ish Ot Jr. (ishotjr)
|
||||||
|
* ivangreene
|
||||||
* James Addison (jayaddison)
|
* James Addison (jayaddison)
|
||||||
* Jameson Lopp (jlopp)
|
* Jameson Lopp (jlopp)
|
||||||
* Jason Bisterfeldt (jbisterfeldt)
|
* Jason Bisterfeldt (jbisterfeldt)
|
||||||
@ -215,8 +220,11 @@ Following is a list of notable GitHub contributors, including their GitHub ID in
|
|||||||
* Jonathan Cross (jonathancross)
|
* Jonathan Cross (jonathancross)
|
||||||
* Jorgeminator
|
* Jorgeminator
|
||||||
* Kai Bakker (kaibakker)
|
* Kai Bakker (kaibakker)
|
||||||
|
* Magomed Aliev (30mb1)
|
||||||
* Mai-Hsuan Chia (mhchia)
|
* Mai-Hsuan Chia (mhchia)
|
||||||
|
* marcofalke
|
||||||
* Marzig (marzig76)
|
* Marzig (marzig76)
|
||||||
|
* Matt McGivney (mattmcgiv)
|
||||||
* Maximilian Reichel (phramz)
|
* Maximilian Reichel (phramz)
|
||||||
* Michalis Kargakis (kargakis)
|
* Michalis Kargakis (kargakis)
|
||||||
* Michael C. Ippolito (michaelcippolito)
|
* Michael C. Ippolito (michaelcippolito)
|
||||||
@ -224,6 +232,7 @@ Following is a list of notable GitHub contributors, including their GitHub ID in
|
|||||||
* Minh T. Nguyen (enderminh)
|
* Minh T. Nguyen (enderminh)
|
||||||
* Nagaraj Hubli (nagarajhubli)
|
* Nagaraj Hubli (nagarajhubli)
|
||||||
* Nekomata (nekomata-3)
|
* Nekomata (nekomata-3)
|
||||||
|
* Philipp Gille (philippgille)
|
||||||
* Robert Furse (Rfurse)
|
* Robert Furse (Rfurse)
|
||||||
* Richard Kiss (richardkiss)
|
* Richard Kiss (richardkiss)
|
||||||
* Ruben Alexander (hizzvizz)
|
* Ruben Alexander (hizzvizz)
|
||||||
@ -234,6 +243,7 @@ Following is a list of notable GitHub contributors, including their GitHub ID in
|
|||||||
* Stephan Oeste (Emzy)
|
* Stephan Oeste (Emzy)
|
||||||
* takaya-imai
|
* takaya-imai
|
||||||
* Thiago Arrais (thiagoarrais)
|
* Thiago Arrais (thiagoarrais)
|
||||||
|
* Thomas Kerin (afk11)
|
||||||
* venzen
|
* venzen
|
||||||
* Will Binns (wbnns)
|
* Will Binns (wbnns)
|
||||||
* wintercooled
|
* wintercooled
|
||||||
|
Loading…
Reference in New Issue
Block a user