Как майнер выполняет хеширование?

Я пытаюсь пройти свой путь через процесс, с помощью которого хешируют шахтеры.

Скажем, запрос getwork возвращает data:

0000000244de6ceba49e1c8d438c0d8c584eefd9c8590545bfdfbf380000025c00000000fb3a091de1b4bbe5dc7acfe6bdacbc3fc3bb09bf1030adef8e2854db1b6ac42f5075c0051a057e08456c6f69000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000

Насколько я понимаю, первым шагом является вычисление середины. Для этого сначала берем первую половину строки данных:

0000000244de6ceba49e1c8d438c0d8c584eefd9c8590545bfdfbf380000025c00000000fb3a091de1b4bbe5dc7acfe6bdacbc3fc3bb09bf1030adef8e2854db

Затем мы отменяем континент каждого 32-битного беззнакового int (представленного как 8 шестнадцатеричных цифр в строке), давая:

02000000eb6cde448d1c9ea48c0d8c43d9ef4e58450559c838bfdfbf5c020000000000001d093afbe5bbb4e1e6cf7adc3fbcacbdbf09bbc3efad3010db54288e

Далее мы преобразуем это в шестнадцать 32-битных беззнаковых ints:

33554432, 3949780548, 2367463076, 2349698115, 3656339032, 1157978568, 952098751, 1543634944, 0, 487144187, 3854284001, 3872357084, 1069329597, 3205086147, 4021104656, 3679725710

Затем мы вводим этот массив int во внутреннюю функцию SHA-256, а второй вход представляет собой восемь 32-битных чисел, указанных на стр. 13 Спецификации SHA-256 .

Вывод этого предварительного хэша дает следующие восемь 32-битных ints в нашем среднесрочном периоде:

3045448562, 361056177, 1940413978, 3803584651, 1661283772, 3478943551, 2906109005, 300125848

С этого момента я не уверен, насколько правильными являются шаги. Исправления очень ценятся!

Далее мы рассмотрим вторую половину входной строки:

1b6ac42f5075c0051a057e08456c6f69000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000

Еще раз, мы отменяем континент, поскольку все это 8-символьная шестнадцатеричная строка, представляющая 32-битные беззнаковые ints:

2fc46a1b05c07550087e051a696f6c45800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280

Теперь мы разбиваем это на шестнадцать 32-битных ints: 801401371, 96499024, 142476570, 1768909893, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 640

Пятое число (21474836481) должно быть nonce, согласно это описание .

(Почему это не ноль?)

Теперь, начиная с данного nonce, мы используем функцию SHA-256 для хэша шестнадцати 32-битных ints из второй половины данных, используя midstate как другие восемь int-входов. Это дает: 3993002029, 2278477219, 3977673643, 191934125, 2075691039, 4115259165, 601235791, 2598049038

Теперь, что я использую в качестве входных данных для второй хеш-функции в «double-hash»? Или подсчитал счет среднего штата в качестве первого вычисления хеширования?

И когда переполнение nonce, я должен отправить другой запрос getwork или подождать, пока я не проверил nonces в диапазон [0, original_nonce_value)? (Предполагая, что мой анализ указывает, что данный nonce является 21474836481?)

Наконец, если наш target значение из getwork:

ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000

Нам нужно переключить континент этого значения, получив:

00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff

И затем мы преобразуем это в восемь 32-битных беззнаковых ints, уступая: 0, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295

И я верю, что после второго хэша SHA-256 у нас должно быть восемь 32-битных беззнаковых int. Наконец, мы должны сравнить эти восемь выходных ints с нашими восемью целевыми ints (слева направо в массиве, поэтому сравниваем вывод [0] с целевым 0, затем вывод [1] против 4294967295 и т. Д.), И если наш вывод меньше, чем цель, мы преобразуем наши восемь значений int в шестнадцатеричные строки, переключим континент, объедините их в одном порядке (шестнадцатеричная строка вывода [0] - это первый набор из восьми символов) и отправьте его обратно в пул сервер в getwork завершение POST.

Насколько это правильно, и где я неверно интерпретирую протокол?

Приветствуется всякая помощь; Большое спасибо!

7 голосов | спросил ConstableJoe 20 +04002012-10-20T01:24:36+04:00312012bEurope/MoscowSat, 20 Oct 2012 01:24:36 +0400 2012, 01:24:36

1 ответ


3

Этот вопрос сложный, но я посмотрю, что я могу сделать, чтобы ответить на него. Кроме того, я не буду пытаться решить вопрос о предисловии, так как в случае с биткойном это дает мне головную боль ...

Во-первых, давайте посмотрим, что у нас есть в заголовке блока, предоставленном нам сетью. Возьмем блок Бытия для примера.

01000000 - version
0000000000000000000000000000000000000000000000000000000000000000 - prev block
3BA3EDFD7A7B12B27AC72C3E67768F617FC81BC3888A51323A9FB8AA4B1E5E4A - merkle root
29AB5F49 - timestamp
FFFF001D - bits
00000000 - nonce (it will be set to 1DAC2B7C later)
00 - number of transactions (always 0, this is the block header)
0000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000 - padding

Чтобы вычислить середину, мы разделим заголовок на две части, которые принимаются алгоритмом SHA (по 64 байта):

0100000000000000000000000000000000000000000000000000000000000000000000003BA3EDFD7A7B12B27AC72C3E67768F617FC81BC3888A51323A9FB8AA
4B1E5E4A29AB5F49FFFF001D00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000

Мы загружаем первую часть в алгоритм SHA. Мы берем это состояние для последующего использования (midstate) (извините за отсутствие примеров, но у меня нет моих алгоритмов хеширования). Затем мы загружаем вторую часть в алгоритм SHA. Мы читаем результат, это первый хеш. Мы берем этот вывод, подключаем его к новому входу и получаем его результат. Это второй хеш. Предполагая, что мы получили правильный nonce (в нашем случае - 1DAC2B7C), наш результат должен выглядеть примерно так:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

и сравните его с нашей целью:

00000000ffff0000000000000000000000000000000000000000000000000000

Взято как число, которое больше? Цель. Это означает, что у нас есть правильный nonce, и мы можем представить наш полный заголовок в качестве результата. Прибыль!

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

Я надеюсь, что это ответит на вашу проблему.

ответил ThePiachu 24 +04002012-10-24T12:03:17+04:00312012bEurope/MoscowWed, 24 Oct 2012 12:03:17 +0400 2012, 12:03:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132