Понимание хеш-функции

Может ли кто-нибудь подробно объяснить компоненты финального хэша, определяющего победителя блока?

Насколько я понимаю, шахтеры берут

  1. корень Меркла,
  2. Отметка времени,
  3. Хэш предыдущего блока,
  4. Некоторые другие компоненты??, наряду с
  5. Одноразовый номер, который должен угадать майнер, чтобы хэш всех этих компонентов, использующий Sha256, имел не менее 18 начальных нулей.

Мои вопросы:

  1. Я прав в своем понимании до сих пор?

  2. Может ли кто-нибудь объяснить, что такое другие компоненты и в каком порядке они вводятся в хеш-функцию?

  3. Используя данные о каждом блоке, доступные на blockchain.info, могу ли я воссоздать выигрышный хэш, введя те же данные в калькулятор Sha256?

Спасибо.

Ответы (2)

Вы очень близки. Как уже было сказано Mesh, майнеры хешируют следующие данные:

  • nVersion (например, 02000000)
  • HashPrevBlock (этот хэш переворачивается, а затем переворачиваются каждые два байта)
  • HashMerkleRoot (этот хэш переворачивается, а затем переворачиваются каждые два байта)
  • nTime (необходимо преобразовать в шестнадцатеричный формат, например, 358b0553)
  • nBits (целевая сложность, например, 535f0119)
  • nNonce (случайные данные)

Эту информацию можно найти в справочнике разработчиков биткойнов или в PDF-файле .

Теперь, к вашему третьему вопросу, да, вы можете! На самом деле я только что написал небольшую программу на C #, чтобы сделать это вчера! В этом есть небольшая хитрость, потому что вы не можете просто вставить данные прямо в калькулятор хеширования и проверить их. Во-первых, вы добавляете все поля вместе в одну строку (после того, как хэш переворачивается и переворачивается для хэша предыдущего блока и корня Меркла). Затем вы преобразуете эту строку в двоичные данные. На этом этапе вы запускаете двойной хэш SHA256, чтобы убедиться, что вы получили действительный хэш блока.

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

Из документации разработчика Bitcoin.org заголовок блока состоит из:

  • Версия
  • Хэш заголовка предыдущего блока
  • корень Меркла
  • отметка времени
  • поле nBits
  • одноразовый номер

В этой последовательности. Итак, как вы говорите, единственный компонент, отсутствующий в вашем списке, — это версия и поле nBits. Версия не требует пояснений, а поле nBits — нет. Что делает поле nBits, так это кодирует текущую цель для алгоритма сложности:

иметь не менее 18 лидирующих нулей.

Не всегда 18 нулей. Количество начальных нулей изменяется в зависимости от того, как быстро блоки были обнаружены в последнее время, чтобы удерживать время блокировки в среднем примерно на уровне 10 минут, несмотря на разную мощность хеширования в сети. Чем больше майнеров присоединяется, тем выше скорость хеширования, а значит, и сложность (т. е. требуется больше нулей). Другой способ представить нули состоит в том, что вывод SHA256 в виде числа должен быть меньше некоторого целевого числа. Эта цель закодирована в поле nBits. И да, любой может проверить, что хэш заголовка блока соответствует числу ниже целевого, именно так другие клиенты проверяют допустимость блоков, потому что SHA256 всегда выдает один и тот же вывод из одного и того же ввода — это детерминированное свойство всех полезных хэшей. функции.