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?