данные <= {384'h000002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000, nonce_next, data_buf [95: 0]};
Приведенные выше данные затем передаются в модуль хэша SHA256, который затем переходит вычислить хэш. Я просто не понимаю, почему мы должны удвоить окрошка вышеуказанные данные. Согласно https://en.bitcoin.it/wiki/Block_hashing_algorithm нам нужно преобразовать весь 32 битный кусок от маленького до большого Endian Endian, а затем вычислить хеш этой функции. В приведенном выше примере data_buf является 256-битным регистром, который имеет 256 бит данных возвращаются из getwork. Если мы говорим, что первая версия немного получила от getwork является 1, то вдоль этих линий data_buf хранит значение бита 129-192, который был обратным порядком байт сдвинут для каждого 32 битного фрагмента. Но я до сих пор не понимаю, почему мы должны вычислить хэш, как показано выше в коде. Кто-то знает, почему хэш рассчитывается таким образом?
Я возьму Пунт на это (просто чтобы увидеть, если я могу это объяснить, эксперты, пожалуйста, шаг, чтобы исправить меня) ...
Ваш 32 бит кусок неверен(Прости). Алгоритм работает на пакетах сообщений 64 байт, а окончательный хэш составляет 32 байт.
Заголовок блока составляет 80 байт данных. Это дополняется нулями до следующего 64 байт bundary (128 байт, следовательно, всего). плюс немного уборка (задний 1 и длину, которая является постоянной по отношению 640 для 80 байт, как подсчет битов).
Первые 64 байт этого 128 байт "сообщение" предварительно хэшированный сервер getwork (bitcoind или сервер пула) giviing 32 байт SHA256-хэш двойного государство стоимость и поставляется в виде "Midstate",
Работа ПЛИСА принять эту Midstate, и использовать его для выполнения хэша на втором 64 байт этого оригинальных 128 байт сообщения. Однако большая часть этих данных является постоянным (1, с последующим кучей нулей, то длина константа), плюс 32 бит одноразового номера, который генерируется на борту ПЛИС. Эти константа данные представлены, что 384-битового значение (это выглядит странно из-за большой против маленького представления Endian).
Во всяком случае, пара sha256_transform модулей просто вычислить SHA256 двойной хэш (следовательно, пару из них). Верхний 32 бит затем сравнивается 32'h00000000 (или эквивалентный постоянная, если применяются ярлыки). Это представляет собой долю дифференциала 1, и при обнаружении сообщается обратно в бассейн с использованием выходного golden_nonce.
Возможно, ключ к вашему вопросу, что Bitcoin использует двойной SHA256 хэш. Поэтому нам нужен двойной хэш в ПЛИС. Его просто некая магическая математика материал, который позволяет заранее рассчитать Midstate на сервере getwork, тем самым экономя 50% работы (помните его сообщение на 128 байт, которые должны были бы четыре хэш операции, если мы сделали двойной хэш в соответствии со спецификацией).
Надеюсь, что имеет какой-то смысл.
[Редактировать] Другая возможная путаница в том, что "данные" подается на FPGA (вторые 64 байта), в основном, отбрасывают, по отношению только data_buf [95: 0] используется. Это происходит потому, остальное уже известно (его то 384 бит константы), поэтому мы можем сохранить количество consideralbe логики, используя константу вместо того, чтобы обрабатывать переменное значение из данных [255: 96].
Также поставляет полные 256 бит достаточно неэффективное использование канала порта связи (компилятор будет оптимизировать на некоторые или все неиспользованного логики, так что, возможно, не влияет на использование LE, но я не проверял это в деталях), и некоторые из реализаций просто поставить 96 бит через канал порта связи, а не полные 512 бит для передачи данных.