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

Тема в разделе "Криптовалюты", создана пользователем jabbaxatt, 7 янв 2015.

Модераторы: Sorcus
  1. jabbaxatt

    jabbaxatt Добрый модератор

    Moderator
    Регистр.:
    21 янв 2009
    Сообщения:
    890
    Симпатии:
    418
    Стало интересно - решил посмотреть что там внутри.

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

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

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

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

    sha256(sha256(x+nonce)).

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

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

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

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

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

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


    Вопросов ещё куча. Если кто копал или кому просто интересно - предлагаю присоединиться к обсуждению. Всем дающим понятные, подробные и правильные пояснения - "спасибки" от меня гарантирую :D
     
    Последнее редактирование: 7 янв 2015
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.522
    Симпатии:
    1.375
    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), ); //показано для упрощения понимания
    //на самом деле вычисление sha256 и проверка, что с этим нонсе число меньше, чем Difficulty происходит в конце вычисления второго sha256
    var_dumpbin2hex(strrev($hash)) ); // вот тут мы увидим кучу 0 в начале
    x + nonce - 160 символов, пример
    010000001e60224709df1feb2e2849b7b10570abf7d4355ba8e2f6df121100000000000028cc65b7be2f8a1edc2af86ef369472443a1b70479cee205e8db5440cfbe943f57fad74df2b9441acc24ce5b
    для блока Перейти по ссылке
    По коду, приведённому выше, можешь получить второе число, подставив первое вместо $header_hex
     
    Последнее редактирование: 7 янв 2015
    jabbaxatt нравится это.