Към съдържанието
ДаретеEN

Ключове и адреси

Хеш на публичния ключ

Хеш на публичния ключ в биткойн: 20-байтовият HASH160, направен чрез SHA-256 и RIPEMD-160. Вижте как се прави и къде се появява.

От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.

Хешът на публичния ключ в биткойн (bitcoin) е 20-байтов низ, получен чрез двойно хеширане на публичния ключ. Първо ключът се хешира със SHA-256, после резултатът се хешира с RIPEMD-160. Биткойн нарича комбинираната стъпка HASH160. Повечето адреси и заключващи скриптове носят този хеш вместо целия ключ, защото е по-къс.

Как се прави хешът на публичния ключ?

Стъпките са три.

  1. Вземете публичния ключ като байтове. Използвайте компресираната форма, 33 байта, освен ако нямате причина да не я използвате.
  2. Хеширайте тези байтове със SHA-256. Получавате 32 байта.
  3. Хеширайте резултата с RIPEMD-160. Получавате 20 байта. Това е хешът на публичния ключ.
Компресиран публичен ключ от 33 байта минава през SHA-256 до 32 байта, после през RIPEMD-160 до 20-байтов хеш. Компресиран ключ: 33 байта 02cd33111c7fc75b33bc30ad959dd2743 3d631dee5bf072733334163dedc403070 SHA-256 Изход от SHA-256: 32 байта 302752d85c08e5bae4e3bc813c552cb8 7393170f70c79aefe8dc22197b7e2aa2 RIPEMD-160 Хеш на публичния ключ: 20 байта 1fe032088d648e925f15a24a0cf6a1e80f01bf91 HASH160 на публичния ключ Размери в байтове, в мащаб Некомпресиран ключ: 65 Компресиран ключ: 33 Хеш: 20
Всяка лента е начертана в мащаб, затова хешът е най-късият от трите.

За компресирания ключ от страницата за публичния ключ трите стойности са:

public key   02cd33111c7fc75b33bc30ad959dd27433d631dee5bf072733334163dedc403070
SHA-256      302752d85c08e5bae4e3bc813c552cb87393170f70c79aefe8dc22197b7e2aa2
RIPEMD-160   1fe032088d648e925f15a24a0cf6a1e80f01bf91

Тази Python функция прави двете хеширания. Нужни са Python 3 и стандартният модул hashlib.

import hashlib

def hash160(data: bytes) -> bytes:
    """SHA-256, после RIPEMD-160: 20-байтовият хеш на публичния ключ."""
    return hashlib.new("ripemd160", hashlib.sha256(data).digest()).digest()

pubkey = bytes.fromhex("02cd33111c7fc75b33bc30ad959dd27433d631dee5bf072733334163dedc403070")
print(hash160(pubkey).hex())  # 1fe032088d648e925f15a24a0cf6a1e80f01bf91

При някои сборки на OpenSSL 3 RIPEMD-160 липсва в hashlib. Ако видите грешката „unsupported hash type“, ползвайте библиотека като pycryptodome, която има RIPEMD-160.

Защо хешът е 20 байта?

RIPEMD-160 винаги връща 160 бита, което са 20 байта. Така хешът е с 13 байта по-къс от компресиран ключ и с 45 байта по-къс от некомпресиран. По-късата стойност дава по-къс адрес. Адресът добавя байт за версия и контролна сума, а после се кодира така, че хората да го четат.

Защо адресите ползват хеш?

Сатоши е използвал хешове на публичните ключове за адресите в първата версия на биткойн, а основната цел е била по-кратък адрес. Тази версия е ползвала само некомпресирани ключове, по 65 байта, което е правело копирането и поставянето трудни. 20-байтовият хеш е много по-лесен за споделяне.

Хешът също крие ключа, докато не похарчите. Някои хора го броят за допълнителна защита. Това важи само за монетите, които още не са похарчени, защото ключът се разкрива в момента, в който ги похарчите. Ясната полза е по-късият адрес.

Къде се появява хешът в трансакция?

Хешът се появява в заключващия скрипт на изхода, който определя условията за харчене на монетите. Има две често срещани форми. Схемата показва и двете, а текстът по-долу ги обяснява.

20-байтовият хеш е вътре в P2PKH скрипт от шест елемента, а P2WPKH скриптът е версия 0, последвана от push на 20 байта. Заключващ скрипт P2PKH Стар формат. Целият ключ се показва в scriptSig. 76 OP_DUP a9 OP_HASH160 14 push на следващите 20 байта 1fe032088d648e925f15a24a0cf6a1e80f01bf91 88 OP_EQUALVERIFY ac OP_CHECKSIG Заключващ скрипт P2WPKH SegWit. Ключът е в witness, когато похарчите. 00 OP_0, версия 0 на witness 14 push на 20 байта 1fe032088d648e925f15a24a0cf6a1e80f01bf91
Хешът е в оранжево в P2PKH скрипта и в синьо в P2WPKH скрипта.

P2PKH

P2PKH е старата (legacy) форма, а адресите ѝ започват с 1. scriptPubKey на P2PKH изхода за примерния ключ е:

76a9141fe032088d648e925f15a24a0cf6a1e80f01bf9188ac

Байтовете 76 (OP_DUP), a9 (OP_HASH160), 14 (push на 20 байта) и 88 и ac (OP_EQUALVERIFY и OP_CHECKSIG) обграждат хеша. Когато харчите, scriptSig показва целия компресиран ключ и подпис. Нодът после хешира ключа с HASH160 и сравнява резултата с хеша в заключването. Ако съвпаднат, проверява подписа.

Реален пример е трансакция 6f7cf958…8516, която има P2PKH изход.

P2WPKH

P2WPKH е SegWit формата, а адресите ѝ започват с bc1q. Нейният scriptPubKey е по-къс:

00141fe032088d648e925f15a24a0cf6a1e80f01bf91

00 е OP_0, който означава witness версия 0. 14 е push на следващите 20 байта, а те са хешът. Ключът не стои в заключването. Той идва по-късно, в witness, когато изходът се похарчи. Реален пример е трансакция c178d8da…a83a, която има P2WPKH изход.

Как адресите ползват хеша?

Адресът е хешът на публичния ключ с префикс и контролна сума, записан като текст. P2PKH адресът добавя отпред байта 00, прибавя контролна сума и кодира резултата в Base58. P2WPKH адресът ползва bech32 и номера на версията. Хешът не се променя между двата вида. Променя се само опаковката.

Примерният ключ дава P2PKH адреса 13uYXKWq8VoZgQApSxTXHPtYDs1m1xGi4z. Страницата за адреса показва всяка стъпка от построяването.

Обобщение

Хешът на публичния ключ е 20-байтовият HASH160 на публичен ключ: SHA-256, после RIPEMD-160. Той прави адресите по-къси и се съдържа във всеки P2PKH и P2WPKH изход. Целият ключ се разкрива едва когато монетите се похарчат. Следващата страница, контролна сума, обяснява как адресите добавят проверка срещу грешки при писане.

Източници: страницата за версия 1 адреси в Bitcoin Wiki описва стъпката HASH160, а hash.h на Bitcoin Core я дефинира в референтния софтуер.

В този раздел: Ключове и адреси

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни