The ((("mining", "purpose of")))((("bitcoins", "mining", "purpose of")))word "mining" is somewhat
The ((("mining", "purpose of")))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
@ -27,7 +27,7 @@ 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_.
====
====
Miners ((("bitcoins", "mining", "operational overview", id="bitcoin-mining-overview")))((("mining", "operational overview", id="mining-overview")))record new transactions on the global blockchain. A
Miners ((("mining", "operational overview", id="mining-overview")))record new transactions on the global blockchain. A
new block, containing transactions that occurred since the last block,
new block, containing transactions that occurred since the last block,
is _mined_ every 10 minutes on average, thereby adding those
is _mined_ every 10 minutes on average, thereby adding those
transactions to the blockchain. Transactions that become part of a block
transactions to the blockchain. Transactions that become part of a block
To understand mining and consensus, we will track Alice's transaction
To understand mining and consensus, we will track Alice's transaction
as it is received and added to a block by Jing's mining equipment. Then
as it is received and added to a block by Jing's mining equipment. Then
we will follow the block as it is mined, added to the blockchain, and
we will follow the block as it is mined, added to the blockchain, and
accepted by the Bitcoin network through the process of ((("bitcoins", "mining", "operational overview", startref="bitcoin-mining-overview")))((("mining", "operational overview", startref="mining-overview")))emergent
accepted by the Bitcoin network through the process of ((("mining", "operational overview", startref="mining-overview")))emergent
In the ((("bitcoins", "mining", "decentralized consensus", id="bitcoin-mining-consensus")))((("mining", "decentralized consensus", id="mining-consensus")))((("decentralized consensus", id="decentral-consensus")))((("emergent consensus", id="emergent-consensus")))((("consensus", see="decentralized consensus")))previous chapter we looked at the
In the ((("mining", "decentralized consensus", id="mining-consensus")))((("decentralized consensus", id="decentral-consensus")))((("emergent consensus", id="emergent-consensus")))((("consensus", see="decentralized consensus")))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
ownership transfers.
ownership transfers.
@ -248,13 +248,13 @@ processes that occur independently on nodes across the network:
In the next few sections, we will examine these processes and how they
In the next few sections, we will examine these processes and how they
interact to create the emergent property of network-wide consensus that
interact to create the emergent property of network-wide consensus that
allows any Bitcoin node to assemble its own copy of the authoritative,
allows any Bitcoin node to assemble its own copy of the authoritative,
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
transaction is then sent to the neighboring nodes in the Bitcoin network
transaction is then sent to the neighboring nodes in the Bitcoin network
@ -303,12 +303,12 @@ address new types of denial-of-service attacks.
By independently verifying each transaction as it is received and before
By independently verifying each transaction as it is received and before
propagating it, every node builds a pool of valid (but unconfirmed)
propagating it, every node builds a pool of valid (but unconfirmed)
transactions known ((("bitcoins", "mining", "independent transaction verification", startref="bitcoin-mining-verify")))((("mining", "independent transaction verification", startref="mining-verify")))((("transactions", "independent verification", startref="transaction-verify")))((("independent transaction verification", startref="independent-transaction-verify")))((("verifying", "transactions", startref="verify-transaction")))((("nodes", "transaction verification", startref="node-verify")))((("memory pool")))as the _memory pool_ or
transactions known ((("mining", "independent transaction verification", startref="mining-verify")))((("transactions", "independent verification", startref="transaction-verify")))((("independent transaction verification", startref="independent-transaction-verify")))((("verifying", "transactions", startref="verify-transaction")))((("nodes", "transaction verification", startref="node-verify")))((("memory pool")))as the _memory pool_ or
_mempool_.
_mempool_.
=== Mining Nodes
=== Mining Nodes
Some of the((("bitcoins", "mining", "miners, purpose of", id="bitcoin-mining-miner-purpose")))((("mining", "miner nodes, purpose of", id="mining-nodes-purpose")))((("nodes", "miner nodes", "purpose of", id="nodes-miner-purpose"))) nodes on the Bitcoin network are specialized nodes
Some of the((("mining", "miner nodes, purpose of", id="mining-nodes-purpose")))((("nodes", "miner nodes", "purpose of", id="nodes-miner-purpose"))) nodes on the Bitcoin network are specialized nodes
called _miners_. Jing is a
called _miners_. Jing is a
Bitcoin miner; he
Bitcoin miner; he
earns bitcoin by running a "mining rig," which is a specialized
earns bitcoin by running a "mining rig," which is a specialized
@ -351,7 +351,7 @@ finding a solution according to the proof-of-work algorithm.
When Jing's node aggregates all the transactions from the memory pool,
When Jing's node aggregates all the transactions from the memory pool,
the new candidate block has several thousand transactions that each pay
the new candidate block has several thousand transactions that each pay
@ -572,7 +572,7 @@ version field set to 2 or higher) must contain the block height as a script
=== Constructing the Block Header
=== Constructing the Block Header
To
To
construct ((("bitcoins", "mining", "constructing block header", id="bitcoin-mining-blockheader")))((("mining", "constructing block header", id="mining-blockheader")))((("nodes", "miner nodes", "constructing block header", id="nodes-miner-blockheader")))((("block header", "constructing", id="block-header-construct")))the block header, the mining node needs to fill in six fields,
construct ((("mining", "constructing block header", id="mining-blockheader")))((("nodes", "miner nodes", "constructing block header", id="nodes-miner-blockheader")))((("block header", "constructing", id="block-header-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>>.
++++
++++
@ -694,13 +694,13 @@ With all the other fields filled, the header of the candidate block is now compl
the process of mining can begin. The goal is now to find a header
the process of mining can begin. The goal is now to find a header
that results in a hash that is less than the target.
that results in a hash that is less than the target.
The mining node will need to test billions or trillions of variations of
The mining node will need to test billions or trillions of variations of
the header before a version is found that satisfies the((("bitcoins", "mining", "constructing block header", startref="bitcoin-mining-blockheader")))((("mining", "constructing block header", startref="mining-blockheader")))((("nodes", "miner nodes", "constructing block header", startref="nodes-miner-blockheader")))((("block header", "constructing", startref="block-header-construct"))) requirement.
the header before a version is found that satisfies the((("mining", "constructing block header", startref="mining-blockheader")))((("nodes", "miner nodes", "constructing block header", startref="nodes-miner-blockheader")))((("block header", "constructing", startref="block-header-construct"))) requirement.
[role="less_space pagebreak-before"]
[role="less_space pagebreak-before"]
=== Mining the Block
=== Mining the Block
Now
Now
that((("candidate blocks", "mining", id="candidate-mine")))((("blocks", "candidate blocks", "mining", id="block-candidate-mine")))((("mining", "candidate blocks", id="mining-candidate")))((("bitcoins", "mining", "candidate blocks", id="bitcoin-mining-candidate"))) a candidate block has been constructed by Jing's node, it is time
that((("candidate blocks", "mining", id="candidate-mine")))((("blocks", "candidate blocks", "mining", id="block-candidate-mine")))((("mining", "candidate blocks", id="mining-candidate"))) 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
@ -718,7 +718,7 @@ until the desired hash result appears by chance.
==== Proof-of-Work Algorithm
==== Proof-of-Work Algorithm
A hash((("bitcoins", "mining", "proof-of-work algorithm", id="bitcoin-mining-proof")))((("mining", "proof-of-work algorithm", id="mining-proof")))((("hash functions", "proof-of-work algorithm", id="hash-proof")))((("proof-of-work algorithm", id="proof-mining"))) algorithm takes an
A hash((("mining", "proof-of-work algorithm", id="mining-proof")))((("hash functions", "proof-of-work algorithm", id="hash-proof")))((("proof-of-work algorithm", id="proof-mining"))) 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
@ -859,7 +859,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
Block headers ((("bitcoins", "mining", "proof-of-work algorithm", startref="bitcoin-mining-proof")))((("mining", "proof-of-work algorithm", startref="mining-proof")))((("hash functions", "proof-of-work algorithm", startref="hash-proof")))((("proof-of-work algorithm", startref="proof-mining")))((("bitcoins", "mining", "target representation", id="bitcoin-mining-target")))((("mining", "target representation", id="mining-target")))((("targets", "representation of", id="target-represent")))((("proof-of-work algorithm", "target representation", id="proof-target")))contain the target in a notation called "target
Block headers ((("mining", "proof-of-work algorithm", startref="mining-proof")))((("hash functions", "proof-of-work algorithm", startref="hash-proof")))((("proof-of-work algorithm", startref="proof-mining")))((("mining", "target representation", id="mining-target")))((("targets", "representation of", id="target-represent")))((("proof-of-work algorithm", "target representation", id="proof-target")))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
coefficient/exponent format, with the first two hexadecimal digits for
coefficient/exponent format, with the first two hexadecimal digits for
@ -905,12 +905,12 @@ header hash less than the target. In binary that number must
have more than 60 leading bits set to zero. With this level of
have more than 60 leading bits set to zero. With this level of
difficulty, a single miner processing 1 trillion hashes per second (1
difficulty, a single miner processing 1 trillion hashes per second (1
terahash per second or 1 TH/sec) would only find a solution once every
terahash per second or 1 TH/sec) would only find a solution once every
8,496 blocks or once every 59 days, ((("bitcoins", "mining", "target representation", startref="bitcoin-mining-target")))((("mining", "target representation", startref="mining-target")))((("targets", "representation of", startref="target-represent")))((("proof-of-work algorithm", "target representation", startref="proof-target")))on average.
8,496 blocks or once every 59 days, ((("mining", "target representation", startref="mining-target")))((("targets", "representation of", startref="target-represent")))((("proof-of-work algorithm", "target representation", startref="proof-target")))on average.
[[target]]
[[target]]
==== Retargeting to Adjust Difficulty
==== Retargeting to Adjust Difficulty
As we saw, ((("bitcoins", "mining", "adjusting difficulty", id="bitcoin-mining-difficulty")))((("mining", "adjusting difficulty", id="mining-difficulty")))((("targets", "adjusting difficulty", id="target-difficulty")))((("proof-of-work algorithm", "adjusting difficulty", id="proof-difficulty")))((("difficulty", "adjusting", id="difficulty-adjust")))the target determines the difficulty and
As we saw, ((("mining", "adjusting difficulty", id="mining-difficulty")))((("targets", "adjusting difficulty", id="target-difficulty")))((("proof-of-work algorithm", "adjusting difficulty", id="proof-difficulty")))((("difficulty", "adjusting", id="difficulty-adjust")))the target determines the difficulty and
therefore affects how long it takes to find a solution to the
therefore affects how long it takes to find a solution to the
proof-of-work algorithm. This leads to the obvious questions: Why is the
proof-of-work algorithm. This leads to the obvious questions: Why is the
difficulty adjustable, who adjusts it, and how?
difficulty adjustable, who adjusts it, and how?
@ -1013,13 +1013,13 @@ possible with the current generation of silicon fabrication, converting
electricity into hashing computation at the highest rate possible. The
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 ((("bitcoins", "mining", "adjusting difficulty", startref="bitcoin-mining-difficulty")))((("mining", "adjusting difficulty", startref="mining-difficulty")))((("targets", "adjusting difficulty", startref="target-difficulty")))((("proof-of-work algorithm", "adjusting difficulty", startref="proof-difficulty")))((("difficulty", "adjusting", startref="difficulty-adjust")))mining
mining and therefore the incentives to enter or exit the ((("mining", "adjusting difficulty", startref="mining-difficulty")))((("targets", "adjusting difficulty", startref="target-difficulty")))((("proof-of-work algorithm", "adjusting difficulty", startref="proof-difficulty")))((("difficulty", "adjusting", startref="difficulty-adjust")))mining
market.
market.
[[mtp]]
[[mtp]]
=== Median Time Past (MTP)
=== Median Time Past (MTP)
In Bitcoin ((("decentralized consensus", "timestamps and", id="decentral-consensus-timestamp")))((("consensus rules", "timestamps and", id="consensus-timestamp")))((("timestamps", id="timestamp")))((("median time past (MTP)", id="median-time-past")))((("bitcoins", "mining", "timestamps", id="bitcoin-mining-timestamps")))((("mining", "timestamps", id="mining-timestamps")))there is a subtle, but very
In Bitcoin ((("decentralized consensus", "timestamps and", id="decentral-consensus-timestamp")))((("consensus rules", "timestamps and", id="consensus-timestamp")))((("timestamps", id="timestamp")))((("median time past (MTP)", id="median-time-past")))((("mining", "timestamps", id="mining-timestamps")))there is a subtle, but very
significant, difference between wall time and consensus time. Bitcoin is
significant, difference between wall time and consensus time. Bitcoin is
a decentralized network, which means that each participant has his or
a decentralized network, which means that each participant has his or
her own perspective of time. Events on the network do not occur
her own perspective of time. Events on the network do not occur
@ -1071,7 +1071,7 @@ MTP changes the implementation of time calculations for
lock time, +CLTV+, sequence, and +CSV+. The consensus time
lock time, +CLTV+, sequence, and +CSV+. The consensus time
calculated by MTP is usually about one hour behind
calculated by MTP is usually about one hour behind
wall clock time. If you create timelock transactions, you should account
wall clock time. If you create timelock transactions, you should account
for it when estimating the desired value to encode ((("decentralized consensus", "timestamps and", startref="decentral-consensus-timestamp")))((("consensus rules", "timestamps and", startref="consensus-timestamp")))((("timestamps", startref="timestamp")))((("median time past (MTP)", startref="median-time-past")))((("bitcoins", "mining", "timestamps", startref="bitcoin-mining-timestamps")))((("mining", "timestamps", startref="mining-timestamps")))in lock time,
for it when estimating the desired value to encode ((("decentralized consensus", "timestamps and", startref="decentral-consensus-timestamp")))((("consensus rules", "timestamps and", startref="consensus-timestamp")))((("timestamps", startref="timestamp")))((("median time past (MTP)", startref="median-time-past")))((("mining", "timestamps", startref="mining-timestamps")))in lock time,
sequence, +CLTV+, and +CSV+.
sequence, +CLTV+, and +CSV+.
=== Successfully Mining the Block
=== Successfully Mining the Block
@ -1107,7 +1107,7 @@ a block at the same height and immediately start computing the next
block in the chain, using Jing's block as the "parent." By building on
block in the chain, using Jing's block as the "parent." By building on
top of Jing's newly discovered block, the other miners are essentially
top of Jing's newly discovered block, the other miners are essentially
using their mining power to endorse Jing's block and the
using their mining power to endorse Jing's block and the
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
@ -1115,7 +1115,7 @@ that forms the decentralized blockchain.
=== Validating a New Block
=== Validating a New Block
The third ((("bitcoins", "mining", "validating blocks", id="bitcoin-mining-validate")))((("mining", "validating blocks", id="mining-validate")))((("blocks", "validating", id="block-validate")))((("validating", "blocks", id="validate-block")))((("decentralized consensus", "validating blocks", id="decentral-consensus-validate")))((("nodes", "validating blocks", id="nodes-validate")))step in Bitcoin's
The third ((("mining", "validating blocks", id="mining-validate")))((("blocks", "validating", id="block-validate")))((("validating", "blocks", id="validate-block")))((("decentralized consensus", "validating blocks", id="decentral-consensus-validate")))((("nodes", "validating blocks", id="nodes-validate")))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.
@ -1159,14 +1159,14 @@ The miners have to construct a block, based on the shared rules
that all nodes follow, and mine it with a correct solution to the
that all nodes follow, and mine it with a correct solution to the
PoW. To do so, they expend a lot of electricity in mining, and
PoW. To do so, they expend a lot of electricity in mining, and
if they cheat, all the electricity and effort is wasted. This is why
if they cheat, all the electricity and effort is wasted. This is why
independent validation is a key component of ((("bitcoins", "mining", "validating blocks", startref="bitcoin-mining-validate")))((("mining", "validating blocks", startref="mining-validate")))((("blocks", "validating", startref="block-validate")))((("validating", "blocks", startref="validate-block")))((("decentralized consensus", "validating blocks", startref="decentral-consensus-validate")))((("nodes", "validating blocks", startref="nodes-validate")))decentralized consensus.
independent validation is a key component of ((("mining", "validating blocks", startref="mining-validate")))((("blocks", "validating", startref="block-validate")))((("validating", "blocks", startref="validate-block")))((("decentralized consensus", "validating blocks", startref="decentral-consensus-validate")))((("nodes", "validating blocks", startref="nodes-validate")))decentralized consensus.
//FIXME:normalize terminology between "block-finding race", "mining
//FIXME:normalize terminology between "block-finding race", "mining
//race", and "forks"
//race", and "forks"
[[forks]]
[[forks]]
=== Assembling and Selecting Chains of Blocks
=== Assembling and Selecting Chains of Blocks
The final ((("bitcoins", "mining", "assembling blockchain", id="bitcoin-mining-assemble")))((("mining", "assembling blockchain", id="mining-assemble")))((("blockchain", "assembling", id="blockchain-assemble")))((("decentralized consensus", "assembling blockchain", id="decentral-consensus-assemble")))part in Bitcoin's decentralized
The final ((("mining", "assembling blockchain", id="mining-assemble")))((("blockchain", "assembling", id="blockchain-assemble")))((("decentralized consensus", "assembling blockchain", id="decentral-consensus-assemble")))part in Bitcoin's decentralized
consensus mechanism is the assembly of blocks into chains and the
consensus mechanism is the assembly of blocks into chains and the
selection of the chain with the most proof of work.
selection of the chain with the most proof of work.
@ -1237,14 +1237,14 @@ security, you'd prefer a system with 1-minute blocks, where you could
wait for three blocks, over a system with 10-minute blocks. The shorter
wait for three blocks, over a system with 10-minute blocks. The shorter
the time between blocks, the more miner work is wasted on accidental
the time between blocks, the more miner work is wasted on accidental
forks (in addition to other problems), so many people prefer Bitcoin's
forks (in addition to other problems), so many people prefer Bitcoin's
Bitcoin mining ((("mining", "competitiveness of", id="mining-competitive")))is an extremely competitive industry.
The hashing power has increased exponentially every year of Bitcoin's
The hashing power has increased exponentially every year of Bitcoin's
existence. Some years the growth has reflected a complete change of
existence. Some years the growth has reflected a complete change of
technology, such as in 2010 and 2011 when many miners switched from
technology, such as in 2010 and 2011 when many miners switched from
@ -1265,7 +1265,7 @@ a rapid pace.
[[extra_nonce]]
[[extra_nonce]]
==== The Extra Nonce Solution
==== The Extra Nonce Solution
Since 2012, mining((("bitcoins", "mining", "extra nonce solution", id="bitcoin-mining-nonce")))((("mining", "extra nonce solution", id="mining-nonce")))((("extra nonce solution", id="extra-nonce"))) has evolved to resolve a
Since 2012, mining((("mining", "extra nonce solution", id="mining-nonce")))((("extra nonce solution", id="extra-nonce"))) 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
@ -1301,12 +1301,12 @@ an individual piece of mining equipment to perform up to 281 TH/s by
only making changes to the block header. This keeps mining equipment
only making changes to the block header. This keeps mining equipment
and protocols simpler than incrementing the extra nonce in the coinbase
and protocols simpler than incrementing the extra nonce in the coinbase
transaction every 4 billion hashes, which requires recalculating the
transaction every 4 billion hashes, which requires recalculating the
entire left flank of the merkle tree up to ((("bitcoins", "mining", "extra nonce solution", startref="bitcoin-mining-nonce")))((("mining", "extra nonce solution", startref="mining-nonce")))((("extra nonce solution", startref="extra-nonce")))the root.
entire left flank of the merkle tree up to ((("mining", "extra nonce solution", startref="mining-nonce")))((("extra nonce solution", startref="extra-nonce")))the root.
[[mining_pools]]
[[mining_pools]]
==== Mining Pools
==== Mining Pools
In this ((("bitcoins", "mining", "mining pools", id="bitcoin-mining-pools")))((("mining", "mining pools", id="mining-mining-pools")))((("mining pools", id="mining-pools")))highly competitive environment, individual miners working
In this ((("mining", "mining pools", id="mining-mining-pools")))((("mining pools", id="mining-pools")))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
is so low that it represents a gamble, like playing the lottery. Even
is so low that it represents a gamble, like playing the lottery. Even
@ -1483,12 +1483,12 @@ attack problem for Bitcoin itself. Rather, P2Pool makes Bitcoin more
robust overall, as part of a diversified mining ecosystem. As of this
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