Просто объясненная копия

Валькирия Холмс

Это в значительной степени подводит итоги последних пяти дней моей работы.

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

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

Но сегодня мы обсуждаем Javascript и как мне удалось написать более 150 строк кода с нуля для простого механизма блокчейна.

Вы можете посмотреть это вводное видео, чтобы получить общее представление о моем проекте:

Я следил за серией видео с Simply Explained, канала Youtube, посвященного изучению нового во всем, от программирования до экзистенциальных вопросов. Он выпустил плейлист из пяти частей для написания собственного блокчейна на javascript. Хотя в видеороликах не рассказывалось, как проверить, достаточно ли у меня средств для совершения транзакции или как общаться с другими майнерами, они дали мне относительно простой обзор того, как система работает, например, в такой криптовалюте, как Биткойн.

Создание базы

Моей первой задачей было создание самой сети. Я использовал Visual Studio Code и расширение node.js, которое содержало все свойства, связанные с созданием криптовалюты. Как только все это было установлено, я приступил к работе над своей первой страницей.

Я определил класс «Блок» и использовал конструктор для получения свойств блока, которые являются индексом, отметкой времени, данными и предыдущим хешем. Индекс сообщает нам, где находится блок в цепочке, отметка времени сообщает нам, когда он был создан, данные будут виртуальным кодом, а предыдущий хеш содержит хеш последнего блока, который мы взломали в цепочке.

Оттуда мы нашли хорошее применение файлу crypto.js, используя библиотеку SHA256 для различных случайных хэшей в наших блоках. Я связал их, что превратило их в видимые данные, и закончил блок!

Затем я создал новый класс под названием Blockchain. Внутри этого класса находится код начала цепочки, генезис-блока, который содержит дату, имя и индекс. Я также ввожу функцию getLatestBlock, которая возвращает нам следующий блок, а также функцию addBlock, которая продолжает цепочку. При этом нам потребовалось изменить хеш в соответствии с новыми блоками. На самом деле вам придется пройти множество проверок, прежде чем вы сможете создать еще один блок, но для этих целей это было упрощено.

Наконец, я установил переменную с названием «valkyrieCoin» (очень оригинальную, я знаю), чтобы соответствовать новому классу Blockchain, и создал два новых блока, которые возвращали серию блоков после того, как я запустил программу. Он содержит цепочку свойств, которая содержит хеши, ссылающиеся на предыдущие блоки. Но есть проблема, вы не можете проверить целостность цепочки вот так. Вот почему мы затем создаем функцию проверки цепочки, которая действительно может проверять, является ли блок правильным или нет.

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

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

Первое, что нам нужно сделать, это настроить функцию «mineBlock» с заданной сложностью. Этот сегмент содержится в подстроке «цикла while». Сложность устанавливает хэш так, чтобы впереди было добавлено определенное количество нулей. Компьютер, пытающийся добыть блок, должен пройти этот дополнительный уровень безопасности, что значительно замедлит этот процесс на вашем обычном ноутбуке или ПК. Как только это установлено, вы создаете одноразовое значение, которое может завершить цикл. Сделав еще несколько настроек, мы можем протестировать код.

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

Поощрение монетами

Тогда у нас возникает извечный вопрос: зачем людям вообще добывать блоки? Ну, конечно же, цифровая валюта! Но на данный момент у нас нет никакого набора. Итак, следующим шагом было ввести виртуальные монеты и транзакции в код.

Я немного изменил код, чтобы он содержал транзакции в нашем классе Block, а также создал полностью отдельный класс для транзакций. Этот класс содержит «на адрес», «от адреса» и сумму, которая переводится. Затем мы создаем пространство «ожидающих транзакций», где криптовалюта может жить до тех пор, пока блок не будет добыт (что-то вроде хранения средств на отдельной учетной записи).

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

Подписание транзакций

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

Я немного очистил код, разместив их на разных страницах, и теперь мы готовы к финишу!

Мне нужно было импортировать «эллиптическую» библиотеку с методами проверки подписей и создания защищенных транзакций (в частности, secp256k1) с открытым и закрытым ключами в виде «шестнадцатеричных» строк. Сохранив их на другой странице, я мог разработать код «calculateHash», который будет подписываться при каждом прогоне. Перед подписанием транзакции я создал данные подписи, которые соответствуют определенным хешам, и работал в еще одной системе проверки, чтобы проверить, выполнены ли условия.

Чтобы запустить код, я скопировал закрытый ключ в функцию const, чтобы получить содержимое этого кошелька, а затем назначил транзакцию из 10 монет на случайный адрес (в идеале, другому человеку, которому вы пытаетесь отправить монеты). Как видите, баланс равен 90. Это связано с тем, что у нас было вознаграждение за майнинг в размере 100 от блока, и мы перевели 10 из этих монет на другой адрес.

Уф, это была ОГРОМНАЯ свалка для вас. Не расстраивайтесь, если вы не все поняли, мне потребовалось немало времени, чтобы осмыслить различные функции и то, почему мой код не работает в пятидесятый раз. В общем, было очень приятно видеть, что на экране моего компьютера всплывают последние 90.

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

Если у вас есть какие-либо вопросы или проблемы, напишите мне по адресу [email protected].