В этой статье мы сосредоточимся на разработке блокчейна 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/