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

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

Контролна сума

Контролна сума биткойн: първите 4 байта от двойния SHA-256, добавени към адреси и ключове, за да се хванат грешки при писане. Вижте как работи.

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

Контролната сума в биткойн (bitcoin) е 4 байта допълнителни данни, добавени към низ, за да може портфейлът да хване грешки при писане. Това са първите 4 байта от HASH256, който представлява SHA-256, приложен два пъти върху данните. Адресите, WIF частните ключове и разширените ключове носят такава. Ако контролната сума не съвпадне, портфейлът може да откаже низа, преди да изпратите монети на грешното място.

Какво прави контролната сума?

Контролната сума ви позволява да проверите дали данните са същите, каквито са били при записването им. Пресмятате кратък отпечатък на данните и го добавяте. По-късно пресмятате отпечатъка отново. Ако се промени един знак, двата отпечатъка почти сигурно се различават.

Контролната сума открива грешки, но не ги поправя. Казва ви, че нещо не е наред, но не и къде е грешката.

Как се прави контролна сума в биткойн?

Контролната сума се прави на три стъпки.

  1. Хеширайте данните със SHA-256.
  2. Хеширайте този резултат пак със SHA-256. Двете стъпки заедно са HASH256.
  3. Запазете първите 4 байта от резултата. Това са 8 шестнадесетични цифри.

Ето пример с 20 байта aa, записани като 40 шестнадесетични цифри:

data          = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hash256(data) = 05c4de7c1069e9de703efd172e58c1919f48ae03910277a49c9afd7ded58bbeb
checksum      = 05c4de7c
Контролната сума се прави, като данните се хешират два пъти със SHA-256, запазват се първите 4 байта и се добавят към данните. Данни (payload): 21 байта 001fe032088d648e925f15a24a0cf6a1 e80f01bf91 SHA-256, и пак SHA-256 hash256 на данните: 32 байта 94686373829f8747c77aa9bf0ff58d48 b4d8533e29ae28db390784c770083d09 пазим първите 4 байта Контролна сума: 4 байта 94686373 добавена към 21-байтовите данни Кодиране в Base58 Адрес (P2PKH) 13uYXKWq8VoZgQApSxTXHPtYDs1m1xGi4z
Данните тук са от P2PKH адреса на примерния ключ. Контролната сума се пресмята по същия начин.

За примерния ключ данните са байт за версия 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, което не съвпада. Портфейлът отхвърля адреса.

Една сбъркана буква променя запазената контролна сума, така че тя вече не съвпада с пресметнатата. Въведено вярно: прието 13uYXK…1xGi4z в адреса пресметната 94686373 94686373 = Една буква е сбъркана: отхвърлено 13uYXK…1xGi4y в адреса пресметната 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 реализира декодирането и проверката на контролната сума.

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

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

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