Мы начнем от самой простой тривиальной модели и будем дополнять ее возможности, пока не получим полноценную модель.
Определим цель использования блокчейна:
Есть несколько участников, которые заинтересованы поддерживать целостность общего массива данных и дополнять его.
Базовая модель
Данные представлены последовательностью записей, которую можно дополнять. Записи вместе с вспомогательной информацией хранятся в блоках. Блоки хранятся в виде односвязного списка. Каждый участник представлен узлом(node), который хранит весь актуальный массив данных и контактирует с другими узлами. Узлы могут добавлять новые записи в конец списка, а также сообщают друг другу об изменениях списка.
Последовательное расширение функционала
Приоритет более длинному списку
Выбирая между несколькими версиями списка записей, узлы сохраняют у себя более длинный. Таким образом, добавленная в одном узле новая запись распространяется на все остальные узлы.
Хеш предыдущей записи
В блоке хранится хеш-код предыдущей записи. Такой хеш-код однозначно идентифицирует все предыдущие блоки и их взаимное расположение. Следовательно, блок внутри списка не может быть изменен без изменения последующих блоков.
Вычислительная сложность создания блока
В блоке добавляется новое поле — counter — произвольное число. Нужно подобрать такое значение counter'а, чтобы хеш-код блока заканчивался на определенное число нулей.
Пул необработанных записей
Новые записи попадают в пул. Узлы достают записи из пула, формируют блок, и после добавления блока в список удаляют запись из пула.
Поручение майнинга третьим лицам
Записи из пула выбирают майнеры, формируют блок и передают готовый блок узлу. На майнеров перекладывается основная вычислительная нагрузка.
Узел проверяет блок и добавляет в список.
Несколько записей в блоке
В блоке может быть несколько записей. Майнеры выбирают любые записи для формирования блока. Блок ограничен максимальной длинной.
Ну вот и всё — концептуальная модель готова, спасибо за внимание.
Комментарии (22)
rumkin
14.10.2016 11:02+1Это не блокчейн в чистом виде, а частный случай – распределенный блокчейн на POW.
user16
14.10.2016 18:17Может ли блокчейн быть нераспределенным?
Greendq
14.10.2016 18:52+1Да, строго говоря — БЧ — это просто последовательные записи, связанные между собой контрольными суммами. А распределённость — это уже необязательная фича.
gandjustas
17.10.2016 14:23А есть ли практическое применение нераспределенного блокчейна?
Greendq
17.10.2016 16:08Вопрос был о возможности нераспределённого БЧ. На практике он просто не востребован, так как не имеет особого смысла — если источник данных централизован у него нет необходимости сомневаться в собственной надёжности :)
QtRoS
14.10.2016 22:09+2Несколько простых вопросов (и напрашивающихся решений в квадратных скобках):
— Два узла одновременно обработали один и тот же блок, как быть? [Не давать так делать?]
— А если разные блоки и теперь у них одинаковая длина? [Разруливается временем? Оно разное теоретически]
— Как все-таки происходит взаимодействие по сети? Не мешает ли всякие NAT'ы и тд?Darth_Malok
15.10.2016 10:20+1> Два узла одновременно обработали один и тот же блок, как быть? [Не давать так делать?]
Блоки рассылаются по сети и цепочка раздваивается. После этого всё зависит от того, какой из двух блоков принял майнер, посчитавший следующий блок. Если вдруг случится так, что два майнера, принявшие разные блоки снова одновременно посчитали хэш следующего блока, смотрим дальше. Как только в какой-то цепочке блок найден быстрее, вторая альтернативная цепочка просто откидывается, и все участники сети переключаются на более длинную.
> Как все-таки происходит взаимодействие по сети? Не мешает ли всякие NAT'ы и тд?
По аналогии с торрентами. Простая p2p сеть.
Ну и чтобы два раза не вставать:
Блокчейн в вакууме, это, как это ни странно, цепочка блоков, в котором каждый следующий блок содержит хэш предыдущего. Благодаря этому достигается целостность и неизменность данных. Необязательно блоки должны подписывать майнеры, необязательно нужна сложность. Блокчейн — БД, в которой нельзя изменить какие-либо данные без изменения данных, которые были записаны позже. Всё очень просто.Myrddin
15.10.2016 15:22Т.е. пока твой блок не закроют следующим, нельзя быть уверенным, что он останется в цепочке? Как-то не очень надежно выглядит для финансовых транзакций…
Darth_Malok
16.10.2016 08:01Более того, даже если его уже закрыли следующим, есть вероятность, что вся цепочка будет отброшена. Поэтому рекомендуют дожидаться 6-ти подтверждающих блоков, тогда шанс, что цепочка будет отброшена настолько мизерный, что им можно пренебречь.
Итого, час на подтверждение транзакции. Не так уж и много. Небольшая плата за свободные никем не контролируемые деньги) Размер блокчейна, imho, намного большая проблема.
keksmen
16.10.2016 09:58С транзакциями всё в порядке. Существует специальная очередь, из которой и берут записи для формирования блоков. Поэтому, из откинутых блоков записи снова помещаются в эту очередь.
Gorthauer87
15.10.2016 12:24+2Как-то очень поверхностно, во первых для того, чтобы новый блок был принят, нужно прежде всего достигнуть консенсуса, это в случае биткоина и есть тот самый правильно подобранный nonce, эта техника называется proof of work, но можно сделать приватный блокчейн на одном сервере для личных нужд, тогда алгоритма консенсуса может и не быть, а блоки будут приниматься с некоторой фиксированной скоростью. С другой же стороны есть альтернативные алгоритмы консенсуса, которые сильно зависят от того, насколько блокчейн публичен. К примеру, если его майнят лишь определенные узлы, у которых на это есть права, а остальные имеют к нему доступ на проверку, то можно использовать более быстрые алгоритмы, чем proof of work и таким образом уменьшать время на прием транзакции из пула в блок.
gandjustas
17.10.2016 14:20А можно подробнее про пулы и блоки? Кто хранит\пополняет пулы? Пулы тоже распределенные?
Как гарантируется запись?
Вот добавили мы блок, нету никакой гарантии ни в какое время, что этот блок не будет отброшен из-за более длинной цепочки, сформированной в другом сегменте.
Нет ли в таком сценарии вектора атаки? Злоумышленник может сделать "перевод денег", и одновременно генерировать альтернативные цепочки. Тогда фактически "перевод" может не случиться, но злоумышленник успеет забрать "товар".
Myrddin
Спасибо. Не совсем понятно, что есть узел и что есть майнер?
keksmen
Майнеры нужны из-за искусственного завышения вычислительной сложности для составления блока. Помним, что хэш-функция в идеале непредсказуема, а узлы, которые эти блоки хранят и проверяют, не принимают блоки с хэшем, значение которого меньше фиксированного числа. Из-за этого приходится множество раз менять вышеупомянутый counter для получения нового результата хэширования до тех пор, пока хэш не станет удовлетворять условиям принятия блока в цепь.
Myrddin
И насколько сильно сложность увеличивается с увеличением длины цепи? К примеру на 10 000 000 записей.
keksmen
Ни насколько. Сложность вычисления хеша одного блока не зависит от длины цепи.
Myrddin
Тогда почему чем больше майнится биткоинов, тем сложнее майнить оставшиеся?
keksmen
Я уже описывал, что хэш должен быть больше, либо равен определенному числу (не постулат, но bitcoin использует именно эту схему).
Это искусственно ограничивает скорость создания блоков. Так что же мешает по определенным правилам регулировать это число?
keksmen
И ещё кое-что. Майнеры не "майнят" оставшиеся биткоины. Они "майнят" награду за принятый в цепь блок.