У цій статті ми зосередимося на розробці блокчейну 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/