Вместо того, вычислительно решение для SHA256 (SHA256 (block_header)), подход к решению его символический. То, что я имею в виду, что это, а не обрабатывать входные биты заголовка блока, как 0 или 1, обрабатывают каждый входной бит в качестве индивидуального символической переменной (640 в общей сложности). Затем выполняют двойную SHA256, и производить набор уравнений, который представляет каждый бит в окончательном хэш. Это, очевидно, будет огромным, но вы можете PolynomialReduce после каждого шага хеширования, чтобы уменьшить размер уравнения.
Выход SHA256 32 байта, так что вы в конечном итоге с представляет собой систему из 256 уравнений, состоящая из 640 переменных, каждый (которые включают в себя все логические операторы, применяемые с двойной хэш.) Для целей добычи на сложности 1, вы можете отбрасывать все, кроме первых 32 уравнений.
Теперь помоему с помощью этого метода: Вы должны свернуть уравнения и упростить. Возьмите текущий, реальный block_header в вопросе, и заполнить фактические значения в ваших 32 уравнений для каждого бита для 32-битного временного значения, за исключением (608 в общей сложности.) Reduce.
Теперь у вас есть система из 32 уравнений и 32 неизвестных. Установить все 32 уравнений, равные друг другу, и решить систему уравнений.
То, что вы в конечном итоге с 3 возможных решения: одноразовое значение, которое производит 32 "0" бит (то, что мы хотим), случайное слово, которое производит все "1" биты (отбрасывают) или нет решения (приращение) extraNonce.
Обратите внимание, чтобы сделать сокращение и решение системы уравнений проще, преобразование логических операторов (XOR, или и) в арифметические операции и делать сокращения и решение в кольце чисел по модулю 2, например:
а ^ Ь == (а + б) 2%
(А | б) == ((а * б)% 2% + а 2 + Ь% 2);
(а & б) == (а * б) 2%
Мысли?