Декомпозиция blockchain

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

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

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

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


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

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


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

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

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

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

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

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

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

Комментарии 23

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

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

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

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

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

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

                0

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

        +1

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

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

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

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

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

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

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

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

                Ну и чтобы два раза не вставать:
                Блокчейн в вакууме, это, как это ни странно, цепочка блоков, в котором каждый следующий блок содержит хэш предыдущего. Благодаря этому достигается целостность и неизменность данных. Необязательно блоки должны подписывать майнеры, необязательно нужна сложность. Блокчейн — БД, в которой нельзя изменить какие-либо данные без изменения данных, которые были записаны позже. Всё очень просто.
                  0
                  Т.е. пока твой блок не закроют следующим, нельзя быть уверенным, что он останется в цепочке? Как-то не очень надежно выглядит для финансовых транзакций…
                    0
                    Более того, даже если его уже закрыли следующим, есть вероятность, что вся цепочка будет отброшена. Поэтому рекомендуют дожидаться 6-ти подтверждающих блоков, тогда шанс, что цепочка будет отброшена настолько мизерный, что им можно пренебречь.
                    Итого, час на подтверждение транзакции. Не так уж и много. Небольшая плата за свободные никем не контролируемые деньги) Размер блокчейна, imho, намного большая проблема.
                      0

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

                  +2

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

                    0

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


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


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

                      0
                      Кто хранит\пополняет пулы?
                      Пользователи блокчейна добавляют желаемые записи в пул. Копии пула хранятся в узлах.
                      Пулы тоже распределенные?
                      Да

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

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

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

                    Самое читаемое