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

Майнинг с доказателство за работа

Целта на блока

Целевата стойност в биткойн е числото, под което трябва да падне хешът на блока. Пази се като bits, сверява се на 2016 блока и се мени най-много четирикратно.

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

Целта (target) е прагът, под който трябва да падне хешът на блока. Блокът е валиден само ако хешът на заглавието му е по-малък или равен на целта. По-ниската цел е по-трудна за постигане, затова майнингът отнема повече време. Целта се коригира на всеки 2016 блока, така че блоковете да продължават да идват около веднъж на 10 минути, каквато и да е общата изчислителна мощ в мрежата.

Скорошен пример е целта, зададена при блок 951,552 през май 2026 г. Първите 24 шестнадесетични цифри са 00000000000000000002068f, а останалите 40 са нули. Всичките 64 цифри започват с 19 нули. Следващият раздел обяснява как се записва тази стойност, а останалата част от страницата показва как се променя.

Как изглежда целта?

Целта е 256-битово число, записано с 64 шестнадесетични цифри. Повечето от тях са водещи нули. Колкото повече водещи нули, толкова по-малка е целта и толкова по-трудно е да се намери хеш под нея.

Ето целта за блок 100,000, от примера на страницата за майнинг:

000000000004864c000000000000000000000000000000000000000000000000

Хешът на блока се сравнява с целта като цяло число. Експлорърът показва хеша с обърнати байтове, затова го четете в този вид, отляво надясно, срещу целта. Цикълът за майнинг на страницата за майнинг прави точно това сравнение.

Какво е полето bits?

Записването на 64 шестнадесетични цифри във всяко заглавие би хабило място, затова целта се пази в полето bits на заглавието, в компактна четирибайтова форма. Първият байт е експонента, а следващите три са мантиса.

def bits_to_target(bits: int) -> int:
    exponent = bits >> 24           # броят байтове в целта
    mantissa = bits & 0xFFFFFF      # трите горни байта на целта
    return mantissa * 256 ** (exponent - 3)

print(format(bits_to_target(0x1B04864C), "064x"))
# 000000000004864c000000000000000000000000000000000000000000000000
Стойността bits 1b04864c се разгръща в 256-битова цел с 24 нулеви байта в края. Блок 100,000: bits 1b04864c 4 байта в заглавието, компактна форма експонента 1b 27 в десетичен вид размерът в байтове мантиса 04864c трите горни байта на числото мантиса × 256^(27 − 3) в края се добавят 24 нулеви байта Целта: 64 hex цифри 000000000004864c0000000000000000 00000000000000000000000000000000 Хешът трябва да е под целта или равен.
Мантисата се умножава по 256 за всеки байт на експонентата над тройката.

За блок 100,000 bits са 1b04864c. Експонентата 1b е 27, така че мантисата 04864c се измества наляво с 24 байта и резултатът е 64-цифрената цел по-горе. Скриптът пропуска един краен случай от Bitcoin Core, който отхвърля мантиса с най-горния бит, защото това би било отрицателна цел. Никой валиден блок не ползва такава форма, така че скриптът може да я пропусне.

Какво е трудност?

Трудността е по-удобен начин да изразим целта. Тя е съотношението между най-лесната възможна цел и текущата:

# целта на генезис блока
DIFFICULTY_1 = bits_to_target(0x1D00FFFF)

def difficulty(bits: int) -> float:
    return DIFFICULTY_1 / bits_to_target(bits)

# блок 100,000 дава 14484.16
print(round(difficulty(0x1B04864C), 2))
# блок 951,552 дава 138955357012247.3
print(round(difficulty(0x1702068F), 2))

Най-лесната възможна цел, 00000000ffff0000…, има трудност 1. Трудността на блок 100,000 е около 14,484, което означава, че целта му е около 14,484 пъти по-малка от целта на генезис блока. Средно за един блок са нужни толкова хеша, колкото е трудността, умножена по 2^32. При блок 100,000 това са около 62 трилиона. Превръщането на трудност обратно в цел не е точно, защото трудността се пази като число с плаваща запетая. Страницата за трудността обяснява идеята с прости думи.

Кога се променя целта?

Целта се променя на всеки 2016 блока, което при целевото темпо е около две седмици. Когато е време за корекция, всеки нод гледа времевите марки на последния период и ги сравнява с очакваното време за него.

Очакваното време е 2016 блока по 600 секунди, което е 1,209,600 секунди. Времевите марки се взимат от първия блок на периода и от последния му блок. Този интервал съдържа 2015 интервала, а не 2016. Затова периодът е с един интервал по-кратък. Първоначалният код е направил този избор и остава така, защото промяната би променила правилата, които всеки нод спазва.

Когато майнърите се присъединят или напуснат, реалното време се отклонява от очакваното, а следващата корекция го връща. На нодовете не трябва да се съобщава нищо. Всеки от тях чете времевите марки и стига до същия резултат.

Целта се умножава по съотношението между реалното и очакваното време за 2016 блока, после се записва като bits. Следваща цел след 2016 блока Реално време: 1,157,929 сек от блок 401,184 до блок 403,199 Очаквано: 1,209,600 сек 2016 блока по десет минути, две седмици Съотношение: 0.9573 ограничено между 0.25 и 4 Нова цел = стара × 0.9573 стара 1806f0a8: 000000000000000006f0a8… нова 1806a4c3: 000000000000000006a4c3… трудността расте с около 4.5% Записано като bits: 1806a4c3 компактната форма за всеки нод
Работен пример от блок 403,200. Съотношението е реалното време, разделено на очакваното.

Как се изчислява новата цел?

Новата цел е старата, умножена по съотношението между реалното и очакваното време. Ето изчислението като скрипт, с целочислена аритметика, както в Bitcoin Core.

# най-лесната цел, зададена при генезис блока
MAX_TARGET = bits_to_target(0x1D00FFFF)

def next_target(old_target: int, first_time: int, last_time: int) -> int:
    # две седмици по десет минути на блок
    expected = 2016 * 600
    # 2015-те интервала на периода
    actual = last_time - first_time
    # никога не се променя повече от четирикратно
    actual = min(max(actual, expected // 4), expected * 4)
    return min(old_target * actual // expected, MAX_TARGET)

Крайната стойност трябва пак да се запише в компактната форма bits, която отрязва по-ниските цифри.

Работният пример използва периода от блок 401,184 до блок 403,199. Времевите им марки дават реално време 1,157,929 секунди. Съотношението е 1,157,929 / 1,209,600, около 0.9573. Периодът е бил по-бърз от очакваното, затова целта пада и майнингът става по-труден. Старият bits, 1806f0a8, се превръща в 1806a4c3 за блок 403,200. Новата цел е с около 4.3% по-малка от старата, а трудността расте с около 4.5%.

Какво ограничава промяната?

Две граници държат целта в разумни рамки.

  1. Промяната е най-много четирикратна. Ако съотношението е под 0.25 или над 4, то се ограничава до тази стойност. Период с много бързи блокове не може да направи целта четири пъти по-малка от преди. Много бавен период не може да я направи четири пъти по-голяма. И в двата случая промяната става на една стъпка.
  2. Целта никога не надминава целта на генезис блока. Целта на генезис блока, 00000000ffff0000…, е едновременно начална точка и най-голямата стойност, която може да има цел. Това е най-лесният възможен блок.

Втората граница обяснява защо в началото целта е била неподвижна. Първите 2016 блока са отнели около 24 дни, далеч повече от очакваните 14 дни. Всяка корекция тогава е искала да направи майнинга по-лесен, но целта вече е била на максимума си. Първата истинска промяна е била при блок 32,256, когато трудността е скочила от 1 на около 1.18.

Какви са скорошните промени на целта?

Ето три скорошни корекции, с височината, от която новата цел е в сила.

Височина Цел (първите 24 цифри) Промяна спрямо предишния период
951,552 00000000000000000002068f ×0.9831
949,536 000000000000000000020f79 ×0.9697
947,520 000000000000000000021ff0 ×1.0236

Всяка промяна е новата цел, разделена на целта от предишния период. Съотношение под 1 означава, че трудността е скочила, а над 1, че е паднала. Всеки ред можете да видите в нашия експлорър, например блок 951,552.

Защо 10 минути?

Бялата книга не обяснява защо интервалът е 10 минути. Обичайното обяснение е, че блоковете трябва да имат време да стигнат до всеки нод, преди да бъде намерен следващият. Ако се намират много по-бързо, отколкото се разпространяват, майнърите продължават да строят върху остарели блокове и част от работата се губи в кратки разклонения. Стабилният интервал дава и стабилен темп на новите монети.

Как нодовете се съгласуват за целта?

Всеки нод изчислява целта сам и всички стигат до един и същи резултат. Всеки нод следва най-дългата верига от валидни блокове, а целта зависи само от времевите марки и целите във веригата. Два нода с една и съща верига имат една и съща цел на всяка височина.

Как да прочетете текущата цел?

Bitcoin Core може да ви даде целта по три начина.

  • getblocktemplate връща целта за следващия блок, което е най-прекият отговор. Ползвайте го с правилото segwit, както на страницата за блока кандидат.
  • getblockheader връща стойността bits за всеки блок. Превърнете я с горния скрипт, за да получите пълната цел.
  • getdifficulty връща трудността. Удобна е за бърз поглед, но, както стана дума, превръщането ѝ обратно в цел не е точно.

За вече намерен блок стойността bits в заглавието му е целта, срещу която е бил намерен, и именно нея нодът проверява.

В този раздел: Майнинг с доказателство за работа

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

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