
golang에는 블록체인 관련 패키지가 있어서 매우 편리하게 블록체인 프로젝트를 만들 수 있다. 오늘 배운 sha256 패키지도 그 중 하나다.
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값을 더해서 만드는데, 이 더한 값을 sha256의 Sum256 함수에 넣어줘서 해시값을 만들 수 있다.
genesisBlock은 맨 처음 만드는 블록이기 때문에 data 외에 Hash값과 이전 Hash값이 없다.
Sum256 함수는 []byte 슬라이스를 인자로 받아서 위 코드처럼 string을 슬라이스로 바꿔줘야 한다.
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() 함수를 만들어 자동으로 추가할 수 있도록 했다.