상세 컨텐츠

본문 제목

[Nomad Coin] Blockchain - #4.5 Refactoring part Two

Go/Blockchain

by Gopythor 2022. 7. 16. 03:26

본문

728x90
반응형

#4.5 Refactoring part Two

  • function을 두개 만들어야 한다.
  • 한 개는 blockchain 내부에 있는 모든 block을 가져오는 function이고 다른 하나는 block을 blockchain에 append하는 function을 만들 것이다.
  • block을 blockchain에 추가하는 것이다.
b.blocks = append(b.blocks, createBlock("Genesis Block"))
  • 이 코드에서 append를 하는 부분은 이 부분뿐이다.
  • 이 blockchain을 초기화하면서 GenesisBlock을 blockchain에 append할 때 뿐이다.
  • 이 부분을 function으로 구현할 것이다.
  • 왜냐하면 이 부분을 밖에서 사용해야 한다.
  • 하지만 Genesis Block이 아니라 넘겨준 data로 생성을 할 것이다.
func (b *blockchain) AddBlock(data string){
	b.blocks = append(b.blocks, createBlock(data))
}
  • receiver funciton으로 구현할 것이다.
  • 이 function은 export 될 것이다. 대문자로 시작하면, export 된다는 뜻이다.
  • 여기서 block을 data와 함께 추가할 것이다.
  • string data를 받아온다.
  • 여기서 b.blocks는 block을 append 한 값이다 라고 구현을 해주는 것이다.
  • 이 block을 생성해 줄 것이다.
func GetBlockchain() *blockchain {
	if b == nil {
		once.Do(func() {
			b = &blockchain{}
			b.AddBlock("Genesis")
		})
	}
	return b
}
  • 여기서 b.AddBlock을 호출해주고 Genesis Block을 넘겨주면 된다.
  • AddBlock은 재활용이 가능하고 바깥에서도 사용 가능하다.
func main() {
	chain := blockchain.GetBlockchain()
	chain.AddBlock("Second Block")
	chain.AddBlock("Thrid Block")
	chain.AddBlock("Fourth Block")
}
  • 왜  두 번째냐면 이 blockchain이 초기화되는 부분을 제어해서 이제 Genesis Block을 처음부터 생성할 수 있게 되었다.
  • 누군가 blockchain의 instance를 언제든지 호출하려고 하면, 이미 Genesis Block이 안에 추가된 상태일 것이다.
  • 여기서 세 번째, 네 번째 block 또한 추가할 수 있다.
  • 그리고 이제 마지막 function을 구현할 시간이다.
  • 아마도 AllBlock이란 이름으로 구현할 것 같다.
type blockchain struct {
	Blocks []*block
}
  • 모든 block들을 보여주는 function을 만들 필요가 있을까?
  • 왜냐하면 block들을 공유하는 건 어렵지 않다.
  • blocks를 Blocks로 바꾸고 Blocks를 호출하는 것 만으로도 모든 block들을 볼 수 있다.
  • 이걸로 function을 만들 수는 있지만, 지금 당장은 별로 좋은 선택이 아니다.
  • 나중에 모든 block들을 보여주는 funciton을 만들 것이다.
  • 이 스트럭트는 그저 block들의 pointer들을 가지고 있는 slice에 불과하다.
  • 나중에 이걸 데이터베이스로 바꿀 것이다.
  • 나중엔 모든 block들을 가지고 오는 function을 만들 수 밖에 없다.
  • 하지만 일단 만들 것이다. 왜냐하면 singleton의 기본적인 철학이다.
  • 프로그램에 field를 드러내주는 funciton을 만드는 것이다.
func AllBlocks() []*block {
	return GetBlockchain().blocks
}
  • 여기에 AllBlocks같은 funciton을 만드는 것과 같다.
  • 그리고 이건 block pointer들의 slice를 반환할 것이다.
  • blockchain의 blocks를 반환해주는 것과 같다.
func (b *blockchain) AllBlocks() []*block {
	return b.blocks
}
  • 만약 GetBlockchain을 사용하기 싫다면 receiver functinon을 구현하면 된다.
  • blockchain에서 AllBlocks를 호출할 지, chain에서 AllBlocks를 호출하고 싶은지 말이다.
  • 어디에 붙이냐에 따라 호출하는 위치도 달라질 것이다.
  • 아니면 blocks를 Blocks로 바꿔주기만 하면 간단해진다.
func main() {
	chain := blockchain.GetBlockchain()
	chain.AddBlock("Second Block")
	chain.AddBlock("Thrid Block")
	chain.AddBlock("Fourth Block")
	chain.AllBlocks()
}
  • range를 잊지 말자.

  • data는 아직 공유가 되고 있지 않다.
type block struct {
	Data     string
	Hash     string
	PrevHash string
}
  • block struct로 와서 'D'ata, 대문자의 H의 'H'ash, 그리고 'P'revHash
  • 이것들을 export해야 한다.

  • 여기서 block.Data를 출력할 수 있다.
func main() {
	chain := blockchain.GetBlockchain()
	chain.AddBlock("Second Block")
	chain.AddBlock("Thrid Block")
	chain.AddBlock("Fourth Block")
	for _, block := range chain.AllBlocks() {
		fmt.Printf("Data : %s\n", block.Data)
		fmt.Printf("Hash : %s\n", block.Hash)
		fmt.Printf("PrevHash : %s\n", block.PrevHash)
	}

}
  • 처음 했던 거와 매우 비슷해 보이겠지만, 이 코드는 좀 더 정돈되어 있고, blockchain을 위한 package도 생성했고, main.go를 위한 package도 따로 있다.
  • 이 교육과정은 암호화폐나 blockchain만을 위한 과정이 아니다.
  • blockchain은 멈추고 새로운 걸 시작할 것이다.
  • 세가지를 구현할 것인데, 이 버전의 blockchain을 위한 HTML Explorer를 구현할거고, blockchain과 상호작용 가능한 JSON API도 구현할 거고, 그리고 마지막으로 blockchain과 상호작용 할 CLI(Command Line Interface)를 구현할 것이다.
  • main function을 깔끔하게 정리해놔야만 다른 많은 것들을 할 수있다.

 

Data : Genesis
Hash : 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5
PrevHash :
Data : Second Block
Hash : f41b519bca7a353b19581ebc9b23c1e4db2d92cfe25a7fb5c5df3768604df5e2
PrevHash : 81ddc8d248b2dccdd3fdd5e84f0cad62b08f2d10b57f9a831c13451e5c5c80a5
Data : Thrid Block
Hash : 13ddd629f599f0206445a1930d7ad6dd4605a33b7519475657145c1d8cef4863
PrevHash : f41b519bca7a353b19581ebc9b23c1e4db2d92cfe25a7fb5c5df3768604df5e2
Data : Fourth Block
Hash : 065956b3be69e0b04cd0e6a43c4b737d4f529121d97b1d189b13aa053aabe6b4
PrevHash : 13ddd629f599f0206445a1930d7ad6dd4605a33b7519475657145c1d8cef4863
  • blcok들을 생성했고, hash값도 가지고 있고, 이전 hash값도 기억한다.
  • Singleton 패턴에 대해서도 배웠다.
  • blockchain은 그러 Go를 사용하기 위한 도구이다.

출처 : 노마드코인, 노마드코더

728x90
반응형

관련글 더보기

댓글 영역