Создайте блокчейн на Голанге с нуля

В этой статье мы сосредоточимся на разработке блокчейна Go с нуля. Однако, прежде чем мы начнем, вы должны быть уверены, что знакомы с основными понятиями Golang. Если нет, то будет разумно, если вы пройдете предварительные концепции, а затем вернетесь к блокчейну. 

Итак, приступим непосредственно к теме. 

Начиная с нового каталога 

Для начала создадим новый каталог. Предположим, что этот каталог имеет название «блокчейн». Мы будем вводить код в командной строке (или, если вы используете macOS или Linux, вы должны использовать терминал). Таким образом, мы набираем:

компакт-диск go-workspace 

мкдир блокчейн 

компакт-диск блокчейн 

код

Когда откроется VS Code, мы создадим модуль Go в командной строке. Как мы это делаем? Что ж, набираем:

идите мод инициализировать github.com/golang-company/blockchain

Программирование в main.go 

Затем мы создадим исходный файл Go с именем «main.go» и введем в него код. Но сначала давайте разберемся, что такое блокчейн. А блокчейн может быть определена как общедоступная база данных, которая децентрализована и распределена между несколькими одноранговыми узлами. Блокчейн позволяет базе данных самокорректироваться, даже если узел выдает неточные данные. 

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

 Итак, вы готовы к Перейти к разработке блокчейна? Большой! Давайте начнем. 

Часть программирования 

В этом разделе мы рассмотрим файл main.go. 

основной пакет

Импортировать (

"байты"

«крипто/sha256» 

«ФМТ» 

)

введите структуру криптоблока {

Хэш [] байт 

Данные [] байт 

PrevHash [] байт 

}

  • Как видите, структура только создана. 

func (c *Криптоблок) BuildHash() {

детали := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

хэш: = sha256.Sum256 (подробности)

c.Hash = хэш[ : ]

}

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

детали := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

Здесь мы берем двумерный срез байтов, мы передаем c.Data и предыдущий хэш. Затем мы объединим пустой кусок байтов. 

  • После этого мы создаем фактический хеш, используя хэш-функцию sum256 для деталей. Мы можем использовать это, так как мы будем импортировать библиотеку sha256. 
  • Далее мы вставляем созданный хэш в поле Hash для блока. 

func BuildBlock (строка данных, prevHash [] byte) *Cryptoblock {

block := &Cryptoblock{[]byte{}, []byte(data), prevHash}

блок.BuildHash()

блок возврата

  • Теперь мы создадим функцию, которая позволяет создавать Block. Функция принимает на вход строку данных, prevHash из предыдущего блока на вход, а затем выводит ссылку на Cryptoblock. Мы будем строить блок с помощью конструктора блоков. 
  • &Cryptoblock действует как ссылка на блок. Для поля Hash мы включаем пустой фрагмент байтов. Для поля данных мы берем строку данных и преобразуем ее в срез байтов. И мы включаем prevHash в поле PrevHash. 
  • Наконец, мы вызываем BuildHash() для блока и возвращаем блок. 

введите структуру BlockChain {

блоки []*Криптоблок

}

  • Требуется тип, который поможет выразить блокчейн. И мы реализовали структуру для достижения этой цели. Структура типа BlockChain состоит из массива указателей на Cryptoblock.

func (цепочка *BlockChain) AddBlock(строка данных) {

prevBlock := chain.blocks[len(chain.blocks)-1]

новый := BuildBlock(данные, prevBlock.Hash)

chain.blocks = добавить (chain.blocks, новый)

}

  • Здесь мы создаем метод, позволяющий присоединять блок к цепочке. Метод извлекает указатель блокчейна. После этого он принимает строку данных. 
  • Вызывая chain.blocks, мы попадаем на предыдущий блок в блокчейне. Далее мы передали длину блокчейна [len(chain.blocks)-1].
  • В новой переменной мы вызываем функцию BuildBlock и передаем строку данных и prevBlock.Hash.
  • Используя функцию добавления, добавив ее в chain.blocks, мы затем присоединяем новый блок к цепочке блоков.

func Inception() *Криптоблок {

вернуть BuildBlock («Начало», [] байт {})

}

  • Следующим шагом является создание функции Inception, которая будет описывать первый блок блокчейна. И мы вернем в функцию новый BuildBlock вместе с данными в первом блоке. Здесь. Я включил «Начало» и часть байтов, которая представляет собой пустой предыдущий хэш. 

функция InitBlockChain() *BlockChain {

return &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Чтобы создать первую цепочку блоков, я представил функцию InitBlockChain. Здесь я просто возвращаю конкретную ссылку на BlockChain. Далее мы строим массив криптоблоков, где делаем вызов функции Inception. 

func main () {

цепочка := InitBlockChain()

chain.AddBlock("Первый блок после создания")

chain.AddBlock("Второй блок после начала")

chain.AddBlock("Третий блок после начала")

для _, блок := диапазон chain.blocks {

fmt.Printf("Предыдущий хеш: %x\n", block.PrevHash)

fmt.Printf("Данные в блоке: %s\n", block.Data)

fmt.Printf("Хеш: %x\n", block.Hash)

}

}

  • Наконец, мы подошли к основной функции. Как видите, мы вызвали InitBlockChain() и присвоили его переменной цепочки. 
  • Далее мы добавляем блоки в цепочку через chain.AddBlock, и передаем необходимые данные. 
  • После этого мы запускаем цикл for для проверки блокчейна. Затем мы выделяем каждый блок и печатаем поля внутри каждого блока. Мы просто набираем:

fmt.Printf("Предыдущий хеш: %x\n", block.PrevHash)

fmt.Printf("Данные в блоке: %s\n", block.Data)

fmt.Printf("Хеш: %x\n", block.Hash)

Вывод: 

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

Ваша криптовалюта заслуживает наилучшей защиты. Получить Аппаратный кошелек Ledger всего за 79 долларов!

Источник: https://coinfomania.com/build-a-blockchain-in-golang/