#7 UTXO management

UTXO들을 효율적으로 관리하기

UTXO들을 데이터베이스에 따로 저장해서 데이터베이스 전체를 탐색하지 않고 UTXO를 접근할 수 있도록 할 것입니다.

구현할 것

이전 파트까지 구현을 했다면, 뭔가 많이 비효율적이라는 생각이 들었을 것 입니다. Balance를 확인하거나 send 트랜잭션을 발생시킬 때마다 전체 블록을 찾아가면서 UTXO를 찾아야했습니다. 지금이야 블록체인이 아주 작기 때문에 괜찮지만 체인의 길이가 길어진다면 문제가 될 것입니다.

예를 들어, FindSpendableOutputs 함수나 FindUTXO함수가 이에 해당합니다.

이번 파트에서는 UTXO를 따로 저장하여 관리하는 방법으로 이를 최적화할 것입니다.

"utxo-"라는 prefix를 블록 해시에 붙힌 값을 key로 하여 UTXO들만 따로 저장합니다.

Update UTXOSet

blockchain/tx.go

TxOutput struct의 집합인 TxOutputs 구조를 만들고, 이에 대한 Serialize, Deserialize 함수를 만든다.

blockchain/utxo.go

UTXO들을 관리하기 위한 코드들을 따로 정리하기 위해 utxo.go 파일을 만듭니다. BlockChain의 Database를 공유하고 "utxo-" prefix를 key앞에 붙혀서 UTXO들만 따로 관리합니다.

blockchain/blockchain.go

FindUTXO 함수와 AddBlock 함수를 수정합니다.

blockchain/transaction.go

NewTransaction함수의 인자를 UTXOSet으로 바꾸고 이에 따라 코드도 약간 수정합니다.

cli/cli.go

Cli 프로그램에 새로운 명령어 1개를 추가합니다. 커맨드 추가는 printchain과 같으므로 생략하겠습니다.

UTXOSet을 이용하도록 하기 3개 함수를 수정합니다.

Testing

Optimizing이기 때문에 새로 테스트 해 볼 것은 없습니다. 이전 테스트처럼 wallet을 생성하고 send를 호출한 후 getbalance나 printchain으로 정상 동작하는 지 살펴보세요.

혹시 getbalance가 제대로 동작하지 않는다면 reindexutxo 커맨드를 실행해보세요.

Last updated: May 2, 2021

Last updated

Was this helpful?