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

Мы начнем от самой простой тривиальной модели и будем дополнять ее возможности, пока не получим полноценную модель.

Определим цель использования блокчейна:
Есть несколько участников, которые заинтересованы поддерживать целостность общего массива данных и дополнять его.

Базовая модель


Данные представлены последовательностью записей, которую можно дополнять. Записи вместе с вспомогательной информацией хранятся в блоках. Блоки хранятся в виде односвязного списка. Каждый участник представлен узлом(node), который хранит весь актуальный массив данных и контактирует с другими узлами. Узлы могут добавлять новые записи в конец списка, а также сообщают друг другу об изменениях списка.

Последовательное расширение функционала


Приоритет более длинному списку
Выбирая между несколькими версиями списка записей, узлы сохраняют у себя более длинный. Таким образом, добавленная в одном узле новая запись распространяется на все остальные узлы.

Хеш предыдущей записи
В блоке хранится хеш-код предыдущей записи. Такой хеш-код однозначно идентифицирует все предыдущие блоки и их взаимное расположение. Следовательно, блок внутри списка не может быть изменен без изменения последующих блоков.

Вычислительная сложность создания блока
В блоке добавляется новое поле — counter — произвольное число. Нужно подобрать такое значение counter'а, чтобы хеш-код блока заканчивался на определенное число нулей.

Пул необработанных записей
Новые записи попадают в пул. Узлы достают записи из пула, формируют блок, и после добавления блока в список удаляют запись из пула.

Поручение майнинга третьим лицам
Записи из пула выбирают майнеры, формируют блок и передают готовый блок узлу. На майнеров перекладывается основная вычислительная нагрузка.
Узел проверяет блок и добавляет в список.

Несколько записей в блоке
В блоке может быть несколько записей. Майнеры выбирают любые записи для формирования блока. Блок ограничен максимальной длинной.

Ну вот и всё — концептуальная модель готова, спасибо за внимание.
Поделиться с друзьями
-->

Комментарии (22)


  1. Myrddin
    14.10.2016 05:27

    Спасибо. Не совсем понятно, что есть узел и что есть майнер?


    1. keksmen
      14.10.2016 09:38

      Майнеры нужны из-за искусственного завышения вычислительной сложности для составления блока. Помним, что хэш-функция в идеале непредсказуема, а узлы, которые эти блоки хранят и проверяют, не принимают блоки с хэшем, значение которого меньше фиксированного числа. Из-за этого приходится множество раз менять вышеупомянутый counter для получения нового результата хэширования до тех пор, пока хэш не станет удовлетворять условиям принятия блока в цепь.


      1. Myrddin
        14.10.2016 15:02

        И насколько сильно сложность увеличивается с увеличением длины цепи? К примеру на 10 000 000 записей.


        1. keksmen
          15.10.2016 10:12

          Ни насколько. Сложность вычисления хеша одного блока не зависит от длины цепи.


          1. Myrddin
            15.10.2016 13:17

            Тогда почему чем больше майнится биткоинов, тем сложнее майнить оставшиеся?


            1. keksmen
              15.10.2016 14:11

              Я уже описывал, что хэш должен быть больше, либо равен определенному числу (не постулат, но bitcoin использует именно эту схему).
              Это искусственно ограничивает скорость создания блоков. Так что же мешает по определенным правилам регулировать это число?


            1. keksmen
              15.10.2016 14:13

              И ещё кое-что. Майнеры не "майнят" оставшиеся биткоины. Они "майнят" награду за принятый в цепь блок.


  1. rumkin
    14.10.2016 11:02
    +1

    Это не блокчейн в чистом виде, а частный случай – распределенный блокчейн на POW.


    1. user16
      14.10.2016 18:17

      Может ли блокчейн быть нераспределенным?


      1. Greendq
        14.10.2016 18:52
        +1

        Да, строго говоря — БЧ — это просто последовательные записи, связанные между собой контрольными суммами. А распределённость — это уже необязательная фича.


        1. gandjustas
          17.10.2016 14:23

          А есть ли практическое применение нераспределенного блокчейна?


          1. Greendq
            17.10.2016 16:08

            Вопрос был о возможности нераспределённого БЧ. На практике он просто не востребован, так как не имеет особого смысла — если источник данных централизован у него нет необходимости сомневаться в собственной надёжности :)


          1. rumkin
            18.10.2016 18:12

            github – централизованный блокчейн.


  1. vlad_xl
    14.10.2016 16:56

    Было бы интересно узнать как именно происходит процесс подтверждения транзакции в классическом POW блокчейне.


    1. user16
      14.10.2016 17:20

      Когда один из узлов принял блок с транзакцией — это произошло первое подтверждение. Каждый последующий блок над ним дает еще одно подтверждение.


  1. QtRoS
    14.10.2016 22:09
    +2

    Несколько простых вопросов (и напрашивающихся решений в квадратных скобках):
    — Два узла одновременно обработали один и тот же блок, как быть? [Не давать так делать?]
    — А если разные блоки и теперь у них одинаковая длина? [Разруливается временем? Оно разное теоретически]
    — Как все-таки происходит взаимодействие по сети? Не мешает ли всякие NAT'ы и тд?


    1. Darth_Malok
      15.10.2016 10:20
      +1

      > Два узла одновременно обработали один и тот же блок, как быть? [Не давать так делать?]

      Блоки рассылаются по сети и цепочка раздваивается. После этого всё зависит от того, какой из двух блоков принял майнер, посчитавший следующий блок. Если вдруг случится так, что два майнера, принявшие разные блоки снова одновременно посчитали хэш следующего блока, смотрим дальше. Как только в какой-то цепочке блок найден быстрее, вторая альтернативная цепочка просто откидывается, и все участники сети переключаются на более длинную.

      > Как все-таки происходит взаимодействие по сети? Не мешает ли всякие NAT'ы и тд?
      По аналогии с торрентами. Простая p2p сеть.

      Ну и чтобы два раза не вставать:
      Блокчейн в вакууме, это, как это ни странно, цепочка блоков, в котором каждый следующий блок содержит хэш предыдущего. Благодаря этому достигается целостность и неизменность данных. Необязательно блоки должны подписывать майнеры, необязательно нужна сложность. Блокчейн — БД, в которой нельзя изменить какие-либо данные без изменения данных, которые были записаны позже. Всё очень просто.


      1. Myrddin
        15.10.2016 15:22

        Т.е. пока твой блок не закроют следующим, нельзя быть уверенным, что он останется в цепочке? Как-то не очень надежно выглядит для финансовых транзакций…


        1. Darth_Malok
          16.10.2016 08:01

          Более того, даже если его уже закрыли следующим, есть вероятность, что вся цепочка будет отброшена. Поэтому рекомендуют дожидаться 6-ти подтверждающих блоков, тогда шанс, что цепочка будет отброшена настолько мизерный, что им можно пренебречь.
          Итого, час на подтверждение транзакции. Не так уж и много. Небольшая плата за свободные никем не контролируемые деньги) Размер блокчейна, imho, намного большая проблема.


        1. keksmen
          16.10.2016 09:58

          С транзакциями всё в порядке. Существует специальная очередь, из которой и берут записи для формирования блоков. Поэтому, из откинутых блоков записи снова помещаются в эту очередь.


  1. Gorthauer87
    15.10.2016 12:24
    +2

    Как-то очень поверхностно, во первых для того, чтобы новый блок был принят, нужно прежде всего достигнуть консенсуса, это в случае биткоина и есть тот самый правильно подобранный nonce, эта техника называется proof of work, но можно сделать приватный блокчейн на одном сервере для личных нужд, тогда алгоритма консенсуса может и не быть, а блоки будут приниматься с некоторой фиксированной скоростью. С другой же стороны есть альтернативные алгоритмы консенсуса, которые сильно зависят от того, насколько блокчейн публичен. К примеру, если его майнят лишь определенные узлы, у которых на это есть права, а остальные имеют к нему доступ на проверку, то можно использовать более быстрые алгоритмы, чем proof of work и таким образом уменьшать время на прием транзакции из пула в блок.


  1. gandjustas
    17.10.2016 14:20

    А можно подробнее про пулы и блоки? Кто хранит\пополняет пулы? Пулы тоже распределенные?


    Как гарантируется запись?
    Вот добавили мы блок, нету никакой гарантии ни в какое время, что этот блок не будет отброшен из-за более длинной цепочки, сформированной в другом сегменте.


    Нет ли в таком сценарии вектора атаки? Злоумышленник может сделать "перевод денег", и одновременно генерировать альтернативные цепочки. Тогда фактически "перевод" может не случиться, но злоумышленник успеет забрать "товар".