Программирование блокчейн с чего начать

Блокчейн на JavaScript

В последнее время криптовалюты и блокчейн-технологии стали невероятно популярными. Сегодня я расскажу о моём подходе к созданию блокчейн-платформы на JavaScript с использованием всего 60 строк кода. Я — начинающий блокчейн-разработчик, поэтому если я в чём-то ошибаюсь — поправьте меня в комментариях.

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начать

Что такое блокчейн?

Прежде чем мы займёмся программированием — надо разобраться с тем, что такое блокчейн (blockchain, цепочка взаимосвязанных блоков). С технической точки зрения, в минимальном представлении, это всего лишь список объектов, содержащих некую информацию — вроде отметки времени, сведений о транзакциях, хешей. Эти данные должны быть иммутабельными и надёжно защищёнными от взлома. Современные платформы, вроде Ethereum, Cardano, Polkadot, обладают гораздо более широкими возможностями, чем просто хранение неких данных, но мы тут будем стремиться к простоте.

Подготовка среды разработки

Для этого проекта мы будем использовать Node.js, поэтому вам, если у вас эта платформа не установлена, понадобится её установить.

Я применяю объектно-ориентированный стиль программирования, поэтому ожидаю от читателя хотя бы базовых знаний в этой сфере.

Создание блока

Как я уже сказал, блок — это просто объект, в котором хранится какая-то информация. Нам, следовательно, понадобится класс Block :

Вышеприведённый код даст нам то, что нужно. Но если вы хотите разобраться с тем, как именно он работает — взгляните на официальную документацию Node.js по классу Hash.

На данном этапе работы у нас должно получиться нечто вроде следующего кода:

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

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

Блокчейн

Как я уже говорил, блокчейн — это список блоков. Поэтому простейший блокчейн можно описать с помощью следующего класса.

Ещё нам необходим так называемый первичный блок (genesis block), который, с технической точки зрения, представляет собой всего лишь самый первый блок:

И я, для удобства, создал функцию, которая выдаёт самый последний блок:

Теперь нам нужен механизм добавления блоков в блокчейн:

Проверка блокчейна

Нам нужно знать о том, корректны ли данные, хранящиеся в блокчейне. Поэтому нам нужен метод, который проверяет хеши блоков. Блокчейн корректен в том случае, если хеши блоков равны тому, что возвращает метод хеширования, и если свойство блока prevHash равно хешу предыдущего блока.

Алгоритм доказательства выполнения работы

Подобная система направлена на то, чтобы значительно увеличить объём работ, необходимых для создания нового блока. Если нужно модифицировать некий блок — понадобится выполнить работу, необходимую для создания этого блока и всех блоков, которые идут за ним. Это требует поиска значений, которые, после хеширования, дают результат, начинающийся с определённого количества нулевых битов. Речь идёт о так называемом значении nonce (number that can only be used once — число, которое может быть использовано один раз), а количество нулевых битов в начале такого числа известно как «сложность». По мере увеличения сложности задача добычи (майнинга, mining) нового блока становится всё сложнее и сложнее. Это позволяет предотвратить модификацию предыдущих блоков, так как тому, кто хотел бы модифицировать некий блок, пришлось бы выполнить работу, необходимую для создания этого блока и всех блоков, которые идут за ним. А это практически невозможно.

Реализовать эту систему можно, добавив в класс Block метод mine и свойство nonce :

Из-за того, что даже маленькое изменение данных блока ведёт к появлению совершенно нового хеша, мы просто снова и снова инкрементируем nonce до тех пор, пока хеш не окажется таким, как нам нужно.

(Учтите, что Bitcoin и другие блокчейн-системы используют другой способ настройки сложности, но мы тут, как уже говорилось, стремимся к простоте.)

Вернёмся к классу Blockchain и создадим в нём свойство для хранения сложности — difficulty :

В него записано число 1, оно должно меняться в зависимости от количества добытых блоков.

Нам надо отредактировать и код метода addBlock класса Blockchain :

Теперь каждый блок, прежде чем его можно будет добавить в блокчейн, нужно добыть.

Примечание

Я использовал для этого блокчейна PoW-систему из-за стремления к простоте. Большинство современных блокчейнов используют гораздо лучшую систему, основанную на механизме консенсуса «доказательство доли владения» (Proof-of-Stake, PoS), или одну из многих усовершенствованных систем такого типа.

Тестирование блокчейна!

Сначала экспортируем необходимые классы:

Импортируем их в index.js и приступим к испытанию:

Запуск системы должен выглядеть примерно так:

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начать

Первый блок — это первичный блок, а второй — это тот блок, который мы добавили в блокчейн.

Дополнение: сложность и время блока

▍Время блока

Время блока (block time) — это константное значение, которое представляет собой приблизительное время, необходимое на добавление блока в блокчейн. Платформа Bitcoin, например, имеет время блока, равное 10 минутам, а время блока Ethereum равняется 13 секундам.

▍Формула сложности Bitcoin

Сложность Bitcoin меняется после добычи каждых 2016 блоков. Для вычисления сложности используется следующая формула:

Теперь займёмся программированием!

Просто для примера я создам собственную систему: сложность будет увеличиваться на 1 если время блока меньше, чем реальное время, за которое был добыт блок. В противном случае она будет уменьшаться на 1.

▍Важное примечание

Можете, правда, создать и собственную формулу. Но при этом нужно ориентироваться на безопасность и на хорошую производительность решения.

Итоги

Вот исходный код моего проекта на GitHub.

Хочу сказать, что многое узнал о блокчейне из материалов YouTube-канала Simply Explained. Я не написал бы эту статью, если бы не серия учебных видео по блокчейну с этого канала. Я, кроме того, почерпнул кое-что из этой статьи. Рекомендую эти материалы всем, кому интересна тема блокчейна.

Доводилось ли вам пользоваться блокчейн-технологиями?

Источник

Пишем свой блокчейн

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начать

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

Прежде, чем начать

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

Если вы не знаете, что такое хэш, вот объяснение.

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

Что мне нужно? Убедитесь, что установлен Python 3.6 + (вместе с pip). Вам также потребуется установить Flask и замечательную библиотеку requests:

Вам также понадобится HTTP-клиент, например Postman или cURL. Но все подойдет.

Исходный код доступен здесь.

Шаг 1. Создание блокчейна

Откройте свой любимый текстовый редактор или IDE, лично я люблю PyCharm. Создайте новый файл с именем blockchain.py. Мы будем использовать только один файл, но, если вы потеряетесь, всегда можете обратиться к исходному коду.

Наш класс Blockchain отвечает за управление цепочкой. Он будет хранить транзакции и иметь несколько вспомогательных методов для добавления новых блоков в цепочку. Давайте начнем конкретизировать некоторые методы.

Каждый блок имеет индекс, временную метку (во времени Unix), список транзакций, доказательство (подробнее об этом позже) и хэш предыдущего блока.

Вот пример того, как выглядит отдельный блок:

Добавление транзакций в блок

Нам понадобится способ добавления транзакций в блок. За это отвечает наш метод new_transaction(), и он довольно прост:

Создание новых блоков

Помимо создания генезис-блока в нашем конструкторе, мы также конкретизируем методы для new_block(), new_transaction() и hash():

Понимание доказательства работы

Мы рассмотрим очень простой пример, который поможет понять это.

Давайте решим, что хэш одного целого числа, x умноженного на другое, y должен заканчиваться на 0. Так, hash(x * y) = ac23dc. 0. И для этого упрощенного примера давайте примем x = 5. Реализация этого в Python:

Решение здесь y = 21. Поскольку созданный хэш заканчивается на 0:

Сеть способна легко проверить их решение.

Внедрение базового доказательства работы

Давайте реализуем аналогичный алгоритм для нашего блокчейна. Наше правило будет аналогично приведенному выше примеру:

Найдите число p, при хешировании которого с решением предыдущего блока получается хэш с 4 ведущими 0.

Чтобы отрегулировать сложность алгоритма, мы можем изменить количество ведущих нулей. Но 4 достаточно. Вы обнаружите, что добавление одного ведущего нуля значительно увеличивает время, необходимое для поиска решения.

Наш класс почти готов, и мы готовы начать с ним взаимодействовать с помощью HTTP-запросов.

Шаг 2: Блокчейн как API

Мы собираемся использовать Python Flask Framework. Это фреймворк, который упрощает сопоставление конечных точек с функциями Python. Это позволяет нам общаться с нашей цепочкой блоков через Интернет, используя HTTP-запросы.

Мы создадим три метода:

/transactions/new создать новую транзакцию в блоке

/mine чтобы сказать нашему серверу майнить новый блок.

/chain чтобы вернуть полную цепочку блоков.

Наш «сервер» сформирует единый узел в нашей сети блокчейнов. Создадим шаблонный код:

Краткое объяснение того, что мы добавили выше:

Строка 15: создает экземпляр нашего узла. Узнайте больше о Flask здесь.

Строка 18: создание случайного имени для нашего узла.

Строка 21: создание экземпляра нашего Blockchain класса.

Строка 24–26: создание /mine конечной точки, которая является GET-запросом.

Строка 28–30: создание /transactions/new конечную точку, которая является POST-запросом, поскольку мы будем отправлять ей данные.

Строка 32–38: Создайте /chain конечную точку, которая возвращает полную цепочку блоков.

Строка 40–41: запускает сервер на порту 5000.

Конечная точка транзакций

Так будет выглядеть запрос на транзакцию. Это то, что пользователь отправляет на сервер:

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

Конечная точка майнинга

1. Рассчитать Proof of Work

2. Наградить майнера (нас), добавив транзакцию, дающую нам 1 монету.

3. Создать новый блок, добавив его в цепочку

Шаг 3: Взаимодействие с нашей цепочкой блоков

Вы можете использовать старый простой cURL или Postman для взаимодействия с нашим API по сети.

Попробуем добыть блок, запросив http://localhost:5000/mine:

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начатьИспользуем Postman отправить GET-запрос

Давайте создадим новую транзакцию, сделав POST-запрос к http://localhost:5000/transactions/new, содержащему нашу структуру транзакции:

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начатьИспользуем Postman отправить POST-запрос

Если вы не используете Postman, вы можете сделать аналогичный запрос с помощью cURL:

Я перезапустил свой сервер и добыл два блока, всего получилось 3. Давайте проверим всю цепочку, запросив http://localhost:5000/chain:

Шаг 4: консенсус

Регистрация новых узлов

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

/nodes/register принять список новых узлов в виде URL-адресов.

/nodes/resolve для реализации нашего алгоритма консенсуса, который разрешает любые конфликты, чтобы гарантировать, что узел имеет правильную цепочку.

Нам нужно будет изменить конструктор нашей цепочки блоков и предоставить метод для регистрации узлов:

Обратите внимание, что мы использовали set() для хранения списка узлов. Это дешевый способ гарантировать, что добавление новых узлов идемпотентно, то есть независимо от того, сколько раз мы добавляем конкретный узел, он появляется только один раз.

Реализация алгоритма консенсуса

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

Первый метод valid_chain() отвечает за проверку правильности цепочки путем обхода каждого блока и проверки как хэша, так и доказательства.

Давайте зарегистрируем две конечные точки в нашем API, одну для добавления соседних узлов, а другую для разрешения конфликтов:

На этом этапе вы можете взять другую машину, если хотите, и развернуть разные узлы в своей сети. Или запустите процессы, используя разные порты на одной машине. Я развернул еще один узел на своей машине, на другом порту, и зарегистрировал его на моем текущем узле. Таким образом, у меня есть два узла: http://localhost:5000 и http://localhost:5001.

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начатьРегистрация нового узла

Затем я добыл несколько новых блоков на узле 2, чтобы цепочка была длиннее. После этого я вызвал /nodes/resolve узел 1, где цепочка была заменена алгоритмом консенсуса:

Программирование блокчейн с чего начать. Смотреть фото Программирование блокчейн с чего начать. Смотреть картинку Программирование блокчейн с чего начать. Картинка про Программирование блокчейн с чего начать. Фото Программирование блокчейн с чего начатьАлгоритм консенсуса

Надеюсь, это вдохновило вас на создание чего-то нового. Я в восторге от криптовалют, потому что считаю, что блокчейн быстро изменят наши представления об экономике, правительстве и ведении учета.

Источник

Как стать блокчейн-разработчиком, с чего начать новичку

Блокчейн-разработчики у хедхантеров нарасхват. Как же влиться в эту новую индустрию?

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

Билл Гейтс сказал, что блокчейн изменит правила игры уже в ближайшее десятилетие. Инновационной (и даже революционной) эту технологию делает именно её универсальность. Блокчейн можно применить практически в любой индустрии, которая поддерживается логической схемой и технически структурированной сетью.

Если говорить о потенциале блокчейна, то мы пока не полностью увидели даже верхушку айсберга. Повсеместное увлечение криптовалютой привлекло в сферу множество талантливых специалистов, в то время как публичным блокчейнам вроде Steem и Verge и их приватным братьям, например Hyperledger, постоянно требуются новые умы для решения технологических задач.

Зачем же становиться блокчейн\-разработчиком?

Наш мир меняется со скоростью, сравнимой лишь с временами промышленной революции (и это сравнение не в пользу последней). В XIX веке сторонники ручного труда проиграли конкурентам, которые не побоялись взять технику на вооружение. Вскоре конвейеры стали нормой, автоматизировав производство, которым люди занимались вручную на протяжении тысяч лет.

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

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

Также стоит отметить, как коммуникационные технологии и сила децентрализации помогли многим предпринимателям по всему миру самостоятельно создать свой бизнес и производить транзакции без каких-либо лишних соглашений. До интернета такое сложно было представить. Со временем это становится трендом.

Помимо перечисленных выше преимуществ есть и другие.

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

Сама блокчейн-индустрия, по прогнозам экспертов, к 2025 году будет иметь капитализацию в несколько сотен миллиардов долларов. Это довольно грубое предположение, учитывая, что мы не знаем, как государства и международные институты поведут себя в отношении блокчейна. Однако эта технология, несомненно, изменит множество индустрий и бизнес-процессов.

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

Концентрируясь на криптовалютах, мы игнорируем львиную долю потенциала технологии.

Чем может заниматься блокчейн\-разработчик?

Есть несколько путей развития для блокчейн-разработчика.

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

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

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

Какие навыки пригодятся?

Очевидно, этот рынок требует специальных навыков. Блокчейн — это чистое программирование, и различные блокчейны и монеты построены на различных языках. Биткоин работает на C++, а эфириум — и на C++, и на Python. Некоторые блокчейны стараются помочь своему распространению, задействуя несколько языков программирования (например, Dragonchain поддерживает Java, Python, NodeJS и C#). У вас довольно широкий выбор в плане языка, но навык в любом случае должен быть на высоком уровне.

Вам также понадобятся навыки веб-разработчика. Они включают в себя знание HTML, CSS, NodeJS и MongoDB. Придётся заниматься и бэк-эндом. Навыки нетворкинга и систем безопасности также будут полезны, ведь блокчейн-разработчики часто вынуждены общаться с представителями этих отделов.

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

Тем, кто хочет что-нибудь почитать на эту тему, стоит обратиться к книге Mastering Bitcoin, написанной Андреасом Антонопулусом. Эта полезнейшая книга в электронном виде распространяется бесплатно.

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

Как получить работу?

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

Далее перед вами открываются два основных пути: в качестве разработчика или в качестве консультанта. В этой статье мы фокусируемся на первом варианте.

На техническом пути вам предстоит стать разработчиком программного обеспечения — тем человеком, который будет программировать смарт-контракты, децентрализованные приложения и код блокчейна. Это потребует всех навыков, которые мы упоминали в ранее. Кстати, особенно полезным окажется знание JavaScript, так как Solidity сильно его напоминает, соответственно, вам будет проще начать работу с эфириумом.

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

Платформы онлайн-найма отмечают заметное повышение спроса и предложения работы, связанной с криптовалютами. На LinkedIn и UpWork появляется всё больше резюме блокчейн-разработчиков. Почему бы вам не добавить и своё? В поисках вакансий можно зайти на AngelList или Blocktribe, где размещено множество запросов к блокчейн-разработчикам. Помимо этого, на данный момент Ripple ищет специалистов.

Благодаря сплочённости сообщества разработчиков вы можете получить опыт работы в качестве волонтёра. Многие проекты счастливы лишней паре рук, если к ним прилагается должный уровень навыков. Почитайте об интересующих проектах на Reddit, в Telegram, Slack и Discord, отправьте твиты членам команды. И, конечно же, не забудьте заглянуть на их сайты: многие вывешивают вакансии именно там.

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

Заключение

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

Однако фундаментальными инструментами для создания блокчейна и программного обеспечения на его основе сегодня владеет большинство программистов. Источники навыков и знаний доступны в интернете в формате видеоматериалов и сжатых текстовых руководств. Ничто не останавливает вас от того, чтобы стать блокчейн-разработчиком. Если сфера вас действительно манит — дерзайте и верьте в себя!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *