From 82800755260a382a4cfad4c160d21d1357356b96 Mon Sep 17 00:00:00 2001 From: kenjiszk Date: Wed, 7 Mar 2018 17:00:56 +0900 Subject: [PATCH 01/56] fix segit to segwit --- ch07.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch07.asciidoc b/ch07.asciidoc index 943476b3..0c05e7d3 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -942,7 +942,7 @@ Mohammed's company can then construct segwit transactions to spend these payment ===== Segregated Witness addresses -Even after segwit activation, it will take some time until most wallets are upgraded. At first, segwit will be embedded in P2SH, as we saw in the previous section, to ease compatibility between segit-aware and unaware wallets. +Even after segwit activation, it will take some time until most wallets are upgraded. At first, segwit will be embedded in P2SH, as we saw in the previous section, to ease compatibility between segwit-aware and unaware wallets. However, once wallets are broadly supporting segwit, it makes sense to encode witness scripts directly in a native address format designed for segwit, rather than embed it in P2SH. From 1377879f3cad0ee25ba6b875221ea5ffea280787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Jankovi=C4=87?= <3431769+trulex@users.noreply.github.com> Date: Tue, 13 Mar 2018 20:48:36 +0100 Subject: [PATCH 02/56] "program language" -> "programming language" --- glossary.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glossary.asciidoc b/glossary.asciidoc index 8a9dbaee..5e7d4a8d 100644 --- a/glossary.asciidoc +++ b/glossary.asciidoc @@ -239,7 +239,7 @@ transaction pool:: An unordered collection of transactions that are not in blocks in the main chain, but for which we have input transactions. Turing completeness:: - A program language is called "Turing complete" if it can run any program that a Turing machine can run, given enough time and memory. + A programming language is called "Turing complete" if it can run any program that a Turing machine can run, given enough time and memory. unspent transaction output (UTXO):: UTXO is an unspent transaction output that can be spent as an input in a new transaction. From bff5117c28309ec49d172365f5fcb228f588b060 Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Wed, 14 Mar 2018 13:59:32 -0700 Subject: [PATCH 03/56] Updated atlas.json --- atlas.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atlas.json b/atlas.json index f31c943c..7d416659 100644 --- a/atlas.json +++ b/atlas.json @@ -32,7 +32,7 @@ ], "formats": { "pdf": { - "version": "web", + "version": "print", "toc": true, "index": true, "antennahouse_version": "AHFormatterV62_64-MR4", From 8ac54c414b741bae055308c283d5999dc4cc3d9e Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Thu, 15 Mar 2018 09:28:26 -0700 Subject: [PATCH 04/56] Edited ch04.asciidoc with Atlas code editor --- ch04.asciidoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ch04.asciidoc b/ch04.asciidoc index 7a2149c5..3b1b60de 100644 --- a/ch04.asciidoc +++ b/ch04.asciidoc @@ -451,11 +451,6 @@ As we saw in the section <>, a public key is a point (x,y) on an ellipti Whereas uncompressed public keys have a prefix of +04+, compressed public keys start with either a +02+ or a +03+ prefix. Let's look at why there are two possible prefixes: because the left side of the equation is __y__^2^, the solution for _y_ is a square root, which can have a positive or negative value. Visually, this means that the resulting _y_ coordinate can be above or below the x-axis. As you can see from the graph of the elliptic curve in <>, the curve is symmetric, meaning it is reflected like a mirror by the x-axis. So, while we can omit the _y_ coordinate we have to store the _sign_ of _y_ (positive or negative); or in other words, we have to remember if it was above or below the x-axis because each of those options represents a different point and a different public key. When calculating the elliptic curve in binary arithmetic on the finite field of prime order p, the _y_ coordinate is either even or odd, which corresponds to the positive/negative sign as explained earlier. Therefore, to distinguish between the two possible values of _y_, we store a compressed public key with the prefix +02+ if the _y_ is even, and +03+ if it is odd, allowing the software to correctly deduce the _y_ coordinate from the _x_ coordinate and uncompress the public key to the full coordinates of the point. Public key compression is illustrated in <>. -[[pubkey_compression]] -[role="smallerseventy"] -.Public key compression -image::images/mbc2_0407.png["pubkey_compression"] - Here's the same public key generated previously, shown as a compressed public key stored in 264 bits (66 hex digits) with the prefix +03+ indicating the _y_ coordinate is odd: ---- @@ -464,6 +459,11 @@ K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A This compressed public key corresponds to the same private key, meaning it is generated from the same private key. However, it looks different from the uncompressed public key. More importantly, if we convert this compressed public key to a bitcoin address using the double-hash function (+RIPEMD160(SHA256(K))+) it will produce a _different_ bitcoin address. This can be confusing, because it means that a single private key can produce a public key expressed in two different formats (compressed and uncompressed) that produce two different bitcoin addresses. However, the private key is identical for both bitcoin addresses. +[[pubkey_compression]] +[role="smallerseventy"] +.Public key compression +image::images/mbc2_0407.png["pubkey_compression"] + Compressed public keys are gradually becoming the default across bitcoin clients, which is having a significant impact on reducing the size of transactions and therefore the blockchain. However, not all clients support compressed public keys yet. Newer clients that support compressed public keys have to account for transactions from older clients that do not support compressed public keys. This is especially important when a wallet application is importing private keys from another bitcoin wallet application, because the new wallet needs to scan the blockchain to find transactions corresponding to these imported keys. Which bitcoin addresses should the bitcoin wallet scan for? The bitcoin addresses produced by uncompressed public keys, or the bitcoin addresses produced by compressed public keys? Both are valid bitcoin addresses, and can be signed for by the private key, but they are different addresses! To resolve this issue, when private keys are exported from a wallet, the WIF that is used to represent them is implemented differently in newer bitcoin wallets, to indicate that these private keys have been used to produce _compressed_ public keys and therefore _compressed_ bitcoin addresses. This allows the importing wallet to distinguish between private keys originating from older or newer wallets and search the blockchain for transactions with bitcoin addresses corresponding to the uncompressed, or the compressed, public keys, respectively. Let's look at how this works in more detail, in the next section. From bab88e00aa942bf4148477c7f3c54035154ee410 Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Thu, 15 Mar 2018 09:30:29 -0700 Subject: [PATCH 05/56] Edited ch07.asciidoc with Atlas code editor --- ch07.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/ch07.asciidoc b/ch07.asciidoc index f92c7384..b08e2fda 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -480,6 +480,7 @@ To redeem this, Bob must construct an unlocking script that presents a valid pre Without presenting the pre-image, Bob can't get to the part of the script that checks for his signature. +[role="pagebreak-after"] This script can be written with an +IF+ instead: .A redeem script with an +IF+ guard clause From 76c22db8995e693c46812b22bcae7c606cbd5ffc Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Thu, 15 Mar 2018 09:34:21 -0700 Subject: [PATCH 06/56] Edited colo.html with Atlas code editor --- colo.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/colo.html b/colo.html index 09cb4475..0e913b49 100644 --- a/colo.html +++ b/colo.html @@ -3,7 +3,7 @@

The animal on the cover of Mastering Bitcoin is a leafcutter ant (Atta colombica). The leafcutter ant (a nongeneric name) is a tropical, fungus-growing ant endemic to South and Central America, Mexico, and southern United States. Aside from humans, leafcutter ants form the largest and most complex animal societies on the planet. They are named for the way they chew leaves, which serve as nutrition for their fungal garden.

-

Winged ants, both male and female, take part in a mass exit of their nest known as the revoada, or a nuptial flight. Females mate with multiple males to collect the 300 million sperm necessary to set up a colony. Females also store bits of the parental fungus garden mycelium in the infrabuccal pocket located in their oral cavity; they will use this to start their own fungal gardens. Once grounded, the female loses its wings and sets up an underground lair for her colony. The success rate for new queens is low: 2.5% establish a long-lived colony.

+

Winged ants, both male and female, take part in a mass exit of their nest known as the revoada, or a nuptial flight. Females mate with multiple males to collect the 300 million sperm necessary to set up a colony. Females also store bits of the parental fungus garden mycelium in the infrabuccal pocket located in their oral cavity; they will use this to start their own fungal gardens. Once grounded, the female loses her wings and sets up an underground lair for her colony. The success rate for new queens is low: 2.5% establish a long-lived colony.

Once a colony has matured, ants are divided into castes based on size, with each caste performing various functions. There are usually four castes: minims, the smallest workers that tend to the young and fungus gardens; minors, slightly larger than minima, are the first line of defense for the colony and patrol the surrounding terrain and attack enemies; mediae, the general foragers that cut leaves and bring back leaf fragments to the nest; and majors, the largest worker ants that act as soldiers, defending the nest from intruders. Recent research has shown that majors also clear main foraging trails and carry bulky items back to the nest.

From abb074e41e02ce363619495c87df5e70518bb6cb Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Thu, 15 Mar 2018 09:40:43 -0700 Subject: [PATCH 07/56] Updated atlas.json --- atlas.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atlas.json b/atlas.json index 7d416659..f31c943c 100644 --- a/atlas.json +++ b/atlas.json @@ -32,7 +32,7 @@ ], "formats": { "pdf": { - "version": "print", + "version": "web", "toc": true, "index": true, "antennahouse_version": "AHFormatterV62_64-MR4", From ee84b330e5c17bd7529a429e9d97fb76a4156c4d Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Thu, 15 Mar 2018 09:45:24 -0700 Subject: [PATCH 08/56] Updated atlas.json --- atlas.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atlas.json b/atlas.json index f31c943c..7d416659 100644 --- a/atlas.json +++ b/atlas.json @@ -32,7 +32,7 @@ ], "formats": { "pdf": { - "version": "web", + "version": "print", "toc": true, "index": true, "antennahouse_version": "AHFormatterV62_64-MR4", From ab5ae32bae3eda1f80bfc47335e69ed2693a0622 Mon Sep 17 00:00:00 2001 From: "kristen@oreilly.com" Date: Thu, 15 Mar 2018 10:09:31 -0700 Subject: [PATCH 09/56] Edited ch07.asciidoc with Atlas code editor --- ch07.asciidoc | 1 - 1 file changed, 1 deletion(-) diff --git a/ch07.asciidoc b/ch07.asciidoc index b08e2fda..376584f4 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -569,7 +569,6 @@ Using this construct, we can build redeem scripts with tens or hundreds of execu Here's the redeem script that Mohammed designs to achieve this (line number prefix as XX): .Variable Multi-Signature with Timelock -[source,linenum] ---- 01 IF 02 IF From d70a0f91f2f89ef898673623abc34ac60e46362f Mon Sep 17 00:00:00 2001 From: koshikraj Date: Fri, 16 Mar 2018 20:32:21 +0530 Subject: [PATCH 10/56] fixed hashlib library error for python3 --- code/hash_example.py | 2 +- code/proof-of-work-example.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/hash_example.py b/code/hash_example.py index d5e69b2b..977671bf 100644 --- a/code/hash_example.py +++ b/code/hash_example.py @@ -12,7 +12,7 @@ for nonce in range(20): input_data = text + str(nonce) # calculate the SHA-256 hash of the input (text+nonce) - hash_data = hashlib.sha256(input_data).hexdigest() + hash_data = hashlib.sha256(input_data.encode()).hexdigest() # show the input and hash result print(input_data, '=>', hash_data) diff --git a/code/proof-of-work-example.py b/code/proof-of-work-example.py index 0431fedf..2415cd55 100755 --- a/code/proof-of-work-example.py +++ b/code/proof-of-work-example.py @@ -19,7 +19,7 @@ def proof_of_work(header, difficulty_bits): target = 2 ** (256 - difficulty_bits) for nonce in xrange(max_nonce): - hash_result = hashlib.sha256(str(header) + str(nonce)).hexdigest() + hash_result = hashlib.sha256((str(header) + str(nonce)).encode()).hexdigest() # check if this is a valid result, below the target if long(hash_result, 16) < target: From 9504d804e05a10ee7bd6ad7185fad3bc00e00bf5 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Sun, 25 Mar 2018 20:17:35 -0700 Subject: [PATCH 11/56] Stop using numeric_limits for the constant "255", and fix a bug. The bug is that `x % 255` is not quite the same thing as `x % 256`; but `x & 255` is. The stylistic issue is that `numeric_limits::max()` is a very verbose way of spelling `255`. --- code/vanity-miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/vanity-miner.cpp b/code/vanity-miner.cpp index 6c3ab412..277b4fea 100644 --- a/code/vanity-miner.cpp +++ b/code/vanity-miner.cpp @@ -45,7 +45,7 @@ bc::ec_secret random_secret(std::default_random_engine& engine) bc::ec_secret secret; // Iterate through every byte setting a random value... for (uint8_t& byte: secret) - byte = engine() % std::numeric_limits::max(); + byte = engine() & 255; // Return result. return secret; } From dc1ead7d152c3a2a693ae4b09cfc6a32e1436ad1 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Sun, 25 Mar 2018 20:22:49 -0700 Subject: [PATCH 12/56] Spelling nit: s/Berkley/Berkeley/ --- ch10.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch10.asciidoc b/ch10.asciidoc index 47028166..772aea98 100644 --- a/ch10.asciidoc +++ b/ch10.asciidoc @@ -971,7 +971,7 @@ The two chains continue to diverge from this point. Miners on the "b" chain will Examples of software forks that have attempted to change consensus rules include Bitcoin XT, Bitcoin Classic, and most recently Bitcoin Unlimited. However, none of these software forks have resulted in a hard fork. While a software fork is a necessary precondition, it is not in itself sufficient for a hard fork to occur. For a hard fork to occur, the competing implementation must be adopted and the new rules activated, by miners, wallets, and intermediary nodes. Conversely, there are numerous alternative implementations of Bitcoin Core, and even software forks, that do not change the consensus rules and barring a bug, can coexist on the network and interoperate without causing a hard fork. -Consensus rules may differ in obvious and explicit ways, in the validation of transactions or blocks. The rules may also differ in more subtle ways, in the implementation of the consensus rules as they apply to bitcoin scripts or cryptographic primitives such as digital signatures. Finally, the consensus rules may differ in unanticipated ways because of implicit consensus constraints imposed by system limitations or implementation details. An example of the latter was seen in the unanticipated hard fork during the upgrade of Bitcoin Core 0.7 to 0.8, which was caused by a limitation in the Berkley DB implementation used to store blocks. +Consensus rules may differ in obvious and explicit ways, in the validation of transactions or blocks. The rules may also differ in more subtle ways, in the implementation of the consensus rules as they apply to bitcoin scripts or cryptographic primitives such as digital signatures. Finally, the consensus rules may differ in unanticipated ways because of implicit consensus constraints imposed by system limitations or implementation details. An example of the latter was seen in the unanticipated hard fork during the upgrade of Bitcoin Core 0.7 to 0.8, which was caused by a limitation in the Berkeley DB implementation used to store blocks. Conceptually, we can think of a hard fork as developing in four stages: a software fork, a network fork, a mining fork, and a chain fork. From 1a8484b81fb66894f0178951e9538f1475fef3d5 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Mon, 26 Mar 2018 13:00:48 -0700 Subject: [PATCH 13/56] Revert accidental s/=/==/ in the Bitcoin Whitepaper appendix. This looks like a `sed` accident in commit 44eecb1b. --- appdx-bitcoinwhitepaper.asciidoc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/appdx-bitcoinwhitepaper.asciidoc b/appdx-bitcoinwhitepaper.asciidoc index 464ad9a4..bf8df23e 100644 --- a/appdx-bitcoinwhitepaper.asciidoc +++ b/appdx-bitcoinwhitepaper.asciidoc @@ -75,7 +75,7 @@ The incentive may help encourage nodes to stay honest. If a greedy attacker is a image::images/mbc2_abin04.png["disk"] -A block header with no transactions would be about 80 bytes. If we suppose blocks are generated every 10 minutes, +80 bytes * 6 * 24 * 365 == 4.2MB+ per year. With computer systems typically selling with 2GB of RAM as of 2008, and Moore's Law predicting current growth of 1.2GB per year, storage should not be a problem even if the block headers must be kept in memory. +A block header with no transactions would be about 80 bytes. If we suppose blocks are generated every 10 minutes, +80 bytes * 6 * 24 * 365 = 4.2MB+ per year. With computer systems typically selling with 2GB of RAM as of 2008, and Moore's Law predicting current growth of 1.2GB per year, storage should not be a problem even if the block headers must be kept in memory. ==== Simplified Payment Verification It is possible to verify payments without running a full network node. A user only needs to keep a copy of the block headers of the longest proof-of-work chain, which he can get by querying network nodes until he's convinced he has the longest chain, and obtain the Merkle branch linking the transaction to the block it's timestamped in. He can't check the transaction for himself, but by linking it to a place in the chain, he can see that a network node has accepted it, and blocks added after it further confirm the network has accepted it. @@ -107,11 +107,11 @@ The race between the honest chain and an attacker chain can be characterized as

The probability of an attacker catching up from a given deficit is analogous to a Gambler's Ruin problem. Suppose a gambler with unlimited credit starts at a deficit and plays potentially an infinite number of trials to try to reach breakeven. We can calculate the probability he ever reaches breakeven, or that an attacker ever catches up with the honest chain, as follows [8]:

++++ -p == probability an honest node finds the next block +p = probability an honest node finds the next block -q == probability the attacker finds the next block +q = probability the attacker finds the next block -q~z~ == probability the attacker will ever catch up from z blocks behind +q~z~ = probability the attacker will ever catch up from z blocks behind image::images/mbc2_abin08.png["eq1"] @@ -140,16 +140,16 @@ Converting to C code... #include double AttackerSuccessProbability(double q, int z) { - double p == 1.0 - q; - double lambda == z * (q / p); - double sum == 1.0; + double p = 1.0 - q; + double lambda = z * (q / p); + double sum = 1.0; int i, k; - for (k == 0; k <== z; k++) + for (k = 0; k <= z; k++) { - double poisson == exp(-lambda); - for (i == 1; i <== k; i++) - poisson *== lambda / i; - sum -== poisson * (1 - pow(q / p, z - k)); + double poisson = exp(-lambda); + for (i = 1; i <= k; i++) + poisson *= lambda / i; + sum -= poisson * (1 - pow(q / p, z - k)); } return sum; } From db6370b735b01df370be704878b9e2d775609c34 Mon Sep 17 00:00:00 2001 From: Chris McBride Date: Wed, 4 Apr 2018 17:59:58 -0400 Subject: [PATCH 14/56] fix double negative in example the double negative changes the example output to 13 instead of the expected 7 --- ch06.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index 34e6b4a1..5501f98d 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -446,7 +446,7 @@ As we saw in the step-by-step example in <>, when this script image::images/mbc2_0604.png["TxScriptSimpleMathExample"] [role="pagebreak-before"] -The following is a slightly more complex script, which calculates ++2 + 7 -- 3 + 1++. Notice that when the script contains several operators in a row, the stack allows the results of one operator to be acted upon by the next operator: +The following is a slightly more complex script, which calculates ++2 + 7 - 3 + 1++. Notice that when the script contains several operators in a row, the stack allows the results of one operator to be acted upon by the next operator: ---- 2 7 OP_ADD 3 OP_SUB 1 OP_ADD 7 OP_EQUAL From 3a62587d88611c57650adb13d88725d075a35697 Mon Sep 17 00:00:00 2001 From: Lorenzo Manacorda Date: Sat, 14 Apr 2018 13:04:11 +0200 Subject: [PATCH 15/56] Remove "short" from timelock sentence I think that short provides an unnecessary detail to the explanation. The timelock can be short or long. Also, in the provided example, the timelock expires after around 7 days, which may or may not be short. --- ch12.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch12.asciidoc b/ch12.asciidoc index 4923bbc2..0d49b746 100644 --- a/ch12.asciidoc +++ b/ch12.asciidoc @@ -360,7 +360,7 @@ Output 1: CHECKSIG ---- -This way, each party has a commitment transaction, spending the 2-of-2 funding output. This input is signed by the _other_ party. At any time the party holding the transaction can also sign (completing the 2-of-2) and broadcast. However, if they broadcast the commitment transaction, it pays the other party immediately whereas they have to wait for a short timelock to expire. By imposing a delay on the redemption of one of the outputs, we put each party at a slight disadvantage when they choose to unilaterally broadcast a commitment transaction. But a time delay alone isn't enough to encourage fair conduct. +This way, each party has a commitment transaction, spending the 2-of-2 funding output. This input is signed by the _other_ party. At any time the party holding the transaction can also sign (completing the 2-of-2) and broadcast. However, if they broadcast the commitment transaction, it pays the other party immediately whereas they have to wait for a timelock to expire. By imposing a delay on the redemption of one of the outputs, we put each party at a slight disadvantage when they choose to unilaterally broadcast a commitment transaction. But a time delay alone isn't enough to encourage fair conduct. <> shows two asymmetric commitment transactions, where the output paying the holder of the commitment is delayed. From d50fdfc7200ef9e558e5a22d71fee9296084df66 Mon Sep 17 00:00:00 2001 From: Patrick Stockwell Date: Sat, 14 Apr 2018 23:43:04 +1000 Subject: [PATCH 16/56] Change 'inputs' to 'outputs' Anything value unspent would have to come from an output. ...uses previously unspent `outputs`, and ... --- ch02.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch02.asciidoc b/ch02.asciidoc index 43e4bdff..25940f24 100644 --- a/ch02.asciidoc +++ b/ch02.asciidoc @@ -224,7 +224,7 @@ The transaction created by Alice's wallet application is 258 bytes long and cont ===== Bob's view -If Bob's bitcoin wallet application is directly connected to Alice's wallet application, Bob's wallet application might be the first node to receive the transaction. However, even if Alice's wallet sends the transaction through other nodes, it will reach Bob's wallet within a few seconds. Bob's wallet will immediately identify Alice's transaction as an incoming payment because it contains outputs redeemable by Bob's keys. Bob's wallet application can also independently verify that the transaction is well formed, uses previously unspent inputs, and contains sufficient transaction fees to be included in the next block. At this point Bob can assume, with little risk, that the transaction will shortly be included in a block and confirmed. +If Bob's bitcoin wallet application is directly connected to Alice's wallet application, Bob's wallet application might be the first node to receive the transaction. However, even if Alice's wallet sends the transaction through other nodes, it will reach Bob's wallet within a few seconds. Bob's wallet will immediately identify Alice's transaction as an incoming payment because it contains outputs redeemable by Bob's keys. Bob's wallet application can also independently verify that the transaction is well formed, uses previously unspent outputs, and contains sufficient transaction fees to be included in the next block. At this point Bob can assume, with little risk, that the transaction will shortly be included in a block and confirmed. [TIP] ==== From d6e1399c35d343ef07421c13b6148985d4216d0f Mon Sep 17 00:00:00 2001 From: "Nelson R. Perez" Date: Sun, 22 Apr 2018 21:38:05 -0500 Subject: [PATCH 17/56] Adding a diagram to better illustrate what the different bit flag combinations imply --- ch06.asciidoc | 6 ++++++ images/sighash_combinations.png | Bin 0 -> 21932 bytes 2 files changed, 6 insertions(+) create mode 100644 images/sighash_combinations.png diff --git a/ch06.asciidoc b/ch06.asciidoc index 34e6b4a1..dc1ecbe9 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -615,6 +615,12 @@ In addition, there is a modifier flag +SIGHASH_ANYONECANPAY+, which can be combi | SINGLE\|ANYONECANPAY | 0x83 | Signature applies to one input and the output with the same index number |======================= +These flag combinations are summarized in <> + +[[sighash_combinations]] +.Summary of different sighash combinations +image::images/sighash_combinations.png["Summary of different SIGHASH flag combinations"] + The way +SIGHASH+ flags are applied during signing and verification is that a copy of the transaction is made and certain fields within are truncated (set to zero length and emptied). The resulting transaction is serialized. The +SIGHASH+ flag is added to the end of the serialized transaction and the result is hashed. The hash itself is the "message" that is signed. Depending on which +SIGHASH+ flag is used, different parts of the transaction are truncated. The resulting hash depends on different subsets of the data in the transaction. By including the +SIGHASH+ as the last step before hashing, the signature commits the +SIGHASH+ type as well, so it can't be changed (e.g., by a miner). [NOTE] diff --git a/images/sighash_combinations.png b/images/sighash_combinations.png new file mode 100644 index 0000000000000000000000000000000000000000..9974e61f0931b80c79a2c78e9924852c0b1d5c2f GIT binary patch literal 21932 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 Date: Sun, 22 Apr 2018 21:40:49 -0500 Subject: [PATCH 18/56] Adjusted size of the figure --- images/sighash_combinations.png | Bin 21932 -> 18828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/sighash_combinations.png b/images/sighash_combinations.png index 9974e61f0931b80c79a2c78e9924852c0b1d5c2f..783e329672345e65cee5610430e2731be1638443 100644 GIT binary patch literal 18828 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 Date: Thu, 26 Apr 2018 03:35:03 +0400 Subject: [PATCH 19/56] Fix missing comma --- ch09.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch09.asciidoc b/ch09.asciidoc index aac23390..27dcaeee 100644 --- a/ch09.asciidoc +++ b/ch09.asciidoc @@ -11,7 +11,7 @@ Although a block has just one parent, it can temporarily have multiple children. The "previous block hash" field is inside the block header and thereby affects the _current_ block's hash. The child's own identity changes if the parent's identity changes. When the parent is modified in any way, the parent's hash changes. The parent's changed hash necessitates a change in the "previous block hash" pointer of the child. This in turn causes the child's hash to change, which requires a change in the pointer of the grandchild, which in turn changes the grandchild, and so on. This cascade effect ensures that once a block has many generations following it, it cannot be changed without forcing a recalculation of all subsequent blocks. Because such a recalculation would require enormous computation (and therefore energy consumption), the existence of a long chain of blocks makes the blockchain's deep history immutable, which is a key feature of bitcoin's security. -One way to think about the blockchain is like layers in a geological formation, or glacier core sample. The surface layers might change with the seasons, or even be blown away before they have time to settle. But once you go a few inches deep, geological layers become more and more stable. By the time you look a few hundred feet down, you are looking at a snapshot of the past that has remained undisturbed for millions of years. In the blockchain, the most recent few blocks might be revised if there is a chain recalculation due to a fork. The top six blocks are like a few inches of topsoil. But once you go more deeply into the blockchain, beyond six blocks, blocks are less and less likely to change. ((("transactions", "coinbase transactions")))((("coinbase transactions")))After 100 blocks back there is so much stability that the coinbase transaction—the transaction containing newly mined bitcoin—can be spent. A few thousand blocks back (a month) and the blockchain is settled history, for all practical purposes. While the protocol always allows a chain to be undone by a longer chain and while the possibility of any block being reversed always exists, the probability of such an event decreases as time passes until it becomes infinitesimal. +One way to think about the blockchain is like layers in a geological formation, or glacier core sample. The surface layers might change with the seasons, or even be blown away before they have time to settle. But once you go a few inches deep, geological layers become more and more stable. By the time you look a few hundred feet down, you are looking at a snapshot of the past that has remained undisturbed for millions of years. In the blockchain, the most recent few blocks might be revised if there is a chain recalculation due to a fork. The top six blocks are like a few inches of topsoil. But once you go more deeply into the blockchain, beyond six blocks, blocks are less and less likely to change. ((("transactions", "coinbase transactions")))((("coinbase transactions")))After 100 blocks back, there is so much stability that the coinbase transaction—the transaction containing newly mined bitcoin—can be spent. A few thousand blocks back (a month) and the blockchain is settled history, for all practical purposes. While the protocol always allows a chain to be undone by a longer chain and while the possibility of any block being reversed always exists, the probability of such an event decreases as time passes until it becomes infinitesimal. === Structure of a Block From 86034b6ecdecf3fd2ab9240897d54eb099d6474a Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Thu, 26 Apr 2018 04:03:12 +0400 Subject: [PATCH 20/56] Fix inconsistent date format --- ch10.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch10.asciidoc b/ch10.asciidoc index 47028166..025df820 100644 --- a/ch10.asciidoc +++ b/ch10.asciidoc @@ -402,7 +402,7 @@ By selecting the specific _parent_ block, indicated by the Previous Block Hash f c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e ---- -Jing's mining node will then add a 4-byte timestamp, encoded as a Unix "epoch" timestamp, which is based on the number of seconds elapsed from January 1, 1970, midnight UTC/GMT. The time +1388185914+ is equal to Friday, 27 Dec 2013, 23:11:54 UTC/GMT. +Jing's mining node will then add a 4-byte timestamp, encoded as a Unix "epoch" timestamp, which is based on the number of seconds elapsed since midnight UTC, Thursday, January 1, 1970. The time +1388185914+ is equal to Friday, December 27, 2013, 23:11:54 UTC. Jing's node then fills in the target, which defines the required Proof-of-Work to make this a valid block. The target is stored in the block as a "target bits" metric, which is a mantissa-exponent encoding of the target. The encoding has a 1-byte exponent, followed by a 3-byte mantissa (coefficient). In block 277,316, for example, the target bits value is +0x1903a30c+. The first part +0x19+ is a hexadecimal exponent, while the next part, +0x03a30c+, is the coefficient. The concept of a target is explained in <> and the "target bits" representation is explained in <>. From cfabc0d27174a71200d6d383266f3dbb753c2820 Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Fri, 27 Apr 2018 00:28:38 +0400 Subject: [PATCH 21/56] Update URLs to HTTPS scheme --- ch01.asciidoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ch01.asciidoc b/ch01.asciidoc index d17a30e4..80f17198 100644 --- a/ch01.asciidoc +++ b/ch01.asciidoc @@ -153,7 +153,7 @@ Here are some methods for getting bitcoin as a new user: * Find a friend who has bitcoin and buy some from him or her directly. Many bitcoin users start this way. This method is the least complicated. One way to meet people with bitcoin is to attend a local bitcoin meetup listed at https://bitcoin.meetup.com[Meetup.com]. * Use a classified service such as pass:[localbitcoins.com] to find a seller in your area to buy bitcoin for cash in an in-person transaction. * Earn bitcoin by selling a product or service for bitcoin. If you are a programmer, sell your programming skills. If you're a hairdresser, cut hair for bitcoin. -* ((("Coin ATM Radar")))((("ATMs, locating")))Use a bitcoin ATM in your city. A bitcoin ATM is a machine that accepts cash and sends bitcoin to your smartphone bitcoin wallet. Find a bitcoin ATM close to you using an online map from http://coinatmradar.com[Coin ATM Radar]. +* ((("Coin ATM Radar")))((("ATMs, locating")))Use a bitcoin ATM in your city. A bitcoin ATM is a machine that accepts cash and sends bitcoin to your smartphone bitcoin wallet. Find a bitcoin ATM close to you using an online map from https://coinatmradar.com[Coin ATM Radar]. * ((("exchange rates", "listing services")))Use a bitcoin currency exchange linked to your bank account. Many countries now have currency exchanges that offer a market for buyers and sellers to swap bitcoin with local currency. Exchange-rate listing services, such as https://bitcoinaverage.com[BitcoinAverage], often show a list of bitcoin exchanges for each currency. [TIP] @@ -172,9 +172,9 @@ Alice was introduced to bitcoin by a friend so she has an easy way to acquire he There are hundreds of applications and websites that can provide the current market rate. Here are some of the most popular: -http://bitcoinaverage.com/[Bitcoin Average]:: ((("BitcoinAverage")))A site that provides a simple view of the volume-weighted-average for each currency. -http://coincap.io/[CoinCap]:: A service listing the market capitalization and exchange rates of hundreds of crypto-currencies, including bitcoin. -http://bit.ly/cmebrr[Chicago Mercantile Exchange Bitcoin Reference Rate]:: A reference rate that can be used for institutional and contractual reference, provided as part of investment data feeds by the CME. +https://bitcoinaverage.com/[Bitcoin Average]:: ((("BitcoinAverage")))A site that provides a simple view of the volume-weighted-average for each currency. +https://coincap.io/[CoinCap]:: A service listing the market capitalization and exchange rates of hundreds of crypto-currencies, including bitcoin. +https://bit.ly/cmebrr[Chicago Mercantile Exchange Bitcoin Reference Rate]:: A reference rate that can be used for institutional and contractual reference, provided as part of investment data feeds by the CME. In addition to these various sites and applications, most bitcoin wallets will automatically convert amounts between bitcoin and other currencies. Joe will use his wallet to convert the price automatically before sending bitcoin to Alice. From 9c67786252c48b15cc75ff12dc16660468100eec Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Fri, 27 Apr 2018 00:43:41 +0400 Subject: [PATCH 22/56] Normalize URLs --- ch01.asciidoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ch01.asciidoc b/ch01.asciidoc index 80f17198..f197273b 100644 --- a/ch01.asciidoc +++ b/ch01.asciidoc @@ -150,11 +150,11 @@ Bitcoin transactions are irreversible. Most electronic payment networks such as [role="pagebreak-before"] Here are some methods for getting bitcoin as a new user: -* Find a friend who has bitcoin and buy some from him or her directly. Many bitcoin users start this way. This method is the least complicated. One way to meet people with bitcoin is to attend a local bitcoin meetup listed at https://bitcoin.meetup.com[Meetup.com]. +* Find a friend who has bitcoin and buy some from him or her directly. Many bitcoin users start this way. This method is the least complicated. One way to meet people with bitcoin is to attend a local bitcoin meetup listed at https://bitcoin.meetup.com/[Meetup.com]. * Use a classified service such as pass:[localbitcoins.com] to find a seller in your area to buy bitcoin for cash in an in-person transaction. * Earn bitcoin by selling a product or service for bitcoin. If you are a programmer, sell your programming skills. If you're a hairdresser, cut hair for bitcoin. -* ((("Coin ATM Radar")))((("ATMs, locating")))Use a bitcoin ATM in your city. A bitcoin ATM is a machine that accepts cash and sends bitcoin to your smartphone bitcoin wallet. Find a bitcoin ATM close to you using an online map from https://coinatmradar.com[Coin ATM Radar]. -* ((("exchange rates", "listing services")))Use a bitcoin currency exchange linked to your bank account. Many countries now have currency exchanges that offer a market for buyers and sellers to swap bitcoin with local currency. Exchange-rate listing services, such as https://bitcoinaverage.com[BitcoinAverage], often show a list of bitcoin exchanges for each currency. +* ((("Coin ATM Radar")))((("ATMs, locating")))Use a bitcoin ATM in your city. A bitcoin ATM is a machine that accepts cash and sends bitcoin to your smartphone bitcoin wallet. Find a bitcoin ATM close to you using an online map from https://coinatmradar.com/[Coin ATM Radar]. +* ((("exchange rates", "listing services")))Use a bitcoin currency exchange linked to your bank account. Many countries now have currency exchanges that offer a market for buyers and sellers to swap bitcoin with local currency. Exchange-rate listing services, such as https://bitcoinaverage.com/[BitcoinAverage], often show a list of bitcoin exchanges for each currency. [TIP] ==== From f18d93d18a6e13c883603ee37e0b068ad42944a2 Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Fri, 27 Apr 2018 09:19:01 +0400 Subject: [PATCH 23/56] Normalize and update URL to HTTPS scheme --- ch06.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index 34e6b4a1..4ecd0526 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -304,7 +304,7 @@ Over time, the way transaction fees are calculated and the effect they have on t Fee estimation algorithms calculate the appropriate fee, based on capacity and the fees offered by "competing" transactions. These algorithms range from simplistic (average or median fee in the last block) to sophisticated (statistical analysis). They estimate the necessary fee (in satoshis per byte) that will give a transaction a high probability of being selected and included within a certain number of blocks. Most services offer users the option of choosing high, medium, or low priority fees. High priority means users pay higher fees but the transaction is likely to be included in the next block. Medium and low priority means users pay lower transaction fees but the transactions may take much longer to confirm. -((("bitcoinfees (third-party service)")))Many wallet applications use third-party services for fee calculations. One popular service is http://bitcoinfees.21.co/[_http://bitcoinfees.21.co_], which provides an API and a visual chart showing the fee in satoshi/byte for different priorities. +((("bitcoinfees (third-party service)")))Many wallet applications use third-party services for fee calculations. One popular service is https://bitcoinfees.21.co/[_https://bitcoinfees.21.co/_], which provides an API and a visual chart showing the fee in satoshi/byte for different priorities. [TIP] ==== From f33a8de918dba38cd02d1dc0788e458127ed8476 Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Fri, 27 Apr 2018 10:12:08 +0400 Subject: [PATCH 24/56] Fix double whitespaces in chapter 1 --- ch01.asciidoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ch01.asciidoc b/ch01.asciidoc index f197273b..c703f1ab 100644 --- a/ch01.asciidoc +++ b/ch01.asciidoc @@ -4,7 +4,7 @@ === What Is Bitcoin? -((("bitcoin", "defined", id="GSdefine01")))Bitcoin is a collection of concepts and technologies that form the basis of a digital money ecosystem. Units of currency called bitcoin are used to store and transmit value among participants in the bitcoin network. Bitcoin users communicate with each other using the bitcoin protocol primarily via the internet, although other transport networks can also be used. The bitcoin protocol stack, available as open source software, can be run on a wide range of computing devices, including laptops and smartphones, making the technology easily accessible. +((("bitcoin", "defined", id="GSdefine01")))Bitcoin is a collection of concepts and technologies that form the basis of a digital money ecosystem. Units of currency called bitcoin are used to store and transmit value among participants in the bitcoin network. Bitcoin users communicate with each other using the bitcoin protocol primarily via the internet, although other transport networks can also be used. The bitcoin protocol stack, available as open source software, can be run on a wide range of computing devices, including laptops and smartphones, making the technology easily accessible. Users can transfer bitcoin over the network to do just about anything that can be done with conventional currencies, including buy and sell goods, send money to people or organizations, or extend credit. Bitcoin can be purchased, sold, and exchanged for other currencies at specialized currency exchanges. Bitcoin in a sense is the perfect form of money for the internet because it is fast, secure, and borderless. @@ -12,7 +12,7 @@ Unlike traditional currencies, bitcoin are entirely virtual. There are no physic 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. Behind the scenes, bitcoin is also the name of the protocol, a peer-to-peer network, and a distributed computing innovation. The bitcoin currency is really only the first application of this invention. Bitcoin represents the culmination of decades of research in cryptography and distributed systems and includes four key innovations brought together in a unique and powerful combination. Bitcoin consists of: @@ -35,7 +35,7 @@ In this chapter we'll get started by explaining some of the main concepts and te 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? -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. @@ -153,7 +153,7 @@ Here are some methods for getting bitcoin as a new user: * Find a friend who has bitcoin and buy some from him or her directly. Many bitcoin users start this way. This method is the least complicated. One way to meet people with bitcoin is to attend a local bitcoin meetup listed at https://bitcoin.meetup.com/[Meetup.com]. * Use a classified service such as pass:[localbitcoins.com] to find a seller in your area to buy bitcoin for cash in an in-person transaction. * Earn bitcoin by selling a product or service for bitcoin. If you are a programmer, sell your programming skills. If you're a hairdresser, cut hair for bitcoin. -* ((("Coin ATM Radar")))((("ATMs, locating")))Use a bitcoin ATM in your city. A bitcoin ATM is a machine that accepts cash and sends bitcoin to your smartphone bitcoin wallet. Find a bitcoin ATM close to you using an online map from https://coinatmradar.com/[Coin ATM Radar]. +* ((("Coin ATM Radar")))((("ATMs, locating")))Use a bitcoin ATM in your city. A bitcoin ATM is a machine that accepts cash and sends bitcoin to your smartphone bitcoin wallet. Find a bitcoin ATM close to you using an online map from https://coinatmradar.com/[Coin ATM Radar]. * ((("exchange rates", "listing services")))Use a bitcoin currency exchange linked to your bank account. Many countries now have currency exchanges that offer a market for buyers and sellers to swap bitcoin with local currency. Exchange-rate listing services, such as https://bitcoinaverage.com/[BitcoinAverage], often show a list of bitcoin exchanges for each currency. [TIP] From 73f288dcaf4bd99ef5e01cc843ba8030b2ba5136 Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Sat, 28 Apr 2018 12:12:03 +0400 Subject: [PATCH 25/56] Normalize animals.oreilly.com URL in colophon --- colo.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/colo.html b/colo.html index 09cb4475..5a548992 100644 --- a/colo.html +++ b/colo.html @@ -7,7 +7,7 @@

Once a colony has matured, ants are divided into castes based on size, with each caste performing various functions. There are usually four castes: minims, the smallest workers that tend to the young and fungus gardens; minors, slightly larger than minima, are the first line of defense for the colony and patrol the surrounding terrain and attack enemies; mediae, the general foragers that cut leaves and bring back leaf fragments to the nest; and majors, the largest worker ants that act as soldiers, defending the nest from intruders. Recent research has shown that majors also clear main foraging trails and carry bulky items back to the nest.

-

Many of the animals on O'Reilly covers are endangered; all of them are important to the world. To learn more about how you can help, go to animals.oreilly.com.

+

Many of the animals on O'Reilly covers are endangered; all of them are important to the world. To learn more about how you can help, go to animals.oreilly.com.

The cover image is from Insects Abroad. The cover fonts are URW Typewriter and Guardian Sans. The text font is Adobe Minion Pro; the heading font is Adobe Myriad Condensed; and the code font is Dalton Maag's Ubuntu Mono.

From b54037cbd671a7f943d4cd8a9a8481dd0c5bc5d6 Mon Sep 17 00:00:00 2001 From: wintercooled Date: Mon, 7 May 2018 13:40:10 +0100 Subject: [PATCH 26/56] Fixed broken link to rpcuser.py - is actually rpcauth.py The correct file and path is rpcauth not rpcuser https://github.com/bitcoin/bitcoin/blob/master/share/rpcauth/rpcauth.py --- ch03.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch03.asciidoc b/ch03.asciidoc index e3e6e01b..f8ecfb19 100644 --- a/ch03.asciidoc +++ b/ch03.asciidoc @@ -684,7 +684,7 @@ $ curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "met 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. +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/rpcauth/rpcauth.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. From d6ec46403fe2346495ebbe7f9558167317936164 Mon Sep 17 00:00:00 2001 From: "Samuel B. Atwood" Date: Mon, 7 May 2018 11:49:35 -0500 Subject: [PATCH 27/56] Specify height/timestamp cutoff for nLockTime Changed "If it is above 500 million..." to "If it is greater than or equal to 500 million" to more accurately reflect the protocol spec. See: https://en.bitcoin.it/wiki/Script#Locktime --- ch07.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch07.asciidoc b/ch07.asciidoc index f92c7384..8d48f08b 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -262,7 +262,7 @@ Timelocks are useful for postdating transactions and locking funds to a date in [[transaction_locktime_nlocktime]] ==== Transaction Locktime (nLocktime) -((("scripting", "timelocks", "nLocktime")))((("timelocks", "nLocktime")))From the beginning, bitcoin has had a transaction-level timelock feature. Transaction locktime is a transaction-level setting (a field in the transaction data structure) that defines the earliest time that a transaction is valid and can be relayed on the network or added to the blockchain. Locktime is also known as +nLocktime+ from the variable name used in the Bitcoin Core codebase. It is set to zero in most transactions to indicate immediate propagation and execution. If +nLocktime+ is nonzero and below 500 million, it is interpreted as a block height, meaning the transaction is not valid and is not relayed or included in the blockchain prior to the specified block height. If it is above 500 million, it is interpreted as a Unix Epoch timestamp (seconds since Jan-1-1970) and the transaction is not valid prior to the specified time. Transactions with +nLocktime+ specifying a future block or time must be held by the originating system and transmitted to the bitcoin network only after they become valid. If a transaction is transmitted to the network before the specified +nLocktime+, the transaction will be rejected by the first node as invalid and will not be relayed to other nodes. The use of +nLocktime+ is equivalent to postdating a paper check. +((("scripting", "timelocks", "nLocktime")))((("timelocks", "nLocktime")))From the beginning, bitcoin has had a transaction-level timelock feature. Transaction locktime is a transaction-level setting (a field in the transaction data structure) that defines the earliest time that a transaction is valid and can be relayed on the network or added to the blockchain. Locktime is also known as +nLocktime+ from the variable name used in the Bitcoin Core codebase. It is set to zero in most transactions to indicate immediate propagation and execution. If +nLocktime+ is nonzero and below 500 million, it is interpreted as a block height, meaning the transaction is not valid and is not relayed or included in the blockchain prior to the specified block height. If it is greater than or equal to 500 million, it is interpreted as a Unix Epoch timestamp (seconds since Jan-1-1970) and the transaction is not valid prior to the specified time. Transactions with +nLocktime+ specifying a future block or time must be held by the originating system and transmitted to the bitcoin network only after they become valid. If a transaction is transmitted to the network before the specified +nLocktime+, the transaction will be rejected by the first node as invalid and will not be relayed to other nodes. The use of +nLocktime+ is equivalent to postdating a paper check. [[locktime_limitations]] ===== Transaction locktime limitations From 24fd7bd79bbca32bb557895d8946aa395d8cbc67 Mon Sep 17 00:00:00 2001 From: theStack Date: Sat, 19 May 2018 09:10:18 -0400 Subject: [PATCH 28/56] max_money.py: use variable start_block_reward (eliminate magic number) --- code/max_money.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/max_money.py b/code/max_money.py index fcb44509..4b739019 100644 --- a/code/max_money.py +++ b/code/max_money.py @@ -1,12 +1,11 @@ -# Original block reward for miners was 50 BTC -start_block_reward = 50 +# Original block reward for miners was 50 BTC = 50 0000 0000 Satoshis +start_block_reward = 50 * 10**8 # 210000 is around every 4 years with a 10 minute block interval reward_interval = 210000 def max_money(): - # 50 BTC = 50 0000 0000 Satoshis - current_reward = 50 * 10**8 + current_reward = start_block_reward total = 0 while current_reward > 0: total += reward_interval * current_reward From bb3cad42070c1b4acf05bfb7af90973146408661 Mon Sep 17 00:00:00 2001 From: "Nelson R. Perez" Date: Tue, 29 May 2018 21:57:18 -0500 Subject: [PATCH 29/56] Added legends to the graph --- images/sighash_combinations.png | Bin 18828 -> 38948 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/sighash_combinations.png b/images/sighash_combinations.png index 783e329672345e65cee5610430e2731be1638443..8a12f93f9df6228e9022de17e7b4702a020bb894 100644 GIT binary patch literal 38948 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 literal 18828 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 Date: Fri, 1 Jun 2018 12:09:15 -0500 Subject: [PATCH 30/56] Added a period at the end of the sentence --- ch06.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index dc1ecbe9..6f17b5c2 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -615,7 +615,7 @@ In addition, there is a modifier flag +SIGHASH_ANYONECANPAY+, which can be combi | SINGLE\|ANYONECANPAY | 0x83 | Signature applies to one input and the output with the same index number |======================= -These flag combinations are summarized in <> +These flag combinations are summarized in <>. [[sighash_combinations]] .Summary of different sighash combinations From 1376e976e806d2655dfa0b0a62221eeefec39ca8 Mon Sep 17 00:00:00 2001 From: James Cramer Date: Thu, 12 Jul 2018 13:14:38 -0400 Subject: [PATCH 31/56] fix OP_SWAP error in description --- appdx-scriptops.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appdx-scriptops.asciidoc b/appdx-scriptops.asciidoc index 6cfb13e1..b39e8e45 100644 --- a/appdx-scriptops.asciidoc +++ b/appdx-scriptops.asciidoc @@ -80,7 +80,7 @@ Tables and descriptions sourced from https://en.bitcoin.it/wiki/Script[]. | OP_PICK | 0x79 | Pop value N from top, then copy the Nth item to the top of the stack | OP_ROLL | 0x7a | Pop value N from top, then move the Nth item to the top of the stack | OP_ROT | 0x7b | Rotate the top three items in the stack -| OP_SWAP | 0x7c | Swap the top three items in the stack +| OP_SWAP | 0x7c | Swap the top two items on the stack | OP_TUCK | 0x7d | Copy the top item and insert it between the top and second item. |======= From ec1cf256c7def717050597bfc173db73fe362e6b Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 22 Jul 2018 22:23:43 +0300 Subject: [PATCH 32/56] ch06 - fixed grammatical number 'a lot of underlying detail' -> 'a lot of underlying details' --- ch06.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index 34e6b4a1..c7bb8c95 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -727,7 +727,7 @@ From the UTXO set, the blockchain explorer sums up the value of all unspent outp In order to produce this one image, with these two "balances," the blockchain explorer has to index and search through dozens, hundreds, or even hundreds of thousands of transactions. -In summary, the information presented to users through wallet applications, blockchain explorers, and other bitcoin user interfaces is often composed of higher-level abstractions that are derived by searching many different transactions, inspecting their content, and manipulating the data contained within them. By presenting this simplistic view of bitcoin transactions that resemble bank checks from one sender to one recipient, these applications have to abstract a lot of underlying detail. They mostly focus on the common types of transactions: P2PKH with SIGHASH_ALL signatures on every input. Thus, while bitcoin applications can present more than 80% of all transactions in an easy-to-read manner, they are sometimes stumped by transactions that deviate from the norm. Transactions that contain more complex locking scripts, or different SIGHASH flags, or many inputs and outputs, demonstrate the simplicity and weakness of these abstractions. +In summary, the information presented to users through wallet applications, blockchain explorers, and other bitcoin user interfaces is often composed of higher-level abstractions that are derived by searching many different transactions, inspecting their content, and manipulating the data contained within them. By presenting this simplistic view of bitcoin transactions that resemble bank checks from one sender to one recipient, these applications have to abstract a lot of underlying details. They mostly focus on the common types of transactions: P2PKH with SIGHASH_ALL signatures on every input. Thus, while bitcoin applications can present more than 80% of all transactions in an easy-to-read manner, they are sometimes stumped by transactions that deviate from the norm. Transactions that contain more complex locking scripts, or different SIGHASH flags, or many inputs and outputs, demonstrate the simplicity and weakness of these abstractions. Every day, hundreds of transactions that do not contain P2PKH outputs are confirmed on the blockchain. The blockchain explorers often present these with red warning messages saying they cannot decode an address. The following link contains the most recent "strange transactions" that were not fully decoded: https://blockchain.info/strange-transactions[]. From 367bd252c9ebb516e33f0b69cbbc35ebec77a298 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 22 Jul 2018 22:30:06 +0300 Subject: [PATCH 33/56] ch07 - fixed typo 'segit' -> 'segwit' --- ch07.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch07.asciidoc b/ch07.asciidoc index f92c7384..0e7f12aa 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -940,7 +940,7 @@ Mohammed's company can then construct segwit transactions to spend these payment ===== Segregated Witness addresses -Even after segwit activation, it will take some time until most wallets are upgraded. At first, segwit will be embedded in P2SH, as we saw in the previous section, to ease compatibility between segit-aware and unaware wallets. +Even after segwit activation, it will take some time until most wallets are upgraded. At first, segwit will be embedded in P2SH, as we saw in the previous section, to ease compatibility between segwit-aware and unaware wallets. However, once wallets are broadly supporting segwit, it makes sense to encode witness scripts directly in a native address format designed for segwit, rather than embed it in P2SH. From b18ee82b469e888c6a482f3be101942522a1c358 Mon Sep 17 00:00:00 2001 From: ottoteixeira Date: Fri, 17 Aug 2018 14:37:21 -0300 Subject: [PATCH 34/56] Fixed typo: "note than" -> "note that" --- ch07.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch07.asciidoc b/ch07.asciidoc index f92c7384..998421a1 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -982,7 +982,7 @@ With the introduction of Segregated Witness, transactions have two identifiers, The traditional +txid+ is calculated in exactly the same way as with a nonsegwit transaction. However, since the segwit transaction has empty ++scriptSig++s in every input, there is no part of the transaction that can be modified by a third party. Therefore, in a segwit transaction, the +txid+ is immutable by a third party, even when the transaction is unconfirmed. -The +wtxid+ is like an "extended" ID, in that the hash also incorporates the witness data. If a transaction is transmitted without witness data, then the +wtxid+ and +txid+ are identical. Note than since the +wtxid+ includes witness data (signatures) and since witness data may be malleable, the +wtxid+ should be considered malleable until the transaction is confirmed. Only the +txid+ of a segwit transaction can be considered immutable by third parties and only if _all_ the inputs of the transaction are segwit inputs. +The +wtxid+ is like an "extended" ID, in that the hash also incorporates the witness data. If a transaction is transmitted without witness data, then the +wtxid+ and +txid+ are identical. Note that since the +wtxid+ includes witness data (signatures) and since witness data may be malleable, the +wtxid+ should be considered malleable until the transaction is confirmed. Only the +txid+ of a segwit transaction can be considered immutable by third parties and only if _all_ the inputs of the transaction are segwit inputs. [TIP] ==== From 6647b56145d4c13627e4726a17560385b1e5e83a Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Tue, 21 Aug 2018 20:18:39 -0400 Subject: [PATCH 35/56] Correct my GitHub handle (CamelCase) --- preface.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preface.asciidoc b/preface.asciidoc index 11370838..8cc1e664 100644 --- a/preface.asciidoc +++ b/preface.asciidoc @@ -224,7 +224,7 @@ Following is a list of notable GitHub contributors, including their GitHub ID in * Lucas Betschart (lclc) * Magomed Aliev (30mb1) * Mai-Hsuan Chia (mhchia) -* marcofalke +* Marco Falke (MarcoFalke) * Marzig (marzig76) * Matt McGivney (mattmcgiv) * Maximilian Reichel (phramz) From f91e539a82a28dc5c984f7577c4e5809502b72c5 Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Tue, 21 Aug 2018 20:29:13 -0400 Subject: [PATCH 36/56] ch10: Clarify sequence number for typical tx input --- ch10.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch10.asciidoc b/ch10.asciidoc index 47028166..570cd308 100644 --- a/ch10.asciidoc +++ b/ch10.asciidoc @@ -307,7 +307,7 @@ As you can see in <>, the coinbase transaction has a spec | 4 bytes | Output Index | The index number of the UTXO to be spent, first one is 0 | 1–9 bytes (VarInt) | Unlocking-Script Size | Unlocking-Script length in bytes, to follow | Variable | Unlocking-Script | A script that fulfills the conditions of the UTXO locking script -| 4 bytes | Sequence Number | Currently disabled Tx-replacement feature, set to 0xFFFFFFFF +| 4 bytes | Sequence Number | Usually set to 0xFFFFFFFF to opt out of BIP 125 and BIP 68 |======= [[table_8-2]] From 8c239e31f930b19e7311efa4a32bb263f8cee64b Mon Sep 17 00:00:00 2001 From: Brad Chase Date: Tue, 4 Sep 2018 09:20:27 -0400 Subject: [PATCH 37/56] fix typo: "diffent" -> "different" --- ch03.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch03.asciidoc b/ch03.asciidoc index e3e6e01b..012fe6a4 100644 --- a/ch03.asciidoc +++ b/ch03.asciidoc @@ -465,7 +465,7 @@ In the next sections we will demonstrate some very useful RPC commands and their ==== Getting Information on the Bitcoin Core Client Status -((("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 Core", "Bitcoin Core API", "status information")))Bitcoin Core provides status reports on different modules through the JSON-RPC interface. The most important commands include +getblockchaininfo+, +getmempoolinfo+, +getnetworkinfo+ and +getwalletinfo+. 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: From 0cd5f46948a37f313e43ebefed1f88bbde6f29e5 Mon Sep 17 00:00:00 2001 From: "Andreas M. Antonopoulos" Date: Thu, 25 Oct 2018 17:27:54 -0400 Subject: [PATCH 38/56] Released 2nd Edition as CC-BY-SA --- README.md | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a6a061fb..9ffa6089 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,9 @@ This repository contains the complete [first edition, second print](https://gith If you know how to make a pull request to contribute a fix, please write the correction and use a pull request to submit it for consideration against the [develop branch](https://github.com/bitcoinbook/bitcoinbook/tree/develop). If you are making several changes, please use a separate commit for each to make it easier to cherry-pick or resolve conflicts. Otherwise, please submit an issue, explaining the error or comment. If you would like to contribute extensive changes or new material, please coordinate with the author first; contact information can be found on his web site: https://antonopoulos.com/ -# Reading this book (Where is the PDF?) +# Reading this book -To read this book, see [book.asciidoc](https://github.com/bitcoinbook/bitcoinbook/blob/develop/book.asciidoc). Click on each of the chapters to read in your browser. This is not as convenient as reading a PDF or an ebook on your e-reader, for which there is a cost (see below). - -The 2nd edition of "Mastering Bitcoin" is available under a CC-BY-NC-ND license, not a CC-BY-SA license. - -It is deliberately not available as a PDF. Why? Because a PDF is a "derivative" product, which is what the ND prohibits. That's because the publisher (O'Reilly Media) is a for-profit publisher who puts considerable resources behind distributing the book. The book will eventually (within a year of publication) be released under a CC-BY-SA license, at which point the PDF format and translations will be allowed. Until then, making PDF copies violates the license and interferes with the publisher's (and the author's) ability to make a living. Furthermore, if you make it so the publisher can't recoup their investment, they will delay the release into CC-BY-SA. - -Please don't create or distribute PDFs until the license is changed to CC-BY-SA. It is rare for a publisher to even agree to a CC-BY-NC-ND license. Don't make it harder for free culture by violating even that, already generous, license. +To read this book, see [book.asciidoc](https://github.com/bitcoinbook/bitcoinbook/blob/develop/book.asciidoc). Click on each of the chapters to read in your browser. Other parties may choose to release PDFs of the book online. # Published @@ -38,7 +32,7 @@ The book's source code, found in this repository, is kept synchronized with the The tags [Edition1Print1](https://github.com/bitcoinbook/bitcoinbook/releases/tag/Edition1Print1), [Edition1Print2](https://github.com/bitcoinbook/bitcoinbook/releases/tag/Edition1Print2) correspond to the two existing prints of Mastering Bitcoin (First Edition) as published by O'Reilly Media. -Creative Commons License
Mastering Bitcoin - First Edition by Andreas M. Antonopoulos LLC is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. +Creative Commons License
Mastering Bitcoin - First Edition by Andreas M. Antonopoulos LLC is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. This "Free Culture" compliant license was approved by my publisher O'Reilly Media (http://oreilly.com), who understands the value of open source. O'Reilly Media is not just the world's best publisher of technical books, but is also a strong supporter of this open culture and the sharing of knowledge. @@ -46,14 +40,12 @@ Thank you O'Reilly Media! ## Mastering Bitcoin - Second Edition -The tags, [second_edition_print_1](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print_1) and [second_edition_print2](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print2), correspond to the first (June 8th 2017) and second (July 20th 2017) print of Mastering Bitcoin (Second Edition), as published by O'Reilly Media. - -Creative Commons License
Mastering Bitcoin - Second Edition by Andreas M. Antonopoulos LLC is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. +The tags, [second_edition_print_1](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print_1) and [second_edition_print2](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print2), correspond to the first (June 8th 2017) and second (July 20th 2017) print of Mastering Bitcoin (Second Edition), as published by O'Reilly Media. -It is expected that the second edition will be released under a CC-BY-SA license within a year of publication. +Creative Commons License
Mastering Bitcoin - Second Edition by Andreas M. Antonopoulos LLC is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. # Translations -If you are interested in translating this book, please join our team of volunteers at: https://www.transifex.com/bitcoinbook/mastering-bitcoin/ +If you are interested in translating this book, please join our team of volunteers at: https://www.transifex.com/aantonop/mastering-bitcoin Free copies of "Mastering Bitcoin Open Edition," translated in many languages, can be downloaded from: https://bitcoinbook.info From 998bf7369bb63ecf64570ff5980e12cd54b48883 Mon Sep 17 00:00:00 2001 From: sudeshnas25 <32449248+sudeshnas25@users.noreply.github.com> Date: Wed, 31 Oct 2018 01:01:14 +0530 Subject: [PATCH 39/56] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9ffa6089..1a0893ae 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This repository contains the complete [first edition, second print](https://gith # Issues, Errors, Comments, Contributions -If you know how to make a pull request to contribute a fix, please write the correction and use a pull request to submit it for consideration against the [develop branch](https://github.com/bitcoinbook/bitcoinbook/tree/develop). If you are making several changes, please use a separate commit for each to make it easier to cherry-pick or resolve conflicts. Otherwise, please submit an issue, explaining the error or comment. If you would like to contribute extensive changes or new material, please coordinate with the author first; contact information can be found on his web site: https://antonopoulos.com/ +If you know how to make a pull request to contribute a fix, please write the correction and use a pull request to submit it for consideration against the [develop branch](https://github.com/bitcoinbook/bitcoinbook/tree/develop). If you are making several changes, please use a separate commit for each to make it easier to cherry-pick or resolve conflicts. Otherwise, please submit an issue, explaining the error or comment. If you would like to contribute extensive changes or new material, please coordinate with the author first; contact information can be found on his website: https://antonopoulos.com/ # Reading this book @@ -16,7 +16,7 @@ To read this book, see [book.asciidoc](https://github.com/bitcoinbook/bitcoinboo # Published -"Mastering Bitcoin (Second Edition, Second Print): Programming the Open Blockchain" is now available in paperback and ebook formats by many book sellers worldwide: +"Mastering Bitcoin (Second Edition, Second Print): Programming the Open Blockchain" is now available in paperback and ebook formats by many booksellers worldwide: * [Amazon](https://www.amazon.com/Mastering-Bitcoin-Programming-Open-Blockchain/dp/1491954388) @@ -40,7 +40,7 @@ Thank you O'Reilly Media! ## Mastering Bitcoin - Second Edition -The tags, [second_edition_print_1](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print_1) and [second_edition_print2](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print2), correspond to the first (June 8th 2017) and second (July 20th 2017) print of Mastering Bitcoin (Second Edition), as published by O'Reilly Media. +The tags, [second_edition_print_1](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print_1) and [second_edition_print2](https://github.com/bitcoinbook/bitcoinbook/releases/tag/second_edition_print2), correspond to the first (June 8th, 2017) and second (July 20th, 2017) print of Mastering Bitcoin (Second Edition), as published by O'Reilly Media. Creative Commons License
Mastering Bitcoin - Second Edition by Andreas M. Antonopoulos LLC is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. From 0c9fe256b0c1fa665790ef2314db69fbe08eb58d Mon Sep 17 00:00:00 2001 From: Tiago Canto Date: Wed, 7 Nov 2018 16:26:24 -0300 Subject: [PATCH 40/56] In CKD function the public key is compressed 264 bits is the size of a compressed public key --- ch05.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch05.asciidoc b/ch05.asciidoc index ffe8db8d..e342d27c 100644 --- a/ch05.asciidoc +++ b/ch05.asciidoc @@ -325,7 +325,7 @@ The chain code (c) is used to introduce entropy in the function that creates chi 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 compressed key) * A seed called a chain code (256 bits) * An index number (32 bits) From a24ab3912587a80a3180f010a05dbdedeeaac484 Mon Sep 17 00:00:00 2001 From: Oded Leiba Date: Sun, 11 Nov 2018 00:19:00 +0200 Subject: [PATCH 41/56] add blockstream.info as a popular explorer It support testnet, native bech32, transaction scripts and more --- ch02.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/ch02.asciidoc b/ch02.asciidoc index 43e4bdff..86d68e4d 100644 --- a/ch02.asciidoc +++ b/ch02.asciidoc @@ -21,6 +21,7 @@ image::images/mbc2_0201.png["Bitcoin Overview"] * https://live.blockcypher.com[BlockCypher Explorer] * https://blockchain.info[blockchain.info] * https://insight.bitpay.com[BitPay Insight] +* https://blockstream.info[Blockstream Explorer] Each of these has a search function that can take a bitcoin address, transaction hash, block number, or block hash and retrieve corresponding information from the bitcoin network. With each transaction or block example, we will provide a URL so you can look it up yourself and study it in detail. From 29e3a0a267be0dd824f985504455b5b2bf5bc57d Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Wed, 14 Nov 2018 12:47:56 +0100 Subject: [PATCH 42/56] Segwit has been activated on mainnet Remove outdated sentence. --- ch12.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch12.asciidoc b/ch12.asciidoc index 4923bbc2..03630a33 100644 --- a/ch12.asciidoc +++ b/ch12.asciidoc @@ -451,7 +451,7 @@ This is a basic implementation of an HTLC. This type of HTLC can be redeemed by "Lightning Network" refers to a specific design for a routed payment channel network, which has now been implemented by at least five different open source teams. ((("Basics of Lightning Technology (BOLT)")))The independent implementations are coordinated by a set of interoperability standards described in the http://bit.ly/2rBHeoL[_Basics of Lightning Technology (BOLT)_ paper]. -Prototype implementations of the Lightning Network have been released by several teams. For now, these implementations can only be run on testnet because they use segwit, which is not activated on the main bitcoin blockchain (mainnet). +Prototype implementations of the Lightning Network have been released by several teams. The Lightning Network is one possible way of implementing routed payment channels. There are several other designs that aim to achieve similar goals, such as Teechan and Tumblebit. From 0355c51c607b52b657a09f2eda5de1c9b78eb253 Mon Sep 17 00:00:00 2001 From: "@J9Roem" Date: Fri, 21 Dec 2018 00:32:52 +0100 Subject: [PATCH 43/56] Added list of chapter numbers & titles --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 9ffa6089..18a8bd9e 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,21 @@ If you know how to make a pull request to contribute a fix, please write the cor To read this book, see [book.asciidoc](https://github.com/bitcoinbook/bitcoinbook/blob/develop/book.asciidoc). Click on each of the chapters to read in your browser. Other parties may choose to release PDFs of the book online. +## Chapters + ++ Chapter 1: '[Introduction](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch01.asciidoc)' ++ Chapter 2: '[How Bitcoin Works](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch02.asciidoc)' ++ Chapter 3: '[Bitcoin Core: The Reference Implementation](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch03.asciidoc)' ++ Chapter 4: '[Keys, Addresses](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc)' ++ Chapter 5: '[Wallets](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch05.asciidoc)' ++ Chapter 6: '[Transactions](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch06.asciidoc)' ++ Chapter 7: '[Advanced Transactions and Scripting](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch07.asciidoc)' ++ Chapter 8: '[The Bitcoin Network](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch08.asciidoc)' ++ Chapter 9: '[The Blockchain](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch09.asciidoc)' ++ Chapter 10: '[Mining and Consensus](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch10.asciidoc)' ++ Chapter 11: '[Bitcoin Security](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch11.asciidoc)' ++ Chapter 12: '[Blockchain Applications](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch12.asciidoc)' + # Published "Mastering Bitcoin (Second Edition, Second Print): Programming the Open Blockchain" is now available in paperback and ebook formats by many book sellers worldwide: From 9e2817f50a870dbfa73a0162dd436eeaae73ad0a Mon Sep 17 00:00:00 2001 From: Massimiliano Terzi Date: Tue, 1 Jan 2019 16:58:31 +0000 Subject: [PATCH 44/56] Update ec-math.py python 3, no need for decoding/encoding --- code/ec-math.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/code/ec-math.py b/code/ec-math.py index 7dcaa9ea..54856ebb 100644 --- a/code/ec-math.py +++ b/code/ec-math.py @@ -20,29 +20,25 @@ generator = generator_secp256k1 def random_secret(): - 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 - byte_array = os.urandom(32) - - return convert_to_int(byte_array) + byte_array = (os.urandom(32)).hex() + return int(byte_array,16) def get_point_pubkey(point): if (point.y() % 2) == 1: key = '03' + '%064x' % point.x() else: key = '02' + '%064x' % point.x() - return key.decode('hex') + return key def get_point_pubkey_uncompressed(point): key = ('04' + '%064x' % point.x() + '%064x' % point.y()) - return key.decode('hex') - + return key # Generate a new private key. secret = random_secret() @@ -50,9 +46,9 @@ print("Secret: ", secret) # Get the public key point. point = secret * generator -print("EC point:", point) +print("Elliptic Curve point:", point) -print("BTC public key:", get_point_pubkey(point).encode("hex")) +print("BTC public key:", get_point_pubkey(point)) # Given the point (x, y) we can create the object using: point1 = ecdsa.ellipticcurve.Point(curve, point.x(), point.y(), ec_order) From fd9ff0017fdd44c8b499eeb2bc29afd7b83b0a64 Mon Sep 17 00:00:00 2001 From: Amin Mazinani Date: Mon, 7 Jan 2019 11:13:58 +0330 Subject: [PATCH 45/56] fix a typo in ch5 : an deterministic --- ch05.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ch05.asciidoc b/ch05.asciidoc index ffe8db8d..7ed43452 100644 --- a/ch05.asciidoc +++ b/ch05.asciidoc @@ -73,12 +73,12 @@ The second advantage of HD wallets is that users can create a sequence of public Let's look at this from a practical perspective. Which of the following seeds is easier to transcribe, record on paper, read without error, export, and import into another wallet? -.A seed for an deterministic wallet, in hex +.A seed for a deterministic wallet, in hex ---- 0C1E24E5917779D297E14D45F14E1A1A ---- -.A seed for an deterministic wallet, from a 12-word mnemonic +.A seed for a deterministic wallet, from a 12-word mnemonic ---- army van defense carry jealous true garbage claim echo media make crunch From 190ef2e6a5a058fe9bd2632da00ddb1c42dd5afe Mon Sep 17 00:00:00 2001 From: JP Date: Sat, 9 Mar 2019 15:10:50 -0500 Subject: [PATCH 46/56] Replaces bitly links with full links in Tip boxes The bitly links are redirecting to a warning page. https://bitly.com/a/warning?hash=1u0FIGs&url=https%3A%2F%2Fblockchain.info%2Ftx%2F0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2 --- ch02.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ch02.asciidoc b/ch02.asciidoc index 43e4bdff..08a3a890 100644 --- a/ch02.asciidoc +++ b/ch02.asciidoc @@ -183,7 +183,7 @@ The response in <> shows one unspent output (one that has not been [TIP] ==== -View the http://bit.ly/1tAeeGr[transaction from Joe to Alice]. +View the https://www.blockchain.com/btc/tx/7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18[transaction from Joe to Alice]. ==== As you can see, Alice's wallet contains enough bitcoin in a single unspent output to pay for the cup of coffee. Had this not been the case, Alice's wallet application might have to "rummage" through a pile of smaller unspent outputs, like picking coins from a purse until it could find enough to pay for the coffee. In both cases, there might be a need to get some change back, which we will see in the next section, as the wallet application creates the transaction outputs (payments). @@ -207,7 +207,7 @@ image::images/mbc2_0208.png["Alice Coffee Transaction"] [[transaction-alice-url]] [TIP] ==== -View the http://bit.ly/1u0FIGs[transaction from Alice to Bob's Cafe]. +View the https://www.blockchain.com/btc/tx/0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2[transaction from Alice to Bob's Cafe]. ==== ==== Adding the Transaction to the Ledger From 0c1d1ae175b2b891d3baa227f2b38208713d8157 Mon Sep 17 00:00:00 2001 From: Kuziwa Sachikonye Date: Mon, 27 May 2019 11:01:25 +0200 Subject: [PATCH 47/56] changed the word from reliable to persistant for clarity --- ch08.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch08.asciidoc b/ch08.asciidoc index d2a22c15..074e0e7f 100644 --- a/ch08.asciidoc +++ b/ch08.asciidoc @@ -93,7 +93,7 @@ Once one or more connections are established, the new node will send an +addr+ m .Address propagation and discovery image::images/mbc2_0805.png["AddressPropagation"] -A node must connect to a few different peers in order to establish diverse paths into the bitcoin network. Paths are not reliable—nodes come and go—and so the node must continue to discover new nodes as it loses old connections as well as assist other nodes when they bootstrap. Only one connection is needed to bootstrap, because the first node can offer introductions to its peer nodes and those peers can offer further introductions. It's also unnecessary and wasteful of network resources to connect to more than a handful of nodes. After bootstrapping, a node will remember its most recent successful peer connections, so that if it is rebooted it can quickly reestablish connections with its former peer network. If none of the former peers respond to its connection request, the node can use the seed nodes to bootstrap again. +A node must connect to a few different peers in order to establish diverse paths into the bitcoin network. Paths are not persistent —nodes come and go—and so the node must continue to discover new nodes as it loses old connections as well as assist other nodes when they bootstrap. Only one connection is needed to bootstrap, because the first node can offer introductions to its peer nodes and those peers can offer further introductions. It's also unnecessary and wasteful of network resources to connect to more than a handful of nodes. After bootstrapping, a node will remember its most recent successful peer connections, so that if it is rebooted it can quickly reestablish connections with its former peer network. If none of the former peers respond to its connection request, the node can use the seed nodes to bootstrap again. On a node running the Bitcoin Core client, you can list the peer connections with the command +getpeerinfo+: From c8c2a1e5f478503769504dbd0b04443e080fd02f Mon Sep 17 00:00:00 2001 From: pphili Date: Mon, 17 Jun 2019 16:44:58 -0400 Subject: [PATCH 48/56] fix typo --- ch10.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch10.asciidoc b/ch10.asciidoc index d166a172..b314586e 100644 --- a/ch10.asciidoc +++ b/ch10.asciidoc @@ -494,7 +494,7 @@ To make a challenge out of this algorithm, let's set a target: find a phrase tha To give a simple analogy, imagine a game where players throw a pair of dice repeatedly, trying to throw less than a specified target. In the first round, the target is 12. Unless you throw double-six, you win. In the next round the target is 11. Players must throw 10 or less to win, again an easy task. Let's say a few rounds later the target is down to 5. Now, more than half the dice throws will exceed the target and therefore be invalid. It takes exponentially more dice throws to win, the lower the target gets. Eventually, when the target is 2 (the minimum possible), only one throw out of every 36, or 2% of them, will produce a winning result. -From the perspective of an observer who knows that the target of the dice game is 2, if someone has succeeded in casting a winning throw it can be assumed that they attempted, on average, 36 throws. In other words, one can estimate the amount of work it takes to succeed from the difficulty imposed by the target. When the algorithm is a based on a deterministic function such as SHA256, the input itself constitutes _proof_ that a certain amount of _work_ was done to produce a result below the target. Hence, _Proof-of-Work_. +From the perspective of an observer who knows that the target of the dice game is 2, if someone has succeeded in casting a winning throw it can be assumed that they attempted, on average, 36 throws. In other words, one can estimate the amount of work it takes to succeed from the difficulty imposed by the target. When the algorithm is based on a deterministic function such as SHA256, the input itself constitutes _proof_ that a certain amount of _work_ was done to produce a result below the target. Hence, _Proof-of-Work_. [TIP] ==== From e596e02229fd6cd968a432b4d42d44a7f8aa320c Mon Sep 17 00:00:00 2001 From: mikong <4162+mikong@users.noreply.github.com> Date: Sun, 25 Aug 2019 21:55:50 +0800 Subject: [PATCH 49/56] Update domain for bitcoinfees website in ch06 --- ch06.asciidoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index e0087270..790bfe73 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -304,29 +304,29 @@ Over time, the way transaction fees are calculated and the effect they have on t Fee estimation algorithms calculate the appropriate fee, based on capacity and the fees offered by "competing" transactions. These algorithms range from simplistic (average or median fee in the last block) to sophisticated (statistical analysis). They estimate the necessary fee (in satoshis per byte) that will give a transaction a high probability of being selected and included within a certain number of blocks. Most services offer users the option of choosing high, medium, or low priority fees. High priority means users pay higher fees but the transaction is likely to be included in the next block. Medium and low priority means users pay lower transaction fees but the transactions may take much longer to confirm. -((("bitcoinfees (third-party service)")))Many wallet applications use third-party services for fee calculations. One popular service is https://bitcoinfees.21.co/[_https://bitcoinfees.21.co/_], which provides an API and a visual chart showing the fee in satoshi/byte for different priorities. +((("bitcoinfees (third-party service)")))Many wallet applications use third-party services for fee calculations. One popular service is https://bitcoinfees.earn.com/[_https://bitcoinfees.earn.com/_], which provides an API and a visual chart showing the fee in satoshi/byte for different priorities. [TIP] ==== ((("static fees")))((("fees", "static fees")))Static fees are no longer viable on the bitcoin network. Wallets that set static fees will produce a poor user experience as transactions will often get "stuck" and remain unconfirmed. Users who don't understand bitcoin transactions and fees are dismayed by "stuck" transactions because they think they've lost their money. ==== -The chart in <> shows the real-time estimate of fees in 10 satoshi/byte increments and the expected confirmation time (in minutes and number of blocks) for transactions with fees in each range. For each fee range (e.g., 61–70 satoshi/byte), two horizontal bars show the number of unconfirmed transactions (1405) and total number of transactions in the past 24 hours (102,975), with fees in that range. Based on the graph, the recommended high-priority fee at this time was 80 satoshi/byte, a fee likely to result in the transaction being mined in the very next block (zero block delay). For perspective, the median transaction size is 226 bytes, so the recommended fee for a transaction size would be 18,080 satoshis (0.00018080 BTC). +The chart in <> shows the real-time estimate of fees in 10 satoshi/byte increments and the expected confirmation time (in minutes and number of blocks) for transactions with fees in each range. For each fee range (e.g., 61–70 satoshi/byte), two horizontal bars show the number of unconfirmed transactions (1405) and total number of transactions in the past 24 hours (102,975), with fees in that range. Based on the graph, the recommended high-priority fee at this time was 80 satoshi/byte, a fee likely to result in the transaction being mined in the very next block (zero block delay). For perspective, the median transaction size is 226 bytes, so the recommended fee for a transaction size would be 18,080 satoshis (0.00018080 BTC). -The fee estimation data can be retrieved via a simple HTTP REST API, at https://bitcoinfees.21.co/api/v1/fees/recommended[https://bitcoinfees.21.co/api/v1/fees/recommended]. For example, on the command line using the +curl+ command: +The fee estimation data can be retrieved via a simple HTTP REST API, at https://bitcoinfees.earn.com/api/v1/fees/recommended[https://bitcoinfees.earn.com/api/v1/fees/recommended]. For example, on the command line using the +curl+ command: .Using the fee estimation API ---- -$ curl https://bitcoinfees.21.co/api/v1/fees/recommended +$ curl https://bitcoinfees.earn.com/api/v1/fees/recommended {"fastestFee":80,"halfHourFee":80,"hourFee":60} ---- The API returns a JSON object with the current fee estimate for fastest confirmation (+fastestFee+), confirmation within three blocks (+halfHourFee+) and six blocks (+hourFee+), in satoshi per byte. -[[bitcoinfees21co]] -.Fee estimation service bitcoinfees.21.co -image::images/mbc2_0602.png[Fee Estimation Service bitcoinfees.21.co] +[[bitcoinfeesearncom]] +.Fee estimation service bitcoinfees.earn.com +image::images/mbc2_0602.png[Fee Estimation Service bitcoinfees.earn.com] ==== Adding Fees to Transactions From fed7506d883dbbdb1993c5c84b2dbd56840fc7d0 Mon Sep 17 00:00:00 2001 From: practicalswift Date: Tue, 27 Aug 2019 12:31:52 +0000 Subject: [PATCH 50/56] Fix typos --- appdx-bitcore.asciidoc | 2 +- appdx-pycoin.asciidoc | 2 +- ch07.asciidoc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/appdx-bitcore.asciidoc b/appdx-bitcore.asciidoc index d2f22015..b187c388 100644 --- a/appdx-bitcore.asciidoc +++ b/appdx-bitcore.asciidoc @@ -23,7 +23,7 @@ === Bitcore Library Examples -==== Prerequisities +==== Prerequisites * NodeJS >= 4.x or use our https://bitcore.io/playground[hosted online playground] diff --git a/appdx-pycoin.asciidoc b/appdx-pycoin.asciidoc index f4c1fbee..9d877000 100644 --- a/appdx-pycoin.asciidoc +++ b/appdx-pycoin.asciidoc @@ -388,7 +388,7 @@ The final line appears because to validate the transactions' signatures, you tec ---- $ tx -a 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a 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 propagate Version: 1 tx hash 49d2adb6e476fa46d8357babf78b1b501fd39e177ac7833124b3f67b17c40c2a 159 bytes TxIn count: 1; TxOut count: 1 Lock time: 0 (valid anytime) diff --git a/ch07.asciidoc b/ch07.asciidoc index 04483909..f207b749 100644 --- a/ch07.asciidoc +++ b/ch07.asciidoc @@ -948,7 +948,7 @@ The native segwit address format is defined in BIP-173: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki[BIP-173]:: Base32 address format for native v0-16 witness outputs -BIP-173 only encodes witness (P2WPKH and P2WSH) scripts. It is not compatible with non-segwit P2PKH or P2SH scripts. BIP-173 is a checksummed Base32 encoding, as compared to the Base58 encoding of a "traditional" bitcoin address. BIP-173 addesses are also called _bech32_ addresses, pronounced "beh-ch thirty two", alluding to the use of a "BCH" error detection algorithm and 32-character encoding set. +BIP-173 only encodes witness (P2WPKH and P2WSH) scripts. It is not compatible with non-segwit P2PKH or P2SH scripts. BIP-173 is a checksummed Base32 encoding, as compared to the Base58 encoding of a "traditional" bitcoin address. BIP-173 addresses are also called _bech32_ addresses, pronounced "beh-ch thirty two", alluding to the use of a "BCH" error detection algorithm and 32-character encoding set. BIP-173 addresses use 32 lower-case-only alphanumeric character set, carefully selected to reduce errors from misreading or mistyping. By choosing a lower-case-only character set, bech32 is easier to read, speak, and 45% more efficient to encode in QR codes. From 0a10c34e906ca63b56b9262daf93509814ae0117 Mon Sep 17 00:00:00 2001 From: Dan Raviv Date: Fri, 6 Sep 2019 08:26:53 +0300 Subject: [PATCH 51/56] Note should be a warning --- ch04.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch04.asciidoc b/ch04.asciidoc index 3b1b60de..a457ff2d 100644 --- a/ch04.asciidoc +++ b/ch04.asciidoc @@ -594,7 +594,7 @@ include::code/ec-math.py[] <> shows the output produced by running this script. -[NOTE] +[WARNING] ==== <> ((("random numbers", "os.urandom", see="entropy")))((("entropy", "os.urandom", see="random numbers")))((("random numbers", "random number generation")))((("entropy", "random number generation")))uses +os.urandom+, which reflects a cryptographically secure random number generator (CSRNG) provided by the underlying operating system. Caution: Depending on the OS, +os.urandom+ may _not_ be implemented with sufficient security or seeded properly and may _not_ be appropriate for generating production-quality bitcoin keys.((("", startref="KApython04"))) ==== From 9ba567c74b280722161eb136c1766450a325f108 Mon Sep 17 00:00:00 2001 From: Dan Raviv Date: Fri, 6 Sep 2019 08:34:21 +0300 Subject: [PATCH 52/56] Change parameter block->blocks in description to match code The example gets the `blocks` parameter. The preceding description says it takes the `block` parameter. This seems to be a typo. --- ch03.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch03.asciidoc b/ch03.asciidoc index 31e01a2a..e13e810d 100644 --- a/ch03.asciidoc +++ b/ch03.asciidoc @@ -690,7 +690,7 @@ If you're implementing a JSON-RPC call in your own program, you can use a generi 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 <> makes a simple +getblockchaininfo+ call and prints the +block+ parameter from the data returned by Bitcoin Core. +The Python script in <> makes a simple +getblockchaininfo+ call and prints the +blocks+ parameter from the data returned by Bitcoin Core. [[rpc_example]] .Running getblockchaininfo via Bitcoin Core's JSON-RPC API From d43744cd4c3d702d834fabdd60aadeef95ed4dbd Mon Sep 17 00:00:00 2001 From: Dan Raviv Date: Fri, 6 Sep 2019 15:48:29 +0300 Subject: [PATCH 53/56] Clarify warning in ch4 --- ch04.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch04.asciidoc b/ch04.asciidoc index 3b1b60de..db56946f 100644 --- a/ch04.asciidoc +++ b/ch04.asciidoc @@ -816,7 +816,7 @@ image::images/mbc2_0409.png[] [WARNING] ==== -Although you can deposit funds into a paper wallet several times, you should withdraw all funds only once, spending everything. This is because in the process of unlocking and spending funds some wallets might generate a change address if you spend less than the whole amount. Additionally, if the computer you use to sign the transaction is compromised, you risk exposing the private key. By spending the entire balance of a paper wallet only once, you reduce the risk of key compromise. If you need only a small amount, send any remaining funds to a new paper wallet in the same transaction. +Although you can deposit funds into a paper wallet several times, you should withdraw all funds only once, spending everything. This is because in the process of unlocking and spending funds some wallets might generate a change address if you spend less than the whole amount. If the computer you use to sign the transaction is then compromised, you risk exposing the private key, giving access to the funds in the change address. By spending the entire balance of a paper wallet only once, you reduce the risk of key compromise. If you need only a small amount, send any remaining funds to a new paper wallet in the same transaction. ==== Paper wallets come in many designs and sizes, with many different features. Some are intended to be given as gifts and have seasonal themes, such as Christmas and New Year's themes. Others are designed for storage in a bank vault or safe with the private key hidden in some way, either with opaque scratch-off stickers, or folded and sealed with tamper-proof adhesive foil. Figures pass:[#paper_wallet_bpw] through pass:[#paper_wallet_spw] show various examples of paper wallets with security and backup features. From 57a1cb9c8521a12d3ef5595f6dbf8035bed88d28 Mon Sep 17 00:00:00 2001 From: Dan Raviv Date: Sat, 7 Sep 2019 04:25:01 +0300 Subject: [PATCH 54/56] ch5 - Fix intro to seed generation examples Intro indicates all the examples are without any passphrase, even though one of the examples is with a passphrase. --- ch05.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch05.asciidoc b/ch05.asciidoc index 7ed43452..bcbf1899 100644 --- a/ch05.asciidoc +++ b/ch05.asciidoc @@ -222,7 +222,7 @@ image::images/mbc2_0507.png["From mnemonic to seed"] The key-stretching function, with its 2048 rounds of hashing, is a very effective protection against brute-force attacks against the mnemonic or the passphrase. It makes it extremely costly (in computation) to try more than a few thousand passphrase and mnemonic combinations, while the number of possible derived seeds is vast (2^512^). ==== -Tables pass:[#mnemonic_128_no_pass], pass:[#mnemonic_128_w_pass], and pass:[#mnemonic_256_no_pass] show some examples of mnemonic codes and the seeds they produce (without any passphrase). +Tables pass:[#mnemonic_128_no_pass], pass:[#mnemonic_128_w_pass], and pass:[#mnemonic_256_no_pass] show some examples of mnemonic codes and the seeds they produce (either with or without a passphrase). [[mnemonic_128_no_pass]] .128-bit entropy mnemonic code, no passphrase, resulting seed From 302a95857c9619385e50cec62713a802368d8248 Mon Sep 17 00:00:00 2001 From: Dan Raviv Date: Sat, 7 Sep 2019 19:14:42 +0300 Subject: [PATCH 55/56] [ch6] Use n instead of p for group order of EC This is to match existing common conventions. By convention, n, not p, is used to indicate the prime group order of the EC. This is currently extra confusing because p *is* (by convention) used to indicate the order of the EC's finite field. References: https://github.com/bitcoin-core/secp256k1/blob/master/src/ecdsa_impl.h http://www.secg.org/sec2-v2.pdf https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm --- ch06.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index e0087270..f4dcbea8 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -650,7 +650,7 @@ The temporary key pair is based on a random number _k_, which is used as the tem From there, the algorithm calculates the _S_ value of the signature, such that: -_S_ = __k__^-1^ (__Hash__(__m__) + __dA__ * __R__) _mod p_ +_S_ = __k__^-1^ (__Hash__(__m__) + __dA__ * __R__) _mod n_ where: @@ -658,7 +658,7 @@ where: * _R_ is the x coordinate of the ephemeral public key * _dA_ is the signing private key * _m_ is the transaction data -* _p_ is the prime order of the elliptic curve +* _n_ is the prime order of the elliptic curve Verification is the inverse of the signature generation function, using the _R_, _S_ values and the public key to calculate a value _P_, which is a point on the elliptic curve (the ephemeral public key used in signature creation): From e1290e42d60875aaaaf6704c3adc4af23117fd47 Mon Sep 17 00:00:00 2001 From: Will Binns Date: Fri, 4 Oct 2019 10:46:08 +0200 Subject: [PATCH 56/56] ch08: Remove space preceding hyphen --- ch08.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch08.asciidoc b/ch08.asciidoc index 074e0e7f..5a7fea36 100644 --- a/ch08.asciidoc +++ b/ch08.asciidoc @@ -93,7 +93,7 @@ Once one or more connections are established, the new node will send an +addr+ m .Address propagation and discovery image::images/mbc2_0805.png["AddressPropagation"] -A node must connect to a few different peers in order to establish diverse paths into the bitcoin network. Paths are not persistent —nodes come and go—and so the node must continue to discover new nodes as it loses old connections as well as assist other nodes when they bootstrap. Only one connection is needed to bootstrap, because the first node can offer introductions to its peer nodes and those peers can offer further introductions. It's also unnecessary and wasteful of network resources to connect to more than a handful of nodes. After bootstrapping, a node will remember its most recent successful peer connections, so that if it is rebooted it can quickly reestablish connections with its former peer network. If none of the former peers respond to its connection request, the node can use the seed nodes to bootstrap again. +A node must connect to a few different peers in order to establish diverse paths into the bitcoin network. Paths are not persistent—nodes come and go—and so the node must continue to discover new nodes as it loses old connections as well as assist other nodes when they bootstrap. Only one connection is needed to bootstrap, because the first node can offer introductions to its peer nodes and those peers can offer further introductions. It's also unnecessary and wasteful of network resources to connect to more than a handful of nodes. After bootstrapping, a node will remember its most recent successful peer connections, so that if it is rebooted it can quickly reestablish connections with its former peer network. If none of the former peers respond to its connection request, the node can use the seed nodes to bootstrap again. On a node running the Bitcoin Core client, you can list the peer connections with the command +getpeerinfo+: