1
0
mirror of https://github.com/bitcoinbook/bitcoinbook synced 2024-11-21 15:48:09 +00:00

removing 2e index tags

This commit is contained in:
theresa jones 2023-09-08 18:47:20 -07:00
parent 02f8c485c1
commit 140ba650e8
17 changed files with 320 additions and 320 deletions

View File

@ -14,7 +14,7 @@ routed payment channels (Lightning Network).
=== Building Blocks (Primitives) === Building Blocks (Primitives)
((("blockchain applications", "building blocks for ((("blockchain applications", "building blocks for
(primitives)")))((("primitives")))When operating correctly and over the (primitives)")))When operating correctly and over the
long term, the Bitcoin system offers certain guarantees, which can be long term, the Bitcoin system offers certain guarantees, which can be
used as building blocks to create applications. These include: used as building blocks to create applications. These include:
@ -107,13 +107,13 @@ new feature introduced into Bitcoin.
=== Applications from Building Blocks === Applications from Building Blocks
((("blockchain applications", "examples of")))The building blocks The building blocks
offered by Bitcoin are elements of a trust platform that can be used to offered by Bitcoin are elements of a trust platform that can be used to
compose applications. Here are some examples of applications that exist compose applications. Here are some examples of applications that exist
today and the building blocks they use: today and the building blocks they use:
Proof-of-Existence (Digital Notary):: ((("digital notary Proof-of-Existence (Digital Notary):: ((("digital notary
services")))((("Proof of Existence")))Immutability + Timestamp + Durability. services")))Immutability + Timestamp + Durability.
A transaction on the blockchain can commit to a value, A transaction on the blockchain can commit to a value,
proving that a piece of data existed at the time proving that a piece of data existed at the time
it was recorded (Timestamp). The commitment cannot be modified ex-post-facto it was recorded (Timestamp). The commitment cannot be modified ex-post-facto
@ -136,17 +136,17 @@ Double-Spend) the settlement on a shorter timelock (Timelock).
=== Colored Coins === Colored Coins
((("blockchain applications", "colored coins", ((("blockchain applications", "colored coins",
id="BCAcoins12")))((("colored coins", id="color12")))The first id="BCAcoins12")))The first
blockchain application we will discuss is _colored coins_. blockchain application we will discuss is _colored coins_.
((("extrinsic asset management")))Colored coins refers to a set of Colored coins refers to a set of
similar technologies that use Bitcoin transactions to record the similar technologies that use Bitcoin transactions to record the
creation, ownership, and transfer of extrinsic assets other than creation, ownership, and transfer of extrinsic assets other than
bitcoin. By "extrinsic" we mean assets that are not stored directly on bitcoin. By "extrinsic" we mean assets that are not stored directly on
the bitcoin blockchain, as opposed to bitcoin itself, which is an asset the bitcoin blockchain, as opposed to bitcoin itself, which is an asset
intrinsic to the blockchain. intrinsic to the blockchain.
((("digital asset management")))Colored coins are used to track digital Colored coins are used to track digital
assets as well as physical assets held by third parties and traded assets as well as physical assets held by third parties and traded
through colored coins certificates of ownership. Digital asset colored through colored coins certificates of ownership. Digital asset colored
coins can represent intangible assets such as a stock certificate, coins can represent intangible assets such as a stock certificate,
@ -155,7 +155,7 @@ intellectual property (trademarks, copyrights, etc.). Tangible asset
colored coins can represent certificates of ownership of commodities colored coins can represent certificates of ownership of commodities
(gold, silver, oil), land title, automobiles, boats, aircraft, etc. (gold, silver, oil), land title, automobiles, boats, aircraft, etc.
((("Enhanced Padded-Order-Based Coloring (EPOBC)")))The term derives The term derives
from the idea of "coloring" or marking a nominal amount of bitcoin, for from the idea of "coloring" or marking a nominal amount of bitcoin, for
example, a single satoshi, to represent something other than the bitcoin example, a single satoshi, to represent something other than the bitcoin
amount itself. As an analogy, consider stamping a $1 note with a message amount itself. As an analogy, consider stamping a $1 note with a message
@ -379,7 +379,7 @@ underlying data transport mechanism is not the channel. We use the term
channel to represent the relationship and shared state between two channel to represent the relationship and shared state between two
parties, outside of the blockchain. parties, outside of the blockchain.
((("payment (state) channels", "concept of")))To further explain this To further explain this
concept, think of a TCP stream. From the perspective of higher-level concept, think of a TCP stream. From the perspective of higher-level
protocols it is a "socket" connecting two applications across the protocols it is a "socket" connecting two applications across the
internet. But if you look at the network traffic, a TCP stream is just a internet. But if you look at the network traffic, a TCP stream is just a
@ -406,7 +406,7 @@ the state being altered is the balance of a virtual currency.
==== State Channels—Basic Concepts and Terminology ==== State Channels—Basic Concepts and Terminology
((("payment (state) channels", "terminology")))A state channel is A state channel is
established between two parties, through a transaction that locks a established between two parties, through a transaction that locks a
shared state on the blockchain. This is called the _funding transaction_. shared state on the blockchain. This is called the _funding transaction_.
This single transaction must be transmitted to This single transaction must be transmitted to
@ -453,7 +453,7 @@ image::images/mbc2_1204.png["A payment channel between Bob and Alice, showing th
==== Simple Payment Channel Example ==== Simple Payment Channel Example
((("payment (state) channels", "example of", id="PSCexample12")))To To
explain state channels, we start with a very simple example. We explain state channels, we start with a very simple example. We
demonstrate a one-way channel, meaning that value is flowing in one demonstrate a one-way channel, meaning that value is flowing in one
direction only. We will also start with the naive assumption that no one direction only. We will also start with the naive assumption that no one
@ -547,7 +547,7 @@ the commitment transactions that update the balance of the channel.
In the end, only two transactions are recorded on the blockchain: the In the end, only two transactions are recorded on the blockchain: the
funding transaction that established the channel and a settlement funding transaction that established the channel and a settlement
transaction that allocated the final balance correctly between the two transaction that allocated the final balance correctly between the two
participants.((("", startref="PSCexample12"))) participants.
[[video_payment_channel]] [[video_payment_channel]]
.Emma's payment channel with Fabian, showing the commitment transactions that update the balance of the channel .Emma's payment channel with Fabian, showing the commitment transactions that update the balance of the channel
@ -698,7 +698,7 @@ settlement transaction they can close the channel and redeem their
balance immediately. Worst case, one of the parties can be petty, refuse balance immediately. Worst case, one of the parties can be petty, refuse
to cooperate, and force the other party to do a unilateral close with to cooperate, and force the other party to do a unilateral close with
the most recent commitment transaction. But if they do that, they have the most recent commitment transaction. But if they do that, they have
to wait for their funds too.((("", startref="PSCtrust12"))) to wait for their funds too.
==== Asymmetric Revocable Commitments ==== Asymmetric Revocable Commitments
@ -922,7 +922,7 @@ channel.
==== Hash Time Lock Contracts (HTLC) ==== Hash Time Lock Contracts (HTLC)
((("Hash Time Lock Contracts (HTLC)")))((("payment (state) channels", ((("payment (state) channels",
"Hash Time Lock Contracts (HTLC)")))Payment channels can be further "Hash Time Lock Contracts (HTLC)")))Payment channels can be further
extended with a special type of smart contract that allows the extended with a special type of smart contract that allows the
participants to commit funds to a redeemable secret, with an expiration participants to commit funds to a redeemable secret, with an expiration
@ -973,7 +973,7 @@ redeemed by _anyone_ who has the secret +R+. An HTLC can take many
different forms with slight variations to the script. For example, different forms with slight variations to the script. For example,
adding a +CHECKSIG+ operator and a public key in the first clause adding a +CHECKSIG+ operator and a public key in the first clause
restricts redemption of the hash to a particular recipient, who must also restricts redemption of the hash to a particular recipient, who must also
know the secret +R+.((("", startref="BCApayment12"))) know the secret +R+.
[[lightning_network]] [[lightning_network]]
=== Routed Payment Channels (Lightning Network) === Routed Payment Channels (Lightning Network)
@ -998,7 +998,7 @@ https://github.com/lightning/bolts/blob/master/00-introduction.md[_Basics of Lig
==== Basic Lightning Network Example ==== Basic Lightning Network Example
((("Lightning Network", "basic example")))Let's see how this works. Let's see how this works.
In this example, we have five participants: Alice, Bob, Carol, Diana, In this example, we have five participants: Alice, Bob, Carol, Diana,
and Eric. These five participants have opened payment channels with each and Eric. These five participants have opened payment channels with each
@ -1114,7 +1114,7 @@ refund if the channel was closed or the routed payment failed.
==== Lightning Network Transport and Pathfinding ==== Lightning Network Transport and Pathfinding
((("Lightning Network", "transport and pathfinding")))All communications All communications
between LN nodes are encrypted point-to-point. In addition, nodes have a between LN nodes are encrypted point-to-point. In addition, nodes have a
long-term public key that they use as an long-term public key that they use as an
identifier and to authenticate each other. identifier and to authenticate each other.
@ -1204,7 +1204,7 @@ hops to go.
==== Lightning Network Benefits ==== Lightning Network Benefits
((("Lightning Network", "benefits of")))A Lightning Network is a A Lightning Network is a
second-layer routing technology. It can be applied to any blockchain second-layer routing technology. It can be applied to any blockchain
that supports some basic capabilities, such as multisignature that supports some basic capabilities, such as multisignature
transactions, timelocks, and basic smart contracts. transactions, timelocks, and basic smart contracts.

View File

@ -37,7 +37,7 @@ Script is a very simple language. It requires minimal processing and
cannot easily do many of the fancy things modern programming languages cannot easily do many of the fancy things modern programming languages
can do. can do.
((("Pay-to-Public-Key-Hash (P2PKH)")))When legacy transactions were the When legacy transactions were the
most commonly used type of transaction, the majority of transactions processed most commonly used type of transaction, the majority of transactions processed
through the Bitcoin network had the form "Payment to Bob's Bitcoin through the Bitcoin network had the form "Payment to Bob's Bitcoin
address" and used a script called a Pay-to-Public-Key-Hash script. address" and used a script called a Pay-to-Public-Key-Hash script.
@ -53,7 +53,7 @@ conditions for spending and how those conditions can be satisfied.
[TIP] [TIP]
==== ====
((("programmable money")))Bitcoin transaction validation is not based on Bitcoin transaction validation is not based on
a static pattern, but instead is achieved through the execution of a a static pattern, but instead is achieved through the execution of a
scripting language. This language allows for a nearly infinite variety scripting language. This language allows for a nearly infinite variety
of conditions to be expressed. of conditions to be expressed.
@ -61,14 +61,14 @@ of conditions to be expressed.
==== Turing Incompleteness ==== Turing Incompleteness
((("Turing incompleteness")))The Bitcoin transaction script language The Bitcoin transaction script language
contains many operators, but is deliberately limited in one important contains many operators, but is deliberately limited in one important
way--there are no loops or complex flow control capabilities other than way--there are no loops or complex flow control capabilities other than
conditional flow control. This ensures that the language is not _Turing conditional flow control. This ensures that the language is not _Turing
Complete_, meaning that scripts have limited complexity and predictable Complete_, meaning that scripts have limited complexity and predictable
execution times. Script is not a general-purpose language. execution times. Script is not a general-purpose language.
((("denial-of-service attacks")))((("denial-of-service attacks", ((("denial-of-service attacks",
see="also security")))((("security", "denial-of-service attacks")))These see="also security")))These
limitations ensure that the language cannot be used to create an limitations ensure that the language cannot be used to create an
infinite loop or other form of "logic bomb" that could be embedded in a infinite loop or other form of "logic bomb" that could be embedded in a
transaction in a way that causes a denial-of-service attack against the transaction in a way that causes a denial-of-service attack against the
@ -78,7 +78,7 @@ validation mechanism from being used as a vulnerability.
==== Stateless Verification ==== Stateless Verification
((("stateless verification")))The Bitcoin transaction script language is The Bitcoin transaction script language is
stateless, in that there is no state prior to execution of the script, stateless, in that there is no state prior to execution of the script,
or state saved after execution of the script. All the or state saved after execution of the script. All the
information needed to execute a script is contained within the script information needed to execute a script is contained within the script
@ -205,7 +205,7 @@ to know that the number 2 satisfies the script.
[TIP] [TIP]
==== ====
((("transactions", "valid and invalid")))Transactions are valid if the Transactions are valid if the
top result on the stack is +TRUE+, which is any top result on the stack is +TRUE+, which is any
non-zero value. non-zero value.
Transactions are invalid if the top value on the stack is +FALSE+ (the Transactions are invalid if the top value on the stack is +FALSE+ (the
@ -261,7 +261,7 @@ failed to satisfy the spending conditions placed on the output.
[[p2pkh]] [[p2pkh]]
==== Pay-to-Public-Key-Hash (P2PKH) ==== Pay-to-Public-Key-Hash (P2PKH)
((("Pay-to-Public-Key-Hash (P2PKH)")))
A Pay-to-Public-Key-Hash or "P2PKH" script uses an output script that A Pay-to-Public-Key-Hash or "P2PKH" script uses an output script that
contains a hash which commits to a public key. P2PKH is best known as contains a hash which commits to a public key. P2PKH is best known as
the basis for a legacy Bitcoin address. A P2PKH output can be spent by the basis for a legacy Bitcoin address. A P2PKH output can be spent by
@ -301,7 +301,7 @@ data-xrefstyle="select: labelnumber">#P2PubKHash1</a>] and pass:[<a
data-type="xref" href="#P2PubKHash2" data-xrefstyle="select: data-type="xref" href="#P2PubKHash2" data-xrefstyle="select:
labelnumber">#P2PubKHash2</a>] show (in two parts) a step-by-step labelnumber">#P2PubKHash2</a>] show (in two parts) a step-by-step
execution of the combined script, which will prove this is a valid execution of the combined script, which will prove this is a valid
transaction.((("", startref="Tsript06")))((("", transaction.((("",
startref="Stransact06"))) startref="Stransact06")))
[[P2PubKHash1]] [[P2PubKHash1]]
@ -316,7 +316,7 @@ image::images/mbc2_0606.png["Tx_Script_P2PubKeyHash_2"]
=== Scripted multisignatures === Scripted multisignatures
((("transactions", "advanced", "multisignature ((("transactions", "advanced", "multisignature
scripts")))((("transactions", "advanced", id="Tadv07")))((("scripting", scripts")))((("scripting",
"multisignature scripts", id="Smulti07")))((("multisignature "multisignature scripts", id="Smulti07")))((("multisignature
scripts")))Multisignature scripts set a condition where _k_ public keys scripts")))Multisignature scripts set a condition where _k_ public keys
are recorded in the script and at least _t_ of those must provide are recorded in the script and at least _t_ of those must provide
@ -389,7 +389,7 @@ script may include multiple of those opcodes.
==== An oddity in CHECKMULTISIG execution ==== An oddity in CHECKMULTISIG execution
((("scripting", "multisignature scripts", "OP_CHECKMULTISIG ((("scripting", "multisignature scripts", "OP_CHECKMULTISIG
oddity")))((("OP_CHECKMULTISIG oddity workaround")))There is an oddity in oddity")))There is an oddity in
++OP_CHECKMULTISIG++'s execution that requires a slight workaround. When ++OP_CHECKMULTISIG++'s execution that requires a slight workaround. When
+OP_CHECKMULTISIG+ executes, it should consume t+k+2 items on the stack as +OP_CHECKMULTISIG+ executes, it should consume t+k+2 items on the stack as
parameters. However, due to the oddity, +OP_CHECKMULTISIG+ will pop an extra parameters. However, due to the oddity, +OP_CHECKMULTISIG+ will pop an extra
@ -476,13 +476,13 @@ startref="Smulti07")))
[[p2sh]] [[p2sh]]
=== Pay-to-Script-Hash (P2SH) === Pay-to-Script-Hash (P2SH)
((("transactions", "advanced", "Pay-to-Script-Hash")))((("scripting", ((("scripting",
"Pay-to-Script-Hash", id="Spay07")))Pay-to-Script-Hash (P2SH) was "Pay-to-Script-Hash", id="Spay07")))Pay-to-Script-Hash (P2SH) was
introduced in 2012 as a powerful new type of operation that greatly introduced in 2012 as a powerful new type of operation that greatly
simplifies the use of complex scripts. To explain the need simplifies the use of complex scripts. To explain the need
for P2SH, let's look at a practical example. for P2SH, let's look at a practical example.
((("use cases", "import/export", id="mohamseven")))((("scripting", ((("scripting",
"Pay-to-Script-Hash", "import/export example")))((("Pay-to-Script-Hash "Pay-to-Script-Hash", "import/export example")))((("Pay-to-Script-Hash
(P2SH)", "import/export example"))) (P2SH)", "import/export example")))
Mohammed is an electronics importer based in Dubai. Mohammed's Mohammed is an electronics importer based in Dubai. Mohammed's
@ -525,7 +525,7 @@ matches the commitment in addition to the data which satisfies the script. In si
P2SH means "pay to a script matching this hash, a script that will be P2SH means "pay to a script matching this hash, a script that will be
presented later when this output is spent." presented later when this output is spent."
((("redeem scripts")))((("scripting", "redeem scripts")))In P2SH In P2SH
transactions, the script that is replaced by a hash is referred transactions, the script that is replaced by a hash is referred
to as the _redeem script_ because it is presented to the system at to as the _redeem script_ because it is presented to the system at
redemption time rather than as an output script. <<without_p2sh>> shows redemption time rather than as an output script. <<without_p2sh>> shows
@ -618,7 +618,7 @@ If the redeem script hash matches, the redeem script is executed:
==== P2SH Addresses ==== P2SH Addresses
((("scripting", "Pay-to-Script-Hash", ((("scripting", "Pay-to-Script-Hash",
"addresses")))((("Pay-to-Script-Hash (P2SH)", "addresses")))((("bitcoin "addresses")))((("bitcoin
improvement proposals", "Address Format for P2SH (BIP13)")))Another improvement proposals", "Address Format for P2SH (BIP13)")))Another
important part of the P2SH feature is the ability to encode a script important part of the P2SH feature is the ability to encode a script
hash as an address, as defined in BIP13. P2SH addresses are Base58Check hash as an address, as defined in BIP13. P2SH addresses are Base58Check
@ -643,7 +643,7 @@ payment does not see the script.
==== Benefits of P2SH ==== Benefits of P2SH
((("scripting", "Pay-to-Script-Hash", "benefits ((("scripting", "Pay-to-Script-Hash", "benefits
of")))((("Pay-to-Script-Hash (P2SH)", "benefits of")))The P2SH feature of")))The P2SH feature
offers the following benefits compared to the direct use of complex offers the following benefits compared to the direct use of complex
scripts in outputs: scripts in outputs:
@ -679,7 +679,7 @@ risk, because you can send bitcoin to a P2SH address that cannot be spent later.
[WARNING] [WARNING]
==== ====
((("warnings and cautions", "accidental bitcoin invalidation")))P2SH output scripts P2SH output scripts
contain the hash of a redeem script, which gives no clues as to contain the hash of a redeem script, which gives no clues as to
the content of the redeem script. The P2SH output will be the content of the redeem script. The P2SH output will be
considered valid and accepted even if the redeem script is invalid. You considered valid and accepted even if the redeem script is invalid. You
@ -690,10 +690,10 @@ spent.
[[op_return]] [[op_return]]
=== Data Recording Output (OP_RETURN) === Data Recording Output (OP_RETURN)
((("transactions", "advanced", "data recording output")))((("scripting", ((("scripting",
"data recording output")))((("OP_RETURN operator")))((("data recording "data recording output")))((("data recording
(nonpayment data)")))((("nonpayment data")))((("blockchain (the)", (nonpayment data)")))((("blockchain (the)",
"nonpayment data recording")))((("digital notary services")))Bitcoin's "nonpayment data recording")))Bitcoin's
distributed and timestamped blockchain has potential uses distributed and timestamped blockchain has potential uses
beyond payments. Many developers have tried to use the transaction beyond payments. Many developers have tried to use the transaction
scripting language to take advantage of the security and resilience of scripting language to take advantage of the security and resilience of
@ -705,8 +705,8 @@ to a file in such a way that anyone could establish
proof-of-existence of that file on a specific date by reference to that proof-of-existence of that file on a specific date by reference to that
transaction. transaction.
((("blockchain bloat")))((("bloat")))((("unspent transaction outputs ((("unspent transaction outputs
(UTXO)")))((("UTXO sets")))The use of Bitcoin's blockchain to store data (UTXO)")))The use of Bitcoin's blockchain to store data
unrelated to Bitcoin payments is a controversial subject. Many unrelated to Bitcoin payments is a controversial subject. Many
people consider such use abusive and want to discourage it. Others people consider such use abusive and want to discourage it. Others
view it as a demonstration of the powerful capabilities of blockchain view it as a demonstration of the powerful capabilities of blockchain
@ -739,7 +739,7 @@ expensive database operations.
OP_RETURN <data> OP_RETURN <data>
---- ----
((("Proof of Existence")))((("DOCPROOF prefix")))The data portion The data portion
often represents a hash, such as the output often represents a hash, such as the output
from the SHA256 algorithm (32 bytes). Some applications put a prefix in from the SHA256 algorithm (32 bytes). Some applications put a prefix in
front of the data to help identify the application. For example, the front of the data to help identify the application. For example, the
@ -769,7 +769,7 @@ being included in a block until a specific block height, but it does not
prevent spending the funds in another transaction earlier than that. prevent spending the funds in another transaction earlier than that.
Let's explain that with the following example. Let's explain that with the following example.
((("use cases", "buying coffee", id="alicesseven")))Alice signs a transaction spending one of her outputs to Bob's address, and sets the transaction lock time to 3 months in the future. Alice sends that transaction to Bob to hold. With this transaction Alice and Bob know that: Alice signs a transaction spending one of her outputs to Bob's address, and sets the transaction lock time to 3 months in the future. Alice sends that transaction to Bob to hold. With this transaction Alice and Bob know that:
* Bob cannot transmit the transaction to redeem the funds until 3 months have elapsed. * Bob cannot transmit the transaction to redeem the funds until 3 months have elapsed.
* Bob may transmit the transaction after 3 months. * Bob may transmit the transaction after 3 months.
@ -783,7 +783,7 @@ It is important to understand the limitations of transaction lock time. The only
==== Check Lock Time Verify (OP_CLTV) ==== Check Lock Time Verify (OP_CLTV)
((("Check Lock Time Verify (OP_CLTV)", id="cltv07")))((("timelocks", "Check ((("timelocks", "Check
Lock Time Verify (OP_CLTV)")))((("scripting", "timelocks", "Check Lock Time Lock Time Verify (OP_CLTV)")))((("scripting", "timelocks", "Check Lock Time
Verify (OP_CLTV)")))((("bitcoin improvement proposals", Verify (OP_CLTV)")))((("bitcoin improvement proposals",
"OP_CHECKLOCKTIMEVERIFY (BIP65)")))In December 2015, a new form of "OP_CHECKLOCKTIMEVERIFY (BIP65)")))In December 2015, a new form of
@ -891,7 +891,7 @@ expired.
By introducing timelock functionality directly into the scripting By introducing timelock functionality directly into the scripting
language, +OP_CLTV+ allows us to develop some very interesting complex language, +OP_CLTV+ allows us to develop some very interesting complex
scripts.((("", startref="cltv07"))) scripts.
The standard is defined in The standard is defined in
https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki[BIP65 https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki[BIP65
@ -902,7 +902,7 @@ https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki[BIP65
Lock time and +OP_CLTV+ are ((("timelocks", "relative timelocks", Lock time and +OP_CLTV+ are ((("timelocks", "relative timelocks",
id="Trelative07")))((("scripting", "timelocks", "relative id="Trelative07")))((("scripting", "timelocks", "relative
timelocks")))((("relative timelocks", id="relativetime07")))both timelocks")))both
_absolute timelocks_ in that they specify an absolute point in time. The _absolute timelocks_ in that they specify an absolute point in time. The
next two timelock features we will examine are _relative timelocks_ in next two timelock features we will examine are _relative timelocks_ in
that they specify, as a condition of spending an output, an elapsed time that they specify, as a condition of spending an output, an elapsed time
@ -938,7 +938,7 @@ the consensus rules.
==== Relative Timelocks with OP_CSV ==== Relative Timelocks with OP_CSV
((("scripting", "timelocks", "relative timelocks with ((("scripting", "timelocks", "relative timelocks with
CHECKSEQUENCEVERIFY")))((("CHECKSEQUENCEVERIFY (CSV)")))Just like OP_CLTV CHECKSEQUENCEVERIFY")))Just like OP_CLTV
and lock time, there is a script opcode for relative timelocks that and lock time, there is a script opcode for relative timelocks that
leverages the sequence value in scripts. That opcode is leverages the sequence value in scripts. That opcode is
+OP_CHECKSEQUENCEVERIFY+, commonly referred to as +OP_CSV+ for short. +OP_CHECKSEQUENCEVERIFY+, commonly referred to as +OP_CSV+ for short.
@ -970,7 +970,7 @@ is, they're kept off the blockchain (_offchain_). A child transaction cannot be
parent transaction has been propagated, mined, and aged by the time parent transaction has been propagated, mined, and aged by the time
specified in the relative timelock. One application of this use case can specified in the relative timelock. One application of this use case can
be seen in <<state_channels>> and <<lightning_network>>.((("", be seen in <<state_channels>> and <<lightning_network>>.((("",
startref="relativetime07")))((("", startref="Trelative07"))) startref="relativetime07")))
+OP_CSV+ is defined in detail in +OP_CSV+ is defined in detail in
https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki[BIP112, https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki[BIP112,
@ -978,9 +978,9 @@ CHECKSEQUENCEVERIFY].
=== Scripts with Flow Control (Conditional Clauses) === Scripts with Flow Control (Conditional Clauses)
((("transactions", "advanced", "flow control scripts")))((("scripting", ((("scripting",
"flow control scripts", id="Sflow07")))((("conditional clauses", "flow control scripts", id="Sflow07")))((("conditional clauses",
id="condition07")))((("flow control", id="flow07")))One of the more id="condition07")))One of the more
powerful features of Bitcoin Script is flow control, also known as powerful features of Bitcoin Script is flow control, also known as
conditional clauses. You are probably familiar with flow control in conditional clauses. You are probably familiar with flow control in
various programming languages that use the construct +IF...THEN...ELSE+. various programming languages that use the construct +IF...THEN...ELSE+.
@ -1041,13 +1041,13 @@ comes _before_ the +IF+ opcode.
==== Conditional Clauses with VERIFY Opcodes ==== Conditional Clauses with VERIFY Opcodes
((("VERIFY opcodes")))((("IF clauses")))((("opcodes", "VERIFY")))Another Another
form of conditional in Bitcoin Script is any opcode that ends in form of conditional in Bitcoin Script is any opcode that ends in
+VERIFY+. The +VERIFY+ suffix means that if the condition evaluated is +VERIFY+. The +VERIFY+ suffix means that if the condition evaluated is
not +TRUE+, execution of the script terminates immediately and the not +TRUE+, execution of the script terminates immediately and the
transaction is deemed invalid. transaction is deemed invalid.
((("guard clauses")))Unlike an +IF+ clause, which offers alternative Unlike an +IF+ clause, which offers alternative
execution paths, the +VERIFY+ suffix acts as a _guard clause_, execution paths, the +VERIFY+ suffix acts as a _guard clause_,
continuing only if a precondition is met. continuing only if a precondition is met.
@ -1104,7 +1104,7 @@ A very common use for flow control in Bitcoin Script is to construct a
script that offers multiple execution paths, each a different way script that offers multiple execution paths, each a different way
of redeeming the UTXO. of redeeming the UTXO.
((("use cases", "buying coffee")))Let's look at a simple example, where Let's look at a simple example, where
we have two signers, Alice and Bob, and either one is able to redeem. we have two signers, Alice and Bob, and either one is able to redeem.
With multisig, this would be expressed as a 1-of-2 multisig script. For With multisig, this would be expressed as a 1-of-2 multisig script. For
the sake of demonstration, we will do the same thing with an +OP_IF+ the sake of demonstration, we will do the same thing with an +OP_IF+
@ -1178,12 +1178,12 @@ Using this construct, we can build redeem scripts with tens or hundreds
of execution paths, each offering a different way to redeem the UTXO. To of execution paths, each offering a different way to redeem the UTXO. To
spend, we construct an input script that navigates the execution spend, we construct an input script that navigates the execution
path by putting the appropriate +TRUE+ and +FALSE+ values on the stack path by putting the appropriate +TRUE+ and +FALSE+ values on the stack
at each flow control point.((("", startref="Sflow07")))((("", at each flow control point.((("",
startref="flow07")))((("", startref="condition07"))) startref="flow07")))
=== Complex Script Example === Complex Script Example
((("transactions", "advanced", "example")))((("scripting", "complex ((("scripting", "complex
script example", id="Scomplex07")))In this section we combine many of script example", id="Scomplex07")))In this section we combine many of
the concepts from this chapter into a single example. the concepts from this chapter into a single example.
@ -1378,7 +1378,7 @@ to the receiver in the manner that the receiver indicated.
[[p2wsh]] [[p2wsh]]
===== Pay-to-Witness-Script-Hash (P2WSH) ===== Pay-to-Witness-Script-Hash (P2WSH)
The ((("use cases", "import/export", id="mohamappd")))second type of The second type of
segwit v0 witness program corresponds to a Pay-to-Script-Hash (P2SH) script. We segwit v0 witness program corresponds to a Pay-to-Script-Hash (P2SH) script. We
saw this type of script in <<p2sh>>. In that example, P2SH was used by saw this type of script in <<p2sh>>. In that example, P2SH was used by
Mohammed's company to express a multisignature script. Payments to Mohammed's company to express a multisignature script. Payments to

View File

@ -2,7 +2,7 @@
[appendix] [appendix]
== Bitcoin Improvement Proposals == Bitcoin Improvement Proposals
((("bitcoin improvement proposals", "types of")))Bitcoin Improvement Proposals are design documents providing information to the Bitcoin community, or for describing a new feature for Bitcoin or its processes or environment. Bitcoin Improvement Proposals are design documents providing information to the Bitcoin community, or for describing a new feature for Bitcoin or its processes or environment.
As per BIP1 _BIP Purpose and Guidelines_, there are three kinds of BIPs: As per BIP1 _BIP Purpose and Guidelines_, there are three kinds of BIPs:
@ -10,7 +10,7 @@ _Standard_ BIP:: Describes any change that affects most or all Bitcoin implement
_Informational_ BIP:: Describes a Bitcoin design issue, or provides general guidelines or information to the Bitcoin community, but does not propose a new feature. Informational BIPs do not necessarily represent a Bitcoin community consensus or recommendation, so users and implementors may ignore informational BIPs or follow their advice. _Informational_ BIP:: Describes a Bitcoin design issue, or provides general guidelines or information to the Bitcoin community, but does not propose a new feature. Informational BIPs do not necessarily represent a Bitcoin community consensus or recommendation, so users and implementors may ignore informational BIPs or follow their advice.
_Process_ BIP:: Describes a Bitcoin process, or proposes a change to (or an event in) a process. Process BIPs are like standard BIPs but apply to areas other than the Bitcoin protocol itself. They might propose an implementation, but not to Bitcoin's codebase; they often require community consensus; and unlike informational BIPs, they are more than recommendations, and users are typically not free to ignore them. Examples include procedures, guidelines, changes to the decision-making process, and changes to the tools or environment used in Bitcoin development. Any meta-BIP is also considered a process BIP. _Process_ BIP:: Describes a Bitcoin process, or proposes a change to (or an event in) a process. Process BIPs are like standard BIPs but apply to areas other than the Bitcoin protocol itself. They might propose an implementation, but not to Bitcoin's codebase; they often require community consensus; and unlike informational BIPs, they are more than recommendations, and users are typically not free to ignore them. Examples include procedures, guidelines, changes to the decision-making process, and changes to the tools or environment used in Bitcoin development. Any meta-BIP is also considered a process BIP.
((("bitcoin improvement proposals", "repository of")))BIPs are recorded in a versioned repository on GitHub: https://github.com/bitcoin/bips[https://github.com/bitcoin/bips]. BIPs are recorded in a versioned repository on GitHub: https://github.com/bitcoin/bips[https://github.com/bitcoin/bips].
An MIT-licensed document from the open source Bitcoin Core project, An MIT-licensed document from the open source Bitcoin Core project,
reproduced here in edited form, describes which BIPs it implements, including listing reproduced here in edited form, describes which BIPs it implements, including listing
the Pull Request (PR) and version of Bitcoin Core where support for each BIP was added or the Pull Request (PR) and version of Bitcoin Core where support for each BIP was added or

View File

@ -25,7 +25,7 @@ create and examine data related to the blockchain and network.
=== From Bitcoin to Bitcoin Core === From Bitcoin to Bitcoin Core
((("open source licenses")))((("Nakamoto, Satoshi")))Bitcoin is an _open Bitcoin is an _open
source_ project and the source code is available under an open (MIT) source_ project and the source code is available under an open (MIT)
license, free to download and use for any purpose. More than just being license, free to download and use for any purpose. More than just being
open source, Bitcoin is developed by open source, Bitcoin is developed by
@ -35,7 +35,7 @@ contributors with about a dozen developers working on the code almost
full-time and several dozen more on a part-time basis. Anyone can full-time and several dozen more on a part-time basis. Anyone can
contribute to the code&#x2014;including you! contribute to the code&#x2014;including you!
((("bitcoin whitepaper")))((("Satoshi client")))((("reference ((("reference
implementation", see="Bitcoin Core")))((("Bitcoin Core", "reference implementation", see="Bitcoin Core")))((("Bitcoin Core", "reference
implementation")))When Bitcoin was created by Satoshi Nakamoto, the implementation")))When Bitcoin was created by Satoshi Nakamoto, the
software was mostly completed before publication of the whitepaper reproduced in software was mostly completed before publication of the whitepaper reproduced in
@ -51,7 +51,7 @@ wallets, a transaction and block validation engine, tools for block construction
of Bitcoin peer-to-peer communication. of Bitcoin peer-to-peer communication.
<<bitcoin_core_architecture>> shows the architecture of Bitcoin <<bitcoin_core_architecture>> shows the architecture of Bitcoin
Core.((("Bitcoin Core", "architecture"))) Core.
[[bitcoin_core_architecture]] [[bitcoin_core_architecture]]
.Bitcoin Core architecture (Source: Eric Lombrozo) .Bitcoin Core architecture (Source: Eric Lombrozo)
@ -68,7 +68,7 @@ several major upgrades to Bitcoin.
=== Bitcoin Development Environment === Bitcoin Development Environment
((("development environment", "setup", see="Bitcoin Core")))If you're a If you're a
developer, you will want to set up a development environment with all developer, you will want to set up a development environment with all
the tools, libraries, and support software for writing Bitcoin the tools, libraries, and support software for writing Bitcoin
applications. In this highly technical chapter, we'll walk through that applications. In this highly technical chapter, we'll walk through that
@ -81,7 +81,7 @@ next chapter, which is less technical.
((("Bitcoin Core", "compiling from source code", ((("Bitcoin Core", "compiling from source code",
id="BCsource03")))((("Bitcoin Core", "compiling from source code", id="BCsource03")))((("Bitcoin Core", "compiling from source code",
"downloading")))((("code examples, obtaining and using")))Bitcoin Core's "downloading")))Bitcoin Core's
source code can be downloaded as an archive or by cloning the source code can be downloaded as an archive or by cloning the
source repository from GitHub. ((("Bitcoin Core source repository from GitHub. ((("Bitcoin Core
downloads")))On the https://bitcoincore.org/bin/[Bitcoin Core download downloads")))On the https://bitcoincore.org/bin/[Bitcoin Core download
@ -93,7 +93,7 @@ https://github.com/bitcoin/bitcoin[GitHub bitcoin page].
[TIP] [TIP]
==== ====
((("$ symbol")))((("shell commands")))((("terminal applications")))In In
many of the examples in this chapter we will be using the operating many of the examples in this chapter we will be using the operating
system's command-line interface (also known as a "shell"), accessed via system's command-line interface (also known as a "shell"), accessed via
a "terminal" application. The shell will display a prompt; you type a a "terminal" application. The shell will display a prompt; you type a
@ -107,7 +107,7 @@ system's responses to that command. When you see the next +$+ prefix,
you'll know it's a new command and you should repeat the process. you'll know it's a new command and you should repeat the process.
==== ====
((("cloning source code")))((("source code, cloning", seealso="Bitcoin ((("source code, cloning", seealso="Bitcoin
Core")))In this example, we are using the +git+ command to create a Core")))In this example, we are using the +git+ command to create a
local copy ("clone") of the source code: local copy ("clone") of the source code:
@ -124,7 +124,7 @@ Resolving deltas: 100% (175649/175649), done.
[TIP] [TIP]
==== ====
((("distributed version control systems")))Git is the most widely used Git is the most widely used
distributed version control system, an essential part of any software distributed version control system, an essential part of any software
developer's toolkit. You may need to install the +git+ command, or a developer's toolkit. You may need to install the +git+ command, or a
graphical user interface for git, on your operating system if you do not graphical user interface for git, on your operating system if you do not
@ -192,7 +192,7 @@ nothing to commit, working tree clean
==== Configuring the Bitcoin Core Build ==== Configuring the Bitcoin Core Build
((("Bitcoin Core", "compiling from source code", "build ((("Bitcoin Core", "compiling from source code", "build
configuration")))((("documentation")))((("build documentation", configuration")))((("build documentation",
seealso="Bitcoin Core")))The source code includes documentation, which seealso="Bitcoin Core")))The source code includes documentation, which
can be found in a number of files. Review the main documentation located can be found in a number of files. Review the main documentation located
in _README.md_ in the _bitcoin_ directory. in _README.md_ in the _bitcoin_ directory.
@ -303,7 +303,7 @@ fixes the error.
==== Building the Bitcoin Core Executables ==== Building the Bitcoin Core Executables
((("Bitcoin Core", "compiling from source code", "core ((("Bitcoin Core", "compiling from source code", "core
executables")))((("core executables", seealso="Bitcoin Core")))Next, you executables")))Next, you
will compile the source code, a process that can take up to an hour to will compile the source code, a process that can take up to an hour to
complete, depending on the speed of your CPU and available memory. complete, depending on the speed of your CPU and available memory.
If an error If an error
@ -343,7 +343,7 @@ libtool: install: /usr/bin/install -c bitcoin-tx /usr/local/bin/bitcoin-tx
... ...
---- ----
((("", startref="BCsource03")))The default installation of +bitcoind+ The default installation of +bitcoind+
puts it in _/usr/local/bin_. You can confirm that Bitcoin Core is puts it in _/usr/local/bin_. You can confirm that Bitcoin Core is
correctly installed by asking the system for the path of the correctly installed by asking the system for the path of the
executables, as follows: executables, as follows:
@ -358,7 +358,7 @@ $ which bitcoin-cli
=== Running a Bitcoin Core Node === Running a Bitcoin Core Node
((("Bitcoin Core", "running core nodes", id="BCnode03")))((("Bitcoin ((("Bitcoin
nodes", "running core nodes", id="BNcore03")))Bitcoin's peer-to-peer nodes", "running core nodes", id="BNcore03")))Bitcoin's peer-to-peer
network is composed of network "nodes," run mostly by individuals and network is composed of network "nodes," run mostly by individuals and
some of the businesses that provide Bitcoin services. Those running some of the businesses that provide Bitcoin services. Those running
@ -393,7 +393,7 @@ https://blockstream.com/satellite/[Blockstream Satellite].
[TIP] [TIP]
==== ====
((("warnings and cautions", "core node resource ((("warnings and cautions", "core node resource
requirements")))((("resource requirements")))Bitcoin Core keeps a full requirements")))Bitcoin Core keeps a full
copy of the blockchain by default, with nearly every transaction that has ever copy of the blockchain by default, with nearly every transaction that has ever
been confirmed on the Bitcoin network since its inception in 2009. This been confirmed on the Bitcoin network since its inception in 2009. This
dataset is hundreds of gigabytes in size and is downloaded incrementally dataset is hundreds of gigabytes in size and is downloaded incrementally
@ -437,9 +437,9 @@ node.
==== Configuring the Bitcoin Core Node ==== Configuring the Bitcoin Core Node
((("Bitcoin Core", "running core nodes", "configuring")))((("warnings ((("warnings
and cautions", "password creation")))((("passwords", and cautions", "password creation")))((("passwords",
"creating")))((("security", "passwords")))Bitcoin Core will look for a "creating")))Bitcoin Core will look for a
configuration file in its data directory on every start. In this section configuration file in its data directory on every start. In this section
we will examine the various configuration options and set up a we will examine the various configuration options and set up a
configuration file. To locate the configuration file, run +bitcoind configuration file. To locate the configuration file, run +bitcoind
@ -488,7 +488,7 @@ Options:
[many more options] [many more options]
---- ----
((("configuration options", seealso="Bitcoin Core")))Here are some of Here are some of
the most important options that you can set in the configuration file, the most important options that you can set in the configuration file,
or as command-line parameters to +bitcoind+: or as command-line parameters to +bitcoind+:
@ -532,7 +532,7 @@ Use it to reduce memory use on memory-constrained nodes.
**** ****
((("Bitcoin Core", "running core nodes", "database ((("Bitcoin Core", "running core nodes", "database
options")))((("transactions", "database configuration options")))((("transactions", "database configuration
options")))((("txindex option")))((("full indexing option")))By default, options")))By default,
Bitcoin Core builds a database containing _only_ the transactions Bitcoin Core builds a database containing _only_ the transactions
related to the user's wallet. If you want to be able to access _any_ related to the user's wallet. If you want to be able to access _any_
transaction with commands like +getrawtransaction+ (see transaction with commands like +getrawtransaction+ (see
@ -654,11 +654,11 @@ that it runs continuously and restarts when the operating system
restarts. You will find a number of example startup scripts for various restarts. You will find a number of example startup scripts for various
operating systems in Bitcoin Core's source directory under _contrib/init_ and operating systems in Bitcoin Core's source directory under _contrib/init_ and
a _README.md_ file showing which system uses which script.((("", a _README.md_ file showing which system uses which script.((("",
startref="BCnode03")))((("", startref="BNcore03"))) startref="BCnode03")))
=== Bitcoin Core Application Programming Interface (API) === Bitcoin Core Application Programming Interface (API)
((("Bitcoin Core", "Bitcoin Core API", id="BCapi03")))Bitcoin Core Bitcoin Core
implements a JSON-RPC interface that can also be accessed using implements a JSON-RPC interface that can also be accessed using
the command-line helper +bitcoin-cli+. The command line allows us to the command-line helper +bitcoin-cli+. The command line allows us to
experiment interactively with the capabilities that are also available experiment interactively with the capabilities that are also available
@ -723,7 +723,7 @@ and their expected output.
==== Getting Information on Bitcoin Core's Status ==== Getting Information on Bitcoin Core's Status
((("Bitcoin Core", "Bitcoin Core API", "status information")))Bitcoin Bitcoin
Core provides status reports on different modules through the JSON-RPC Core provides status reports on different modules through the JSON-RPC
interface. The most important commands include +getblockchaininfo+, interface. The most important commands include +getblockchaininfo+,
+getmempoolinfo+, +getnetworkinfo+ and +getwalletinfo+. +getmempoolinfo+, +getnetworkinfo+ and +getwalletinfo+.
@ -811,7 +811,7 @@ e739df2f899c49dc267c0ad280aca6dab0d2fa2b42a45182fc83e81713010000
[TIP] [TIP]
==== ====
((("transaction IDs (txd)")))((("malleability")))A transaction ID (txid) A transaction ID (txid)
is not authoritative. Absence of a txid in the blockchain does not mean is not authoritative. Absence of a txid in the blockchain does not mean
the transaction was not processed. This is known as "transaction the transaction was not processed. This is known as "transaction
malleability," because transactions can be modified prior to malleability," because transactions can be modified prior to
@ -905,7 +905,7 @@ transmitted from one owner to the next.
==== Exploring Blocks ==== Exploring Blocks
((("blocks", "block height")))((("blocks", "block hash")))Exploring Exploring
blocks is similar to exploring transactions. However, blocks can be blocks is similar to exploring transactions. However, blocks can be
referenced either by the block _height_ or by the block _hash_. First, referenced either by the block _height_ or by the block _hash_. First,
let's find a block by its height. let's find a block by its height.
@ -985,7 +985,7 @@ we'll examine those in detail in <<mining>>.
==== Using Bitcoin Core's Programmatic Interface ==== Using Bitcoin Core's Programmatic Interface
((("Bitcoin Core", "Bitcoin Core API", "using programmatic ((("Bitcoin Core", "Bitcoin Core API", "using programmatic
interface")))((("programmatic interface", id="progint03")))The interface")))The
+bitcoin-cli+ helper is very useful for exploring the Bitcoin Core API +bitcoin-cli+ helper is very useful for exploring the Bitcoin Core API
and testing functions. But the whole point of an application programming and testing functions. But the whole point of an application programming
interface is to access functions programmatically. In this section we interface is to access functions programmatically. In this section we
@ -1102,7 +1102,7 @@ and more clearly demonstrates the use of a programmatic interface.
In <<rpc_block>>, we first retrieve a block, then retrieve each of In <<rpc_block>>, we first retrieve a block, then retrieve each of
the transactions within it by reference to each transaction ID. Next, the transactions within it by reference to each transaction ID. Next,
we iterate through each of the transaction's outputs and add up the we iterate through each of the transaction's outputs and add up the
value.((("", startref="alicethree"))) value.
[[rpc_block]] [[rpc_block]]
.Retrieving a block and adding all the transaction outputs .Retrieving a block and adding all the transaction outputs
@ -1126,16 +1126,16 @@ block is 10,322.07722534 BTC (including 25 BTC reward and 0.0909 BTC in
fees). Compare that to the amount reported by a block explorer site by fees). Compare that to the amount reported by a block explorer site by
searching for the block hash or height. Some block explorers report the searching for the block hash or height. Some block explorers report the
total value excluding the reward and excluding the fees. See if you can total value excluding the reward and excluding the fees. See if you can
spot the difference.((("", startref="BCapi03")))((("", spot the difference.((("",
startref="progint03"))) startref="progint03")))
[[alt_libraries]] [[alt_libraries]]
=== Alternative Clients, Libraries, and Toolkits === Alternative Clients, Libraries, and Toolkits
((("Bitcoin Core", "alternatives to", id="BCalt03")))((("clients, ((("clients,
libraries, and toolkits", id="clients03")))((("libraries, clients, and libraries, and toolkits", id="clients03")))((("libraries, clients, and
toolkits", id="librar03")))((("toolkits, libraries, and clients", toolkits", id="librar03")))((("toolkits, libraries, and clients",
id="toolkit03")))((("third-party API clients", id="thirdpart03")))There id="toolkit03")))There
are many alternative clients, libraries, toolkits, and even full-node are many alternative clients, libraries, toolkits, and even full-node
implementations in the bitcoin ecosystem. These are implemented in a implementations in the bitcoin ecosystem. These are implemented in a
variety of programming languages, offering programmers native interfaces variety of programming languages, offering programmers native interfaces
@ -1172,9 +1172,9 @@ https://bitcoin-s.org/[bitcoin-s]:: A Bitcoin implementation in Scala
https://github.com/MetacoSA/NBitcoin[NBitcoin]:: Comprehensive bitcoin library for the .NET framework https://github.com/MetacoSA/NBitcoin[NBitcoin]:: Comprehensive bitcoin library for the .NET framework
Many more libraries exist in a variety of other programming languages Many more libraries exist in a variety of other programming languages
and more are created all the time.((("", startref="BCalt03")))((("", and more are created all the time.((("",
startref="clients03")))((("", startref="thirdpart03")))((("", startref="clients03")))((("",
startref="toolkit03")))((("", startref="librar03"))) startref="toolkit03")))
If you followed the instructions in this chapter, you now have Bitcoin If you followed the instructions in this chapter, you now have Bitcoin
Core running and have begun exploring the network and blockchain using Core running and have begun exploring the network and blockchain using

View File

@ -8,19 +8,19 @@ structure of the blockchain and see how it uses cryptographic
commitments and other clever tricks to make every part of it easy for commitments and other clever tricks to make every part of it easy for
full nodes (and sometimes light clients) to validate. full nodes (and sometimes light clients) to validate.
((("blockchain (the)", "overview of")))The blockchain data structure is The blockchain data structure is
an ordered, back-linked list of blocks of transactions. The blockchain an ordered, back-linked list of blocks of transactions. The blockchain
can be stored as a flat file, or in a simple database. can be stored as a flat file, or in a simple database.
Blocks are linked "back," each referring to the previous block in the Blocks are linked "back," each referring to the previous block in the
chain. ((("blocks", "block height")))The blockchain is often visualized chain. The blockchain is often visualized
as a vertical stack, with blocks layered on top of each other and the as a vertical stack, with blocks layered on top of each other and the
first block serving as the foundation of the stack. The visualization of first block serving as the foundation of the stack. The visualization of
blocks stacked on top of each other results in the use of terms such as blocks stacked on top of each other results in the use of terms such as
"height" to refer to the distance from the first block, and "top" or "height" to refer to the distance from the first block, and "top" or
"tip" to refer to the most recently added block. "tip" to refer to the most recently added block.
((("blocks", "block hash")))((("blocks", "genesis block")))((("blocks", ((("blocks",
"parent blocks")))((("genesis block")))((("parent blocks")))Each block "parent blocks")))Each block
within the blockchain is identified by a hash, generated using the within the blockchain is identified by a hash, generated using the
SHA256 cryptographic hash algorithm on the header of the block. Each SHA256 cryptographic hash algorithm on the header of the block. Each
block also commits to the previous block, known as the _parent_ block, block also commits to the previous block, known as the _parent_ block,
@ -58,7 +58,7 @@ years. In the blockchain, the most recent few blocks might be revised if
there is a chain reorganization due to a fork. The top six blocks are there is a chain reorganization due to a fork. The top six blocks are
like a few inches of topsoil. But once you go more deeply into the 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 blockchain, beyond six blocks, blocks are less and less likely to
change. ((("transactions", "coinbase transactions")))((("coinbase change. ((("coinbase
transactions")))After 100 blocks back there is so much stability that transactions")))After 100 blocks back there is so much stability that
the coinbase transaction--the transaction containing the reward in the coinbase transaction--the transaction containing the reward in
bitcoin for creating a new block--can be spent. bitcoin for creating a new block--can be spent.
@ -70,7 +70,7 @@ infinitesimal.
=== Structure of a Block === Structure of a Block
((("blocks", "structure of")))((("blockchain (the)", "block ((("blockchain (the)", "block
structure")))A block is a container data structure that aggregates structure")))A block is a container data structure that aggregates
transactions for inclusion in the blockchain. The transactions for inclusion in the blockchain. The
block is made of a header, containing metadata, followed by a long list block is made of a header, containing metadata, followed by a long list
@ -95,8 +95,8 @@ header. <<block_structure1>> describes how Bitcoin Core stores the structure of
[[block_header]] [[block_header]]
=== Block Header === Block Header
((("blocks", "headers")))((("blockchain (the)", "block ((("blockchain (the)", "block
headers")))((("headers")))The block header consists of headers")))The block header consists of
block metadata as shown in <<block_header_structure_ch09>>. block metadata as shown in <<block_header_structure_ch09>>.
[[block_header_structure_ch09]] [[block_header_structure_ch09]]
@ -118,8 +118,8 @@ process and will be discussed in more detail in <<mining>>.
[[block_hash]] [[block_hash]]
=== Block Identifiers: Block Header Hash and Block Height === Block Identifiers: Block Header Hash and Block Height
((("blockchain (the)", "block identifiers")))((("blocks", "block ((("blocks", "block
height")))((("blocks", "block hash")))The primary identifier of a block height")))The primary identifier of a block
is its cryptographic hash, a commitment made by hashing the is its cryptographic hash, a commitment made by hashing the
block header twice through the SHA256 algorithm. The resulting 32-byte block header twice through the SHA256 algorithm. The resulting 32-byte
hash is called the _block hash_ but is more accurately the _block header hash is called the _block hash_ but is more accurately the _block header
@ -178,7 +178,7 @@ the blockchain.
=== The Genesis Block === The Genesis Block
((("blocks", "genesis block")))((("blockchain (the)", "genesis ((("blockchain (the)", "genesis
block")))The first block in the blockchain is called the _genesis block_ block")))The first block in the blockchain is called the _genesis block_
and was created in 2009. It is the common ancestor of all the blocks in and was created in 2009. It is the common ancestor of all the blocks in
the blockchain, meaning that if you start at any block and follow the the blockchain, meaning that if you start at any block and follow the
@ -250,7 +250,7 @@ first block by Satoshi Nakamoto, Bitcoin's creator.
=== Linking Blocks in the Blockchain === Linking Blocks in the Blockchain
((("blocks", "linking blocks in the blockchain")))((("blockchain (the)", ((("blockchain (the)",
"linking blocks in the blockchain")))Bitcoin full nodes validate every "linking blocks in the blockchain")))Bitcoin full nodes validate every
block in the blockchain after the genesis block. Their local view of block in the blockchain after the genesis block. Their local view of
the blockchain is constantly updated as new blocks are found and used to the blockchain is constantly updated as new blocks are found and used to
@ -307,11 +307,11 @@ image::images/mbc2_0901.png[]
[[merkle_trees]] [[merkle_trees]]
=== Merkle Trees === Merkle Trees
((("merkle trees", id="merkle09")))((("blockchain (the)", "merkle ((("blockchain (the)", "merkle
trees", id="BCTmerkle09")))Each block in the Bitcoin blockchain contains trees", id="BCTmerkle09")))Each block in the Bitcoin blockchain contains
a summary of all the transactions in the block using a _merkle tree_. a summary of all the transactions in the block using a _merkle tree_.
((("binary hash trees", see="merkle trees")))A _merkle tree_, also known A _merkle tree_, also known
as a _binary hash tree_, is a data structure used for efficiently as a _binary hash tree_, is a data structure used for efficiently
summarizing and verifying the integrity of large sets of data. Merkle summarizing and verifying the integrity of large sets of data. Merkle
trees are binary trees containing cryptographic hashes. The term "tree" trees are binary trees containing cryptographic hashes. The term "tree"
@ -369,7 +369,7 @@ of the nodes.
.Calculating the nodes in a merkle tree .Calculating the nodes in a merkle tree
image::images/mbc2_0902.png["merkle_tree"] image::images/mbc2_0902.png["merkle_tree"]
((("balanced trees")))Because the merkle tree is a binary tree, it needs Because the merkle tree is a binary tree, it needs
an even number of leaf nodes. If there is an odd number of transactions an even number of leaf nodes. If there is an odd number of transactions
to summarize, the last transaction hash will be duplicated to create an to summarize, the last transaction hash will be duplicated to create an
even number of leaf nodes, also known as a _balanced tree_. This is even number of leaf nodes, also known as a _balanced tree_. This is
@ -434,7 +434,7 @@ size, just 32 bytes. Whether there is one transaction or ten
thousand transactions in the block, the merkle root always summarizes thousand transactions in the block, the merkle root always summarizes
them into 32 bytes. them into 32 bytes.
((("authentication paths")))To prove that a specific transaction is To prove that a specific transaction is
included in a block, a node only needs to produce approximately +log~2~(N)+ 32-byte included in a block, a node only needs to produce approximately +log~2~(N)+ 32-byte
hashes, constituting an _authentication path_ or _merkle path_ hashes, constituting an _authentication path_ or _merkle path_
connecting the specific transaction to the root of the tree. This is connecting the specific transaction to the root of the tree. This is
@ -497,18 +497,18 @@ transaction is recorded in the blockchain. All in all, the lightweight client wi
have received less than a kilobyte of data for the block header and have received less than a kilobyte of data for the block header and
merkle path, an amount of data that is more than a thousand times less merkle path, an amount of data that is more than a thousand times less
than a full block (about 2 megabytes currently).((("", than a full block (about 2 megabytes currently).((("",
startref="BCTmerkle09")))((("", startref="merkle09"))) startref="BCTmerkle09")))
=== Bitcoin's Test Blockchains === Bitcoin's Test Blockchains
((("blockchain (the)", "test blockchains", ((("blockchain (the)", "test blockchains",
id="BCTtest09")))((("mainnet", seealso="blockchain (the)")))You might be id="BCTtest09")))You might be
surprised to learn that there is more than one blockchain used with Bitcoin. The surprised to learn that there is more than one blockchain used with Bitcoin. The
"main" Bitcoin blockchain, the one created by Satoshi Nakamoto on "main" Bitcoin blockchain, the one created by Satoshi Nakamoto on
January 3rd, 2009, the one with the genesis block we studied in this January 3rd, 2009, the one with the genesis block we studied in this
chapter, is called _mainnet_. There are other Bitcoin blockchains that chapter, is called _mainnet_. There are other Bitcoin blockchains that
are used for testing purposes: at this time _testnet_, _signet_, and are used for testing purposes: at this time _testnet_, _signet_, and
_regtest_. Let's look at each in turn.((("testnet", id="testnet09"))) _regtest_. Let's look at each in turn.
==== Testnet: Bitcoin's Testing Playground ==== Testnet: Bitcoin's Testing Playground
@ -588,7 +588,7 @@ experiment and learn in other programming languages and frameworks.
Testnet3 supports all the features of mainnet, including Testnet3 supports all the features of mainnet, including
Segregated Witness v0 and v1 (see <<segwit>> and <<taproot>>). Therefore, testnet3 can also be Segregated Witness v0 and v1 (see <<segwit>> and <<taproot>>). Therefore, testnet3 can also be
used to test Segregated Witness features.((("", startref="testnet09"))) used to test Segregated Witness features.
===== Problems With Testnet ===== Problems With Testnet
@ -695,7 +695,7 @@ $ bitcoin-cli -signet getblockchaininfo
==== Regtest&#x2014;The Local Blockchain ==== Regtest&#x2014;The Local Blockchain
((("regtest (Regression Testing)")))Regtest, which stands for Regtest, which stands for
"Regression Testing," is a Bitcoin Core feature that allows you to "Regression Testing," is a Bitcoin Core feature that allows you to
create a local blockchain for testing purposes. Unlike signet and testnet3, which create a local blockchain for testing purposes. Unlike signet and testnet3, which
are a public and shared test blockchain, the regtest blockchains are are a public and shared test blockchain, the regtest blockchains are
@ -767,7 +767,7 @@ $ bitcoin-cli -regtest getbalance
=== Using Test Blockchains for Development === Using Test Blockchains for Development
((("development environment", "test blockchains and")))Bitcoin's various Bitcoin's various
blockchains (+regtest+, +signet+, +testnet3+, +mainnet+) offer a range blockchains (+regtest+, +signet+, +testnet3+, +mainnet+) offer a range
of testing environments for bitcoin development. Use the test of testing environments for bitcoin development. Use the test
blockchains whether you are developing for Bitcoin Core, or another blockchains whether you are developing for Bitcoin Core, or another
@ -783,7 +783,7 @@ applications. Finally, once you are confident your code works as
expected, switch to +mainnet+ to deploy it in production. As you make expected, switch to +mainnet+ to deploy it in production. As you make
changes, improvements, bug fixes, etc., start the pipeline again, changes, improvements, bug fixes, etc., start the pipeline again,
deploying each change first on +regtest+, then on +signet+ or +testnet+, and finally deploying each change first on +regtest+, then on +signet+ or +testnet+, and finally
into production.((("", startref="BCTtest09"))) into production.
Now that we know what data the blockchain contains and how cryptographic Now that we know what data the blockchain contains and how cryptographic
commitments securely tie the various parts together, we will look at the commitments securely tie the various parts together, we will look at the

View File

@ -611,7 +611,7 @@ and make a miner very happy, this is probably not what you intended.
[WARNING] [WARNING]
==== ====
((("warnings and cautions", "change outputs")))If you forget to add a If you forget to add a
change output in a manually constructed transaction, you will be paying change output in a manually constructed transaction, you will be paying
the change as a transaction fee. "Keep the change!" might not be what the change as a transaction fee. "Keep the change!" might not be what
you intended. you intended.
@ -622,8 +622,8 @@ you intended.
((("scripting", "timelocks", "defense against ((("scripting", "timelocks", "defense against
fee-sniping")))((("timelocks", "defense against fee-sniping")))((("timelocks", "defense against
fee-sniping")))((("fees", "fee sniping")))((("security", "defense fee-sniping")))((("security", "defense
against fee-sniping")))((("sniping")))Fee-sniping is a theoretical against fee-sniping")))Fee-sniping is a theoretical
attack scenario, where miners attempting to rewrite past blocks "snipe" attack scenario, where miners attempting to rewrite past blocks "snipe"
higher-fee transactions from future blocks to maximize their higher-fee transactions from future blocks to maximize their
profitability. profitability.

View File

@ -192,7 +192,7 @@ RIPEMD-160::
RIPEMD-160 is a 160-bit cryptographic hash function. RIPEMD-160 is a strengthened version of RIPEMD with a 160-bit hash result, and is expected to be secure for the next ten years or more. RIPEMD-160 is a 160-bit cryptographic hash function. RIPEMD-160 is a strengthened version of RIPEMD with a 160-bit hash result, and is expected to be secure for the next ten years or more.
satoshi:: satoshi::
A satoshi is the smallest denomination of bitcoin that can be recorded on the blockchain. It is the equivalent of 0.00000001 bitcoin and is named after the creator of Bitcoin, Satoshi Nakamoto. ((("satoshi"))) A satoshi is the smallest denomination of bitcoin that can be recorded on the blockchain. It is the equivalent of 0.00000001 bitcoin and is named after the creator of Bitcoin, Satoshi Nakamoto.
Satoshi Nakamoto:: Satoshi Nakamoto::
Satoshi Nakamoto is the name used by the person or people who designed Bitcoin and created its original reference implementation, Bitcoin Core. As a part of the implementation, they also devised the first blockchain database. In the process they were the first to solve the double-spending problem for digital currency. Their real identity remains unknown. Satoshi Nakamoto is the name used by the person or people who designed Bitcoin and created its original reference implementation, Bitcoin Core. As a part of the implementation, they also devised the first blockchain database. In the process they were the first to solve the double-spending problem for digital currency. Their real identity remains unknown.

View File

@ -2,7 +2,7 @@
[[ch01_intro_what_is_bitcoin]] [[ch01_intro_what_is_bitcoin]]
== Introduction == Introduction
((("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 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.
[TIP] [TIP]
==== ====
@ -71,18 +71,18 @@ Behind the scenes, Bitcoin is also the name of the protocol, a peer-to-peer netw
* A decentralized peer-to-peer network (the Bitcoin protocol) * A decentralized peer-to-peer network (the Bitcoin protocol)
* A public transaction journal (the blockchain) * A public transaction journal (the blockchain)
* ((("mining and consensus", "consensus rules", "satisfying")))A set of rules for independent transaction validation and currency issuance (consensus rules) * A set of rules for independent transaction validation and currency issuance (consensus rules)
* A mechanism for reaching global decentralized consensus on the valid blockchain (Proof-of-Work algorithm) * A mechanism for reaching global decentralized consensus on the valid blockchain (Proof-of-Work algorithm)
As a developer, I see Bitcoin as akin to the internet of money, a network for propagating value and securing the ownership of digital assets via distributed computation. There's a lot more to Bitcoin than first meets the eye. As a developer, I see Bitcoin as akin to the internet of money, a network for propagating value and securing the ownership of digital assets via distributed computation. There's a lot more to Bitcoin than first meets the eye.
In this chapter we'll get started by explaining some of the main concepts and terms, getting the necessary software, and using Bitcoin for simple transactions. In the following chapters, we'll start unwrapping the layers of technology that make Bitcoin possible and examine the inner workings of the Bitcoin network and protocol.((("", startref="GSdefine01"))) In this chapter we'll get started by explaining some of the main concepts and terms, getting the necessary software, and using Bitcoin for simple transactions. In the following chapters, we'll start unwrapping the layers of technology that make Bitcoin possible and examine the inner workings of the Bitcoin network and protocol.
[role="pagebreak-before less_space"] [role="pagebreak-before less_space"]
.Digital Currencies Before Bitcoin .Digital Currencies Before Bitcoin
**** ****
((("digital currencies", "prior to bitcoin")))The emergence of viable digital money is closely linked to developments in cryptography. This is not surprising when one considers the fundamental challenges involved with using bits to represent value that can be exchanged for goods and services. Three basic questions for anyone accepting digital money are: The emergence of viable digital money is closely linked to developments in cryptography. This is not surprising when one considers the fundamental challenges involved with using bits to represent value that can be exchanged for goods and services. Three basic questions for anyone accepting digital money are:
1. Can I trust that the money is authentic and not counterfeit? 1. Can I trust that the money is authentic and not counterfeit?
2. Can I trust that the digital money can only be spent once (known as the “double-spend” problem)? 2. Can I trust that the digital money can only be spent once (known as the “double-spend” problem)?
@ -92,13 +92,13 @@ Issuers of paper money are constantly battling the counterfeiting problem by usi
When cryptography started becoming more broadly available and understood in the late 1980s, many researchers began trying to use cryptography to build digital currencies. These early digital currency projects issued digital money, usually backed by a national currency or precious metal such as gold. When cryptography started becoming more broadly available and understood in the late 1980s, many researchers began trying to use cryptography to build digital currencies. These early digital currency projects issued digital money, usually backed by a national currency or precious metal such as gold.
((("decentralized systems", "vs. centralized", secondary-sortas="centralized")))Although these earlier digital currencies worked, they were centralized and, as a result, were easy to attack by governments and hackers. Early digital currencies used a central clearinghouse to settle all transactions at regular intervals, just like a traditional banking system. Unfortunately, in most cases these nascent digital currencies were targeted by worried governments and eventually litigated out of existence. Some failed in spectacular crashes when the parent company liquidated abruptly. To be robust against intervention by antagonists, whether legitimate governments or criminal elements, a _decentralized_ digital currency was needed to avoid a single point of attack. Bitcoin is such a system, decentralized by design, and free of any central authority or point of control that can be attacked or corrupted. Although these earlier digital currencies worked, they were centralized and, as a result, were easy to attack by governments and hackers. Early digital currencies used a central clearinghouse to settle all transactions at regular intervals, just like a traditional banking system. Unfortunately, in most cases these nascent digital currencies were targeted by worried governments and eventually litigated out of existence. Some failed in spectacular crashes when the parent company liquidated abruptly. To be robust against intervention by antagonists, whether legitimate governments or criminal elements, a _decentralized_ digital currency was needed to avoid a single point of attack. Bitcoin is such a system, decentralized by design, and free of any central authority or point of control that can be attacked or corrupted.
**** ****
=== History of Bitcoin === History of Bitcoin
((("Nakamoto, Satoshi")))((("distributed computing")))((("bitcoin", ((("bitcoin",
"history of")))Bitcoin was first described in 2008 with the publication of a "history of")))Bitcoin was first described in 2008 with the publication of a
paper titled "Bitcoin: A Peer-to-Peer Electronic Cash paper titled "Bitcoin: A Peer-to-Peer Electronic Cash
System,"footnote:["Bitcoin: A Peer-to-Peer Electronic Cash System," System,"footnote:["Bitcoin: A Peer-to-Peer Electronic Cash System,"
@ -107,13 +107,13 @@ alias of Satoshi Nakamoto (see <<satoshi_whitepaper>>). Nakamoto
combined several prior inventions such as digital signatures and Hashcash to create combined several prior inventions such as digital signatures and Hashcash to create
a completely decentralized electronic cash system that does not rely on a completely decentralized electronic cash system that does not rely on
a central authority for currency issuance or settlement and validation a central authority for currency issuance or settlement and validation
of transactions. ((("Proof-of-Work algorithm")))((("decentralized of transactions. ((("decentralized
systems", "consensus in")))((("mining and consensus", "Proof-of-Work systems", "consensus in")))((("mining and consensus", "Proof-of-Work
algorithm")))A key innovation was to use a distributed computation algorithm")))A key innovation was to use a distributed computation
system (called a "Proof-of-Work" algorithm) to conduct a global system (called a "Proof-of-Work" algorithm) to conduct a global
lottery every 10 minutes on average, allowing the decentralized network to lottery every 10 minutes on average, allowing the decentralized network to
arrive at _consensus_ about the state of transactions. ((("double-spend arrive at _consensus_ about the state of transactions. ((("double-spend
problem")))((("spending bitcoin", "double-spend problem")))This problem")))This
elegantly solves the issue of double-spend where a single currency unit elegantly solves the issue of double-spend where a single currency unit
can be spent twice. Previously, the double-spend problem was a weakness can be spent twice. Previously, the double-spend problem was a weakness
of digital currency and was addressed by clearing all transactions of digital currency and was addressed by clearing all transactions
@ -127,12 +127,12 @@ increased exponentially, and their combined computational power now
exceeds the combined number of computing operations of the exceeds the combined number of computing operations of the
world's top supercomputers. world's top supercomputers.
Satoshi Nakamoto withdrew from the public in April 2011, leaving the responsibility of developing the code and network to a thriving group of volunteers. The identity of the person or people behind Bitcoin is still unknown. ((("open source licenses")))However, neither Satoshi Nakamoto nor anyone else exerts individual control over the Bitcoin system, which operates based on fully transparent mathematical principles, open source code, and consensus among participants. The invention itself is groundbreaking and has already spawned new science in the fields of distributed computing, economics, and econometrics. Satoshi Nakamoto withdrew from the public in April 2011, leaving the responsibility of developing the code and network to a thriving group of volunteers. The identity of the person or people behind Bitcoin is still unknown. However, neither Satoshi Nakamoto nor anyone else exerts individual control over the Bitcoin system, which operates based on fully transparent mathematical principles, open source code, and consensus among participants. The invention itself is groundbreaking and has already spawned new science in the fields of distributed computing, economics, and econometrics.
.A Solution to a Distributed Computing Problem .A Solution to a Distributed Computing Problem
**** ****
((("Byzantine Generals&#x27; Problem")))Satoshi Nakamoto's invention is Satoshi Nakamoto's invention is
also a practical and novel solution to a problem in distributed also a practical and novel solution to a problem in distributed
computing, known as the "Byzantine Generals' Problem." Briefly, the computing, known as the "Byzantine Generals' Problem." Briefly, the
problem consists of trying to get multiple participants without a leader problem consists of trying to get multiple participants without a leader
@ -162,7 +162,7 @@ derived from the original implementation written by Satoshi Nakamoto.
==== Choosing a Bitcoin Wallet ==== Choosing a Bitcoin Wallet
((("security", "wallet selection")))Bitcoin wallets are one of the most actively developed applications in the Bitcoin ecosystem. There is intense competition, and while a new wallet is probably being developed right now, several wallets from last year are no longer actively maintained. Many wallets focus on specific platforms or specific uses and some are more suitable for beginners while others are filled with features for advanced users. Choosing a wallet is highly subjective and depends on the use and user expertise. Therefore it would be pointless to recommend a specific brand or wallet. However, we can categorize Bitcoin wallets according to their platform and function and provide some clarity about all the different types of wallets that exist. It is worth trying out several different wallets until you find one that fits your needs. Bitcoin wallets are one of the most actively developed applications in the Bitcoin ecosystem. There is intense competition, and while a new wallet is probably being developed right now, several wallets from last year are no longer actively maintained. Many wallets focus on specific platforms or specific uses and some are more suitable for beginners while others are filled with features for advanced users. Choosing a wallet is highly subjective and depends on the use and user expertise. Therefore it would be pointless to recommend a specific brand or wallet. However, we can categorize Bitcoin wallets according to their platform and function and provide some clarity about all the different types of wallets that exist. It is worth trying out several different wallets until you find one that fits your needs.
===== Types of Bitcoin wallets ===== Types of Bitcoin wallets
Bitcoin wallets can be categorized as follows, according to the platform: Bitcoin wallets can be categorized as follows, according to the platform:
@ -204,7 +204,7 @@ hardware signing device.
===== Full-node vs. Lightweight ===== Full-node vs. Lightweight
Another way to categorize Bitcoin wallets is by their degree of autonomy and how they interact with the Bitcoin network: Another way to categorize Bitcoin wallets is by their degree of autonomy and how they interact with the Bitcoin network:
Full-node:: ((("full-node")))A full node is a program that validates the Full-node:: A full node is a program that validates the
entire history of Bitcoin transactions (every transaction by every user, entire history of Bitcoin transactions (every transaction by every user,
ever). Optionally, full nodes can also store previously validated ever). Optionally, full nodes can also store previously validated
transactions and serve data to other Bitcoin programs, either on the transactions and serve data to other Bitcoin programs, either on the
@ -213,14 +213,14 @@ computer resources--about the same as watching an hour-long streaming
video for each day of Bitcoin transactions--but the full node offers video for each day of Bitcoin transactions--but the full node offers
complete autonomy to its users. complete autonomy to its users.
Lightweight client:: ((("lightweight clients"))) Lightweight client::
A lightweight client, also known as a simplified-payment-verification (SPV) client, A lightweight client, also known as a simplified-payment-verification (SPV) client,
connects to a full node or other remote server for receiving and sending connects to a full node or other remote server for receiving and sending
Bitcoin transaction information, but stores the user wallet locally, Bitcoin transaction information, but stores the user wallet locally,
partially validates the transactions it receives, and independently partially validates the transactions it receives, and independently
creates outgoing transactions. creates outgoing transactions.
Third-party API client:: ((("third-party API clients")))A third-party Third-party API client:: A third-party
API client is one that interacts with Bitcoin through a third-party API client is one that interacts with Bitcoin through a third-party
system of application programming interfaces (APIs), rather than by system of application programming interfaces (APIs), rather than by
connecting to the Bitcoin network directly. The wallet may be stored by connecting to the Bitcoin network directly. The wallet may be stored by
@ -363,11 +363,11 @@ ensure you aren't being phished.
==== Bitcoin addresses ==== Bitcoin addresses
Alice is now ready to start using her new Bitcoin wallet. ((("", startref="GSquick01")))((("", startref="Wquick01"))) Her wallet application randomly generated a private key (described in more detail in <<private_keys>>) which will be used to derive Bitcoin addresses that direct to her wallet. At this point, her Bitcoin addresses are not known to the Bitcoin network or "registered" with any part of the Bitcoin system. Her Bitcoin addresses are simply numbers that correspond to her private key that she can use to control access to the funds. The addresses are generated independently by her wallet without reference or registration with any service. Alice is now ready to start using her new Bitcoin wallet. Her wallet application randomly generated a private key (described in more detail in <<private_keys>>) which will be used to derive Bitcoin addresses that direct to her wallet. At this point, her Bitcoin addresses are not known to the Bitcoin network or "registered" with any part of the Bitcoin system. Her Bitcoin addresses are simply numbers that correspond to her private key that she can use to control access to the funds. The addresses are generated independently by her wallet without reference or registration with any service.
[TIP] [TIP]
==== ====
((("addresses", "security of")))((("security", "bitcoin addresses")))There There
are a variety of Bitcoin addresses and invoice formats. Addresses and are a variety of Bitcoin addresses and invoice formats. Addresses and
invoices can be shared with other Bitcoin users invoices can be shared with other Bitcoin users
who can use them to send bitcoins directly to your wallet. You can share who can use them to send bitcoins directly to your wallet. You can share
@ -402,7 +402,7 @@ bitcoin-accepting charity.
[[getting_first_bitcoin]] [[getting_first_bitcoin]]
==== Getting Your First Bitcoin ==== Getting Your First Bitcoin
((("getting started", "acquiring bitcoin")))The first task for new users is to acquire some bitcoin. The first task for new users is to acquire some bitcoin.
Bitcoin transactions are irreversible. Most electronic payment networks such as credit cards, debit cards, PayPal, and bank account transfers are reversible. For someone selling bitcoin, this difference introduces a very high risk that the buyer will reverse the electronic payment after they have received bitcoin, in effect defrauding the seller. To mitigate this risk, companies accepting traditional electronic payments in return for bitcoin usually require buyers to undergo identity verification and credit-worthiness checks, which may take several days or weeks. As a new user, this means you cannot buy bitcoin instantly with a credit card. With a bit of patience and creative thinking, however, you won't need to. Bitcoin transactions are irreversible. Most electronic payment networks such as credit cards, debit cards, PayPal, and bank account transfers are reversible. For someone selling bitcoin, this difference introduces a very high risk that the buyer will reverse the electronic payment after they have received bitcoin, in effect defrauding the seller. To mitigate this risk, companies accepting traditional electronic payments in return for bitcoin usually require buyers to undergo identity verification and credit-worthiness checks, which may take several days or weeks. As a new user, this means you cannot buy bitcoin instantly with a credit card. With a bit of patience and creative thinking, however, you won't need to.
@ -411,15 +411,15 @@ Here are some methods for acquiring bitcoin as a new user:
* Find a friend who has bitcoins 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 bitcoins is to attend a local Bitcoin meetup listed at https://meetup.com[Meetup.com]. * Find a friend who has bitcoins 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 bitcoins is to attend a local Bitcoin meetup listed at https://meetup.com[Meetup.com].
* 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 bitcoins. * 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 bitcoins.
* ((("Coin ATM Radar")))((("ATMs, locating")))Use a Bitcoin ATM in your city. A Bitcoin ATM is a machine that accepts cash and sends bitcoins to your smartphone Bitcoin wallet. * Use a Bitcoin ATM in your city. A Bitcoin ATM is a machine that accepts cash and sends bitcoins to your smartphone Bitcoin wallet.
* ((("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 bitcoins with local currency. Exchange-rate listing services, such as https://bitcoinaverage.com[BitcoinAverage], often show a list of Bitcoin exchanges for each currency. * 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 bitcoins with local currency. Exchange-rate listing services, such as https://bitcoinaverage.com[BitcoinAverage], often show a list of Bitcoin exchanges for each currency.
[TIP] [TIP]
==== ====
((("privacy, maintaining")))((("security", "maintaining ((("security", "maintaining
privacy")))((("digital currencies", "currency exchanges")))((("currency privacy")))((("currency
exchanges")))((("digital currencies", "benefits of exchanges")))((("digital currencies", "benefits of
bitcoin")))((("bitcoin", "benefits of")))One of the advantages of bitcoin")))One of the advantages of
Bitcoin over other payment systems is that, when used correctly, it Bitcoin over other payment systems is that, when used correctly, it
affords users much more privacy. Acquiring, holding, and spending affords users much more privacy. Acquiring, holding, and spending
bitcoin does not require you to divulge sensitive and personally bitcoin does not require you to divulge sensitive and personally
@ -440,14 +440,14 @@ Alice was introduced to Bitcoin by a friend so she has an easy way to acquire he
[[bitcoin_price]] [[bitcoin_price]]
==== Finding the Current Price of Bitcoin ==== Finding the Current Price of Bitcoin
((("getting started", "exchange rates")))((("exchange rates", "determining")))Before Alice can buy bitcoin from Joe, they have to agree on the _exchange rate_ between bitcoin and US dollars. This brings up a common question for those new to Bitcoin: "Who sets the price Before Alice can buy bitcoin from Joe, they have to agree on the _exchange rate_ between bitcoin and US dollars. This brings up a common question for those new to Bitcoin: "Who sets the price
of bitcoins?" The short answer is that the price is set by markets. of bitcoins?" The short answer is that the price is set by markets.
((("exchange rates", "floating")))((("floating exchange rate")))Bitcoin, like most other currencies, has a _floating exchange rate_. That means that the value of bitcoin fluctuates according to supply and demand in the various markets where it is traded. For example, the "price" of bitcoin in US dollars is calculated in each market based on the most recent trade of bitcoins and US dollars. As such, the price tends to fluctuate minutely several times per second. A pricing service will aggregate the prices from several markets and calculate a volume-weighted average representing the broad market exchange rate of a currency pair (e.g., BTC/USD). Bitcoin, like most other currencies, has a _floating exchange rate_. That means that the value of bitcoin fluctuates according to supply and demand in the various markets where it is traded. For example, the "price" of bitcoin in US dollars is calculated in each market based on the most recent trade of bitcoins and US dollars. As such, the price tends to fluctuate minutely several times per second. A pricing service will aggregate the prices from several markets and calculate a volume-weighted average representing the broad market exchange rate of a currency pair (e.g., BTC/USD).
There are hundreds of applications and websites that can provide the current market rate. Here are some of the most popular: There are hundreds of applications and websites that can provide the current market rate. Here are some of the most popular:
https://bitcoinaverage.com/[Bitcoin Average]:: ((("BitcoinAverage")))A site that provides a simple view of the volume-weighted-average for each currency. https://bitcoinaverage.com/[Bitcoin Average]:: 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 bitcoins. https://coincap.io/[CoinCap]:: A service listing the market capitalization and exchange rates of hundreds of crypto-currencies, including bitcoins.
https://www.cmegroup.com/markets/cryptocurrencies/cme-cf-cryptocurrency-benchmarks.html?redirect=/trading/cryptocurrency-indices/cf-bitcoin-reference-rate.html[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://www.cmegroup.com/markets/cryptocurrencies/cme-cf-cryptocurrency-benchmarks.html?redirect=/trading/cryptocurrency-indices/cf-bitcoin-reference-rate.html[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.
@ -460,7 +460,7 @@ currencies.
((("getting started", "sending and receiving bitcoin", ((("getting started", "sending and receiving bitcoin",
id="GSsend01")))((("spending bitcoin", "bitcoin wallet quick start id="GSsend01")))((("spending bitcoin", "bitcoin wallet quick start
example")))((("spending bitcoin", see="also transactions")))Alice has example")))Alice has
decided to buy 0.001 bitcoins. After she and Joe check the exchange rate, decided to buy 0.001 bitcoins. After she and Joe check the exchange rate,
she gives Joe an appropriate amount of cash, opens her mobile wallet she gives Joe an appropriate amount of cash, opens her mobile wallet
application, and selects Receive. This application, and selects Receive. This
@ -511,7 +511,7 @@ transaction, Alice's wallet will indicate that it is receiving
[[confirmations]] [[confirmations]]
.Confirmations .Confirmations
**** ****
((("getting started", "confirmations")))((("confirmations", "bitcoin wallet quick start example")))((("confirmations", see="also mining and consensus; transactions")))((("clearing", seealso="confirmations")))At first, Alice's address will show the transaction from Joe as "Unconfirmed." This means that the transaction has been propagated to the network but has not yet been recorded in the Bitcoin transaction journal, known as the blockchain. To be confirmed, a transaction must be included in a block and added to the blockchain, which happens every 10 minutes, on average. In traditional financial terms this is known as _clearing_. For more details on propagation, validation, and clearing (confirmation) of bitcoin transactions, see <<mining>>. At first, Alice's address will show the transaction from Joe as "Unconfirmed." This means that the transaction has been propagated to the network but has not yet been recorded in the Bitcoin transaction journal, known as the blockchain. To be confirmed, a transaction must be included in a block and added to the blockchain, which happens every 10 minutes, on average. In traditional financial terms this is known as _clearing_. For more details on propagation, validation, and clearing (confirmation) of bitcoin transactions, see <<mining>>.
**** ****
Alice is now the proud owner of 0.001 BTC that she can spend. Over the next few days, Alice buys more bitcoin using an ATM and an exchange. In the next chapter we will look at her first purchase with Bitcoin, and examine the underlying transaction and propagation technologies in more detail.((("", startref="BCbasic01"))) Alice is now the proud owner of 0.001 BTC that she can spend. Over the next few days, Alice buys more bitcoin using an ATM and an exchange. In the next chapter we will look at her first purchase with Bitcoin, and examine the underlying transaction and propagation technologies in more detail.

View File

@ -29,7 +29,7 @@ the addresses used by modern Bitcoin software.
=== Public Key Cryptography === Public Key Cryptography
((("keys and addresses", "overview of", "public key ((("keys and addresses", "overview of", "public key
cryptography")))((("digital currencies", "cryptocurrency")))Public key cryptography")))Public key
cryptography was invented in the 1970s and is a mathematical foundation cryptography was invented in the 1970s and is a mathematical foundation
for modern computer and information security. for modern computer and information security.
@ -56,14 +56,14 @@ revealing the private key.
[TIP] [TIP]
==== ====
((("keys and addresses", "overview of", "key pairs")))In some wallet In some wallet
implementations, the private and public keys are stored together as a implementations, the private and public keys are stored together as a
_key pair_ for convenience. However, the public key can be calculated _key pair_ for convenience. However, the public key can be calculated
from the private key, so storing only the private key is also possible. from the private key, so storing only the private key is also possible.
==== ====
((("keys and addresses", "overview of", "private and public key ((("keys and addresses", "overview of", "private and public key
pairs")))((("elliptic curve cryptography")))((("cryptography", "elliptic pairs")))((("cryptography", "elliptic
curve cryptography")))A Bitcoin wallet contains a collection of key curve cryptography")))A Bitcoin wallet contains a collection of key
pairs, each consisting of a private key and a public key. The private pairs, each consisting of a private key and a public key. The private
key (k) is a number, usually derived from a number picked at random. key (k) is a number, usually derived from a number picked at random.
@ -73,8 +73,8 @@ generate a public key (K).
.Why Use Asymmetric Cryptography (Public/Private Keys)? .Why Use Asymmetric Cryptography (Public/Private Keys)?
**** ****
((("cryptography", "asymmetric")))((("digital signatures", "asymmetric ((("digital signatures", "asymmetric
cryptography and")))((("asymmetric cryptography")))Why is asymmetric cryptography and")))Why is asymmetric
cryptography used in Bitcoin? It's not used to "encrypt" (make secret) cryptography used in Bitcoin? It's not used to "encrypt" (make secret)
the transactions. Rather, a useful property of asymmetric cryptography the transactions. Rather, a useful property of asymmetric cryptography
is the ability to generate _digital signatures_. A private key can be is the ability to generate _digital signatures_. A private key can be
@ -92,7 +92,7 @@ signatures.
==== Private Keys ==== Private Keys
((("keys and addresses", "overview of", "private key ((("keys and addresses", "overview of", "private key
generation")))((("warnings and cautions", "private key protection")))A generation")))A
private key is simply a number, picked at random. Control private key is simply a number, picked at random. Control
over the private key is the root of user control over all funds over the private key is the root of user control over all funds
associated with the corresponding Bitcoin public key. The private key is associated with the corresponding Bitcoin public key. The private key is
@ -136,7 +136,7 @@ Otherwise, we simply try again with another random number.
[WARNING] [WARNING]
==== ====
((("random numbers", "random number generation")))((("entropy", "random ((("entropy", "random
number generation")))Do not write your own code to create a random number generation")))Do not write your own code to create a random
number or use a "simple" random number generator offered by your number or use a "simple" random number generator offered by your
programming language. Use a cryptographically secure pseudorandom number programming language. Use a cryptographically secure pseudorandom number
@ -288,13 +288,13 @@ Now that we have defined addition, we can define multiplication in the
standard way that extends addition. For a point P on the elliptic curve, standard way that extends addition. For a point P on the elliptic curve,
if k is a whole number, then kP = P + P + P + ... + P (k times). Note if k is a whole number, then kP = P + P + P + ... + P (k times). Note
that k is sometimes confusingly called an "exponent" in this case.((("", that k is sometimes confusingly called an "exponent" in this case.((("",
startref="eliptic04")))((("", startref="Celliptic04"))) startref="eliptic04")))
[[public_key_derivation]] [[public_key_derivation]]
==== Public Keys ==== Public Keys
((("keys and addresses", "overview of", "public key ((("keys and addresses", "overview of", "public key
calculation")))((("generator point")))The public key is calculated from calculation")))The public key is calculated from
the private key using elliptic curve multiplication, which is the private key using elliptic curve multiplication, which is
irreversible: _K_ = _k_ * _G_, where _k_ is the private key, _G_ is a irreversible: _K_ = _k_ * _G_, where _k_ is the private key, _G_ is a
constant point called the _generator point_, and _K_ is the resulting constant point called the _generator point_, and _K_ is the resulting
@ -317,7 +317,7 @@ signatures that prove control over bitcoin funds.
==== ====
((("keys and addresses", "overview of", "public key ((("keys and addresses", "overview of", "public key
generation")))((("generator point")))Starting with a private key in the generation")))Starting with a private key in the
form of a randomly generated number _k_, we multiply it by a form of a randomly generated number _k_, we multiply it by a
predetermined point on the curve called the _generator point_ _G_ to predetermined point on the curve called the _generator point_ _G_ to
produce another point somewhere else on the curve, which is the produce another point somewhere else on the curve, which is the
@ -379,7 +379,7 @@ geometric operation on the curve.
[TIP] [TIP]
==== ====
((("OpenSSL cryptographic library")))Many Bitcoin implementations use Many Bitcoin implementations use
the https://github.com/bitcoin-core/secp256k1[libsecp256k1 crytographic the https://github.com/bitcoin-core/secp256k1[libsecp256k1 crytographic
library] to do the elliptic curve math. library] to do the elliptic curve math.
==== ====
@ -727,7 +727,7 @@ image::images/mbc2_0405.png["pubkey_to_address"]
//https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2011-November/000778.html //https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2011-November/000778.html
((("public and private keys", "compressed public keys")))
When Bitcoin was first authored, its developers only knew how to create When Bitcoin was first authored, its developers only knew how to create
65-byte public keys. However, a later developer became aware of an 65-byte public keys. However, a later developer became aware of an
alternative encoding for public keys that used only 33 bytes and which alternative encoding for public keys that used only 33 bytes and which
@ -1375,7 +1375,7 @@ support for new Bitcoin features as soon as they become available.
[[priv_formats]] [[priv_formats]]
==== Private key formats ==== Private key formats
((("public and private keys", "private key formats")))The private key The private key
can be represented in a number of different formats, all of which can be represented in a number of different formats, all of which
correspond to the same 256-bit number. <<table_4-2>> shows several common correspond to the same 256-bit number. <<table_4-2>> shows several common
formats used to represent private keys. Different formats are used in formats used to represent private keys. Different formats are used in
@ -1438,7 +1438,7 @@ can easily be converted to any other format.
[[comp_priv]] [[comp_priv]]
===== Compressed private keys ===== Compressed private keys
((("public and private keys", "compressed private keys")))
the commonly used term "compressed private key" is a misnomer, because when a private the commonly used term "compressed private key" is a misnomer, because when a private
key is exported as WIF-compressed it is actually one byte _longer_ than key is exported as WIF-compressed it is actually one byte _longer_ than
an "uncompressed" private key. That is because the private key has an an "uncompressed" private key. That is because the private key has an
@ -1500,14 +1500,14 @@ from older wallets.
=== Advanced Keys and Addresses === Advanced Keys and Addresses
((("keys and addresses", "advanced forms", id="KAadvanced04")))In the In the
following sections we will look at advanced forms of keys and addresses, following sections we will look at advanced forms of keys and addresses,
such as vanity addresses and paper wallets. such as vanity addresses and paper wallets.
==== Vanity Addresses ==== Vanity Addresses
((("keys and addresses", "advanced forms", "vanity ((("keys and addresses", "advanced forms", "vanity
addresses")))((("vanity addresses", id="vanity04")))((("addresses", addresses")))((("addresses",
"vanity addresses", id="Avanity04")))Vanity addresses are valid Bitcoin "vanity addresses", id="Avanity04")))Vanity addresses are valid Bitcoin
addresses that contain human-readable messages. For example, addresses that contain human-readable messages. For example,
+1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33+ is a valid address that contains +1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33+ is a valid address that contains
@ -1603,7 +1603,7 @@ repeat until successful.
===== Vanity address security and privacy ===== Vanity address security and privacy
((("security", "vanity addresses")))Vanity addresses were popular in the Vanity addresses were popular in the
early years of Bitcoin but have almost entirely disappeared from use as early years of Bitcoin but have almost entirely disappeared from use as
of 2023. There are two likely causes for this trend: of 2023. There are two likely causes for this trend:
@ -1634,7 +1634,7 @@ the future unless the above problems are solved.
[[paper_wallets]] [[paper_wallets]]
==== Paper Wallets ==== Paper Wallets
((("keys and addresses", "advanced forms", "paper wallets")))((("paper ((("paper
wallets", id="paperw04")))((("wallets", "types of", "paper wallets", wallets", id="paperw04")))((("wallets", "types of", "paper wallets",
id="Wpaper04")))Paper wallets are private keys printed on paper. id="Wpaper04")))Paper wallets are private keys printed on paper.
Often the paper wallet also includes the corresponding Bitcoin address Often the paper wallet also includes the corresponding Bitcoin address
@ -1679,8 +1679,8 @@ opaque scratch-off stickers, or folded and sealed with tamper-proof
adhesive foil. Other designs feature additional copies of the key and adhesive foil. Other designs feature additional copies of the key and
address, in the form of detachable stubs similar to ticket stubs, address, in the form of detachable stubs similar to ticket stubs,
allowing you to store multiple copies to protect against fire, flood, or allowing you to store multiple copies to protect against fire, flood, or
other natural disasters.((("", startref="KAadvanced04")))((("", other natural disasters.((("",
startref="Wpaper04")))((("", startref="paperw04"))) startref="Wpaper04")))
[[paper_wallet_spw]] [[paper_wallet_spw]]
.An example of a paper wallet with additional copies of the keys on a backup "stub" .An example of a paper wallet with additional copies of the keys on a backup "stub"

View File

@ -1,7 +1,7 @@
[[mining]] [[mining]]
== Mining and Consensus == Mining and Consensus
((("mining and consensus", "purpose of")))The word "mining" is somewhat The word "mining" is somewhat
misleading. By evoking the extraction of precious metals, it focuses our misleading. By evoking the extraction of precious metals, it focuses our
attention on the reward for mining, the new bitcoins created in each attention on the reward for mining, the new bitcoins created in each
block. Although mining is incentivized by this reward, the primary block. Although mining is incentivized by this reward, the primary
@ -13,17 +13,17 @@ transactions are validated and cleared. Mining is one of the inventions that
makes Bitcoin special, a decentralized consensus mechanism that is the makes Bitcoin special, a decentralized consensus mechanism that is the
basis for P2P digital cash. basis for P2P digital cash.
((("mining and consensus", "decentralized consensus")))((("central ((("central
trusted authority")))Mining _secures the Bitcoin system_ and enables the trusted authority")))Mining _secures the Bitcoin system_ and enables the
emergence of network-wide _consensus without a central authority_. emergence of network-wide _consensus without a central authority_.
((("fees", "transaction fees")))The reward of newly minted bitcoins and The reward of newly minted bitcoins and
transaction fees is an incentive scheme that aligns the actions of transaction fees is an incentive scheme that aligns the actions of
miners with the security of the network, while simultaneously miners with the security of the network, while simultaneously
implementing the monetary supply. implementing the monetary supply.
[TIP] [TIP]
==== ====
((("decentralized systems", "bitcoin mining and")))
Mining Mining
is one of the mechanisms by which Bitcoin's _consensus security_ is _decentralized_. is one of the mechanisms by which Bitcoin's _consensus security_ is _decentralized_.
==== ====
@ -52,8 +52,8 @@ In some protocols built on top of Bitcoin, the topological order of
Bitcoin transactions is also used to establish a sequence of events; Bitcoin transactions is also used to establish a sequence of events;
we'll discuss that idea further in <<single_use_seals>>. we'll discuss that idea further in <<single_use_seals>>.
((("fees", "mining rewards")))((("mining and consensus", "mining rewards ((("mining and consensus", "mining rewards
and fees")))((("Proof-of-Work algorithm")))((("mining and consensus", and fees")))((("mining and consensus",
"Proof-of-Work algorithm")))Miners receive two types of rewards in "Proof-of-Work algorithm")))Miners receive two types of rewards in
return for the security provided by mining: new bitcoins created with each return for the security provided by mining: new bitcoins created with each
new block (called the _subsidy_), and transaction fees from all the transactions included in new block (called the _subsidy_), and transaction fees from all the transactions included in
@ -103,7 +103,7 @@ consensus.
=== Bitcoin Economics and Currency Creation === Bitcoin Economics and Currency Creation
((("mining and consensus", "bitcoin economics and currency ((("mining and consensus", "bitcoin economics and currency
creation")))((("currency creation")))((("money supply")))((("issuance creation")))((("issuance
rate")))Bitcoin are minted during the creation of each block at a rate")))Bitcoin are minted during the creation of each block at a
fixed and diminishing rate. Each block, generated on average every 10 fixed and diminishing rate. Each block, generated on average every 10
minutes, contains entirely new bitcoins, created from nothing. Every minutes, contains entirely new bitcoins, created from nothing. Every
@ -168,7 +168,7 @@ to inflate the supply of bitcoin.
.Deflationary Money .Deflationary Money
**** ****
((("deflationary money")))The most important and debated consequence of The most important and debated consequence of
fixed and diminishing monetary issuance is that the currency tends to be fixed and diminishing monetary issuance is that the currency tends to be
inherently _deflationary_. Deflation is the phenomenon of appreciation inherently _deflationary_. Deflation is the phenomenon of appreciation
of value due to a mismatch in supply and demand that drives up the value of value due to a mismatch in supply and demand that drives up the value
@ -206,7 +206,7 @@ outweighs the risks of deflation.
=== Decentralized Consensus === Decentralized Consensus
((("mining and consensus", "decentralized consensus")))((("decentralized ((("decentralized
systems", "consensus in")))In the previous chapter we looked at the systems", "consensus in")))In the previous chapter we looked at the
blockchain, the global list of all transactions, which blockchain, the global list of all transactions, which
everyone in the Bitcoin network accepts as the authoritative record of everyone in the Bitcoin network accepts as the authoritative record of
@ -226,7 +226,7 @@ and assemble a copy of the same blockchain as everyone else. This
chapter examines the process by which the Bitcoin network achieves chapter examines the process by which the Bitcoin network achieves
global consensus without central authority. global consensus without central authority.
((("emergent consensus")))((("mining and consensus", "emergent ((("mining and consensus", "emergent
consensus")))One of Satoshi Nakamoto's inventions is the decentralized consensus")))One of Satoshi Nakamoto's inventions is the decentralized
mechanism for _emergent consensus_. Emergent, because consensus is not mechanism for _emergent consensus_. Emergent, because consensus is not
achieved explicitly—there is no election or fixed moment when consensus achieved explicitly—there is no election or fixed moment when consensus
@ -261,7 +261,7 @@ trusted, public, global blockchain.
=== Independent Verification of Transactions === Independent Verification of Transactions
((("mining and consensus", "independent transaction ((("mining and consensus", "independent transaction
verification")))((("transactions", "independent verification of")))In verification")))In
<<c_transactions>>, we saw how wallet software creates transactions by <<c_transactions>>, we saw how wallet software creates transactions by
collecting UTXOs, providing the appropriate authentication data, and then collecting UTXOs, providing the appropriate authentication data, and then
constructing new outputs assigned to a new owner. The resulting constructing new outputs assigned to a new owner. The resulting
@ -316,7 +316,7 @@ _mempool_.
=== Mining Nodes === Mining Nodes
((("mining and consensus", "mining nodes")))((("Bitcoin nodes", "mining ((("Bitcoin nodes", "mining
nodes")))Some of the nodes on the Bitcoin network are specialized nodes nodes")))Some of the nodes on the Bitcoin network are specialized nodes
called _miners_. Jing is a called _miners_. Jing is a
Bitcoin miner; he Bitcoin miner; he
@ -334,7 +334,7 @@ containing Alice's transaction was mined by Jing's mining system and
follow Alice's transaction as it becomes part of this new block. follow Alice's transaction as it becomes part of this new block.
Jing's mining node maintains a local copy of the blockchain. By the time Jing's mining node maintains a local copy of the blockchain. By the time
((("use cases", "buying coffee")))Alice buys something, Jing's Alice buys something, Jing's
node is caught up with the chain of blocks with the most proof-of-work. node is caught up with the chain of blocks with the most proof-of-work.
Jing's node is listening Jing's node is listening
for transactions, trying to mine a new block and also listening for for transactions, trying to mine a new block and also listening for
@ -352,7 +352,7 @@ transactions in the memory pool and remove any that were included in
that block. Whatever transactions remain in the memory pool are that block. Whatever transactions remain in the memory pool are
unconfirmed and are waiting to be recorded in a new block. unconfirmed and are waiting to be recorded in a new block.
((("Proof-of-Work algorithm")))((("mining and consensus", "Proof-of-Work ((("mining and consensus", "Proof-of-Work
algorithm")))Jing's node immediately constructs a new partial block, a algorithm")))Jing's node immediately constructs a new partial block, a
candidate for the next block. This block is called a _candidate block_ candidate for the next block. This block is called a _candidate block_
because it is not yet a valid block, as it does not contain a valid because it is not yet a valid block, as it does not contain a valid
@ -365,7 +365,7 @@ transaction fees he'll attempt to claim.
==== The Coinbase Transaction ==== The Coinbase Transaction
((("coinbase transactions", id="coinbtrans10")))((("transactions", ((("transactions",
"coinbase transactions", id="Tcoinb10")))The first transaction in any "coinbase transactions", id="Tcoinb10")))The first transaction in any
block is a special transaction, called a _coinbase transaction_. This block is a special transaction, called a _coinbase transaction_. This
transaction is constructed by Jing's node and pays out his _reward_ for transaction is constructed by Jing's node and pays out his _reward_ for
@ -389,8 +389,8 @@ reward.
==== Coinbase Reward and Fees ==== Coinbase Reward and Fees
((("coinbase transactions", "rewards and fees")))((("fees", "transaction ((("fees", "transaction
fees")))((("mining and consensus", "rewards and fees")))To construct the fees")))To construct the
coinbase transaction, Jing's node first calculates the total amount of coinbase transaction, Jing's node first calculates the total amount of
transaction fees: transaction fees:
@ -430,7 +430,7 @@ The initial subsidy is calculated in satoshis by multiplying 50 with the
+COIN+ constant (100,000,000 satoshis). This sets the initial reward +COIN+ constant (100,000,000 satoshis). This sets the initial reward
(+nSubsidy+) at 5 billion satoshis. (+nSubsidy+) at 5 billion satoshis.
((("halvings")))Next, the function calculates the number of +halvings+ Next, the function calculates the number of +halvings+
that have occurred by dividing the current block height by the halving that have occurred by dividing the current block height by the halving
interval (+SubsidyHalvingInterval+). interval (+SubsidyHalvingInterval+).
@ -458,7 +458,7 @@ only gets to spend the reward if the block is accepted by everyone.
==== Structure of the Coinbase Transaction ==== Structure of the Coinbase Transaction
((("coinbase transactions", "structure of")))With these calculations, With these calculations,
Jing's node then constructs the coinbase transaction to pay himself Jing's node then constructs the coinbase transaction to pay himself
the block reward. the block reward.
@ -504,14 +504,14 @@ the miners, as we will see next.
[[duplicate_transactions]] [[duplicate_transactions]]
==== Coinbase Data ==== Coinbase Data
((("coinbase transactions", "coinbase data")))Coinbase transactions do Coinbase transactions do
not have an input script field. Instead, this not have an input script field. Instead, this
field is replaced by coinbase data, which must be between 2 and 100 field is replaced by coinbase data, which must be between 2 and 100
bytes. Except for the first few bytes, the rest of the coinbase data can bytes. Except for the first few bytes, the rest of the coinbase data can
be used by miners in any way they want; it is arbitrary data. be used by miners in any way they want; it is arbitrary data.
((("nonce values")))((("blocks", "genesis block")))((("blockchain ((("blockchain
(the)", "genesis block")))((("genesis block")))In the genesis block, for (the)", "genesis block")))In the genesis block, for
example, Satoshi Nakamoto added the text "The Times 03/Jan/2009 example, Satoshi Nakamoto added the text "The Times 03/Jan/2009
Chancellor on brink of second bailout for banks" in the coinbase data, Chancellor on brink of second bailout for banks" in the coinbase data,
using it as a proof of the earliest date this block chould have been using it as a proof of the earliest date this block chould have been
@ -526,8 +526,8 @@ version field set to 2 or higher) must contain the block height as a script
=== Constructing the Block Header === Constructing the Block Header
((("mining and consensus", "constructing block headers")))((("blocks", ((("blocks",
"headers")))((("headers")))((("blockchain (the)", "block headers")))To "headers")))To
construct the block header, the mining node needs to fill in six fields, construct the block header, the mining node needs to fill in six fields,
as listed in <<block_header_structure_ch10>>. as listed in <<block_header_structure_ch10>>.
@ -564,7 +564,7 @@ Today, VersionBits field has no meaning unless there's an attempt to
upgrade the consensus protocol underway, in which case you will need to upgrade the consensus protocol underway, in which case you will need to
read its documentation to determine how it is using VersionBits. read its documentation to determine how it is using VersionBits.
((("blocks", "parent blocks")))((("parent blocks")))Next, the mining Next, the mining
node needs to add the "Previous Block Hash" (also known as +prevhash+). node needs to add the "Previous Block Hash" (also known as +prevhash+).
That is the hash of the block header of the previous block That is the hash of the block header of the previous block
received from the network, which Jing's node has accepted and received from the network, which Jing's node has accepted and
@ -577,7 +577,7 @@ Block Hash field in the candidate block header, Jing is committing his
mining power to extending the chain that ends in that specific block. mining power to extending the chain that ends in that specific block.
==== ====
((("merkle trees")))((("blockchain (the)", "merkle trees")))The next The next
step is to commit to all the transactions using merkle trees. Each step is to commit to all the transactions using merkle trees. Each
transaction is listed using its witness transaction identifier (_wtxid_) transaction is listed using its witness transaction identifier (_wtxid_)
in topographical order, with 32 0x00 bytes standing in for the wtxid of in topographical order, with 32 0x00 bytes standing in for the wtxid of
@ -622,15 +622,15 @@ the header before a version is found that satisfies the requirement.
=== Mining the Block === Mining the Block
((("mining and consensus", "mining the block", id="MACmining10")))Now Now
that a candidate block has been constructed by Jing's node, it is time that a candidate block has been constructed by Jing's node, it is time
for Jing's hardware mining rig to "mine" the block, to find a solution for Jing's hardware mining rig to "mine" the block, to find a solution
to the Proof-of-Work algorithm that makes the block valid. Throughout to the Proof-of-Work algorithm that makes the block valid. Throughout
this book we have studied cryptographic hash functions as used in this book we have studied cryptographic hash functions as used in
various aspects of the Bitcoin system. The hash function SHA256 is the various aspects of the Bitcoin system. The hash function SHA256 is the
function used in Bitcoin's mining process.((("", startref="jingten"))) function used in Bitcoin's mining process.
((("mining and consensus", "defined")))In the simplest terms, mining is In the simplest terms, mining is
the process of hashing the candidate block header repeatedly, changing one the process of hashing the candidate block header repeatedly, changing one
parameter, until the resulting hash matches a specific target. The hash parameter, until the resulting hash matches a specific target. The hash
function's result cannot be determined in advance, nor can a pattern be function's result cannot be determined in advance, nor can a pattern be
@ -641,14 +641,14 @@ until the desired hash result appears by chance.
==== Proof-of-Work Algorithm ==== Proof-of-Work Algorithm
((("Proof-of-Work algorithm", id="proof10")))((("mining and consensus", ((("mining and consensus",
"Proof-of-Work algorithm", id="Cproof10")))A hash algorithm takes an "Proof-of-Work algorithm", id="Cproof10")))A hash algorithm takes an
arbitrary-length data input and produces a fixed-length deterministic arbitrary-length data input and produces a fixed-length deterministic
result, called a _digest_. The digest is a digital commitment to the result, called a _digest_. The digest is a digital commitment to the
input. For any specific input, the resulting digest will always be the input. For any specific input, the resulting digest will always be the
same and can be easily calculated and same and can be easily calculated and
verified by anyone implementing the same hash algorithm. verified by anyone implementing the same hash algorithm.
((("collisions")))A key characteristic of a cryptographic hash A key characteristic of a cryptographic hash
algorithm is that it is computationally infeasible to find two different algorithm is that it is computationally infeasible to find two different
inputs that produce the same digest (known as a _collision_). As a inputs that produce the same digest (known as a _collision_). As a
corollary, it is also virtually impossible to select an input in such a corollary, it is also virtually impossible to select an input in such a
@ -753,7 +753,7 @@ the target. A lower target means it is more difficult to find a hash
below the target. The target and difficulty are inversely related. below the target. The target and difficulty are inversely related.
==== ====
((("targets")))Bitcoin's Proof-of-Work is very similar to the challenge Bitcoin's Proof-of-Work is very similar to the challenge
shown in <<sha256_example_generator_output>>. The miner constructs a shown in <<sha256_example_generator_output>>. The miner constructs a
candidate block filled with transactions. Next, the miner calculates the candidate block filled with transactions. Next, the miner calculates the
hash of this block's header and sees if it is smaller than the current hash of this block's header and sees if it is smaller than the current
@ -769,7 +769,7 @@ enough block header hash.
//TODO:use visual representation like I did on bitcoin.org //TODO:use visual representation like I did on bitcoin.org
((("mining and consensus", "mining the block", "target ((("mining and consensus", "mining the block", "target
representation")))((("targets", id="targets10"))) representation")))
Block headers contain the target in a notation called "target Block headers contain the target in a notation called "target
bits" or just "bits," which in block 277,316 has the value of bits" or just "bits," which in block 277,316 has the value of
+0x1903a30c+. This notation expresses the Proof-of-Work target as a +0x1903a30c+. This notation expresses the Proof-of-Work target as a
@ -929,7 +929,7 @@ electricity into hashing computation at the highest rate possible. The
primary influence on the mining market is the price of one kilowatt-hour primary influence on the mining market is the price of one kilowatt-hour
of electricity in bitcoin, because that determines the profitability of of electricity in bitcoin, because that determines the profitability of
mining and therefore the incentives to enter or exit the mining mining and therefore the incentives to enter or exit the mining
market.((("", startref="targets10"))) market.
[[mtp]] [[mtp]]
=== Median Time Past (MTP) === Median Time Past (MTP)
@ -988,7 +988,7 @@ sequence, +CLTV+, and +CSV+.
=== Successfully Mining the Block === Successfully Mining the Block
((("mining and consensus", "mining the block", "successful ((("mining and consensus", "mining the block", "successful
completion")))((("use cases", "mining for bitcoin", id="jingtentwo")))As completion")))As
we saw earlier, Jing's node has constructed a candidate block and we saw earlier, Jing's node has constructed a candidate block and
prepared it for mining. Jing has several hardware mining rigs with prepared it for mining. Jing has several hardware mining rigs with
application-specific integrated circuits, where hundreds of thousands of application-specific integrated circuits, where hundreds of thousands of
@ -1021,12 +1021,12 @@ chain it extends.
In the next section, we'll look at the process each node uses to In the next section, we'll look at the process each node uses to
validate a block and select the most-work chain, creating the consensus validate a block and select the most-work chain, creating the consensus
that forms the decentralized blockchain.((("", that forms the decentralized blockchain.((("",
startref="MACmining10")))((("", startref="jingtentwo"))) startref="MACmining10")))
=== Validating a New Block === Validating a New Block
((("mining and consensus", "new block validation")))((("blocks", "new ((("blocks", "new
block validation")))((("validation")))The third step in Bitcoin's block validation")))The third step in Bitcoin's
consensus mechanism is independent validation of each new block by every consensus mechanism is independent validation of each new block by every
node on the network. As the newly solved block moves across the network, node on the network. As the newly solved block moves across the network,
each node performs a series of tests to validate it. each node performs a series of tests to validate it.
@ -1154,8 +1154,8 @@ forks (in addition to other problems), so many people prefer Bitcoin's
==== ====
((("", ((("",
startref="Bassemble10")))((("", startref="MACassembling10")))((("", startref="Bassemble10")))((("",
startref="forks10")))((("", startref="BCTfork10"))) startref="forks10")))
=== Mining and the Hash Lottery === Mining and the Hash Lottery
@ -1181,7 +1181,7 @@ a rapid pace.
[[extra_nonce]] [[extra_nonce]]
==== The Extra Nonce Solution ==== The Extra Nonce Solution
((("nonce values")))Since 2012, mining has evolved to resolve a Since 2012, mining has evolved to resolve a
fundamental limitation in the structure of the block header. In the fundamental limitation in the structure of the block header. In the
early days of Bitcoin, a miner could find a block by iterating through early days of Bitcoin, a miner could find a block by iterating through
the nonce until the resulting hash was below the target. As difficulty the nonce until the resulting hash was below the target. As difficulty
@ -1222,7 +1222,7 @@ entire left flank of the merkle tree up to the root.
[[mining_pools]] [[mining_pools]]
==== Mining Pools ==== Mining Pools
((("mining pools", id="MACoverpool10")))((("mining pools", "benefits ((("mining pools", "benefits
of")))In this highly competitive environment, individual miners working of")))In this highly competitive environment, individual miners working
alone (also known as solo miners) don't stand a chance. The likelihood alone (also known as solo miners) don't stand a chance. The likelihood
of them finding a block to offset their electricity and hardware costs of them finding a block to offset their electricity and hardware costs
@ -1263,7 +1263,7 @@ the miners' Bitcoin addresses, once their share of the rewards has
reached a certain threshold. Typically, the pool server charges a reached a certain threshold. Typically, the pool server charges a
percentage fee of the rewards for providing the pool-mining service. percentage fee of the rewards for providing the pool-mining service.
((("mining pools", "operation of")))Miners participating in a pool split Miners participating in a pool split
the work of searching for a solution to a candidate block, earning the work of searching for a solution to a candidate block, earning
"shares" for their mining contribution. The mining pool sets a higher "shares" for their mining contribution. The mining pool sets a higher
target (lower difficulty) for earning a share, typically more than 1,000 target (lower difficulty) for earning a share, typically more than 1,000
@ -1322,7 +1322,7 @@ whole pool wins.
===== Managed pools ===== Managed pools
((("mining pools", "managed pools")))((("pool operators", ((("pool operators",
seealso="mining pools")))Most mining pools are "managed," meaning that seealso="mining pools")))Most mining pools are "managed," meaning that
there is a company or individual running a pool server. The owner of the there is a company or individual running a pool server. The owner of the
pool server is called the _pool operator_, and he charges pool miners a pool server is called the _pool operator_, and he charges pool miners a
@ -1356,7 +1356,7 @@ using their own full node.
===== Peer-to-peer mining pool (P2Pool) ===== Peer-to-peer mining pool (P2Pool)
((("mining pools", "peer-to-peer pools (P2Pool)")))((("peer-to-peer ((("peer-to-peer
pools (P2Pool)")))Managed pools using Stratum v1 create the possibility of cheating by pools (P2Pool)")))Managed pools using Stratum v1 create the possibility of cheating by
the pool operator, who might direct the pool effort to double-spend the pool operator, who might direct the pool effort to double-spend
transactions or invalidate blocks (see <<consensus_attacks>>). transactions or invalidate blocks (see <<consensus_attacks>>).
@ -1403,7 +1403,7 @@ robust overall, as part of a diversified mining ecosystem. As of this
writing, P2Pool has fallen into disuse, but new protocols such as writing, P2Pool has fallen into disuse, but new protocols such as
Stratum v2 can allow individual miners to choose the transactions they Stratum v2 can allow individual miners to choose the transactions they
include in their blocks.((("", include in their blocks.((("",
startref="MAChash10")))((("", startref="MACoverpool10"))) startref="MAChash10")))
[[consensus_attacks]] [[consensus_attacks]]
=== Hashrate Attacks === Hashrate Attacks
@ -1486,7 +1486,7 @@ original payment to Carol. Carol is now missing the three paintings and
also has no payment. Throughout all this activity, Paul's mining also has no payment. Throughout all this activity, Paul's mining
pool participants might remain blissfully unaware of the double-spend pool participants might remain blissfully unaware of the double-spend
attempt, because they mine with automated miners and cannot monitor attempt, because they mine with automated miners and cannot monitor
every transaction or block.((("", startref="carolten"))) every transaction or block.
((("confirmations", "of large-value transactions", ((("confirmations", "of large-value transactions",
secondary-sortas="large-value transactions")))To protect against this secondary-sortas="large-value transactions")))To protect against this
@ -1575,7 +1575,7 @@ between all participants.
[[hard_forks]] [[hard_forks]]
==== Hard Forks ==== Hard Forks
((("forks", "changing consensus rules", id="forks10a")))((("forks", ((("forks",
"changing consensus rules", "hard forks")))In <<forks>> we looked at how "changing consensus rules", "hard forks")))In <<forks>> we looked at how
the Bitcoin network may briefly diverge, with two parts of the network the Bitcoin network may briefly diverge, with two parts of the network
following two different branches of the blockchain for a short time. We following two different branches of the blockchain for a short time. We
@ -1644,7 +1644,7 @@ valid block.
==== Hard Forks: Software, Network, Mining, and Chain ==== Hard Forks: Software, Network, Mining, and Chain
((("forks", "changing consensus rules", "software forks")))For software For software
developers, the term "fork" has another meaning, adding confusion to the developers, the term "fork" has another meaning, adding confusion to the
term "hard fork." In open source software, a fork occurs when a group of term "hard fork." In open source software, a fork occurs when a group of
developers choose to follow a different software roadmap and start a developers choose to follow a different software roadmap and start a
@ -1740,7 +1740,7 @@ transactions.
==== Contentious Hard Forks ==== Contentious Hard Forks
((("forks", "changing consensus rules", "contentious hard ((("forks", "changing consensus rules", "contentious hard
forks")))((("hard forks")))This is the dawn of the development of software forks")))This is the dawn of the development of software
for decentralized consensus. Just as other innovations in development changed both the methods for decentralized consensus. Just as other innovations in development changed both the methods
and products of software and created new methodologies, new tools, and and products of software and created new methodologies, new tools, and
new communities in its wake, consensus software development also new communities in its wake, consensus software development also
@ -1765,7 +1765,7 @@ consensus modifications.
==== Soft Forks ==== Soft Forks
((("forks", "changing consensus rules", "soft forks")))((("soft forks", ((("soft forks",
"defined")))Not all consensus rule changes cause a hard fork. Only "defined")))Not all consensus rule changes cause a hard fork. Only
consensus changes that are forward-incompatible cause a fork. If the consensus changes that are forward-incompatible cause a fork. If the
change is implemented in such a way that an unmodified client still sees change is implemented in such a way that an unmodified client still sees
@ -1792,7 +1792,7 @@ nonupgraded nodes out of consensus.
===== Soft forks redefining NOP opcodes ===== Soft forks redefining NOP opcodes
((("opcodes", "redefinition by soft forks")))((("soft forks", ((("soft forks",
"redefinition of NOP codes")))Two soft forks have been "redefinition of NOP codes")))Two soft forks have been
implemented in Bitcoin, based on the re-interpretation of NOP opcodes. implemented in Bitcoin, based on the re-interpretation of NOP opcodes.
Bitcoin Script had ten opcodes reserved for future use, NOP1 through Bitcoin Script had ten opcodes reserved for future use, NOP1 through
@ -1811,7 +1811,7 @@ the old clients, the script contains an NOP code, which is ignored.
==== Criticisms of Soft Forks ==== Criticisms of Soft Forks
((("forks", "changing consensus rules", "soft fork drawbacks")))((("soft ((("soft
forks", "drawbacks of")))Soft forks based on the NOP opcodes are forks", "drawbacks of")))Soft forks based on the NOP opcodes are
relatively uncontroversial. The NOP opcodes were placed in Bitcoin relatively uncontroversial. The NOP opcodes were placed in Bitcoin
Script with the explicit goal of allowing non-disruptive upgrades. Script with the explicit goal of allowing non-disruptive upgrades.
@ -1840,13 +1840,13 @@ a loss of funds under the old rules. For example, if a CLTV transaction
is evaluated under the old rules, there is no timelock constraint and it is evaluated under the old rules, there is no timelock constraint and it
can be spent at any time. Therefore, critics contend that a failed soft can be spent at any time. Therefore, critics contend that a failed soft
fork that had to be reversed because of a bug would almost certainly fork that had to be reversed because of a bug would almost certainly
lead to loss of funds.((("", startref="Crule10"))) lead to loss of funds.
[[softforksignaling]] [[softforksignaling]]
=== Soft Fork Signaling with Block Version === Soft Fork Signaling with Block Version
((("forks", "changing consensus rules", "soft fork ((("forks", "changing consensus rules", "soft fork
activation")))((("soft forks", "activation")))Since soft forks allow activation")))Since soft forks allow
unmodified clients to continue to operate within consensus, one unmodified clients to continue to operate within consensus, one
mechanism for "activating" a soft fork is through miners signaling that mechanism for "activating" a soft fork is through miners signaling that
they are ready and willing to enforce the new consensus rules. If they are ready and willing to enforce the new consensus rules. If
@ -2006,7 +2006,7 @@ image::images/mbc2_1010.png[BIP9 Proposal State Transition Diagram]
BIP9 was first implemented for the activation of +CHECKSEQUENCEVERIFY+ BIP9 was first implemented for the activation of +CHECKSEQUENCEVERIFY+
and associated BIPs (68, 112, 113). The proposal named "csv" was and associated BIPs (68, 112, 113). The proposal named "csv" was
activated successfully in July of 2016.((("", startref="forks10a"))) activated successfully in July of 2016.
The standard is defined in The standard is defined in
https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki[BIP9 https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki[BIP9
@ -2117,7 +2117,7 @@ state of this system with only a few changes possible if there is strong
consensus by a very large majority. The 95% threshold for soft forks is consensus by a very large majority. The 95% threshold for soft forks is
reflective of this reality. reflective of this reality.
((("hard forks")))It is important to recognize that there is no perfect It is important to recognize that there is no perfect
solution for consensus development. Both hard forks and soft forks solution for consensus development. Both hard forks and soft forks
involve tradeoffs. For some types of changes, soft forks may be a better involve tradeoffs. For some types of changes, soft forks may be a better
choice; for others, hard forks may be a better choice. There is no choice; for others, hard forks may be a better choice. There is no

View File

@ -1,7 +1,7 @@
[[bitcoin_network_ch08]] [[bitcoin_network_ch08]]
== The Bitcoin Network == The Bitcoin Network
((("Bitcoin network", "peer-to-peer architecture")))((("peer-to-peer ((("peer-to-peer
(P2P)")))Bitcoin is structured as a peer-to-peer network architecture on (P2P)")))Bitcoin is structured as a peer-to-peer network architecture on
top of the internet. The term peer-to-peer, or P2P, means that the top of the internet. The term peer-to-peer, or P2P, means that the
full nodes which participate in the network are peers to each other, that full nodes which participate in the network are peers to each other, that
@ -26,7 +26,7 @@ characteristic. Decentralization of control is a core design principle
that can only be achieved and maintained by a flat and decentralized P2P that can only be achieved and maintained by a flat and decentralized P2P
consensus network. consensus network.
((("Bitcoin network", "defined")))The term "Bitcoin network" refers to The term "Bitcoin network" refers to
the collection of nodes running the Bitcoin P2P protocol. In addition to the collection of nodes running the Bitcoin P2P protocol. In addition to
the Bitcoin P2P protocol, there are other protocols that the Bitcoin P2P protocol, there are other protocols that
are used for mining and lightweight wallets. These additional are used for mining and lightweight wallets. These additional
@ -55,8 +55,8 @@ only a subset of the blockchain and partly verify transactions using a method
called _simplified payment verification_, or SPV. ((("lightweight called _simplified payment verification_, or SPV. ((("lightweight
clients")))These clients are known as lightweight clients. clients")))These clients are known as lightweight clients.
((("Bitcoin nodes", "mining nodes")))((("mining and consensus", "mining ((("mining and consensus", "mining
nodes")))((("Proof-of-Work algorithm")))((("mining and consensus", nodes")))((("mining and consensus",
"Proof-of-Work algorithm")))Miners compete to create new blocks by "Proof-of-Work algorithm")))Miners compete to create new blocks by
running specialized hardware to solve the Proof-of-Work algorithm. Some running specialized hardware to solve the Proof-of-Work algorithm. Some
miners operate full nodes, validating every block on the miners operate full nodes, validating every block on the
@ -74,7 +74,7 @@ mining pool protocols and lightweight client-access protocols.
=== The Network === The Network
((("", startref="BNnode08")))((("", startref="BNtype08")))((("Bitcoin ((("Bitcoin
network", "extended network activities")))As of this writing, the main Bitcoin network, network", "extended network activities")))As of this writing, the main Bitcoin network,
running the Bitcoin P2P protocol, consists of about 10,000 running the Bitcoin P2P protocol, consists of about 10,000
listening nodes running various versions of Bitcoin Core and a few listening nodes running various versions of Bitcoin Core and a few
@ -249,7 +249,7 @@ several Virtual Private Servers (VPSes) hosted on
infrastructure around the world and served to connect the majority of infrastructure around the world and served to connect the majority of
miners and mining pools. miners and mining pools.
((("Fast Internet Bitcoin Relay Engine (FIBRE)")))((("Compact Block ((("Compact Block
optimization")))The original Bitcoin Relay Network was replaced in 2016 optimization")))The original Bitcoin Relay Network was replaced in 2016
with the introduction of the _Fast Internet Bitcoin Relay Engine_ or with the introduction of the _Fast Internet Bitcoin Relay Engine_ or
https://bitcoinfibre.org[_FIBRE_], also created by developer Matt https://bitcoinfibre.org[_FIBRE_], also created by developer Matt
@ -419,14 +419,14 @@ connection for too long, it is assumed to be disconnected
and a new peer will be sought. Thus, the network dynamically adjusts to and a new peer will be sought. Thus, the network dynamically adjusts to
transient nodes and network problems, and can organically grow and transient nodes and network problems, and can organically grow and
shrink as needed without any central control.((("", shrink as needed without any central control.((("",
startref="BNextend08")))((("", startref="BNodiscover08"))) startref="BNextend08")))
=== Full Nodes === Full Nodes
Full nodes are nodes that verify every transaction in every block on the Full nodes are nodes that verify every transaction in every block on the
valid blockchain with the most proof of work. valid blockchain with the most proof of work.
((("blocks", "genesis block")))((("genesis block")))((("blockchain ((("blockchain
(the)", "genesis block")))Full nodes (the)", "genesis block")))Full nodes
independently process every block, starting after the very first independently process every block, starting after the very first
block (genesis block) and building up to the latest known block in the block (genesis block) and building up to the latest known block in the
@ -437,11 +437,11 @@ receive updates about new blocks of transactions, which it then verifies
and incorporates into its local view of which scripts control which and incorporates into its local view of which scripts control which
bitcoins, called the set of _unspent transaction outputs_ (UTXOs). bitcoins, called the set of _unspent transaction outputs_ (UTXOs).
((("Bitcoin nodes", "full nodes")))Running a full node gives Running a full node gives
you the pure Bitcoin experience: independent verification of all you the pure Bitcoin experience: independent verification of all
transactions without the need to rely on, or trust, any other systems. transactions without the need to rely on, or trust, any other systems.
((("Satoshi client")))There are a few alternative implementations of There are a few alternative implementations of
full nodes, built using different programming full nodes, built using different programming
languages and software architectures, or which made different design languages and software architectures, or which made different design
decisions. However, the most common decisions. However, the most common
@ -453,7 +453,7 @@ command +getpeerinfo+ as we saw earlier; for example, +/Satoshi:24.0.1/+.
=== Exchanging "Inventory" === Exchanging "Inventory"
((("Bitcoin network", "syncing the blockchain")))The first thing a full The first thing a full
node will do once it connects to peers is try to construct a complete node will do once it connects to peers is try to construct a complete
chain of block headers. If it is a brand-new node and has no blockchain at all, it chain of block headers. If it is a brand-new node and has no blockchain at all, it
only knows one block, the genesis block, which is statically embedded in only knows one block, the genesis block, which is statically embedded in
@ -461,7 +461,7 @@ the client software. Starting after block #0 (the genesis block), the new
node will have to download hundreds of thousands of blocks to node will have to download hundreds of thousands of blocks to
synchronize with the network and reestablish the full blockchain. synchronize with the network and reestablish the full blockchain.
((("blockchain (the)", "syncing the blockchain")))((("syncing")))The The
process of syncing the blockchain starts with the +version+ message, process of syncing the blockchain starts with the +version+ message,
because that contains +BestHeight+, a node's current blockchain height because that contains +BestHeight+, a node's current blockchain height
(number of blocks). A node will see the +version+ messages from its (number of blocks). A node will see the +version+ messages from its
@ -607,13 +607,13 @@ incoming and outgoing transactions.
Bloom filters allow lightweight clients to receive a subset of Bloom filters allow lightweight clients to receive a subset of
the transactions without directly revealing precisely which addresses they are the transactions without directly revealing precisely which addresses they are
interested in, through a filtering mechanism that uses probabilities interested in, through a filtering mechanism that uses probabilities
rather than fixed patterns.((("", startref="BNspvnodes08")))((("", rather than fixed patterns.((("",
startref="simple08"))) startref="simple08")))
[[bloom_filters]] [[bloom_filters]]
=== Bloom Filters === Bloom Filters
((("bitcoin network", "bloom filters", id="BNebloom08")))((("bloom ((("bloom
filters", id="bloom08")))((("privacy, maintaining", filters", id="bloom08")))((("privacy, maintaining",
id="privacy08")))((("security", "maintaining privacy", id="privacy08")))((("security", "maintaining privacy",
id="Sprivacy08")))A bloom filter is a probabilistic search filter, a way id="Sprivacy08")))A bloom filter is a probabilistic search filter, a way
@ -742,7 +742,7 @@ them) that a lightweight client receives from its peers, selecting only
transactions of interest to the lightweight client without revealing exactly which transactions of interest to the lightweight client without revealing exactly which
addresses or keys it is interested in. addresses or keys it is interested in.
((("transaction IDs (txid)")))A lightweight client will initialize a bloom filter A lightweight client will initialize a bloom filter
as "empty"; in that state the bloom filter will not match any patterns. as "empty"; in that state the bloom filter will not match any patterns.
The lightweight client will then make a list of all the addresses, keys, and The lightweight client will then make a list of all the addresses, keys, and
hashes that it is interested in. It will do this by extracting the hashes that it is interested in. It will do this by extracting the
@ -751,7 +751,7 @@ controlled by its wallet. The lightweight client then adds each of these to the
bloom filter, so that the bloom filter will "match" if these patterns bloom filter, so that the bloom filter will "match" if these patterns
are present in a transaction, without revealing the patterns themselves. are present in a transaction, without revealing the patterns themselves.
((("Bitcoin nodes", "full nodes")))The lightweight client will then send a The lightweight client will then send a
+filterload+ message to the peer, containing the bloom filter to use on +filterload+ message to the peer, containing the bloom filter to use on
the connection. On the peer, bloom filters are checked against each the connection. On the peer, bloom filters are checked against each
incoming transaction. The full node checks several parts of the incoming transaction. The full node checks several parts of the
@ -1139,7 +1139,7 @@ client.
=== Encrypted and Authenticated Connections === Encrypted and Authenticated Connections
((("Bitcoin network", "encrypted ((("Bitcoin network", "encrypted
connections")))((("encryption")))((("authentication")))Most new users of connections")))Most new users of
Bitcoin assume that the network communications of a Bitcoin node are Bitcoin assume that the network communications of a Bitcoin node are
encrypted. In fact, the original implementation of Bitcoin communicates encrypted. In fact, the original implementation of Bitcoin communicates
entirely in the clear, as does the modern implementation of Bitcoin Core entirely in the clear, as does the modern implementation of Bitcoin Core
@ -1151,7 +1151,7 @@ communications: _Tor Transport_.
==== Tor Transport ==== Tor Transport
((("Tor network")))((("The Onion Routing network (Tor)")))Tor, which Tor, which
stands for _The Onion Routing network_, is a software project and stands for _The Onion Routing network_, is a software project and
network that offers encryption and encapsulation of data through network that offers encryption and encapsulation of data through
randomized network paths that offer anonymity, untraceability and randomized network paths that offer anonymity, untraceability and
@ -1183,8 +1183,8 @@ online tutorials.
[[mempool]] [[mempool]]
=== Mempools and orphan pools === Mempools and orphan pools
((("Bitcoin network", "transaction pools")))((("transaction ((("transaction
pools")))((("memory pools (mempools)")))Almost every node on the Bitcoin pools")))Almost every node on the Bitcoin
network maintains a temporary list of unconfirmed transactions called network maintains a temporary list of unconfirmed transactions called
the _memory pool_ (_mempool_). Nodes use this pool the _memory pool_ (_mempool_). Nodes use this pool
to keep track of transactions that are known to the network but are not to keep track of transactions that are known to the network but are not
@ -1194,7 +1194,7 @@ As unconfirmed transactions are received and verified, they are added to the
mempool and relayed to the neighboring nodes to propagate on mempool and relayed to the neighboring nodes to propagate on
the network. the network.
((("orphan pools")))((("transactions", "orphaned")))Some node Some node
implementations also maintain a separate pool of orphaned transactions. implementations also maintain a separate pool of orphaned transactions.
If a transaction's inputs refer to a transaction that is not yet known, If a transaction's inputs refer to a transaction that is not yet known,
such as a missing parent, the orphan transaction will be stored such as a missing parent, the orphan transaction will be stored

View File

@ -1,7 +1,7 @@
[[ch02_bitcoin_overview]] [[ch02_bitcoin_overview]]
== How Bitcoin Works == How Bitcoin Works
((("bitcoin", "overview of", id="BCover02")))((("central trusted ((("central trusted
authority")))((("decentralized systems", "bitcoin overview", authority")))((("decentralized systems", "bitcoin overview",
id="DCSover02")))The Bitcoin system, unlike traditional banking and id="DCSover02")))The Bitcoin system, unlike traditional banking and
payment systems, does not require trust in third parties. Instead of a central payment systems, does not require trust in third parties. Instead of a central
@ -22,7 +22,7 @@ transactions that are propagated across the network, and miners who
produce (through competitive computation) the consensus blockchain, produce (through competitive computation) the consensus blockchain,
which is the authoritative journal of all transactions. which is the authoritative journal of all transactions.
((("blockchain explorer sites")))Each example in this chapter is based Each example in this chapter is based
on an actual transaction made on the Bitcoin network, simulating the on an actual transaction made on the Bitcoin network, simulating the
interactions between several users by sending interactions between several users by sending
funds from one wallet to another. While tracking a transaction through funds from one wallet to another. While tracking a transaction through
@ -36,7 +36,7 @@ relationships and flows between them.
.Bitcoin overview .Bitcoin overview
image::images/mbc2_0201.png["Bitcoin Overview"] image::images/mbc2_0201.png["Bitcoin Overview"]
((("Bitcoin Block Explorer")))Popular blockchain explorers include: Popular blockchain explorers include:
* https://blockstream.info/[Blockstream Explorer] * https://blockstream.info/[Blockstream Explorer]
* https://mempool.space[Mempool.Space] * https://mempool.space[Mempool.Space]
@ -81,7 +81,7 @@ Alice is offered the option to pay with bitcoin, in addition to the
usual options. The checkout cart displays the price in US dollars and usual options. The checkout cart displays the price in US dollars and
also in bitcoin (BTC), at Bitcoin's prevailing exchange rate. also in bitcoin (BTC), at Bitcoin's prevailing exchange rate.
((("payment requests")))((("QR codes", "payment requests")))Bob's Bob's
e-commerce system will automatically create a QR code containing an e-commerce system will automatically create a QR code containing an
_invoice_ (<<invoice-QR>>). _invoice_ (<<invoice-QR>>).
@ -103,7 +103,7 @@ image::images/mbc2_0202.png["payment-request"]
[TIP] [TIP]
==== ====
((("QR codes", "warnings and cautions")))((("transactions", "warnings ((("transactions", "warnings
and cautions")))((("warnings and cautions", "avoid sending money to and cautions")))((("warnings and cautions", "avoid sending money to
addresses appearing in book")))Try to scan this with your wallet to see addresses appearing in book")))Try to scan this with your wallet to see
the address and amount but DO NOT SEND MONEY. the address and amount but DO NOT SEND MONEY.
@ -131,7 +131,7 @@ register.
[NOTE] [NOTE]
==== ====
((("fractional values")))((("milli-bitcoin")))((("satoshis")))The The
Bitcoin network can transact in fractional values, e.g., from Bitcoin network can transact in fractional values, e.g., from
millibitcoin (1/1000th of a bitcoin) down to 1/100,000,000th of a millibitcoin (1/1000th of a bitcoin) down to 1/100,000,000th of a
bitcoin, which is known as a satoshi. This book uses the same bitcoin, which is known as a satoshi. This book uses the same
@ -160,7 +160,7 @@ can spend that amount in subsequent transactions.
=== Bitcoin Transactions === Bitcoin Transactions
((("transactions", "defined")))In simple terms, a transaction tells the In simple terms, a transaction tells the
network that the owner of certain bitcoins has authorized the transfer network that the owner of certain bitcoins has authorized the transfer
of that value to another owner. The new owner can now spend the bitcoin of that value to another owner. The new owner can now spend the bitcoin
by creating another transaction that authorizes the transfer to another by creating another transaction that authorizes the transfer to another
@ -168,12 +168,12 @@ owner, and so on, in a chain of ownership.
==== Transaction Inputs and Outputs ==== Transaction Inputs and Outputs
((("transactions", "overview of", id="Tover02")))((("outputs and ((("outputs and
inputs", "basics of")))Transactions are like lines in a double-entry inputs", "basics of")))Transactions are like lines in a double-entry
bookkeeping ledger. Each transaction contains one or more _inputs_, bookkeeping ledger. Each transaction contains one or more _inputs_,
which spend funds. On the other side of which spend funds. On the other side of
the transaction, there are one or more _outputs_, which receive funds. the transaction, there are one or more _outputs_, which receive funds.
((("fees", "transaction fees")))The inputs The inputs
and outputs do not necessarily add up to the same and outputs do not necessarily add up to the same
amount. Instead, outputs add up to slightly less than inputs and the amount. Instead, outputs add up to slightly less than inputs and the
difference represents an implied _transaction fee_, which is a small difference represents an implied _transaction fee_, which is a small
@ -184,7 +184,7 @@ blockchain. A Bitcoin transaction is shown as a bookkeeping ledger entry in
The transaction also contains proof of ownership for each amount of The transaction also contains proof of ownership for each amount of
bitcoins (inputs) whose value is being spent, in the form of a digital bitcoins (inputs) whose value is being spent, in the form of a digital
signature from the owner, which can be independently validated by signature from the owner, which can be independently validated by
anyone. ((("spending bitcoin", "defined")))In Bitcoin terms, spending anyone. In Bitcoin terms, spending
is signing a transaction that transfers value from a previous is signing a transaction that transfers value from a previous
transaction over to a new owner identified by a Bitcoin address. transaction over to a new owner identified by a Bitcoin address.
@ -194,7 +194,7 @@ image::images/mbc2_0203.png["Transaction Double-Entry"]
==== Transaction Chains ==== Transaction Chains
((("chain of transactions")))Alice's payment to Bob's Store uses a Alice's payment to Bob's Store uses a
previous transaction's output as its input. In the previous chapter, previous transaction's output as its input. In the previous chapter,
Alice received bitcoins from her friend Joe in return for cash. Alice received bitcoins from her friend Joe in return for cash.
We've labeled that as _Transaction 1_ (Tx1) in <<transaction-chain>>. We've labeled that as _Transaction 1_ (Tx1) in <<transaction-chain>>.
@ -252,7 +252,7 @@ that's what the protocol itself uses.
==== Making Change ==== Making Change
((("change, making")))((("change addresses")))((("addresses", "change ((("addresses", "change
addresses")))In addition to one or more outputs that pay the receiver of addresses")))In addition to one or more outputs that pay the receiver of
bitcoins, many transactions will also include an output that pays the bitcoins, many transactions will also include an output that pays the
spender of the bitcoins, called a _change_ output. spender of the bitcoins, called a _change_ output.
@ -327,7 +327,7 @@ blockchain is _payment batching_ that pays to multiple outputs
representing multiple recipients (<<transaction-distributing>>). representing multiple recipients (<<transaction-distributing>>).
This type of transaction is sometimes used by commercial entities to This type of transaction is sometimes used by commercial entities to
distribute funds, such as when processing payroll payments to multiple distribute funds, such as when processing payroll payments to multiple
employees.((("", startref="Tover02"))) employees.
[[transaction-distributing]] [[transaction-distributing]]
.Batch transaction distributing funds .Batch transaction distributing funds
@ -335,7 +335,7 @@ image::images/mbc2_0207.png["Distributing Transaction"]
=== Constructing a Transaction === Constructing a Transaction
((("transactions", "constructing", id="Tconstruct02")))((("wallets", ((("wallets",
"constructing transactions")))Alice's wallet application contains all "constructing transactions")))Alice's wallet application contains all
the logic for selecting inputs and generating outputs to build a the logic for selecting inputs and generating outputs to build a
transaction to Alice's specification. Alice only needs to choose a transaction to Alice's specification. Alice only needs to choose a
@ -349,7 +349,7 @@ while connected to the Bitcoin network.
==== Getting the Right Inputs ==== Getting the Right Inputs
((("outputs and inputs", "locating and tracking inputs")))Alice's wallet Alice's wallet
application will first have to find inputs that can pay the amount she application will first have to find inputs that can pay the amount she
wants to send to Bob. Most wallets keep track of all the available wants to send to Bob. Most wallets keep track of all the available
outputs belonging to addresses in the wallet. Therefore, Alice's wallet outputs belonging to addresses in the wallet. Therefore, Alice's wallet
@ -373,7 +373,7 @@ wallet application creates the transaction outputs (payments).
==== Creating the Outputs ==== Creating the Outputs
((("outputs and inputs", "creating outputs")))A transaction output is A transaction output is
created with a created with a
script that says something like, "This output is paid to whoever can script that says something like, "This output is paid to whoever can
present a signature from the key corresponding to Bob's public address." present a signature from the key corresponding to Bob's public address."
@ -416,7 +416,7 @@ blocks are added.
===== Transmitting the transaction ===== Transmitting the transaction
((("propagation", "process of")))Because the transaction contains all Because the transaction contains all
the information necessary for it to be processed, it does not matter how or where it the information necessary for it to be processed, it does not matter how or where it
is transmitted to the Bitcoin network. The Bitcoin network is a is transmitted to the Bitcoin network. The Bitcoin network is a
peer-to-peer network, with each Bitcoin peer participating by peer-to-peer network, with each Bitcoin peer participating by
@ -425,7 +425,7 @@ network is to propagate transactions and blocks to all participants.
===== How it propagates ===== How it propagates
((("Bitcoin nodes", "defined")))((("nodes", see="Bitcoin nodes")))
Peers in the Bitcoin peer-to-peer network are programs that have both Peers in the Bitcoin peer-to-peer network are programs that have both
the software logic and the data necessary for them to fully verify the the software logic and the data necessary for them to fully verify the
correctness of a new transaction. The connections between peers are correctness of a new transaction. The connections between peers are
@ -441,7 +441,7 @@ node. Her Bitcoin wallet does not have
to be connected to Bob's Bitcoin wallet directly and she does not have to be connected to Bob's Bitcoin wallet directly and she does not have
to use the internet connection offered by Bob, though both those to use the internet connection offered by Bob, though both those
options are possible, too. ((("propagation", "flooding options are possible, too. ((("propagation", "flooding
technique")))((("flooding technique")))Any Bitcoin node that receives a technique")))Any Bitcoin node that receives a
valid transaction it has not seen before will forward it to valid transaction it has not seen before will forward it to
all other nodes to which it is connected, a propagation technique known all other nodes to which it is connected, a propagation technique known
as _gossiping_. Thus, the transaction rapidly propagates out across the as _gossiping_. Thus, the transaction rapidly propagates out across the
@ -478,7 +478,7 @@ computation to verify as correct.
The mining process serves two purposes in Bitcoin: The mining process serves two purposes in Bitcoin:
* ((("mining and consensus", "consensus rules", "security provided * ((("mining and consensus", "consensus rules", "security provided
by")))((("consensus", see="mining and consensus")))Miners can only by")))Miners can only
receive honest income from creating blocks that follow all of Bitcoin's receive honest income from creating blocks that follow all of Bitcoin's
_consensus rules_. Therefore, miners are normally incentivized to _consensus rules_. Therefore, miners are normally incentivized to
only include valid transactions in their blocks and the blocks they only include valid transactions in their blocks and the blocks they
@ -541,7 +541,7 @@ software to create candidate blocks that assign the reward to a pool address.
From there, a share of the reward is distributed to members of the pool From there, a share of the reward is distributed to members of the pool
miners in proportion to the amount of work they contributed. miners in proportion to the amount of work they contributed.
((("candidate blocks")))((("blocks", "candidate blocks")))Alice's Alice's
transaction was picked up by the network and included in the pool of transaction was picked up by the network and included in the pool of
unverified transactions. Once validated by a full node, it was unverified transactions. Once validated by a full node, it was
included in a candidate block. included in a candidate block.
@ -583,7 +583,7 @@ You can see the block that includes
https://blockstream.info/block/000000000000000000027d39da52dd790d98f85895b02e764611cb7acf552e90[Alice's transaction]. https://blockstream.info/block/000000000000000000027d39da52dd790d98f85895b02e764611cb7acf552e90[Alice's transaction].
==== ====
((("confirmations", "role in transactions")))Approximately 19 minutes Approximately 19 minutes
after the block containing Alice's transaction is broadcast, a new block after the block containing Alice's transaction is broadcast, a new block
is mined by another miner. Because this is mined by another miner. Because this
new block is built on top of the block that contained Alice's new block is built on top of the block that contained Alice's
@ -596,7 +596,7 @@ transaction counts as an additional confirmation. As the blocks pile on
top of each other, it becomes harder to reverse the transaction, thereby top of each other, it becomes harder to reverse the transaction, thereby
giving Bob more and more confidence that Alice's payment is secure. giving Bob more and more confidence that Alice's payment is secure.
((("genesis block")))((("blocks", "genesis block")))((("blockchain ((("blockchain
(the)", "genesis block")))In <<block-alice1>>, we can (the)", "genesis block")))In <<block-alice1>>, we can
the block which contains Alice's transaction. Below it are the block which contains Alice's transaction. Below it are
hundreds of thousands of blocks, linked to each other in a chain of hundreds of thousands of blocks, linked to each other in a chain of
@ -607,7 +607,7 @@ By convention, any block with more than six confirmations
is considered very hard to change, because it would require an immense amount of is considered very hard to change, because it would require an immense amount of
computation to recalculate six blocks (plus one new block). We will examine computation to recalculate six blocks (plus one new block). We will examine
the process of mining and the way it builds confidence in more detail in the process of mining and the way it builds confidence in more detail in
<<mining>>.((("", startref="BToverview02")))((("", <<mining>>.((("",
startref="MACover02"))) startref="MACover02")))
[[block-alice1]] [[block-alice1]]

View File

@ -3,27 +3,27 @@
=== Writing the Bitcoin Book === Writing the Bitcoin Book
((("bitcoin", "benefits of", id="BCbasicbenefits0")))((("decentralized systems", "bitcoin as")))I (Andreas) first stumbled upon Bitcoin in mid-2011. My immediate reaction was more or less "Pfft! Nerd money!" and I ignored it for another six months, failing to grasp its importance. This is a reaction that I have seen repeated among many of the smartest people I know, which gives me some consolation. The second time I came across Bitcoin, in a mailing list discussion, I decided to read the whitepaper written by Satoshi Nakamoto and see what it was all about. ((("digital currencies", "bitcoin vs. others")))I still remember the moment I finished reading those nine pages, when I realized that Bitcoin was not simply a digital currency, but a network of trust that could also provide the basis for so much more than just currencies. The realization that "this isn't money, it's a decentralized trust network," started me on a four-month journey to devour every scrap of information about Bitcoin I could find. I became obsessed and enthralled, spending 12 or more hours each day glued to a screen, reading, writing, coding, and learning as much as I could. I emerged from this state of fugue, more than 20 pounds lighter from lack of consistent meals, determined to dedicate myself to working on Bitcoin. I (Andreas) first stumbled upon Bitcoin in mid-2011. My immediate reaction was more or less "Pfft! Nerd money!" and I ignored it for another six months, failing to grasp its importance. This is a reaction that I have seen repeated among many of the smartest people I know, which gives me some consolation. The second time I came across Bitcoin, in a mailing list discussion, I decided to read the whitepaper written by Satoshi Nakamoto and see what it was all about. I still remember the moment I finished reading those nine pages, when I realized that Bitcoin was not simply a digital currency, but a network of trust that could also provide the basis for so much more than just currencies. The realization that "this isn't money, it's a decentralized trust network," started me on a four-month journey to devour every scrap of information about Bitcoin I could find. I became obsessed and enthralled, spending 12 or more hours each day glued to a screen, reading, writing, coding, and learning as much as I could. I emerged from this state of fugue, more than 20 pounds lighter from lack of consistent meals, determined to dedicate myself to working on Bitcoin.
Two years later, after creating a number of small startups to explore various Bitcoin-related services and products, I decided that it was time to write my first book. Bitcoin was the topic that had driven me into a frenzy of creativity and consumed my thoughts; it was the most exciting technology I had encountered since the internet. It was now time to share my passion about this amazing technology with a broader audience. Two years later, after creating a number of small startups to explore various Bitcoin-related services and products, I decided that it was time to write my first book. Bitcoin was the topic that had driven me into a frenzy of creativity and consumed my thoughts; it was the most exciting technology I had encountered since the internet. It was now time to share my passion about this amazing technology with a broader audience.
=== Intended Audience === Intended Audience
((("intended audience")))This book is mostly intended for coders. If you can use a programming language, this book will teach you how cryptographic currencies work, how to use them, and how to develop software that works with them. The first few chapters are also suitable as an in-depth introduction to Bitcoin for noncoders—those trying to understand the inner workings of Bitcoin and cryptocurrencies. This book is mostly intended for coders. If you can use a programming language, this book will teach you how cryptographic currencies work, how to use them, and how to develop software that works with them. The first few chapters are also suitable as an in-depth introduction to Bitcoin for noncoders—those trying to understand the inner workings of Bitcoin and cryptocurrencies.
=== Why Are There Bugs on the Cover? === Why Are There Bugs on the Cover?
((("decentralized systems", "in nature")))The leafcutter ant is a species that exhibits highly complex behavior in a colony super-organism, but each individual ant operates on a set of simple rules driven by social interaction and the exchange of chemical scents (pheromones). Per Wikipedia: "Next to humans, leafcutter ants form the largest and most complex animal societies on Earth." Leafcutter ants don't actually eat leaves, but rather use them to farm a fungus, which is the central food source for the colony. Get that? These ants are farming! The leafcutter ant is a species that exhibits highly complex behavior in a colony super-organism, but each individual ant operates on a set of simple rules driven by social interaction and the exchange of chemical scents (pheromones). Per Wikipedia: "Next to humans, leafcutter ants form the largest and most complex animal societies on Earth." Leafcutter ants don't actually eat leaves, but rather use them to farm a fungus, which is the central food source for the colony. Get that? These ants are farming!
Although ants form a caste-based society and have a queen for producing offspring, there is no central authority or leader in an ant colony. The highly intelligent and sophisticated behavior exhibited by a multimillion-member colony is an emergent property from the interaction of the individuals in a social network. Although ants form a caste-based society and have a queen for producing offspring, there is no central authority or leader in an ant colony. The highly intelligent and sophisticated behavior exhibited by a multimillion-member colony is an emergent property from the interaction of the individuals in a social network.
Nature demonstrates that decentralized systems can be resilient and can produce emergent complexity and incredible sophistication without the need for a central authority, hierarchy, or complex parts. Nature demonstrates that decentralized systems can be resilient and can produce emergent complexity and incredible sophistication without the need for a central authority, hierarchy, or complex parts.
((("decentralized systems", "benefits of")))Bitcoin is a highly sophisticated decentralized trust network that can support myriad financial processes. Yet, each node in the Bitcoin network follows a few simple rules. The interaction between many nodes is what leads to the emergence of the sophisticated behavior, not any inherent complexity or trust in any single node. Like an ant colony, the Bitcoin network is a resilient network of simple nodes following simple rules that together can do amazing things without any central coordination.((("", startref="BCbasicbenefits0"))) Bitcoin is a highly sophisticated decentralized trust network that can support myriad financial processes. Yet, each node in the Bitcoin network follows a few simple rules. The interaction between many nodes is what leads to the emergence of the sophisticated behavior, not any inherent complexity or trust in any single node. Like an ant colony, the Bitcoin network is a resilient network of simple nodes following simple rules that together can do amazing things without any central coordination.
=== Conventions Used in This Book === Conventions Used in This Book
((("typographical conventions")))The following typographical conventions are used in this book: The following typographical conventions are used in this book:
_Italic_:: Indicates new terms, URLs, email addresses, filenames, and file extensions. _Italic_:: Indicates new terms, URLs, email addresses, filenames, and file extensions.
@ -61,9 +61,9 @@ All the code snippets use real values and calculations where possible, so that y
This book is here to help you get your job done. In general, if example code is offered with this book, you may use it in your programs and documentation. You do not need to contact us for permission unless youre reproducing a significant portion of the code. For example, writing a program that uses several chunks of code from this book does not require permission. Selling or distributing a CD-ROM of examples from OReilly books does require permission. Answering a question by citing this book and quoting example code does not require permission. Incorporating a significant amount of example code from this book into your products documentation does require permission. This book is here to help you get your job done. In general, if example code is offered with this book, you may use it in your programs and documentation. You do not need to contact us for permission unless youre reproducing a significant portion of the code. For example, writing a program that uses several chunks of code from this book does not require permission. Selling or distributing a CD-ROM of examples from OReilly books does require permission. Answering a question by citing this book and quoting example code does not require permission. Incorporating a significant amount of example code from this book into your products documentation does require permission.
((("attribution")))We appreciate, but do not require, attribution. An attribution usually includes the title, author, publisher, and ISBN. For example: “_Mastering Bitcoin_ by Andreas M. Antonopoulos and David A. Harding (OReilly). Copyright 2023, ISBN 978-1-491-95438-6.” We appreciate, but do not require, attribution. An attribution usually includes the title, author, publisher, and ISBN. For example: “_Mastering Bitcoin_ by Andreas M. Antonopoulos and David A. Harding (OReilly). Copyright 2023, ISBN 978-1-491-95438-6.”
((("open source licenses")))Some editions of this book are offered under an open source license, such as https://creativecommons.org/licenses/by-nc/4.0/[CC-BY-NC], in which case the terms of that license apply. Some editions of this book are offered under an open source license, such as https://creativecommons.org/licenses/by-nc/4.0/[CC-BY-NC], in which case the terms of that license apply.
If you feel your use of code examples falls outside fair use or the permission given above, feel free to contact us at pass:[<a href="mailto:permissions@oreilly.com">permissions@oreilly.com</a>]. If you feel your use of code examples falls outside fair use or the permission given above, feel free to contact us at pass:[<a href="mailto:permissions@oreilly.com">permissions@oreilly.com</a>].
@ -73,13 +73,13 @@ include::meta/third_edition_changes.asciidoc[]
=== Bitcoin Addresses and Transactions in This Book === Bitcoin Addresses and Transactions in This Book
((("getting started", "warnings and cautions")))((("warnings and cautions", "avoid sending money to addresses appearing in book")))((("keys and addresses", "warnings and cautions")))((("transactions", "warnings and cautions")))((("blockchain applications", "warnings and cautions")))((("QR codes", "warnings and cautions")))The Bitcoin addresses, transactions, keys, QR codes, and blockchain data used in this book are, for the most part, real. That means you can browse the blockchain, look at the transactions offered as examples, retrieve them with your own scripts or programs, etc. The Bitcoin addresses, transactions, keys, QR codes, and blockchain data used in this book are, for the most part, real. That means you can browse the blockchain, look at the transactions offered as examples, retrieve them with your own scripts or programs, etc.
However, note that the private keys used to construct addresses are either printed in this book, or have been "burned." That means that if you send money to any of these addresses, the money will either be lost forever, or in some cases everyone who can read the book can take it using the private keys printed in here. However, note that the private keys used to construct addresses are either printed in this book, or have been "burned." That means that if you send money to any of these addresses, the money will either be lost forever, or in some cases everyone who can read the book can take it using the private keys printed in here.
[WARNING] [WARNING]
==== ====
DO NOT SEND MONEY TO ANY OF THE ADDRESSES IN THIS BOOK. Your money will be taken by another reader, or lost forever.((("", startref="codeuse00"))) DO NOT SEND MONEY TO ANY OF THE ADDRESSES IN THIS BOOK. Your money will be taken by another reader, or lost forever.
==== ====
=== O'Reilly Safari === O'Reilly Safari
@ -96,7 +96,7 @@ For more information, please visit pass:[<a href="https://oreilly.com/safari" cl
=== How to Contact Us === How to Contact Us
((("comments and questions")))((("contact information")))Please address comments and questions concerning this book to the publisher: Please address comments and questions concerning this book to the publisher:
++++ ++++
<ul class="simplelist"> <ul class="simplelist">
@ -146,7 +146,7 @@ link:$$https://dtrt.org/$$[]
_By Andreas M. Antonopoulos_ _By Andreas M. Antonopoulos_
((("acknowledgments", id="acknowledge0")))This book represents the efforts and contributions of many people. I am grateful for all the help I received from friends, colleagues, and even complete strangers, who joined me in this effort to write the definitive technical book on cryptocurrencies and Bitcoin. This book represents the efforts and contributions of many people. I am grateful for all the help I received from friends, colleagues, and even complete strangers, who joined me in this effort to write the definitive technical book on cryptocurrencies and Bitcoin.
It is impossible to make a distinction between the Bitcoin technology and the Bitcoin community, and this book is as much a product of that community as it is a book on the technology. My work on this book was encouraged, cheered on, supported, and rewarded by the entire Bitcoin community from the very beginning until the very end. More than anything, this book has allowed me to be part of a wonderful community for two years and I can't thank you enough for accepting me into this community. There are far too many people to mention by name—people I've met at conferences, events, seminars, meetups, pizza gatherings, and small private gatherings, as well as many who communicated with me by Twitter, on reddit, on bitcointalk.org, and on GitHub who have had an impact on this book. Every idea, analogy, question, answer, and explanation you find in this book was at some point inspired, tested, or improved through my interactions with the community. Thank you all for your support; without you this book would not have happened. I am forever grateful. It is impossible to make a distinction between the Bitcoin technology and the Bitcoin community, and this book is as much a product of that community as it is a book on the technology. My work on this book was encouraged, cheered on, supported, and rewarded by the entire Bitcoin community from the very beginning until the very end. More than anything, this book has allowed me to be part of a wonderful community for two years and I can't thank you enough for accepting me into this community. There are far too many people to mention by name—people I've met at conferences, events, seminars, meetups, pizza gatherings, and small private gatherings, as well as many who communicated with me by Twitter, on reddit, on bitcointalk.org, and on GitHub who have had an impact on this book. Every idea, analogy, question, answer, and explanation you find in this book was at some point inspired, tested, or improved through my interactions with the community. Thank you all for your support; without you this book would not have happened. I am forever grateful.

View File

@ -20,7 +20,7 @@ need to think about securing your bitcoins in a novel way too.
=== Security Principles === Security Principles
((("security", "security principles", id="Sprinc11")))((("decentralized ((("decentralized
systems", "security of")))The core principle in Bitcoin is systems", "security of")))The core principle in Bitcoin is
decentralization and it has important implications for security. A decentralization and it has important implications for security. A
centralized model, such as a traditional bank or payment network, centralized model, such as a traditional bank or payment network,
@ -63,7 +63,7 @@ able to adequately secure their keys and get hacked, one by one.
==== Developing Bitcoin Systems Securely ==== Developing Bitcoin Systems Securely
((("decentralized systems", "bitcoin as")))A critical principle A critical principle
for Bitcoin developers is decentralization. Most developers will be for Bitcoin developers is decentralization. Most developers will be
familiar with centralized security models and might be tempted to apply familiar with centralized security models and might be tempted to apply
these models to their Bitcoin applications, with disastrous results. these models to their Bitcoin applications, with disastrous results.
@ -93,7 +93,7 @@ ultimately subvert Bitcoin's security.
==== The Root of Trust ==== The Root of Trust
((("root of trust concept")))Traditional security architecture is based Traditional security architecture is based
upon a concept called the _root of trust_, which is a trusted core used upon a concept called the _root of trust_, which is a trusted core used
as the foundation for the security of the overall system or application. as the foundation for the security of the overall system or application.
Security architecture is developed around the root of trust as a series Security architecture is developed around the root of trust as a series
@ -112,7 +112,7 @@ of a single system, then extending that root of trust through the
operating system to higher-level system services, and finally across operating system to higher-level system services, and finally across
many servers layered in concentric circles of diminishing trust. many servers layered in concentric circles of diminishing trust.
((("mining and consensus", "security and consensus")))Bitcoin security Bitcoin security
architecture is different. In Bitcoin, the consensus system creates a architecture is different. In Bitcoin, the consensus system creates a
trusted blockchain that is completely decentralized. A correctly trusted blockchain that is completely decentralized. A correctly
validated blockchain uses the genesis block as the root of trust, validated blockchain uses the genesis block as the root of trust,
@ -146,7 +146,7 @@ startref="Sprinc11")))
=== User Security Best Practices === User Security Best Practices
((("security", "user security best practices", id="Suser11")))((("use ((("use
cases", "user security best practices", id="UCsecurity11")))Humans have cases", "user security best practices", id="UCsecurity11")))Humans have
used physical security controls for thousands of years. By comparison, used physical security controls for thousands of years. By comparison,
our experience with digital security is less than 50 years old. Modern our experience with digital security is less than 50 years old. Modern
@ -193,8 +193,8 @@ we will examine various best practices for practical user security.
==== Physical Bitcoin Storage ==== Physical Bitcoin Storage
((("storage", "physical bitcoin storage")))((("paper ((("paper
wallets")))((("wallets", "types of", "paper wallets")))((("paper wallets")))((("paper
wallets", see="also wallets")))Because most users are far more wallets", see="also wallets")))Because most users are far more
comfortable with physical security than information security, a very comfortable with physical security than information security, a very
effective method for protecting bitcoins is to convert them into physical effective method for protecting bitcoins is to convert them into physical
@ -225,7 +225,7 @@ signing devices may become the predominant method of storing bitcoins.
==== Ensuring Your Access ==== Ensuring Your Access
((("risk, balancing and diversifying", seealso="security")))Although Although
most users are rightly concerned about theft of thir bitcoins, there is an even most users are rightly concerned about theft of thir bitcoins, there is an even
bigger risk. Data files get lost all the time. If they contain Bitcoin keys, bigger risk. Data files get lost all the time. If they contain Bitcoin keys,
the loss is much more painful. In the effort to secure their Bitcoin the loss is much more painful. In the effort to secure their Bitcoin
@ -262,7 +262,7 @@ storage).
==== Multisig and Governance ==== Multisig and Governance
((("multisig addresses")))((("addresses", "multisig ((("addresses", "multisig
addresses")))Whenever a company or individual stores large amounts of addresses")))Whenever a company or individual stores large amounts of
bitcoins, they should consider using a multisignature Bitcoin address. bitcoins, they should consider using a multisignature Bitcoin address.
Multisignature addresses secure funds by requiring more than one Multisignature addresses secure funds by requiring more than one
@ -277,8 +277,8 @@ stored in different locations.
==== Survivability ==== Survivability
((("survivability")))((("digital asset executors")))((("passwords", ((("passwords",
"survivability and")))((("security", "passwords")))One important "survivability and")))One important
security consideration that is often overlooked is availability, security consideration that is often overlooked is availability,
especially in the context of incapacity or death of the key holder. especially in the context of incapacity or death of the key holder.
Bitcoin users are told to use complex passwords and keep their keys Bitcoin users are told to use complex passwords and keep their keys
@ -292,7 +292,7 @@ If you have a lot of bitcoins, you should consider sharing access details
with a trusted relative or lawyer. A more complex survivability scheme with a trusted relative or lawyer. A more complex survivability scheme
can be set up with multi-signature access and estate planning through a can be set up with multi-signature access and estate planning through a
lawyer specialized as a "digital asset executor."((("", lawyer specialized as a "digital asset executor."((("",
startref="Suser11")))((("", startref="UCsecurity11"))) startref="Suser11")))
Bitcoin is a completely new, unprecedented, and complex technology. Over Bitcoin is a completely new, unprecedented, and complex technology. Over
time we will develop better security tools and practices that are easier time we will develop better security tools and practices that are easier

View File

@ -1,7 +1,7 @@
[[c_signatures]] [[c_signatures]]
== Digital Signatures == Digital Signatures
((("digital signatures", "algorithm used")))((("Elliptic Curve Digital ((("Elliptic Curve Digital
Signature Algorithm (ECDSA)")))Two signature algorithms are currently Signature Algorithm (ECDSA)")))Two signature algorithms are currently
used in Bitcoin, the _schnorr signature algorithm_ and the _Elliptic used in Bitcoin, the _schnorr signature algorithm_ and the _Elliptic
Curve Digital Signature Algorithm_ (_ECDSA_). Curve Digital Signature Algorithm_ (_ECDSA_).
@ -14,7 +14,7 @@ keypath spending, and by the script functions +OP_CHECKSIG+,
Any time one of those is executed, a signature must be Any time one of those is executed, a signature must be
provided. provided.
((("digital signatures", "purposes of")))A digital signature serves A digital signature serves
three purposes in Bitcoin. First, the three purposes in Bitcoin. First, the
signature proves that the controller of a private key, who is by signature proves that the controller of a private key, who is by
implication the owner of the funds, has _authorized_ the spending of implication the owner of the funds, has _authorized_ the spending of
@ -38,7 +38,7 @@ key.
=== How Digital Signatures Work === How Digital Signatures Work
((("digital signatures", "how they work")))A digital signature A digital signature
consists of two parts. The first part is an algorithm for creating a consists of two parts. The first part is an algorithm for creating a
signature for a message (the transaction) using a private key (the signature for a message (the transaction) using a private key (the
signing key). The second part is an algorithm signing key). The second part is an algorithm
@ -70,7 +70,7 @@ In both schnorr and ECDSA signatures, the function _F_~_sig_~ produces a signatu
two values. There are differences between the two values in the two values. There are differences between the two values in the
different algorithms, which we'll explore later. different algorithms, which we'll explore later.
((("Distinguished Encoding Rules (DER)")))After the two values After the two values
are calculated, they are serialized into a byte-stream. For ECDSA are calculated, they are serialized into a byte-stream. For ECDSA
signatures, the encoding uses an international standard encoding scheme signatures, the encoding uses an international standard encoding scheme
called the called the
@ -79,7 +79,7 @@ simpler serialization format is used.
==== Verifying the Signature ==== Verifying the Signature
((("digital signatures", "verifying"))) The signature verification The signature verification
algorithm takes the message (a hash of parts of the transaction and algorithm takes the message (a hash of parts of the transaction and
related data), the signer's public key and the signature, and returns related data), the signer's public key and the signature, and returns
TRUE if the signature is valid for this message and public key. TRUE if the signature is valid for this message and public key.
@ -95,7 +95,7 @@ signature on this transaction."
==== Signature Hash Types (SIGHASH) ==== Signature Hash Types (SIGHASH)
((("digital signatures", "signature hash ((("digital signatures", "signature hash
types")))((("commitment")))Digital signatures apply to messages, types")))Digital signatures apply to messages,
which in the case of Bitcoin, are the transactions themselves. The which in the case of Bitcoin, are the transactions themselves. The
signature prove a _commitment_ by the signer to specific transaction signature prove a _commitment_ by the signer to specific transaction
data. In the simplest form, the signature applies to almost the entire data. In the simplest form, the signature applies to almost the entire
@ -104,7 +104,7 @@ transaction fields. However, a signature can commit to only a subset of
the data in a transaction, which is useful for a number of scenarios as the data in a transaction, which is useful for a number of scenarios as
we will see in this section. we will see in this section.
((("SIGHASH flags")))Bitcoin signatures have a way of indicating which Bitcoin signatures have a way of indicating which
part of a transaction's data is included in the hash signed by the part of a transaction's data is included in the hash signed by the
private key using a +SIGHASH+ flag. The +SIGHASH+ flag is a single byte private key using a +SIGHASH+ flag. The +SIGHASH+ flag is a single byte
that is appended to the signature. Every signature has either an that is appended to the signature. Every signature has either an
@ -176,7 +176,7 @@ of all inputs and outputs. This is the most common signature form.
Let's look at some of the other +SIGHASH+ types and how they can be used Let's look at some of the other +SIGHASH+ types and how they can be used
in practice: in practice:
+ALL|ANYONECANPAY+ :: ((("charitable donations")))((("use cases", +ALL|ANYONECANPAY+ :: ((("use cases",
"charitable donations")))This construction can be used to make a "charitable donations")))This construction can be used to make a
"crowdfunding&#x201d;-style transaction. Someone attempting to raise "crowdfunding&#x201d;-style transaction. Someone attempting to raise
funds can construct a transaction with a single output. The single funds can construct a transaction with a single output. The single
@ -209,7 +209,7 @@ without the cost in fees exceeding the value of the UTXO, see
of signature, the uneconomical UTXOs can be donated for anyone to aggregate and of signature, the uneconomical UTXOs can be donated for anyone to aggregate and
spend whenever they want. spend whenever they want.
((("Bitmask Sighash Modes")))There are some proposals to modify or There are some proposals to modify or
expand the +SIGHASH+ system. The most widely discussed proposal as of expand the +SIGHASH+ system. The most widely discussed proposal as of
this writing is BIP118, which proposes to add two this writing is BIP118, which proposes to add two
new sighash flags. A signature using +SIGHASH_ANYPREVOUT+ would not new sighash flags. A signature using +SIGHASH_ANYPREVOUT+ would not
@ -886,7 +886,7 @@ as follows:
[[nonce_warning]] [[nonce_warning]]
=== The Importance of Randomness in Signatures === The Importance of Randomness in Signatures
((("digital signatures", "randomness in")))As we saw in <<schnorr_signatures>> and <<ecdsa_signatures>>, As we saw in <<schnorr_signatures>> and <<ecdsa_signatures>>,
the signature generation algorithm uses a random number _k_, as the basis the signature generation algorithm uses a random number _k_, as the basis
for a private/public nonce pair. The value of _k_ is not for a private/public nonce pair. The value of _k_ is not
important, _as long as it is random_. If signatures from the same important, _as long as it is random_. If signatures from the same
@ -898,7 +898,7 @@ key!
[WARNING] [WARNING]
==== ====
((("warnings and cautions", "digital signatures")))If the same value _k_ If the same value _k_
is used in the signing algorithm on two different transactions, the is used in the signing algorithm on two different transactions, the
private key can be calculated and exposed to the world! private key can be calculated and exposed to the world!
==== ====
@ -910,8 +910,8 @@ because of inadvertent reuse of a _k_ value. The most common reason for
reuse of a _k_ value is an improperly initialized random-number reuse of a _k_ value is an improperly initialized random-number
generator. generator.
((("random numbers", "random number generation")))((("entropy", "random ((("entropy", "random
number generation")))((("deterministic initialization")))To avoid this number generation")))To avoid this
vulnerability, the industry best practice is to not generate _k_ with a vulnerability, the industry best practice is to not generate _k_ with a
random-number generator seeded only with entropy, but instead to use a random-number generator seeded only with entropy, but instead to use a
process seeded in part with the transaction data itself plus the process seeded in part with the transaction data itself plus the

View File

@ -20,7 +20,7 @@ In those cases, we'll describe the various options available.
=== Independent Key Generation === Independent Key Generation
((("wallets", "contents of")))Wallets for physical cash hold that cash, Wallets for physical cash hold that cash,
so it's unsurprising that many people mistakenly believe that so it's unsurprising that many people mistakenly believe that
bitcoin wallets contain bitcoins. In fact, what many people call a bitcoin wallets contain bitcoins. In fact, what many people call a
Bitcoin wallet--which we call a _wallet database_ to distinguish it Bitcoin wallet--which we call a _wallet database_ to distinguish it
@ -211,7 +211,7 @@ We'll provide a detailed exploration of HD wallets in <<hd_wallet_details>>.
==== Seeds and Recovery Codes ==== Seeds and Recovery Codes
((("wallets", "technology of", "seeds and recovery codes")))((("recovery ((("recovery
code words")))((("bitcoin improvement proposals", "Recovery Code Words code words")))((("bitcoin improvement proposals", "Recovery Code Words
(BIP39)")))HD wallets are a very powerful mechanism for managing many (BIP39)")))HD wallets are a very powerful mechanism for managing many
keys all derived from a single seed. If your wallet database keys all derived from a single seed. If your wallet database
@ -624,7 +624,7 @@ modern standards that may provide additional features or safety.
[[recovery_code_words]] [[recovery_code_words]]
==== BIP39 Recovery Codes ==== BIP39 Recovery Codes
((("wallets", "technology of", "recovery code words")))((("recovery code ((("recovery code
words", id="mnemonic05")))((("bitcoin improvement proposals", "Recovery words", id="mnemonic05")))((("bitcoin improvement proposals", "Recovery
Code Words (BIP39)", id="BIP3905")))BIP39 recovery codes are word Code Words (BIP39)", id="BIP3905")))BIP39 recovery codes are word
sequences that represent (encode) a random number used as a seed to sequences that represent (encode) a random number used as a seed to
@ -640,7 +640,7 @@ transcribe.
[TIP] [TIP]
==== ====
((("brainwallets")))Recovery codes are often confused with Recovery codes are often confused with
"brainwallets." They are not the same. The primary difference is that a "brainwallets." They are not the same. The primary difference is that a
brainwallet consists of words chosen by the user, whereas recovery codes brainwallet consists of words chosen by the user, whereas recovery codes
are created randomly by the wallet and presented to the user. This are created randomly by the wallet and presented to the user. This
@ -705,13 +705,13 @@ data and the length of recovery code in words.
[[recovery_to_seed]] [[recovery_to_seed]]
===== From recovery code to seed ===== From recovery code to seed
((("key-stretching function")))((("PBKDF2 function")))The recovery code The recovery code
represents entropy with a length of 128 to 256 bits. The entropy is then represents entropy with a length of 128 to 256 bits. The entropy is then
used to derive a longer (512-bit) seed through the use of the used to derive a longer (512-bit) seed through the use of the
key-stretching function PBKDF2. The seed produced is then used to build key-stretching function PBKDF2. The seed produced is then used to build
a deterministic wallet and derive its keys. a deterministic wallet and derive its keys.
((("salts")))((("passphrases")))The key-stretching function takes two The key-stretching function takes two
parameters: the entropy and a _salt_. The purpose of a salt in a parameters: the entropy and a _salt_. The purpose of a salt in a
key-stretching function is to make it difficult to build a lookup table key-stretching function is to make it difficult to build a lookup table
enabling a brute-force attack. In the BIP39 standard, the salt has enabling a brute-force attack. In the BIP39 standard, the salt has
@ -858,7 +858,7 @@ recovery codes (or a value near 128, such as Electrum v2's 132 bits).
[[recovery_passphrase]] [[recovery_passphrase]]
===== Optional passphrase in BIP39 ===== Optional passphrase in BIP39
((("passphrases")))The BIP39 standard allows the use of an optional The BIP39 standard allows the use of an optional
passphrase in the derivation of the seed. If no passphrase is used, the passphrase in the derivation of the seed. If no passphrase is used, the
recovery code is stretched with a salt consisting of the constant string recovery code is stretched with a salt consisting of the constant string
+"mnemonic"+, producing a specific 512-bit seed from any given recovery code. +"mnemonic"+, producing a specific 512-bit seed from any given recovery code.
@ -904,7 +904,7 @@ her family to recover the cryptocurrency estate.
==== Creating an HD Wallet from the Seed ==== Creating an HD Wallet from the Seed
((("wallets", "technology of", "creating HD wallets from root ((("wallets", "technology of", "creating HD wallets from root
seed")))((("root seeds")))((("hierarchical deterministic (HD) seed")))((("hierarchical deterministic (HD)
wallets")))HD wallets are created from a single _root seed_, which is a wallets")))HD wallets are created from a single _root seed_, which is a
128-, 256-, or 512-bit random number. Most commonly, this seed is 128-, 256-, or 512-bit random number. Most commonly, this seed is
generated by or decrypted from a _recovery code_ as detailed in the previous section. generated by or decrypted from a _recovery code_ as detailed in the previous section.
@ -936,7 +936,7 @@ creates child keys from parent keys, as we will see in the next section.
===== Private child key derivation ===== Private child key derivation
((("child key derivation (CKD)")))((("public and private keys", "child ((("public and private keys", "child
key derivation (CKD)")))HD wallets use a _child key derivation_ (CKD) key derivation (CKD)")))HD wallets use a _child key derivation_ (CKD)
function to derive child keys from parent keys. function to derive child keys from parent keys.
@ -1008,7 +1008,7 @@ operate exactly as "normal" keys.
===== Extended keys ===== Extended keys
((("public and private keys", "extended keys")))((("extended keys")))As As
we saw earlier, the key derivation function can be used to create we saw earlier, the key derivation function can be used to create
children at any level of the tree, based on the three inputs: a key, a children at any level of the tree, based on the three inputs: a key, a
chain code, and the index of the desired child. The two essential chain code, and the index of the desired child. The two essential
@ -1055,7 +1055,7 @@ xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECeeMVKZBPLr
[[public__child_key_derivation]] [[public__child_key_derivation]]
===== Public child key derivation ===== Public child key derivation
((("public and private keys", "public child key derivation")))As As
mentioned previously, a very useful characteristic of HD wallets is the mentioned previously, a very useful characteristic of HD wallets is the
ability to derive public child keys from public parent keys, _without_ ability to derive public child keys from public parent keys, _without_
having the private keys. This gives us two ways to derive a child public having the private keys. This gives us two ways to derive a child public
@ -1133,7 +1133,7 @@ address for the actual transaction. However, these other solutions have
not been used in production as of this writing. not been used in production as of this writing.
**** ****
((("cold storage")))((("storage", "cold storage")))((("hardware ((("hardware
wallets")))Another common application of this solution is for wallets")))Another common application of this solution is for
cold-storage or hardware signing devices. In that scenario, the extended cold-storage or hardware signing devices. In that scenario, the extended
private key can be stored on a paper wallet or hardware device, while private key can be stored on a paper wallet or hardware device, while
@ -1152,7 +1152,7 @@ image::images/mbc2_0511.png["ChildPublicDerivation"]
((("wallets", "technology of", "using extended public keys on web ((("wallets", "technology of", "using extended public keys on web
stores")))Let's see how HD wallets are used by looking at stores")))Let's see how HD wallets are used by looking at
Gabriel's web store.((("use cases", "web store", id="gabrielfivetwo"))) Gabriel's web store.
Gabriel first set up his web store as a hobby, based on a simple hosted Gabriel first set up his web store as a hobby, based on a simple hosted
Wordpress page. His store was quite basic with only a few pages and an Wordpress page. His store was quite basic with only a few pages and an
@ -1206,7 +1206,7 @@ software, such as the widely used open source BTCPay Server.
===== Hardened child key derivation ===== Hardened child key derivation
((("public and private keys", "hardened child key ((("public and private keys", "hardened child key
derivation")))((("hardened derivation")))The ability to derive a branch derivation")))The ability to derive a branch
of public keys from an xpub is very useful, but it comes with a of public keys from an xpub is very useful, but it comes with a
potential risk. Access to an xpub does not give access to child private potential risk. Access to an xpub does not give access to child private
keys. However, because the xpub contains the chain code, if a child keys. However, because the xpub contains the chain code, if a child
@ -1273,7 +1273,7 @@ has special meaning, using the letter _h_ is recommended.
===== HD wallet key identifier (path) ===== HD wallet key identifier (path)
((("hierarchical deterministic (HD) wallets")))Keys in an HD wallet are Keys in an HD wallet are
identified using a "path" naming convention, with each level of the tree identified using a "path" naming convention, with each level of the tree
separated by a slash (/) character (see <<table_4-8>>). Private keys separated by a slash (/) character (see <<table_4-8>>). Private keys
derived from the master private key start with "m." Public keys derived derived from the master private key start with "m." Public keys derived
@ -1344,7 +1344,7 @@ contain two Bitcoin "accounts": m/44++&#x27;++/0++&#x27;++/0++&#x27;++
and m/44++&#x27;++/0++&#x27;++/1++&#x27;++. Each account is the root of and m/44++&#x27;++/0++&#x27;++/1++&#x27;++. Each account is the root of
its own subtree. its own subtree.
((("keys and addresses", see="also public and private keys")))On the On the
fourth level, "change," an HD wallet has two subtrees, one for creating fourth level, "change," an HD wallet has two subtrees, one for creating
receiving addresses and one for creating change addresses. Note that receiving addresses and one for creating change addresses. Note that
whereas the previous levels used hardened derivation, this level uses whereas the previous levels used hardened derivation, this level uses

View File

@ -4,7 +4,7 @@
[NOTE] [NOTE]
==== ====
((("whitepaper", id="whitethirteen")))((("bitcoin whitepaper", id="BCwhitethirteen")))((("Nakamoto, Satoshi", id="nakamatothirteen")))This is the original whitepaper, reproduced in its entirety exactly as it was published by Satoshi Nakamoto in October 2008. This is the original whitepaper, reproduced in its entirety exactly as it was published by Satoshi Nakamoto in October 2008.
==== ====
=== Bitcoin - A Peer-to-Peer Electronic Cash System === Bitcoin - A Peer-to-Peer Electronic Cash System
@ -450,7 +450,7 @@ We have proposed a system for electronic transactions without relying on trust.
=== License === License
((("open source licenses")))This whitepaper was published in October 2008 by Satoshi Nakamoto. It was later (2009) added as supporting documentation to the bitcoin software and carries the same MIT license. It has been reproduced in this book, without modification other than formatting, under the terms of the MIT license: This whitepaper was published in October 2008 by Satoshi Nakamoto. It was later (2009) added as supporting documentation to the bitcoin software and carries the same MIT license. It has been reproduced in this book, without modification other than formatting, under the terms of the MIT license:
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2008 Satoshi Nakamoto Copyright (c) 2008 Satoshi Nakamoto
@ -459,4 +459,4 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.((("", startref="whitethirteen")))((("", startref="nakamatothirteen")))((("", startref="BCwhitethirteen"))) THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.