Русские Блоги
блокчейн 200 строк кода: простой пример, реализованный на JavaScript
блокчейн 200 строк кода: простой пример, реализованный на JavaScript
Понять концепцию блокчейна просто (блокчейн, блок цепочки транзакций): он распределен (то есть не размещается на одном компьютере, на разных сетевых устройствах), а база данных поддерживает растущий список записей хостинга. Тем не менее, также легко спутать блокчейн с нашей попыткой помочь ему в достижении цели — на данный момент в сознании людей этот термин довольно сильно связан с концепцией транзакций, контрактов или интеллектуальной криптовалюты.
только вот блокчейн — это не то же самое, что биткойн, и понять базовые знания блокчейна проще, чем кажется, особенно если он основан на исходном коде. В этой статье мы предлагаем простую модель, построенную из 200 строк кода на JavaScript. Исходный код этого проекта, который мы называем NaiveChain, можно найти на GitHub. Часть 1 и Часть 2: Если вам нужно использовать его функции, воспользуйтесь нашей шпаргалкой, мы будем использовать стандартный ECMAScript 6.
Структура блока
Первый шаг — определение элементов, которые должны содержать блок. Для простоты мы включаем только самое необходимое: показатель степени (индекс) предыдущего блока, отметку времени (отметку времени), данные (данные), хэш и хэш, которые должны быть записаны для поддержания структурной целостности схемы.
Блокчейн в 200 строк кода
Основная концепция блокчейна довольно проста: распределенная база данных, которая поддерживает постоянно растущий список упорядоченных записей.
Однако, многоe остается непонятным, когда мы говорим о блокчейне, так же остается много проблем, которые мы пытаемся решить с его помощью. Это относится и к популярным блокчейн проектам, таким как Биткоин (Bitcoin) и Эфириума (Ethereum). Термин «блокчейн» обычно сильно привязан к концепции типа денежных переводов, смарт-контрактов или криптовалюты.
Это делает понимание блокчейна сложнее, чем есть на самом деле. Особенно исходный код. Здесь я пройдусь по супер-простой реализации блокчейна в 200 строк кода JavaScript под названием NaiveChain.
Структура блока
Первый логический шаг — определиться со структурой блока. Чтобы оставить все как можно проще, мы включили только самое необходимое: индекс, отметка, данные, хэш и хэш предыдущего блока.
Хэш предыдущего блока необходимо найти в блоке для сохранения целостности цепи
Хеш блока
Блок должен быть хэширован, чтобы сохранить целостность данных. SHA256 отвечает за содержание блока. Следует отметить, что этот хэш не имеет ничего общего с «майнингом», поскольку нет подтверждения работы — решения задачи.
Генерация блока
Для создания блока нужно знать хэш предыдущего блока, а остальное необходимо создавать из следующего содержания (= index, hash, data и timestamp). Блок-дата — это некая информация, которая передается конечному пользователю.
Хранение блоков
В памяти массив JavaScript используется для хранения блокчейн. Первый блок в блокчейн — это всегда так называемый «генезис-блок», имеющий следующий код:
Проверка целостности блоков
В любой момент времени мы должны быть в состоянии проверить, является ли блок или цепочка блоков допустимыми с точки зрения целостности. Это особенно актуально, когда мы получаем новые блоки от других узлов и должны решить, принимать их или нет.
Выбираем самую длинную цепочку
Всегда должен быть только один явный набор блоков в цепи в один момент времени. В случае возникновения конфликтов (например, два узла как в созданном блоке № 72) мы выбираем цепь, которая имеет самый длинный ряд блоков.
Общение с другими узлами
Важной функцией узла является — разделение и синхронизация блокчейн с другими узлами. Правила — используемые для поддержания синхронизации сети:
- Когда узел генерирует новый блок, он транслирует его в сеть
- Когда узел подключается к новой одноранговой сети он опирается на последний блок
- Когда узел обнаруживает блок, который имеет индекс больший, чем текущий известный блок, он либо добавляет блок в его нынешнем состоянии в свою собственную цепь либо поддерживает для заполнения блокчейна.
Нет никакого автоматического взаимного обнаружения. Местоположения (=URL-адреса) стороны должны быть добавлены вручную.
Контроль над узлом (node`ой)
Пользователь, в некотором роде, должен иметь возможность контролировать узел. Это делается путем настройки http-сервера.
Как видно, пользователь может взаимодействовать с узлом следующими способами:
- Просматривать список всех блоков
- Создавать новый блок с содержанием, заданным пользователем
- Просматривать или добавлять одноранговых пользователей
#получить все блоки из узла
curl http://localhost:3001/blocks
Архитектура
Следует отметить, что узел фактически предоставляет два веб-сервера: один для пользователя, чтобы контролировать узел (http-сервер) и один для одноранговой (peer-to-peer) связи между узлами.(websocket сервер http)
Основные компоненты NaiveChain
Заключение
NaiveChain был создан для демонстрационных и учебных целей. До тех пор, пока у него нет «майнинг» алгоритма для (PoS of PoW) он не может использоваться в общедоступной сети. Тем не менее он реализует основные функции для реализации блокчейн.
Блокчейн на 200 строках кода
Базовая концепция блокчейна довольно проста: речь идет о распределенной базе данных, поддерживающей постоянно растущий список упорядоченных записей. Запутаться, однако, легко, поскольку всякий раз, когда мы говорим о блокчейнах, мы рассматриваем их с позиции задач, которые пытаемся решить и потому нередко начинаем подмешивать в это определение другие, очень близкие ему понятия. Это справедливо и в случае с популярными блокчейн проектами, такими, как Биткойн и Эфириум. Термин «блокчейн» обычно тесно связан с такими концепциями, как транзакции, умные контракты или криптовалюты.
Все это оправданно, но все же существенно усложняет процесс понимания принципа работы блокчейнов, особенно с точки зрения программного обеспечения с открытым исходным кодом. В этом материале я покажу вам крайне простой блокчейн, написание которого потребовало всего 200 строк Javascript-кода. Я назвал его NaiveChain.
Структура блока
Первым и логичным шагом было бы определиться со структурой блока. Чтобы сохранить максимальную простоту, мы включим в него лишь самое необходимое: индекс, метку времени, данные и хэши текущего и предыдущего блоков.
Хэш предыдущего блока включен в каждый блок для сохранения целостности цепочки
Хэширование блока
Сохранение целостности данных достигается с помощью хэширования блоков. В данном случае применяется алгоритм SHA-256. Следует также отметить, что получаемый хэш никак не связан с процессом майнинга, поскольку наш блокчейн не требует решения каких-либо «Proof Of Work» задач.
Генерация блока
Для генерации блока мы должны знать хэш предыдущего блока и добавить оставшуюся часть содержимого текущего блока, то есть индекс, хэш, данные и временную метку. Под данными блока понимается какая-либо предоставленная конечными пользователями информация.
Хранение блоков
Блокчейн хранится в оперативной памяти в форме Javascript массива. Первый блок, как это обычно бывает во всех блокчейнах, получил название genesis-block (блок-прародитель). Его содержимое прописано заранее и не подлежит изменению.
Проверка целостности блоков
В любой момент мы должны иметь возможность проверить, действительно ли тот или иной блок или цепочка блоков содержит правильно сформированную и достоверную информацию. Это особенно важно, когда мы получаем новые блоки от других узлов и должны принять решение относительно их подлинности.
Выбор самой длинной цепочки
В любой момент времени в блокчейне должен существовать только один достоверный набор блоков. В случае конфликта (например, два узла генерируют блок номер 72) мы выбираем цепочку, содержащую наибольшее количество блоков.
Обмен информацией с другими узлами
Одна из ключевых составляющих деятельности узла заключается в обмене информации о блокчейне и синхронизации данных с другими узлами.
- Когда узел генерирует новый блок, он оповещает об этом всех остальных участников сети.
- Когда узел соединяется с другим новым узлом, он опрашивает его о последнем известном ему блоке.
- Когда узел узнает о блоке с показателем индекса более высоким, нежели у последнего известного ему, он добавляет блок в собственную цепочку или отправляет запрос на получение целого блокчейна для сверки.
Некоторые типичные сценарии обмена сообщениями между узлами, предусмотренные описанным протоколом
Автоматическое обнаружение узлов в нашем блокчейне не используется. Расположения (то есть URL’ы) других узлов прописываются вручную.
Управление узлом
Пользователь должен обладать определенными возможности по управлению узлом. Для этого в нашем коде предусмотрена настройка HTTP-сервера.
Как видно из приведенного выше фрагмента кода, пользователь получает возможность взаимодействовать с узлом следующими способами:
- Получить список всех блоков.
- Создать новый блок с указанным содержимым.
- Получить список всех узлов или добавить в него новые узлы.
Один из вариантов непосредственного управления узлом — использование Curl:
Архитектура
Следует отметить, что работа каждого узла включает в себя использование двух веб-серверов: управляющего узлом HTTP-сервера и осуществляющего коммуникацию с другими узлами Websocket HTTP-сервера.
Основные компоненты NaiveChain
Заключение
NaiveChain был создан в демонстрационных и обучающих целях. В силу того, что в нем нет алгоритма майнинга (PoS или PoW), использовать его для публично доступной сети не представляется возможным. Тем не менее проект воплощает на практике всю необходимую базовую функциональность Блокчейн.
Более подробная техническая информация доступна в Github-репозитории проекта.
ссылка на оригинал статьи https://geektimes.ru/post/284552/
Источник https://russianblogs.com/article/44361352139/
Источник https://habr.com/ru/post/323586/
Источник https://savepearlharbor.com/?p=283678