Разбираемся с алгоритмом Bitcoin и SHA-256

jabbaxatt

Добрый модератор
Регистрация
21 Янв 2009
Сообщения
902
Реакции
432
Стало интересно - решил посмотреть что там внутри.

Т.к. по английски понимаю плохо, и в C++ не шарю, буду тут писать и задавать вопросы в стиле "правильно ли я понял".

Ну и собирать ссылки на примеры(исходники) реализации и на статьи по русски.

Начнём.
Правильно ли я понял что майнеры занимаются следующим: Собирают в одну строку
х = хеш предыдущего подтверждённого блока + текущие транзакции требующие подтверждения и

считают двойной sha256, т.е.

sha256(sha256(x+nonce)).

Где
nonce - изменяемое число в конце, которое увеличивается на 1 до тех пор пока рассчитываемый двойной хеш нас не устроит(т.е. не окажется меньше текущей установленной цели).

Что хочу понять

1) Как точно формируется этот самый блок x (в каком порядке и что туда включается) и какого он примерно размера. Какие транзакции включаются в этот блок и в каком виде? В общем нужен стандарт формирования этого x?

2) По идее у всех майнеров эти блоки должны быть чуть чуть разные, что-бы не считать одно и тоже. За счёт чего эта разница достигается? Разный набор транзакций в блоке или туда пихается какая-то собственная инфа связанная с нашим кошельком или ключём?

3) nonce имеет конечную длинну 32 бита. Допустим мы их все перебрали и нужного хеша не нашли. Что тогда? Пишут что тогда добавляется "техническая транзакция" и всё начитается заново. Но что это за "техническая транзакция" откуда берётся, и куда добавляется авторы статей не пишут.

4) "Хеш меньше установленного значения" это действительно хеш sha256(sha256(x+nonce)) с нулями в начале? Типа 00000000000001c21dbf4715d5da1a288061faa21e950dd8df6ae25c8b55d868
Или там что-то где-то переворачивается?


Вопросов ещё куча. Если кто копал или кому просто интересно - предлагаю присоединиться к обсуждению. Всем дающим понятные, подробные и правильные пояснения - "спасибки" от меня гарантирую :D
 
Последнее редактирование:
1) и 3) как я понял, хеши блоков могут идти в произвольном порядке. Если это так, то для блока Для просмотра ссылки Войди или Зарегистрируйся, в котором 803 транзакции, мы имеем возможных сочетаний 803! ~= 4,e+1985
Для тех, кто не понял: 1985 - это количество нулей после 4. Т.е. больше Для просмотра ссылки Войди или Зарегистрируйся значений! ;)
Кстати, для перебора всех nonce надо еще примерно 9 ноликов дописать :)
Перебор абсолютно всех этих значений даже с подключением всех майнеров в один пул займёт больше времени, чем выгорание всех звёзд млечного пути, так что работы хватит всем :) Но нам это и не надо, достаточно найти первое сочетание, хеш которого будет меньше Difficulty.

2) Каждый майнер добавляет свою уникальную транзакцию с переводом вознаграждения за найденный блок и комиссиями на свой кошелёк - вот тебе и уникальность перебора у каждого пула или соло-майнера.

3+) возможно, техническая транзакция требуется на этапе запуска новой крипты, а сейчас, когда уже есть транзакции от множества людей, это не актуально.

4) Да, что-то где-то переворачивается и sha256 вычисляется от хеша заголовка в бинарном виде, для php это код:
PHP:
$header_bin = hex2bin($header_hex); //header_hex - это x+nonce
$hash =  hash('sha256', hash('sha256', $header_bin, 1 ), 1 ); //показано для упрощения понимания
//на самом деле вычисление sha256 и проверка, что с этим нонсе число меньше, чем Difficulty происходит в конце вычисления второго sha256
var_dump( bin2hex(strrev($hash)) ); // вот тут мы увидим кучу 0 в начале

x + nonce - 160 символов, пример
010000001e60224709df1feb2e2849b7b10570abf7d4355ba8e2f6df121100000000000028cc65b7be2f8a1edc2af86ef369472443a1b70479cee205e8db5440cfbe943f57fad74df2b9441acc24ce5b
для блока Для просмотра ссылки Войди или Зарегистрируйся
По коду, приведённому выше, можешь получить второе число, подставив первое вместо $header_hex
 
Последнее редактирование:
Назад
Сверху