Как рассчитывается сумма proof-of-work, вложенная в цепочку?

В официальном документе биткойнов ( стр. 3) говорится

Решение большинства представлено самой длинной цепочкой, в которую вложены наибольшие усилия по доказательству работы.

Я не смог найти, как именно рассчитывается эта сложность.

Это сумма нулей префиксов одноразовых номеров каждого блока?


Я нашел этот ответ , но он слишком короткий для меня, чтобы понять.

Ответы (1)

Работа рассчитывается как work = 2^256 / block_target, как указано в связанном ответе, что является минимальным значением хеш-функции, которое считается действительным доказательством работы (обратите внимание, что это меняется только каждые 2016 блоков). Исходный код для этого src/chain.cpp L#121 . Общая работа цепочки — это сумма работы всех блоков в цепочке, которая рассчитывается здесь: src/validation.cpp L#3713 . Таким образом, чтобы визуализировать, чем ниже цель блока, тем больше работы было проделано.

Пример

Цель блока 0: 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Цель блока 1:00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Блок 0 : Блок 1 :work = (2^256) / <block 0 hash> = 4.295 × 10^9
work = (2^256) / <block 1 hash> = 4.295 × 10^9

Вы можете видеть, что они оба проделали одинаковую работу. В случае ничьей применяются следующие правила, см. https://bitcoin.stackexchange.com/a/37275/60443 .

  • Какой из них был получен первым? (Это может быть разным для разных клиентов, поэтому предыдущее правило применяется первым.)
  • Какой из них имеет больший адрес указателя? (Это в значительной степени случайно и по-разному для разных клиентов.)
Объяснение для «block_target» отсутствовало. Теперь я понимаю, что это буквальный хэш блока.
Не могли бы вы предоставить ссылку на соответствующий метод/строку в исходном коде Биткойн?
Я отредактировал свой ответ, так как ошибся в использовании хэша блока дляblock_target
Также добавлены ссылки на исходный код.