Створіть блокчейн у Golang з нуля

У цій статті ми зосередимося на розробці блокчейну Go з нуля. Однак перш ніж ми розпочнемо, ви повинні переконатися, що ви знайомі з основними поняттями в Golang. Якщо ні, тоді було б розумно, якщо ви ознайомитеся з попередніми концепціями, а потім повернетеся до блокчейну. 

Отже, перейдемо безпосередньо до теми. 

Починаючи з нового каталогу 

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

cd go-workspace 

блокчейн mkdir 

блокчейн cd 

код .

Коли відкриється код VS, ми створимо модуль Go у командному рядку. Як ми це робимо? Ну, набираємо:

go mod init github.com/golang-company/blockchain

Кодування в main.go 

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

Зазвичай блок у блокчейні складається з даних, якими ми ділимося в базі даних, хешу та криптографічного хешу попереднього блоку. 

 Отже, ви готові до Перейти до розробки блокчейну? Чудово! Давайте розпочнемо. 

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

У цьому розділі ми розглянемо файл main.go. 

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

імпорт (

"байти"

“crypto/sha256” 

"Fmt" 

)

type Cryptoblock struct {

Хеш [] байт 

Дані [] байт 

PrevHash [] байт 

}

  • Як бачите, структуру тільки створено. 

func (c *Cryptoblock) BuildHash() {

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

хеш := sha256.Sum256(подробиці)

c.Hash = хеш[ : ]

}

  • Тепер ми створимо метод, який дозволить нам генерувати хеш залежно від даних і попереднього хешу. Ми імпортуємо бібліотеку «bytes», тому що ми її використовуватимемо.
  • Наступним кроком є ​​створення змінної під назвою details і використання типу даних bytes. Ми будемо використовувати Join(), щоб з’єднати фрагменти байтів.

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

Тут ми беремо двовимірний зріз байтів, передаємо c.Data та попередній хеш. Потім ми об’єднаємо порожній фрагмент байтів. 

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

func BuildBlock (рядок даних, prevHash [] байт) *Cryptoblock {

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

block.BuildHash()

блок повернення

  • Тепер ми побудуємо функцію, яка дозволить створити блок. Функція приймає рядок даних як вхідні дані, prevHash із попереднього блоку як вхідні дані, а потім виводить посилання на Cryptoblock. Ми будемо будувати блок за допомогою конструктора блоків. 
  • &Криптоблок діє як посилання на блок. Для поля Хеш ми включаємо порожній фрагмент байтів. Для поля даних ми беремо рядок даних і перетворюємо його на фрагмент байтів. І ми включаємо prevHash у поле PrevHash. 
  • Нарешті, ми викликаємо BuildHash() для блоку та повертаємо блок. 

type BlockChain struct {

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

}

  • Потрібен тип, який допоможе відобразити блокчейн. І ми реалізували структуру для досягнення цього. Структура типу BlockChain складається з масиву покажчиків на Cryptoblock.

func (ланцюг *BlockChain) AddBlock(рядок даних) {

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

new := BuildBlock(data, prevBlock.Hash)

chain.blocks = append(chain.blocks, новий)

}

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

func Inception() *Cryptoblock {

return BuildBlock(“Початок”, []byte{})

}

  • Наступним кроком є ​​створення функції під назвою Inception, яка описуватиме перший блок блокчейну. І ми повернемо новий BuildBlock у функції разом із даними в першому блоці. тут Я включив «Початок» і фрагмент байтів, який представляє порожній попередній хеш. 

func InitBlockChain() *BlockChain {

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

}

  • Щоб створити перший блокчейн, я ввів функцію InitBlockChain. Тут я просто повертаю конкретне посилання на BlockChain. Далі ми будуємо масив Cryptoblock, де виконуємо виклик функції Inception. 

func main() {

ланцюг := InitBlockChain()

chain.AddBlock(“Перший блок після створення”)

chain.AddBlock(“Другий блок після створення”)

chain.AddBlock(«Третій блок після створення»)

for _, block := range 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/