3. BadgerDB

Add command line interface and create a layer of persistence for our blockchain.

지금까지는 블록체인을 메모리 안에서만 생성했기 때문에 프로그램을 종료하면 없어졌다. 이번 강좌에서는 DB를 이용해서 블록체인을 저장하고 사용하도록 해보자.

Badger DB

  • Key, Value 형태로 값을 저장하는 DB

  • []byte 형태 저장한다. (저장하기 위해 형변환이 필요)

  • badger.Txn

    • transaction을 말한다.

    • DB에 일어나는 일련의 동작 묶음이다.

    • txn.Set() 을 통해 값을 넣거나 바꾼다.

    • txn.Get() 을 통해 value 값을 받아온다. (Argument로 키값을 넣는다.)

아래 디비 구조 그림 Reference

디비 구조

blockchain.go

  • BadgerDB를 생성하여 디비 포인터와 마지막 해쉬값을 blockchain struct에 저장한다.

  • 블록의 생성 및 추가를 디비와 연계했다.

  • 이터레이터를 추가하여 블록체인 구조를 순회할 수 있도록 했다.

block.go

  • BadgerDB에 값을 넣기 위해서 []byte 타입으로 바꿔주어야 하기 때문에 Serialize, Deserialize 유틸 함수를 추가했다.

main.go

  • CommandLine 으로 블록의 추가와 블록체인 전체 출력을 하도록 했다.

proof.go

  • 기존 코드의 경우 데이터를 생성할 때 Difficulty를 사용하지만 Validate에서는 Difficulty를 상요하지 않아서 Difficulty를 변경하며 블록을 생성했을 경우 Difficulty 값이 다르게 생성된 블록의 경우 false를 반환했다.

  • 블록 내부에 Difficulty를 저장하고 Validate에 해당 블록의 Difficulty를 반영하여 Difficulty를 수정해도 올바른 검증이 가능하도록 수정했다.

  • block.go 의 CreateBlock 함수에서 difficulty를 설정할 수 있도록 했다. 현재는 const값이지만 나중에는 블록체인의 상황에 따라 유동적으로 바뀌도록 할 수 있다.

  • Bitcoin 의 Difficulty 조절 방법

    • n의 블록이 생성된 후에 블록이 생성될때까지 걸린 시간을 체크한다.

    • 10초에 1개의 블록이 생성 되기를 원한다.

    • 그렇다면 n개의 블록은 10*n초의 시간이 걸려야 한다.

    • 이보다 오래 걸렸으면 difficulty를 낮추고 적게 걸렸으면 difficulty를 올린다.

    • difficulty를 너무 올려버리면 다음 체크때까지 시간이 너무 오래 걸릴 수 있으므로 어느정도 올릴 수 있는 제한이 있다.

Result

  • go run main.go print

    • BlockChain 전체 노드를 출력한다.

  • go run main.go add -block [data]

    • [data] 를 데이터로 가지는 노드를 추가한다.

Code

Last updated

Was this helpful?