Майнинг с доказателство за работа
Целта на блока
Целевата стойност в биткойн е числото, под което трябва да падне хешът на блока. Пази се като 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
За блок 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. Затова периодът е с един интервал по-кратък. Първоначалният код е направил този избор и остава така, защото промяната би променила правилата, които всеки нод спазва.
Когато майнърите се присъединят или напуснат, реалното време се отклонява от очакваното, а следващата корекция го връща. На нодовете не трябва да се съобщава нищо. Всеки от тях чете времевите марки и стига до същия резултат.
Как се изчислява новата цел?
Новата цел е старата, умножена по съотношението между реалното и очакваното време. Ето изчислението като скрипт, с целочислена аритметика, както в 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%.
Какво ограничава промяната?
Две граници държат целта в разумни рамки.
- Промяната е най-много четирикратна. Ако съотношението е под 0.25 или над 4, то се ограничава до тази стойност. Период с много бързи блокове не може да направи целта четири пъти по-малка от преди. Много бавен период не може да я направи четири пъти по-голяма. И в двата случая промяната става на една стъпка.
- Целта никога не надминава целта на генезис блока. Целта на генезис блока,
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 в заглавието му е целта, срещу която е бил намерен, и именно нея нодът проверява.
В този раздел: Майнинг с доказателство за работа
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни