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

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

WIF частен ключ

WIF биткойн: Wallet Import Format записва частен ключ в Base58, с байт за мрежата и контролна сума. Вижте как се кодира и декодира.

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

WIF, което е съкращение от Wallet Import Format, е начин да запишете частен ключ като низ в Base58. Той добавя байт, който показва мрежата, незадължителен байт, който показва компресиран ключ, и контролна сума, която хваща грешки при писане. Низовете WIF в основната мрежа (mainnet) започват с 5, K или L.

Низът WIF не е различен ключ. Същите 32 байта може да се запишат като шестнадесетични цифри или като WIF, а от WIF можете винаги да се върнете към тях. Тъй като низът WIF съдържа самия ключ, той изисква същите грижи като частния ключ, който кодира.

Защо WIF, а не шестнадесетичен запис?

WIF има три практически предимства пред 64-цифрения шестнадесетичен ключ:

  • Е по-къс, 51 или 52 знака, и се копира по-лесно.
  • Започва с познат знак, така че частният ключ се отличава от случаен низ.
  • Контролната му сума хваща сбъркан знак при внасяне. Не може да поправи грешката, но не позволява лошият низ да бъде използван.

Флагът за компресия добавя четвърто предимство. Той казва на портфейла за кой формат на публичния ключ е предназначен ключът и оттам за кой адрес да търси.

Какви са полетата на низа WIF?

Поле Размер Стойност
Байт за версия 1 байт 80 в основната мрежа, ef в тестовата мрежа
Частен ключ 32 байта Суровият ключ, без промяна
Флаг за компресия 1 байт, незадължителен 01 за компресиран публичен ключ. Липсва при некомпресиран.
Контролна сума 4 байта Първите 4 байта от hash256 на всички полета по-горе

Байтовете после се кодират в Base58, азбука без 0, O, I и l, за да се сбъркат по-трудно знаците.

Как се кодира частен ключ като WIF?

  1. Вземете 32-байтовия частен ключ в шестнадесетичен запис.
  2. Сложете отпред байта за версия: 80 за основната мрежа, ef за тестовата.
  3. Добавете 01 в края, ако ключът е за компресиран публичен ключ. Повечето ключове, които се ползват днес, са компресирани.
  4. Хеширайте данните два пъти с SHA-256. Запазете първите 4 байта и ги добавете в края като контролна сума.
  5. Кодирайте в Base58 целия резултат.
32-байтовият частен ключ получава байт за версия, байт за компресия и контролна сума, после се кодира в Base58. байт за версия: 80 означава основна мрежа 80 32 байта: частният ключ ef235aacf90d9f4aadd8c92e4b2562e1 d9eb97f0df9ba3b508258739cb013db2 незадължителен: 01, компресиран 01 4 байта: контролна сума на горното 66557e53 Кодиране в Base58 WIF частен ключ L5EZftvrYaSudiozVRzTqLcHLN DoVn7H5HSfM9BAN6tMJX8oTWz6
Примерният ключ от тази страница. Не го ползвайте с истински монети.

Тази страница използва собствен пример, ef235aacf90d9f4aadd8c92e4b2562e1d9eb97f0df9ba3b508258739cb013db2. Той не е ключът от страницата за частния ключ, който започва с dbf34ebb, така че двата примера не се смесват. Ето как се прилагат стъпките за този ключ. Байтовете преди контролната сума са 80, после ключът, после 01. Контролната сума е 66557e53, а низът WIF е L5EZftvrYaSudiozVRzTqLcHLNDoVn7H5HSfM9BAN6tMJX8oTWz6. Ключът е публикуван, така че всеки може да похарчи монетите, изпратени към него. Не го ползвайте.

Тази Python функция прави същите стъпки. Не ѝ трябва библиотека извън стандартната.

import hashlib

BASE58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

def base58(data: bytes) -> str:
    n = int.from_bytes(data, "big")
    out = ""
    while n > 0:
        n, r = divmod(n, 58)
        out = BASE58[r] + out
    pad = len(data) - len(data.lstrip(b"\x00"))  # всеки водещ нулев байт става "1"
    return "1" * pad + out

def hash256(data: bytes) -> bytes:
    return hashlib.sha256(hashlib.sha256(data).digest()).digest()

def wif_encode(key_hex: str, testnet=False, compressed=True) -> str:
    data = (b"\xef" if testnet else b"\x80") + bytes.fromhex(key_hex)
    if compressed:
        data += b"\x01"
    data += hash256(data)[:4]
    return base58(data)

print(wif_encode("ef235aacf90d9f4aadd8c92e4b2562e1d9eb97f0df9ba3b508258739cb013db2"))
# L5EZftvrYaSudiozVRzTqLcHLNDoVn7H5HSfM9BAN6tMJX8oTWz6

Проверете всеки кодировчик спрямо този пример, преди да му се доверите с истински ключ.

Как се декодира низ WIF?

Низът WIF се декодира в 38 байта: байт за версия, 32-байтовият частен ключ, незадължителен флаг и контролна сума. WIF частен ключ L5EZftvrYaSudiozVRzTqLcHLN DoVn7H5HSfM9BAN6tMJX8oTWz6 Декодиране от Base58 байт 0 версия: 80, основна мрежа байтове 1 до 32 частният ключ ef235aacf90d9f4aadd8c92e4b2562e1 d9eb97f0df9ba3b508258739cb013db2 байт 33 компресия: 01, по избор байтове 34 до 37 контролна сума
Позициите на байтовете се броят от нула. Некомпресираният ключ има 37 байта и няма байт за флаг.

Декодирането върви в обратен ред:

  1. Декодирайте низа от Base58. Компресираният WIF дава 38 байта, а некомпресираният 37.
  2. Хеширайте всичко без последните 4 байта и сравнете първите 4 байта на хеша с контролната сума. Несъвпадение означава грешка при писане.
  3. Прочетете байта за версия, за да разберете мрежата.
  4. Вземете байтовете от 1 до 32, броени от нула, като частен ключ.
  5. Ако байт 33 съществува, той е флагът за компресия.

Същата логика в Python:

def wif_decode(wif: str) -> str:
    n = 0
    for c in wif:
        n = n * 58 + BASE58.index(c)
    raw = n.to_bytes((n.bit_length() + 7) // 8, "big")
    payload, checksum = raw[:-4], raw[-4:]
    if hash256(payload)[:4] != checksum:
        raise ValueError("контролната сума не съвпада: низът има грешка при писане")
    return payload[1:33].hex()  # байтовете от 1 до 32: частният ключ

Изпълнете я върху примерния низ и ще получите обратно примерния ключ.

Кой първи знак показва мрежата и вида ключ?

Първият знак се променя според байта за версия и флага за компресия. Ето четирите случая:

Започва с Мрежа Публичен ключ
5 Основна мрежа Некомпресиран
K или L Основна мрежа Компресиран
9 Тестова мрежа Некомпресиран
c Тестова мрежа Компресиран

Повечето ключове в основната мрежа, които ще срещнете, започват с K или L, защото почти всеки портфейл ползва днес компресирани публични ключове.

Къде се използва WIF?

WIF се използва главно за пренасяне на един частен ключ между програми. RPC командата importprivkey на Bitcoin Core приема низ WIF, а dumpprivkey връща такъв. Командата dumpprivkey е въведена в края на 2011 г. с pull request 574. Много портфейли искат WIF, когато внасяте ключ, а не суров шестнадесетичен запис.

WIF не е шифриран. BIP 38 описва форма, защитена с парола, която започва с 6P. Обикновеният низ WIF не е защитен така, затова го третирайте като самия ключ.

Как да пазите низ WIF?

  • Низът WIF не е шифриран. Всеки, който го види, може да похарчи монетите, затова го пазете като суровия ключ.
  • Не го поставяйте в уебсайт или приложение, които не контролирате. Сайт, който го иска или сам го генерира за вас, може да запази копие.
  • Проверявайте всеки инструмент спрямо известни примери, преди да го ползвате, или напишете собствен кодировчик, както е показано по-горе.

Форматът е описан в страницата Wallet import format в Bitcoin Wiki, която обяснява префиксите и флага, използвани тук.

Следващата страница, публичен ключ, показва как от същия частен ключ се получава публичен ключ.

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

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

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