Как хэши Blake2b генерируются в реализации Equihash Ховратовича?
Я пытаюсь понять реализацию Equihash от khovratovich (здесь ссылка), потому что я хочу написать простой майнер Zcash (пока меня не интересуют аспекты оптимизации).
Анализируя реализацию, я вижу, что инсайдер FillMemory()
, на каждой итерации следующие элементы хешируются вместе (с использованием хэш-функции Blake2b):
- Семя
- Nonce
- индекс
Полученный хэш затем сохраняется в массиве из 32-битных элементов длиной 8, который называется buff[]
(получив так 256-битный буфер). Я не могу понять причину, по которой рассматриваемые кортежи являются массивами, полученными путем копирования содержимого массиваbuff[]
но учитывая только n/(k+1) наименее значимый бит каждой ячейки массива buff[]
(соответствует выполнению операции сдвига вправо 32-(n/k+1) бит).
Затем алгоритм выполняет итерацию и проверку коллизий для первых n/(k+1) бит, вторых n/(k+1) бит и так далее для каждого кортежа.
Выполняется ли эта операция с регистром сдвига в реализации Zcash с использованием Equihash? Как получаются кортежи?