Контролна сума
Контролна сума биткойн: първите 4 байта от двойния SHA-256, добавени към адреси и ключове, за да се хванат грешки при писане. Вижте как работи.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Контролната сума в биткойн (bitcoin) е 4 байта допълнителни данни, добавени към низ, за да може портфейлът да хване грешки при писане. Това са първите 4 байта от HASH256, който представлява SHA-256, приложен два пъти върху данните. Адресите, WIF частните ключове и разширените ключове носят такава. Ако контролната сума не съвпадне, портфейлът може да откаже низа, преди да изпратите монети на грешното място.
Какво прави контролната сума?
Контролната сума ви позволява да проверите дали данните са същите, каквито са били при записването им. Пресмятате кратък отпечатък на данните и го добавяте. По-късно пресмятате отпечатъка отново. Ако се промени един знак, двата отпечатъка почти сигурно се различават.
Контролната сума открива грешки, но не ги поправя. Казва ви, че нещо не е наред, но не и къде е грешката.
Как се прави контролна сума в биткойн?
Контролната сума се прави на три стъпки.
- Хеширайте данните със SHA-256.
- Хеширайте този резултат пак със SHA-256. Двете стъпки заедно са HASH256.
- Запазете първите 4 байта от резултата. Това са 8 шестнадесетични цифри.
Ето пример с 20 байта aa, записани като 40 шестнадесетични цифри:
data = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hash256(data) = 05c4de7c1069e9de703efd172e58c1919f48ae03910277a49c9afd7ded58bbeb
checksum = 05c4de7c
За примерния ключ данните са байт за версия 00, следван от 20-байтовия хеш на публичния ключ. Това прави 21 байта. Контролната сума е 94686373. Целият низ е 25 байта: данните и добавената към тях контролна сума. Кодирането им в Base58 дава адреса 13uYXKWq8VoZgQApSxTXHPtYDs1m1xGi4z.
Как се проверява контролна сума?
За да проверите контролната сума, отделете последните 4 байта, хеширайте останалото пак и сравнете. Ако двете съвпаднат, данните са непроменени. Скриптът по-долу създава контролната сума за примерните данни и после я проверява.
import hashlib
def hash256(data: bytes) -> bytes:
"""Двойно SHA-256."""
return hashlib.sha256(hashlib.sha256(data).digest()).digest()
payload = bytes.fromhex("001fe032088d648e925f15a24a0cf6a1e80f01bf91")
checksum = hash256(payload)[:4]
print(checksum.hex()) # 94686373
def checksum_ok(data_with_checksum: bytes) -> bool:
data, stored = data_with_checksum[:-4], data_with_checksum[-4:]
return hash256(data)[:4] == stored
print(checksum_ok(payload + checksum)) # True
Сега да направим една грешка. Сменете последния знак на адреса от z на y. Декодираната контролна сума се променя от 94686373 на 94686372. Портфейлът пресмята контролната сума отново от данните и получава 94686373, което не съвпада. Портфейлът отхвърля адреса.
Къде се появяват контролните суми в биткойн?
- Адреси. Всеки стар (legacy) адрес, като P2PKH и P2SH, ползва Base58Check: данни, контролна сума, после кодиране в Base58.
- WIF частни ключове. WIF ключът също носи контролна сума, така че при внасяне може да се хване сбъркан ключ.
- Разширени ключове. Низовете
xprvиxpubза HD портфейли имат всеки своя контролна сума. - Мрежови съобщения. Всяко заглавие на съобщение между нодовете съдържа 4-байтова контролна сума на полезния товар (payload). Повреда или подмяна се показват като несъвпадение.
Адресите Bech32 също съдържат контролна сума, но тя е по-силна: BCH код, който открива всяка грешка до 4 знака. Тя не е простата контролна сума от тази страница.
Колко надеждна е 4-байтовата контролна сума?
4-байтовата контролна сума има 2^32 възможни стойности, което е около 4.3 милиарда. Случайна грешка дава съвпадаща контролна сума около веднъж на 4.3 милиарда опита. Това е много малко вероятно, но не е невъзможно. Затова контролната сума е предпазна мрежа, а не гаранция.
Пълният 32-байтов хеш би бил по-силен, но адресите щяха да станат много дълги. Четирите байта са компромис между сигурност и дължина.
Обобщение
Контролната сума хваща грешки при писане. Адресите, WIF ключовете и разширените ключове носят такава. Портфейл, който я проверява, може да ви спре, преди плащането да отиде на грешното място. Въпреки това проверявайте всеки адрес сами, преди да платите. Ако сте разработчик, винаги проверявайте контролната сума, когато приемате низ, защото проверката е само няколко реда код. Следващата страница, Base58, обяснява азбуката, в която се записват тези низове.
Източници: страницата Base58Check encoding в Bitcoin Wiki описва построяването, а base58.cpp на Bitcoin Core реализира декодирането и проверката на контролната сума.
В този раздел: Ключове и адреси
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни