Хеш функция
Хеш функция биткойн превръща всякакви данни в отпечатък с фиксиран размер. Вижте как биткойн ползва SHA-256, HASH256, HASH160 и tagged hash.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Хеш функцията превръща всякакви данни в кратък отпечатък с фиксиран размер, наречен хеш. Биткойн (bitcoin) използва най-често SHA-256. Върху него той изгражда и две комбинации: HASH256, който прилага SHA-256 два пъти, и HASH160, който след SHA-256 прилага RIPEMD-160. Хешовете свързват блоковете и трансакциите и задвижват майнинга, при който хешът на блока трябва да падне под целта.
Какво е хеш функция?
Хеш функцията приема вход с произволна дължина и връща изход с определен размер. SHA-256 винаги връща 32 байта (256 бита), независимо дали входът е един байт, или цял блок данни. Изходът изглежда случаен, така че можете да го използвате като референтен номер за входа.
Байтовете на хеша обикновено се показват като шестнадесетични знаци. Всеки байт се превръща в две шестнадесетични цифри, така че 32-байтовият изход на SHA-256 има 64 знака.
Какво прави хеш функцията силна?
Една проста функция за отпечатъци трябва да има две свойства. Тя трябва да дава същия изход за същия вход, което се нарича детерминираност. Освен това трябва да връща фиксиран размер. Силната (криптографската) хеш функция трябва да има още три свойства:
| Свойство | Какво означава |
|---|---|
| Устойчивост на прообраз | При даден хеш не може да се намери вход, който да го произвежда. |
| Устойчивост на втори прообраз | При даден вход не може да се намери друг вход със същия хеш. |
| Устойчивост на колизии | Не може да се намерят два входа с общ хеш. |
Силните хеш функции проявяват и лавинния ефект. Малка промяна във входа променя около половината от битовете на изхода.
Какво се случва, когато се промени един бит?
Решетката по-горе показва лавинния ефект. Байтът 00 и байтът 01 се различават с един бит, но SHA-256 хешовете им нямат видим модел. Около половината битове се променят, точно както трябва при добра хеш функция. Тъй като изходът е непредсказуем, никой не може да избере вход, за да получи желания резултат. Биткойн разчита на това свойство при майнинга.
Кои хеш функции използва биткойн?
Биткойн използва няколко метода за хеширане. Повечето от тях са изградени върху SHA-256.
| Метод | Изграден от | Изход | Основна употреба в биткойн |
|---|---|---|---|
| SHA-256 | Един кръг SHA-256 | 32 байта | Хешове на скриптове в P2WSH и в tagged hash |
| HASH256 | SHA-256, приложен два пъти | 32 байта | Хешове на блокове, TXID, Меркъл корени, контролни суми, хешове за подписване |
| HASH160 | SHA-256, после RIPEMD-160 | 20 байта | Хешове на публични ключове (P2PKH, P2WPKH) и на скриптове (P2SH) |
| Tagged hash | SHA-256 с таг отпред | 32 байта | Подписи Schnorr и Taproot |
| HMAC-SHA512 | SHA-512 с таен ключ | 64 байта | Дъщерни ключове в HD портфейлите |
| PBKDF2 | HMAC-SHA512, изпълнен 2,048 пъти | 64 байта | Сийдът от мнемоничната фраза |
Стандартът FIPS 180-4 определя SHA-256. RIPEMD-160 е дефиниран в статия от 1996 г. на изследователи от KU Leuven.
Как се изчислява HASH256?
HASH256 е най-разпространеният метод. Хеширате данните веднъж със SHA-256, после хеширате 32-байтовия резултат отново със SHA-256.
import hashlib
def hash256(data: bytes) -> bytes:
return hashlib.sha256(hashlib.sha256(data).digest()).digest()
print(hash256(bytes.fromhex("aa")).hex())
# e51600d48d2f72eb428e78733e01fbd6081b349528335bf21269362edfae185d
Блоковите хешове и TXID-овете, показани от bitcoin-cli, се появяват в обратен ред на байтовете. Суровите байтове са същите, само показването е различно. Страницата за реда на байтовете обяснява обръщането.
Как се изчислява HASH160?
HASH160 хешира данните първо със SHA-256, после с RIPEMD-160. Втората стъпка скъсява резултата от 32 на 20 байта, което прави адресите по-кратки.
import hashlib
def hash160(data: bytes) -> bytes:
return hashlib.new("ripemd160", hashlib.sha256(data).digest()).digest()
print(hash160(bytes.fromhex("aa")).hex())
# 58d179ca6112752d00dc9b89ea4f55a585195e26
Публичният ключ е дълъг 33 или 65 байта. Хеширането му с HASH160 дава 20-байтовия хеш на публичния ключ, който носят повечето адреси. Хешовете на P2SH скриптовете също използват HASH160.
Какво е tagged hash?
Tagged hash добавя име, тага, пред данните. Подписите Schnorr и Taproot дефинират хешовете си така, че хеш, направен за една цел, да не може да се обърка с хеш, направен за друга. BIP 340 дефинира схемата така:
tagged_hash(tag, msg) = SHA256(SHA256(tag) || SHA256(tag) || msg)
Повтарянето на хеша на тага е трик за скорост. Префиксът е 64 байта и запълва точно един блок на SHA-256, така че една реализация може да изчисли този блок веднъж и да го използва повторно.
import hashlib
def tagged_hash(tag: str, msg: bytes) -> bytes:
t = hashlib.sha256(tag.encode()).digest()
return hashlib.sha256(t + t + msg).digest()
print(tagged_hash("BIP0340/challenge", b"").hex())
# c216d352f5818b7b4beacd4ae0a26fe888080823d2a598856661bcd54f1b3713
Taproot използва същата конструкция със свои тагове, например TapSighash, дефинирани в BIP 341.
Защо има значение типът на входа?
Често срещана грешка е да се хешира шестнадесетичният текст, а не байтовете, които той означава. Текстът ab са два ASCII знака, 0x61 и 0x62. Байтът 0xab е една стойност. Хешовете им са различни.
import hashlib
print(hashlib.sha256(b"ab").hexdigest()) # текстът "ab"
# fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603
print(hashlib.sha256(bytes.fromhex("ab")).hexdigest()) # байтът 0xab
# 087d80f7f182dd44f184aa86ca34488853ebcc04f0c60d5294919a466b463831
Винаги превръщайте шестнадесетичния текст в байтове, преди да го хеширате. Ако вашият хеш не съвпада с известен резултат, първо проверете това.
Къде използва биткойн хеширане?
Хеширането се среща почти навсякъде в биткойн:
- Хеш на блока: HASH256 на 80-байтовото заглавие на блока. Майнингът търси заглавие, чийто хеш е под целта.
- Меркъл корен (Merkle root): хешира TXID-овете по двойки, докато получи един корен за целия блок.
- TXID: HASH256 на трансакция, използван като нейн референтен номер.
- Контролна сума: първите 4 байта от HASH256, добавени към адресите в Base58, за да се хванат грешките при въвеждане.
- Хешът за подписване (sighash): съобщението, което покрива всеки подпис.
- Разширени ключове: HMAC-SHA512 създава всеки дъщерен ключ от родителския.
- Сийдът от мнемоничната фраза: PBKDF2 превръща думите и незадължителната парола в 64-байтов сийд.
Защо HASH256 се прилага два пъти?
Сатоши Накамото никога не е обяснил двойното хеширане. Една вероятна причина е атаката с удължаване на дължината (length extension attack), която може да има значение, когато хешът покрива тайни данни. Повечето хешове в биткойн покриват публични данни, при които тази атака няма значение, така че допълнителният кръг днес е най-вече особеност. По-новите схеми са го премахнали, където са могли. P2WSH, дефиниран в BIP 141, използва един SHA-256 за хеша на скрипта. Двойното хеширане е особеност на биткойн, която трябва да познавате, но не е правило, което да копирате.
Какво следва?
Хешът превръща данните в отпечатък, но не може да докаже кой ги е създал. За това биткойн използва крива. Продължете с математиката на елиптичната крива, после със страниците за ECDSA и подписите Schnorr.
В този раздел: Криптография
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни