[Go] Genesis block 만들기

0xDave·2022년 7월 17일

Go

목록 보기
6/10
post-thumbnail

golang에는 블록체인 관련 패키지가 있어서 매우 편리하게 블록체인 프로젝트를 만들 수 있다. 오늘 배운 sha256 패키지도 그 중 하나다.

📍 Hash 값 만들기


package main

import (
	"crypto/sha256"
	"fmt"
)

type block struct {
	data     string
	hash     string
	prevHash string
}

func main() {
	genesisBlock := block{"Genesisblock", "", ""}
	hash := sha256.Sum256([]byte(genesisBlock.data + genesisBlock.prevHash))
	fmt.Printf("%x", hash)

} // 출력값 eeee29277c549306886cce86697859cf37725a045341dca9208b80f04103bbb3
  • Hash값은 해당 블록의 데이터와 이전 블록의 Hash값을 더해서 만드는데, 이 더한 값을 sha256Sum256 함수에 넣어줘서 해시값을 만들 수 있다.

  • genesisBlock은 맨 처음 만드는 블록이기 때문에 data 외에 Hash값과 이전 Hash값이 없다.

  • Sum256 함수는 []byte 슬라이스를 인자로 받아서 위 코드처럼 string을 슬라이스로 바꿔줘야 한다.


🔗 Hash값 추가


func main() {
	genesisBlock := block{"Genesisblock", "", ""}
	hash := sha256.Sum256([]byte(genesisBlock.data + genesisBlock.prevHash))
	hexHash := fmt.Sprintf("%x", hash)
	genesisBlock.hash = hexHash
	fmt.Println(genesisBlock)
}

Sprintf를 통해 String 값으로 반환해서 GenesisBlock Hash값에 추가해주면 GenesisBlock 완성!

하지만 위 코드는 고쳐야 할 부분이 많다. 2번째 블록을 만들 때 일일이 입력 해야 해서 자동화해야 할 부분도 많다.


⛓ 대규모(?) 업그레이드


package main

import (
	"crypto/sha256"
	"fmt"
)

type block struct {
	data     string
	hash     string
	prevHash string
}

//block을 모아놓은 blockchain struct 추가
type blockchain struct {
	blocks []block
}

//이전 블록의 Hash값을 string으로 리턴
func (b *blockchain) getLastHash() string {
	if len(b.blocks) > 0 {
		return b.blocks[len(b.blocks)-1].hash
	}
	return ""
}

//새로운 Block 생성 후, 기존 blocks 배열에 추가
func (b *blockchain) addBlock(data string) {
	newBlock := block{data, "", b.getLastHash()}
	hash := sha256.Sum256([]byte(newBlock.data + newBlock.prevHash))
	newBlock.hash = fmt.Sprintf("%x", hash)
	b.blocks = append(b.blocks, newBlock)

}

//현재 모든 블록의 값들을 출력
func (b *blockchain) listBlocks() {
	for _, block := range b.blocks {
		fmt.Printf("Data : %s\n", block.data)
		fmt.Printf("Hash : %s\n", block.hash)
		fmt.Printf("PrevHash : %s\n", block.prevHash)
	}
}

func main() {
	chain := blockchain{}
	chain.addBlock("Genesisblock")
	chain.addBlock("Secondblock")
	chain.addBlock("Thirdblock")
	chain.listBlocks()
}

이전 코드에 비해 많은 것들이 추가됐다. 기존 블록들을 배열로 모아놓기 위해 blockchain struct가 만들어졌고, 일일이 블록 데이터를 입력해서 추가하기 보다 getLastHash()addBlock() 함수를 만들어 자동으로 추가할 수 있도록 했다.

profile
Just BUIDL :)

0개의 댓글