Bits
Полето bits в блока на биткойн е 4-байтовата компактна форма на целта, под която трябва да падне хешът. Вижте експонентата и коефициента.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Полето bits е 4-байтовата компактна форма на целта. Целта е числото, под което трябва да падне хешът на блока, за да е валиден блокът. Пълната цел е 32 байта, но пазенето ѝ цялата във всяко заглавие би хабило място. Затова bits пазят само толкова от нея, колкото е нужно, в четири байта.
Как целта се събира в четири байта?
Четирите байта се делят на две части:
- Експонентата, първият байт. Тя казва с колко байта коефициентът е изместен наляво.
- Коефициентът, следващите три байта. Той пази първите значими цифри на целта.
Стойността е коефициент × 256^(експонента − 3). Заглавието записва полето в little-endian, така че експонентата е последният байт. Explorer-ите печатат четирите байта като едно число, с експонентата първа.
Вземете блок 974,000. Заглавието му записва bits като ace50117, което се чете като 0x1701e5ac:
- Експонентата е
0x17, което е 23. - Коефициентът е
0x01e5ac. - Коефициентът се измества 23 − 3 = 20 байта наляво, а останалите байтове от 32-те са нули.
Резултатът е 00000000000000000001e5ac0000000000000000000000000000000000000000, цел с 19 нулеви цифри в началото.
Как се превръщат bits в цел?
Изместете коефициента наляво с толкова байта, колкото е експонентата минус три, както казва формулата. Тази Python функция го прави:
def bits_to_target(bits: int) -> int:
exponent = bits >> 24
coefficient = bits & 0x007FFFFF # знаковият бит (0x00800000) никога не е зададен в валидна цел
return coefficient * 256 ** (exponent - 3)
print(format(bits_to_target(0x1701E5AC), "064x"))
# 00000000000000000001e5ac0000000000000000000000000000000000000000
Пуснете я за bits на генезис блока, 0x1d00ffff, и получавате 00000000ffff, следвано от нули. Това е целта на генезис блока, най-голямата цел, която mainnet допуска.
Как се превръща цел в bits?
Работете в обратна посока. Вземете трите най-значими байта на целта като коефициент. Преброете колко байта има вдясно от тях, а този брой плюс три е експонентата.
Има един капан. Битът най-горе в коефициента е знаков бит в числовия формат на биткойн, затова трябва да остане 0. Ако първият байт на коефициента е 0x80 или по-голям, добавете отпред байт 00 и увеличете експонентата с едно. Блок 489,888 е пример. Целта му започва с 000000000000000000eb30, а първият значим байт, eb, е над 7f. Затова записът е 1800eb30, а не 17eb304f, който би изглеждал отрицателен.
Майнърите не смятат това на ръка. Bitcoin Core превръща новата цел в bits при всяка корекция на трудността и ги чете обратно с SetCompact.
Каква е целта в началото на веригата?
Генезис блокът използва bits 1d00ffff, което дава цел 00000000ffff, следвано от нули. Трудността се мери спрямо нея. Съотношението се нарича трудност и се изчислява като генезис целта, разделена на текущата.
Блок 974,000 има bits 1701e5ac. Целта му е около 148 трилиона пъти по-малка от генезис целта, което съвпада с трудността му от около 148.36 трилиона. Тъй като целта е толкова малка, хешът трябва да започва с много нули, за да е валиден. Хешът на блок 974,000 започва с 20 нулеви шестнадесетични цифри.
Защо целта изобщо е в заглавието?
Нодовете биха могли да изчислят целта от веригата. Записването ѝ в заглавието е излишно, но прави всяко заглавие самоописателно. Премахването на полето би изисквало хардфорк, което не си струва усилието, затова полето остава.
Защо полето се казва bits?
Оригиналният код никога не обяснява името. Името е подвеждащо, защото bit е и най-малката единица данни, а полето няма нищо общо с това значение. То е просто кратко, компактно записване на целта.
Кога се променя целта?
Целта се мени на всеки 2,016 блока, така че bits в блоковете се променят в този момент. Страницата за целта обяснява как се изчислява новата стойност от времето, което е отнел последният период. Правилата за времето са на страницата за времето.
Bits пазят само трите най-значими байта на целта. Хешът се проверява спрямо това скъсено число, а не спрямо по-дългото, което майнърът е изчислил. Блок 40,320 е пример. Bits му са 1c654657, а целта, която записват, е 0000000065465700, следвано от нули. Загубената точност е малка в сравнение с големината на целта.
Какво следва?
Следва nonce, последното поле на заглавието, което майнърите сменят.
В този раздел: Структура на блока
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни