Wie Bitcoin Mining wirklich funktioniert

Während sich Bitcoin der Akzeptanz und Anerkennung des Mainstreams nähert, wird sein grundlegendes Sicherheitsmodell, das als Bergbau bezeichnet wird, täglich ins Rampenlicht gerückt und immer mehr hinterfragt.

Die Menschen sind zunehmend besorgt und interessiert an den Umweltauswirkungen des Bitcoin-Bergbaus, der Sicherheit und dem Grad der Dezentralisierung des zugrunde liegenden Modells und sogar an den möglichen Auswirkungen eines Durchbruchs im Bereich Quantencomputer auf die Zukunft von Bitcoin und anderen Kryptowährungen.

Proof-of-Work wird oft als „kryptografisches Rätsel“ beschrieben, aber was ist das eigentlich?

Um diese Fragen (und mögliche Antworten) wirklich zu verstehen, benötigen Sie ein grundlegendes Verständnis des Bitcoin-Mining selbst und seiner Entwicklung.

In diesem Artikel werden alle technischen Komponenten und beweglichen Teile des Proof-of-Work untersucht und wie sie nahtlos miteinander synchronisiert werden, damit Bitcoin die dezentrale Plattform ist, die es heute ist.

Warum Bergbau funktioniert: Kryptografisches One-Way-Hashing

Die Bitcoin-Blockchain wird häufig als eine Datenbank beschrieben, die kryptografisch sicher und anschließend unveränderlich ist. Die zugrunde liegende Technologie, die diese Unveränderlichkeit und Sicherheit unterstützt, ist kryptografisches Hashing.

Eine kryptografische Hash-Funktion ist eine mathematische Funktion, die einfach ausgedrückt jede Eingabe aufnimmt und sie einer Zeichenfolge fester Größe zuordnet.

Es gibt jedoch vier spezielle Eigenschaften dieser Funktionen, die sie für das Bitcoin-Netzwerk von unschätzbarem Wert machen. Sie sind:

  1. Deterministisch - Für jede Eingabe in die kryptografische Hash-Funktion ist die resultierende Ausgabe immer dieselbe.
  2. Schnell - Die Berechnung der Ausgabe der Hash-Funktion ist bei jeder Eingabe ein relativ schneller Prozess (erfordert keine umfangreiche Berechnung).
  3. Eindeutig - Jede Eingabe in die Funktion sollte zu einer völlig zufälligen und eindeutigen Ausgabe führen (mit anderen Worten, keine zwei Eingaben führen zu derselben Ausgabe).
  4. Irreversibel - Bei einer Ausgabe einer Hash-Funktion kann die ursprüngliche Eingabe nicht erhalten werden

Diese Regeln bilden die Grundlage, auf der Bitcoin Mining das Netzwerk sichern kann.

Insbesondere der Entwickler des Bitcoin-Protokolls, Satoshi Nakomoto, entschied sich für die Verwendung der SHA-256-Hash-Funktion als Grundlage für das Bitcoin-Mining. Dies ist eine spezifische kryptografische Hash-Funktion, von der mathematisch nachgewiesen wurde, dass sie die oben genannten Eigenschaften aufweist. Es wird immer eine 256-Bit-Zahl ausgegeben (die grundlegendste Recheneinheit), die normalerweise im Hexadezimalzahlensystem mit 64 Zeichen zur besseren Lesbarkeit dargestellt wird.

Die Ausgabe der SHA-256-Funktion wird normalerweise als Hash ihrer Eingabe bezeichnet.

Hier ist ein Beispiel für eine SHA-256-Funktionseingabe und -ausgabe (Sie können sie hier selbst ausprobieren):

Input to SHA-256:  Output to SHA-256: 77077b1f4c3ad44c83dc0bdb8d937e9b71c0ef07a35c2664bb7da85be738eacf

Interessanterweise wird an den meisten Stellen, an denen Hashing im Bitcoin-Protokoll verwendet wird, doppeltes Hashing verwendet. Dies bedeutet, dass die Ausgabe der ursprünglichen SHA-256-Funktion direkt in die SHA-256-Funktion zurückgesetzt wird, um eine weitere Ausgabe zu erhalten. So sieht dieser Prozess aus:

Input to SHA-256(first round):  Output (first round): 77077b1f4c3ad44c83dc0bdb8d937e9b71c0ef07a35c2664bb7da85be738eacf Input to SHA-256 (second round): 77077b1f4c3ad44c83dc0bdb8d937e9b71c0ef07a35c2664bb7da85be738eacf Output (second round and final result): 3c6c55b0e4b607b672b50f04e028a6951aed6dc97b91e103fb0f348c3f1dfa00

Double Hashing schützt vor Geburtstagsangriffen. Ein Geburtstagsangriff ist ein Szenario, in dem ein Angreifer denselben Hash wie eine andere Eingabe mithilfe einer völlig anderen Eingabe ( Kollision genannt ) erzeugen kann . Dies bricht die dritte Eigenschaft der Einzigartigkeit. Ohne sie können zwei völlig unterschiedliche Bitcoin-Blöcke durch genau denselben Hash dargestellt werden, sodass Angreifer möglicherweise Blöcke austauschen können.

Mit der SHA-256-Funktion ist die Wahrscheinlichkeit dieses Angriffs unendlich gering. Wenn es nicht nahezu unmöglich wäre, würde SHA-256 als defekt angesehen.

Andere Hash-Funktionen wurden jedoch in der Vergangenheit "unterbrochen". Um zu verhindern, dass SHA-256 in Zukunft passiert (und das Sicherheitsmodell von Bitcoin effektiv bricht), ist es am besten, den Hash zu hashen . Dies halbiert die Wahrscheinlichkeit einer Kollision und macht das Protokoll so viel sicherer.

Auf sehr hohem Niveau ist Bitcoin Mining ein System, bei dem alle Bitcoin-Transaktionen an Bitcoin-Miner gesendet werden. Bergleute wählen Transaktionen im Wert von einem Megabyte aus, bündeln sie als Eingabe in die SHA-256-Funktion und versuchen, eine bestimmte Ausgabe zu finden, die das Netzwerk akzeptiert. Der erste Miner, der diese Ausgabe findet und den Block im Netzwerk veröffentlicht, erhält eine Belohnung in Form von Transaktionsgebühren und der Erstellung eines neuen Bitcoin.

Lassen Sie uns noch einen Schritt weiter gehen und in die Bitcoin-Blockchain selbst eintauchen, um zu sehen, was genau Bergleute tun, um das Netzwerk sicherer zu machen.

Bitcoin Mining: Eine technische Einführung

Bergbau wurde als Lösung für das Problem der doppelten Ausgaben eingeführt. Wenn ich 1 Bitcoin habe und es an Bob sende und dann versuche, dasselbe Bitcoin an Alice zu senden, stellt das Netzwerk sicher, dass nur eine Transaktion akzeptiert wird. Dies geschieht durch den bekannten Prozess des Bergbaus.

Bevor Sie sich mit den technischen Details befassen, ist es wichtig zu verstehen, warum Mining zur Sicherung des Netzwerks erforderlich ist. Da es jetzt eine Fiat-Währung gibt, wird die von uns gehaltene Währung von einer Federal Reserve erstellt und validiert. Da Bitcoin unter der starren Annahme von Dezentralisierung und Konsens arbeitet, kann keine zentrale Behörde existieren, die die Ausgabe dieser Währung und die Validierung von Transaktionen, die mit dieser Währung stattfinden, validiert und mit einem Zeitstempel versehen kann.

Satoshi Nakamoto schlug die damals einzige bekannte Lösung zur Lösung dieses Validierungsproblems in einem konsensorientierten System vor. Dieses Schema, das im Bitcoin-Whitepaper als Arbeitsnachweis betitelt ist , rechtfertigt auf elegante Weise, dass Transaktionen von Personen validiert werden, die bereit sind, genügend physische Rechenenergie und Zeit dafür aufzuwenden, und gleichzeitig einen Anreiz zur Induzierung des Marktwettbewerbs einführen. Dieser Wettbewerb ermöglicht es, dass die Eigenschaft der Dezentralisierung innerhalb des Ökosystems entsteht und organisch gedeiht.

Ein Blick in einen Block

Ein Bitcoin-Block besteht hauptsächlich aus zwei Komponenten:

1. Transaktionen in Form eines Merkle-Baums

Mining-Computer sammeln genügend Transaktionen, um einen Block zu füllen und zu einem Merkle-Baum zu bündeln.

Ein Merkle-Baum ist ein relativ einfaches Konzept: Transaktionen liegen als Blätter am unteren Rand des Baums und werden mit der SHA-256-Funktion gehasht. Die Kombination von zwei Blatttransaktionen wird erneut mithilfe der SHA-256-Funktion gehasht, um ein übergeordnetes Element der Blätter zu bilden. Dieses übergeordnete Element wird in Kombination mit anderen übergeordneten Elementen von gehashten Transaktionen kontinuierlich nach oben gehasht, bis eine einzelne Wurzel erstellt wird. Der Hash dieser Wurzel ist effektiv eine eindeutige Darstellung der Transaktionen, die sich darunter befinden.

Die Wurzel des Merkle-Baums ist eine Kombination der Hashes jeder Transaktion im Baum.

Denken Sie daran, dass für jede Eingabe in eine Hash-Funktion die Ausgabe völlig eindeutig ist. Sobald die meisten Knoten im Netzwerk einen verminten Block erhalten, fungiert die Wurzel des Merkle-Tree-Hash als unveränderliche Zusammenfassung aller Transaktionen in diesem bestimmten Block.

Wenn ein böswilliger Akteur versuchen würde, den Inhalt einer Transaktion in einem Block zu ändern, würde sein Hash geändert. Diese Änderung eines Hashs wird im Merkle-Baum der Transaktion weitergegeben, bis der Hash der Wurzel geändert wird. Jeder Knoten kann diese böswillige Handlung dann schnell abfangen, indem er die Wurzel des Merkle-Baums des geänderten Blocks mit der des Merkle-Baums eines gültigen Blocks vergleicht.

2. Der Blockheader

Der Blockheader ist eine Zusammenfassung des Inhalts des Blocks. Es enthält die folgenden sechs Komponenten :

  • Die Version der Software, die der Bitcoin-Client ausführt
  • Der Zeitstempel des Blocks
  • Die Wurzel des Merkle-Baums der enthaltenen Transaktionen
  • Der Hash des Blocks davor
  • Eine Nonce
  • Das Ziel

Denken Sie daran, dass die Wurzel des Transaktions-Merkle-Baums als effektive Zusammenfassung jeder Transaktion im Block fungiert, ohne dass Sie sich jede Transaktion ansehen müssen.

Der Hash des vorherigen Blocks, bevor das Netzwerk den Block ordnungsgemäß in chronologischer Reihenfolge platzieren kann. Hierher leitet sich der Begriff Blockchain ab - jeder Block ist mit einem vorherigen Block verkettet.

Das Nonce und das Ziel sind es, die den Bergbau zum Ticken bringen. Sie sind die Grundlage für die Lösung des SHA-256-Puzzles, das Bergleute lösen müssen.

Bitte beachten Sie, dass alle diese Daten im Blockheader mit einer Notation namens Little-Endian auf 80 Byte komprimiert werden, was die Übertragung von Blockheadern zwischen Knoten zu einem trivial effizienten Prozess macht. Für die Zwecke dieser Erklärung ignorieren wir diese Komprimierung und gehen davon aus, dass die Daten in ihrer ursprünglichen Form vorliegen.

Das Bergbauproblem erklären

Das im Blockheader gespeicherte Ziel ist einfach ein numerischer Wert, der in Bits gespeichert ist. In der traditionellen Basis-10-Notation liegt dieses Ziel zwischen 0 und 2²² (eine Ziffer von 67+)Anzahl), abhängig davon, wie viele Bergleute gleichzeitig um die Lösung dieses Problems konkurrieren.

Denken Sie daran, dass die Ausgabe von SHA-256 nur eine Zahl ist. Das Ziel eines Miners ist es, den Header des aktuellen Blocks zu nehmen, ihm eine Zufallszahl hinzuzufügen, die als Nonce bezeichnet wird , und seinen Hash zu berechnen. Dieser numerische Wert des Hash muss kleiner als der Zielwert sein.

Das ist alles dazu. Aber es ist viel leichter gesagt als getan.

Erinnern Sie sich an die erste Eigenschaft von SHA-256: Eine Eingabe in eine Hash-Funktion führt immer zu derselben Ausgabe. Wenn der Miner den Blockheader nahm, ihn haschte und feststellte, dass der Hashwert nicht kleiner als das Ziel war, musste er die Eingabe irgendwie ändern, um zu versuchen, einen Hash unter dem Zielwert zu finden.

Hier kommt die Nonce ins Spiel .

The miner adds a number (starting from 0), called the nonce, to the block header, and hashes that value. If the hash value isn’t less than the target, the miner will increment the nonce by 1, add it again to the block header, and hash that changed value. This process is repeated continuously until a hash less than the target value is found.

A Mining Example

Here’s a rough approximation of what made up the first block header:

  • The merkle root of the transaction in the Genesis block:
Merkle Root: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
  • The first known Bitcoin version: 0.1.0
  • The timestamp of the block: 2009–01–03 18:15:05
  • The target (this is also the highest the target will ever be):
Target: 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  • No previous block hash — this was the first block, and so this is a unique case

The final block header after adding its components together:

Let’s take this large header and compute the double-hash:

SHA-256 of header: 7d80bd12dfdccbdde2c41c9f406edfc05afb3320f5affc4f510b05a3394e1c91 SHA-256 of the previous result (final result): c5aa3150f61b752c8fb39525f911981e2f9982c8b9bc907c73914585ad2ef12b

Both the target and the output hash are incredibly large numbers when converted to base 10 (remember, over 67 digits long). Instead of trying to demonstrate the comparison of the two here, the following Python function handles the comparison instead:

def isBlockHashLessThanTarget(blockHash, target): return int(blockHash, 16) < int(target, 16)

True is returned if the hash is less than the target, false otherwise.

Here is the result with our target and block hash:

Now we take the original block hexadecimal value and add 1 to it. Here is the following result:

We then run the same hashing algorithm and comparison on this changed data. If its not below the target, keep repeating.

Once a successful hash is found, the latest nonce used to find this solution is saved within the block.

The listed nonce on the Genesis block is 2,083,236,893.

This means Satoshi Nakomoto iterated through this process over 2 billion times before he found a hash that was acceptable.

I’ve written a small Python implementation of this Genesis block mining process that can be found on my GitHub.

subhan-nadeem/bitcoin-mining-python

bitcoin-mining-python - A Python implementation of the Bitcoin mining algorithm

github.com

See how long it would take for you to successfully mine the Genesis block!

A Caveat: extraNonce

The nonce value in a block header is stored as a 32-bit number. This means that the highest nonce anybody is able to achieve is 2³² (approximately 4 billion). After 4 billion iterations, the nonce is exhausted, and if a solution is not found, miners are once again stuck.

The solution to this is to add a field to the coinbase (the transaction contents of a block, stored as the merkle tree) called the extraNonce. The size of this extraNonce is only limited by the size of block itself, and so it can be as large as miners wish as long as the block size is within protocol limits.

If all 4 billion possible values of the nonce are exhausted, the extraNonce is added and incremented to the coinbase. A new merkle root and subsequently new block header are calculated, and the nonce is iterated over once again. This process is repeated until a sufficient hash is found.

It’s best to avoid adding the extraNonce until the nonce is exhausted, because any change to the extraNonce changes the merkle tree. This requires extra computation in order to propagate the change upwards until a new root of the merkle tree is calculated.

The Miner Reward

A miner who successfully publishes a block the fastest is rewarded brand new Bitcoin, created out of thin air. That reward currently stands at 12.5 BTC. Just how do these Bitcoins come into existence?

Each miner simply adds a new output transaction to their block that attributes 12.5 Bitcoins to themselves before beginning to mine the block. The network protocol will accept this special transaction as valid upon receiving a newly validated block. This special transaction is called a generation transaction.

Its the miner’s responsibility to add this transaction into the block before mining it. There has been at least one case where miners forgot to add the reward to the transaction before mining a block, effectively destroying 12.5 BTC!

Validating Proof-of-Work

Let’s say our miner has found a hash that is less than the target. All this miner has to do is publish the mined block with the original six components to any connected nodes.

This node receiving the block will first verify the transaction set, ensuring all transactions are valid (for example, all transactions are appropriately signed, and coins aren’t being double-spent and/or being created out of thin air).

It will then simply double-hash theblock header and ensure the value is below the block’s included target value. Once the block is deemed valid, the new node will continue to propagate this block across the network until every node has an up-to-date ledger.

As you can see, newly published blocks can easily be verified by any given node. However, publishing a valid block to the network requires an incredibly large amount of computational power (thus, electricity and time). This asymmetry is what allows the network to be secured while simultaneously allowing individuals who wish to conduct economic activity on the network to do so in a relatively seamless manner.

The Block Time and Adjusting the Target

As the first miners began mining, they each monitored the block time. Each Bitcoin block has a set block time of 10 minutes. What this means is that given the current level of computing power (networkhashrate) on the network, nodes will always expect newly validated blocks to be produced every 10 minutes on average.

We can reasonably expect blocks to be produced within 10 minutes because the probability of finding a block, given the network hashrate, is known.

For example, let’s take the easiest target that’s ever existed in Bitcoin: the genesis block. The probability of any single hash being less than the easiest target is 1 in 2³². That’s one in over four billion. Therefore, we can reasonably expect somebody to run 2³² iterations of the mining problem in order to find a proper hash. Nodes on the network expected four billion of these iterations to be run across allminers on the network every 10 minutes.

If, over a large sample size of blocks, blocks start appearing faster than 10 minutes, this is a pretty clear indication that nodes on the network are iterating through four billion hashes much faster than 10 minutes. This situation prompts every node to adjust the target proportionally based on the increase (or decrease) in network power to ensure blocks continue to be produced every 10 minutes.

In actuality, nodes on the network monitor the block time across 2016 blocks, which comes out to exactly two weeks. Every two weeks, the total block time is compared to the expected block time (which is 20160 minutes).

To obtain the new target, simply multiply the existing target by the ratio of the total actual block time over the last two weeks to get the expected block time. This will adjust the target proportionally to the amount of entering or exiting computing power on the network.

The block time and the ability to easily calculate the probability of finding a valid block lets nodes easily monitor and determine the total hashpower on the network and adjust the network. No matter how much computing power is added to the network or how quickly its added, on average the block time will always remain at 10 minutes.

The current total hash rate on the network is 28.27 exahash per second. That’s 28.27 x 10¹⁸ hashes run every second across all computers on the network.

In summary

We have now comprehensively covered the following:

  • Why cryptographic one way hashing is vital to proof-of-work
  • A breakdown of the construction of a Bitcoin block
  • The actual mining process and iteration itself
  • How nodes can easily validate other blocks
  • How the network manages to maintain the algorithm and competitiveness by monitoring the block time and adjusting the target

You should now be able to understand and explain how proof-of-work actually functions and why it is considered to be an entirely secure algorithm that enables decentralization and consensus!

Follow me on Twitter and Medium if you’re interested in more in-depth and informative write-ups like these in the future!