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?
- Вземете 32-байтовия частен ключ в шестнадесетичен запис.
- Сложете отпред байта за версия:
80за основната мрежа,efза тестовата. - Добавете
01в края, ако ключът е за компресиран публичен ключ. Повечето ключове, които се ползват днес, са компресирани. - Хеширайте данните два пъти с SHA-256. Запазете първите 4 байта и ги добавете в края като контролна сума.
- Кодирайте в Base58 целия резултат.
Тази страница използва собствен пример, 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?
Декодирането върви в обратен ред:
- Декодирайте низа от Base58. Компресираният WIF дава 38 байта, а некомпресираният 37.
- Хеширайте всичко без последните 4 байта и сравнете първите 4 байта на хеша с контролната сума. Несъвпадение означава грешка при писане.
- Прочетете байта за версия, за да разберете мрежата.
- Вземете байтовете от 1 до 32, броени от нула, като частен ключ.
- Ако байт 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, която обяснява префиксите и флага, използвани тук.
Следващата страница, публичен ключ, показва как от същия частен ключ се получава публичен ключ.
В този раздел: Ключове и адреси
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни