Вы удивитесь, насколько это просто.

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

Например, Walmart уже использует блокчейн для решения задач управления цепочкой поставок. Сочетание блокчейна с технологиями Интернета вещей (IoT) (такими как датчики температуры в реальном времени) позволило Walmart создать смарт-контракты для автоматического выставления счетов, деталей доставки и многого другого. Если когда-либо произошла ошибка при доставке или если в какой-то момент было обнаружено загрязнение пищевых продуктов, события можно мгновенно отследить через их блокчейн.

Внедрение решений blockchain и IoT резко сократило время обработки счетов Walmart с семи дней до молниеносных 2,2 секунд.

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

В конце концов, реализовать собственный блокчейн на самом деле не так сложно, как кажется. В этом руководстве мы реализуем базовый блокчейн с использованием одного из самых популярных языков программирования 2021 года - GoLang.

Строим!

Понимание блокчейна

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

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

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

Переходя к блоку 2, мы используем хэш блока генезиса для значения предыдущего хеша блока 2. Это действие связывает генезисный блок с блоком 2! Затем мы берем отметку времени, список транзакций и предыдущее значение хеш-функции в качестве входных данных для нашего алгоритма хеширования. Алгоритм выдаст нам новое значение хеш-функции для представления блока 2.

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

Создание простого блокчейна в Go

Первый шаг в создании нашей цепочки блоков - это определение того, что такое блок. Go упрощает нашу жизнь, создавая пользовательские типы, мы можем определить тип Block с помощью следующего кода. Здесь структура Block имеет четыре поля, соответствующие нашей диаграмме выше.

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

Функция NewHash() принимает в качестве входных параметров время, список транзакций и предыдущий хэш, при этом возвращает массив байтов для представления только что сгенерированного хеш-значения. В этой функции мы просто собираемся возьмите весь наш ввод и смешайте его в один массив байтов с именем input. Мы делаем это с помощью функции append(), чтобы добавить параметр time к prevHash путем преобразования time в string с суффиксом ..., чтобы добавить time срез к prevHash.

Затем мы перебираем transactions и добавляем каждый отдельный transaction в input большой двоичный объект данных. Забавный синтаксис string(rune(transaction))... - это всего лишь один из способов в Go преобразовать каждый элемент transactions в фрагмент, который можно добавить к input. Он печатает мусор, так что погрузитесь в него, если хотите.

Наконец, мы используем пакет crypto в Go для вызова sha256.Sum256() с input в качестве параметра. Это даст нам новое хеш-представление для всех вводимых данных. Мы возвращаем hash[:] с синтаксисом [:], который используется для нарезания hash до нужной длины после возврата. Приносим извинения за то, что замалчиваем детали, но мы здесь, чтобы построить блокчейн и не разбираться в методах ввода и нарезки в Go.

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

Милая! Теперь осталось только создавать новые транзакции, блоки и хеши. Мы можем сделать это в нашем основном методе. Мы определяем массив строк для записи транзакций в нашей цепочке блоков. Также обратите внимание, как мы передаем пустой массив байтов в NewBlock(), чтобы сгенерировать наш первый блок с именем genesisBlock.

Чтобы создать новые блоки, мы передаем хэш-значение предыдущего блока в NewBlock() вместе с соответствующей историей транзакций. Если вы хотите увидеть всю программу в одном месте, вот она:

Если бы мы запустили эту программу, мы бы получили следующий результат:

$ go run example.go 
--- First Block ---
        time: 2021-04-05 15:12:18.813294 -0600 MDT m=+0.000074939
        prevHash: 
        Hash: 43ec51c50d2b9565f221155a29d8b72307247b08eaf6731cca
        Transactions:
                0: "Izzy sent Will 50 bitcoin"
                1: "Will sent Izzy 30 bitcoin"
--- Second Block ---
        time: 2021-04-05 15:12:18.813477 -0600 MDT m=+0.000257244
        prevHash: 43ec51c50d2b9565f221155a29d8b72307247b08eaf6731cca
        Hash: fcce5323a35cb67b45fe75866582db00fd32baeb92aac448c7
        Transactions:
                0: "John sent Izzy 30 bitcoin"
--- Third Block ---
        time: 2021-04-05 15:12:18.813488 -0600 MDT m=+0.000269168
        prevHash: fcce5323a35cb67b45fe75866582db00fd32baeb92aac448c7
        Hash: fc1d3eee286970d85812b47c3a5bf016ae8c1de4f86b8ace972ffa
        Transactions:
                0: "Will sent Izzy 45 bitcoin"
                1: "Izzy sent Will 10 bitcoin"

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

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

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

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