Was ist HASH160?
HASH160 bezeichnet in Bitcoin die Kombination aus zwei Hashfunktionen:
Die Daten werden also zuerst mit SHA-256 gehasht. Das 32-Byte-Ergebnis daraus wird anschließend noch einmal mit RIPEMD-160 gehasht. Am Ende entsteht ein 160-Bit-Wert, also genau 20 Byte.
HASH160 ist deshalb kein eigener Algorithmus, sondern eine feste Abfolge zweier bestehender Hashfunktionen.
In Bitcoin wird HASH160 vor allem verwendet, um aus einem öffentlichen Schlüssel einen kompakten
Fingerabdruck zu erzeugen. Statt den vollständigen Public Key direkt in einer Adresse oder einem
scriptPubKey zu speichern, wird häufig nur dessen HASH160 verwendet.
Daten
↓
SHA-256
↓
RIPEMD-160
↓
20-Byte-Public-Key-HashDieser 20-Byte-Wert ist nicht der öffentliche Schlüssel selbst. Er ist nur ein Hash davon. Wer später Coins ausgeben möchte, muss den passenden öffentlichen Schlüssel offenlegen. Die Node berechnet dann erneut den HASH160 und prüft, ob er mit dem erwarteten Wert übereinstimmt.
Als Beispiel dient die Transaktion 6f7cf9580f1c2dfb3c4d5d043cdbb128c640e3f20161245aa7372e9666168516 aus Block 728, ein
frühes Beispiel für P2PKH.
Was ist RIPEMD-160?
RIPEMD-160 wird meist „Ripe M D one sixty“ ausgesprochen. Der Name steht für RACE Integrity Primitives Evaluation Message Digest. Die Zahl 160 bezieht sich auf die Länge des Ergebnisses: 160 Bit, also 20 Byte.
In Bitcoin ist RIPEMD-160 vor allem deshalb relevant, weil es das Ergebnis von SHA-256 auf einen kürzeren Wert verdichtet. Bei HASH160 wird also nicht der ursprüngliche Public Key direkt mit RIPEMD-160 gehasht, sondern zuerst dessen SHA-256-Hash.
Der wichtige Punkt ist: RIPEMD-160 liefert den kompakten 20-Byte-Wert, der in klassischen P2PKH- und P2SH-Ausgaben gespeichert werden kann. Es verschlüsselt keine Daten und lässt sich nicht rückwärts zum ursprünglichen Public Key oder Script auflösen.
In Bitcoin taucht RIPEMD-160 daher meistens nicht allein auf, sondern zusammen mit SHA-256 als HASH160.
HASH160 in P2PKH-Ausgaben
Bei Pay-to-Public-Key-Hash, kurz P2PKH, wird eine Ausgabe nicht direkt an einen öffentlichen Schlüssel gebunden, sondern an dessen HASH160.
Der Name beschreibt den Kern:
Pay to Public Key Hash
= Zahle an den Hash eines öffentlichen SchlüsselsIn einer P2PKH-Ausgabe steht also nicht der vollständige öffentliche Schlüssel. Im
scriptPubKey steht stattdessen ein 20-Byte-HASH160 des öffentlichen
Schlüssels:
P2PKH ScriptPubKey · Block 728
- Push-Opcode
- Daten
- Opcode
Bereich anklicken für Details.
Der Platzhalter <Public-Key-Hash> ist der gespeicherte Vergleichswert:
<Public-Key-Hash>
= HASH160(Public Key)
= RIPEMD-160(SHA-256(Public Key))Public Key
65 Byte
044d05240cfbd8a2786eda9dadd520c1609b8593ff8641018d57703d02ba687cf2f187f0cee2221c3afb1b5ff7888caced2423916b61444666ca1216f26181398c32-Byte-Hash
32 Byte
9937c25f9764321edf4f0dece8546b165ae42f896ba82b8ccb5271bdfe88a90d20-Byte-HASH160
20 Byte
12ab8dc588ca9d5787dde7eb29569da63c3a238cWallets können diesen Public-Key-Hash als klassische 1…-Adresse codieren. Wie daraus Versionsbyte, Prüfsumme und
Base58Check entstehen, steht unter Addresses.
Beim Ausgeben liefert der Input den öffentlichen Schlüssel und eine
Signatur. Die Node führt anschließend das
P2PKH-Script aus. Dabei berechnet
OP_HASH160 erneut den HASH160 des offengelegten öffentlichen Schlüssels und
OP_EQUALVERIFY vergleicht ihn mit dem im
scriptPubKey gespeicherten Public-Key-Hash.
Danach prüft OP_CHECKSIG, ob die Signatur zum öffentlichen Schlüssel und zur
Transaktion passt. Nur wenn das Script erfolgreich ausgewertet wird, ist die Ausgabe
gültig.
HASH160 in P2SH-Ausgaben
HASH160 wird nicht nur für öffentliche Schlüssel verwendet.
Bei Pay-to-Script-Hash, kurz P2SH, wird nicht der Hash eines Public Keys gespeichert, sondern der HASH160 eines Scripts. Dieses Script nennt man Redeem Script.
P2PKH:
HASH160(Public Key)
P2SH:
HASH160(Redeem Script)Dadurch konnte Bitcoin komplexere Ausgabebedingungen kompakt im scriptPubKey
speichern. Die Ausgabe enthält zunächst nur den 20-Byte-Hash. Beim Ausgeben muss der Input das passende Redeem Script
offenlegen. Die Node hasht dieses Script erneut mit HASH160 und prüft, ob der Wert mit dem gespeicherten Script-Hash
übereinstimmt.
Warum nicht einfach SHA-256?
SHA-256 erzeugt einen 256-Bit-Hash, also 32 Byte. Für viele Stellen in Bitcoin ist das genau richtig, zum Beispiel bei Block-Hashes, Transaktions-IDs oder Merkle-Bäumen.
Für klassische P2PKH-Ausgaben wurde jedoch ein kürzerer Wert verwendet. HASH160 verkürzt das SHA-256-Ergebnis mit RIPEMD-160 auf 160 Bit, also 20 Byte.
Dadurch ist der gespeicherte Vergleichswert im scriptPubKey kleiner. Auch die
daraus abgeleitete klassische Adresse wird kürzer als sie mit einem vollen SHA-256-Hash wäre.
Wichtig ist: HASH160 ersetzt SHA-256 nicht überall. Es ist eine spezielle Konstruktion für bestimmte Ausgabeformen wie P2PKH und P2SH. An anderen Stellen verwendet Bitcoin weiterhin SHA-256 oder doppelte SHA-256-Hashes.