1. Blocks & Blockchain

간단한 블록과 블록체인을 만들어보자.

구현 내용

  • 블록과 블록들을 연결하는 블록체인 구조를 설계

  • 블록을 생성, 블록체인에 추가

Block

  • Hash, Data, PrevHash를 가지는 간단한 블록을 설계.

  • 이전 해쉬를 이용해 해쉬를 생성.

  • Data와 이전 해쉬값을 이용한 현재 해쉬값 생성 메소드 작성.

Blockchain

  • 블록들을 이어주는 블록 포인터 배열을 생성.

  • AddBlock 메소드 작성.

main.go

package main

import (
	"bytes"
	"crypto/sha256"
	"fmt"
)

// BlockChain structure
type BlockChain struct {
	blocks []*Block
}

// Block structure
type Block struct {
	Hash     []byte
	Data     []byte
	PrevHash []byte
}

// DeriveHash : Data와 PrevHash를 이용해서 Hash를 생성한다.
func (b *Block) DeriveHash() {
	info := bytes.Join([][]byte{b.Data, b.PrevHash}, []byte{})
	hash := sha256.Sum256(info)
	b.Hash = hash[:]
}

// CreateBlock : data와 prevHash를 받아서 새로운 Hash를 생성한 블록을 생성한다.
func CreateBlock(data string, prevHash []byte) *Block {
	block := &Block{[]byte{}, []byte(data), prevHash}
	block.DeriveHash()
	return block
}

// AddBlock : data의 값을 가지는 블록을 추가한다.
func (chain *BlockChain) AddBlock(data string) {
	prevBlock := chain.blocks[len(chain.blocks)-1]
	new := CreateBlock(data, prevBlock.Hash)
	chain.blocks = append(chain.blocks, new)
}

// Genesis : 체인의 맨 처음 블록이다. prevHash 값이 비어있다.
func Genesis() *Block {
	return CreateBlock("Genesis", []byte{})
}

// InitBlockChain : Genesis 블록을 시작으로 하는 블록체인을 생성한다.
func InitBlockChain() *BlockChain {
	return &BlockChain{[]*Block{Genesis()}}
}

func main() {
	chain := InitBlockChain()

	chain.AddBlock("First Block after Genesis")
	chain.AddBlock("Second Block after Genesis")
	chain.AddBlock("Third Block after Genesis")

	for _, block := range chain.blocks {
		fmt.Printf("Previous Hash: %x\n", block.PrevHash)
		fmt.Printf("Data in Block: %s\n", block.Data)
		fmt.Printf("Hash: %x\n", block.Hash)
		fmt.Println()
	}
}

Code

Reference

Last updated