Реальная история.
Здравствуй,
Я поддерживать
Open Source FPGA Bitcoin Miner, так что может быть в состоянии помочь. Не стесняйтесь задавать вопросы, и я буду держать глаз на эту тему.
Я вижу, как можно было бы определить состояние остановки перед тем, весь вычисляется хэш. Но это не очевидно.
Есть нет "остановить условия" с SHA-256 (1). Вы должны вычислить все это, иначе хэш является неполным. Как вы уже нашли, однако, есть небольшой ярлык из-за способа горных работ.
И основная идея заключается в изменение небольшой постион х (нонс), пока мы не найдем окончательный хэш, который меньше определенного уровня (т.е. есть определенное количество ведущих нулей).
Для большинства шахтеров, все, что вы заботитесь о поиске, что называется трудность 1 часть (2). Это означает, что есть 32 бит ведущих нулей. Таким образом, для оптимизации добычи коды мы только заботиться о том, что последний 32 бит конечного хэша равен 0. Как вы видели, этот последние 32 бит фактически рассчитывается в первом раунде 61, и сдвигаются 3 раза в раундах 62, 63 и 64. Мы не заботятся ни о чем, вычисленной в этих последних трех раундах. Таким образом, оптимизация, чтобы пропустить их, и проверьте, 5-й 32-битное слово хэша, полученного после 61-го раунда.
Вы можете видеть, что в
код здесь. Для второго прогона SHA-256 использует только 61 раундов, и считывает 5-е слово из выходного сигнала (код использует IDX (4), так как индекс начинается с 0).
Вместо этого Голдер Nonce считаются найдено, когда часть второго хэша равна 0xa41f32e7.
Существует еще один ярлык здесь. В SHA-256, после того, как все 64 раундов были вычислены, одна последняя операция выполняется. Отдельные 32-битные слова состояния ввода добавляются в отдельных 32-битных слова выхода последнего раунда. Вы можете видеть, что в
SHA2 википедии статья, где он говорит, "Добавить хэш этого блока, чтобы привести до сих пор."
Теперь мы смотрим, чтобы увидеть, если последнее слово равно нулю:
из [ `IDX (7)] + input_state [` IDX (7)] == 0x00000000 ???
Входное состояние на второй пробег SHA-256 является известной величиной. Восьмое слово которого 0x5be0cd19, так что ...
из [ `IDX (7)] + 0x5be0cd19 == 0x00000000 ???
Что эквивалентно:
из [ `IDX (7)] == 0x00000000 - 0x5be0cd19 ???
Что эквивалентно:
из [ `IDX (7)] == 0xa41f32e7 ???
Я надеюсь, что объясняет эти две оптимизации. Опять же, не стесняйтесь задавать вопросы, если вы путать, или если у вас есть другие вопросы. Я более или менее писал быстро, так что, возможно, пропустили некоторые детали.
ЗАМЕТКИ(1) Я не уверен, что коннотация вы даете "остановить условия," поэтому я объясню немного дальше, чтобы помочь очистить путаницы. При добыче, вы получаете набор данных для выполнения хэш на. Как уже отмечалось, это делается путем манипулирования и временное значение хэширования каждый раз, когда изменения Нонс. То, что вы действительно хотите сделать, это проверить
все возможные одноразовые. Даже если вы уже нашли "золотой нонс" (Один, который дает вам хэш, начиная с 32 нулями), вам нужно
продолжать поиск более. Там может быть где угодно между 0 и 2 ^ 32 решения данного блока работы, так что это в ваших интересах, чтобы продолжать поиски более. Следовательно, нет никаких условий остановки в смысле, когда перестают работать ваш алгоритм, кроме исчерпав все возможные одноразовые номера (в этот момент, вы получите больше работы).
(2) Это потому, что большинство шахтеров подключены к серверу пула, который принимает любой хэш-совещание по крайней мере, сложности 1 (32 ведущих нулей). Следует, однако, отметить, что программное обеспечение, разработанное вокруг этой оптимизации будет по-прежнему работать для сольнога добычи непосредственно против bitcoind, потому что bitcoind будет просто отказаться от доли, которая не отвечает блочной трудности (и все сложности 1 акцию имеет возможность сделать это ). Кроме того, большинство FPGA или GPU шахтеры имеют некоторые высокого уровня контрольного программного обеспечения (написанный на Python или C), который может выполнить реальную проверку сложности при необходимости. Имея проверку аппаратного обеспечения для акций действительно просто способ снижения пропускной способности от аппаратных средств к управляющему программному обеспечению.