#4 Transaction Basic

기초적인 Transaction

비트코인의 가장 중요한 기능 Transaction을 구현할 것 입니다. 이 파트에서 구현하는 트랜잭션은 완벽한 트랜잭션은 아니고 기본 동작을 구현한 것입니다. 나머지 파트를 진행하면서 점차 완성되어 갈 것입니다.

배경지

이제 우리는 블록에 저장될 "거래"(트랜잭션)를 구현할 것입니다. 기존 구현에서의 Block.Data가 트랜잭션의 모음으로 대체될 것 입니다.

하기 내용은 TransactionUTXO의 개념없이 이해하기 힘들 수 있습니다. 단어를 클릭하여 해당 키워드를 습득하고 돌아오시는 걸 추천드립니다.

Coinbase Transaction

블록이 채굴될 때, 채굴자에게 보상으로 코인을 주는 트랜잭션을 Coinbase 트랜잭션이라고 합니다. 모든 블록의 첫번째 트랜잭션은 Coinbase 트랜잭션 입니다.

https://www.blockchain.com/explorer 에서 아무 블록이나 눌러서 트랜잭션을 확인해봅시다.

COINBASE 트랜잭션

이 튜토리얼에서 구현할 coinbase 트랜잭션은 아래와 같은 구조입니다. 하나의 TxInput과 채굴자에게 주어지는 하나의 TxOutput(TXO)으로 구성되어 있습니다.

구현할 Coinbase 트랜잭션

Coin이 생성되는 Coinbase 트랜잭션이기 때문에 TxInput이 TXO를 참조하고 있지않습니다. (TxInput은 사용할 UTXO를 가르키는 일을 합니다.) TxOutput에는 채굴자의 PubKey (아직은 암호화를 거치지 않고 단순 문자열로 사용)와 주어지는 코인의 양이 기록됩니다.

위의 Coinbase 트랜잭션만 발생한 상황에서 jy에게 주어진 100코인짜리 TXO는 아직 소모되지 않았기 때문에 이를 Unspent(사용되지않은) TXO라고 하여 UTXO라고 부릅니다.

jy가 받은 100 coin 중 30 coin을 ht에게 보내는 새로운 트랜잭션을 만듭니다.

jy->ht 트랜잭션

TxInput은 TXO를 가르키는 구조체입니다. 어떤 {ID}를 가진 트랜잭션의 {Out}번 째 TXO를 사용할 지를 표시합니다. 해당 TXO가 자신의 TXO임을 증명하는 {Sig}도 포함시킵니다.

TxInput이 가르키는 TXO는 100 Coin 짜리 입니다. 30 coin, 70 coin 짜리 TXO로 나누어져 30은 ht에게 보내지고 70은 다시 jy에게로 반환됩니다.

이제 코딩을 시작해봅시다.

blockchain/transaction.go

blockchain/transaction.go 파일을 열어서 아래 내용을 붙혀넣습니다. 사실 따라서 타이핑해보는 것이 좋습니다.

blockchain/block.go

블록에 데이터 대신 트랜잭션을 저장합니다. 크게 바뀌는 것은 없습니다.

blockchain/blockchain.go

우리의 블록체인은 이제 거래 내역을 저장하는 의미있는 블록체인이 되었습니다. 이제 블록체인은 과거의 거래 내역을 토대로 계좌의 잔고를 계산하거나 새로운 거래를 만드는 일을 수행해야합니다.

findUnspentTransaction함수부터는 직접 타이핑하면서 이해하시길 권장합니다.

main.go

마지막으로 Cli 프로그램을 수정하도록 하겠습니다. 만들어진 함수를 사용하는 단계이고 크게 어려울 것은 없을 것 같아서 주석은 거의 생략하였습니다.

Let's Run

블록체인을 새로 생성합니다. 기존의 tmp/blocks의 모든 파일을 삭제하세요.

createblockchain

chain을 프린트해봅니다.

printchain

잔고를 확인하세요. 현재 코드에서는 Genesis block을 채굴하면 100을 받게되어있습니다.

getbalance

Alice가 채굴한 100중 50을 Bob에게 보냅니다.

send

Bob의 잔고를 확인해보세요.

Bob's balance

Last update: 2021/04/28

Last updated

Was this helpful?