우리는 블록체인에 대해서 비트코인을 통해 가깝게 접하고 있습니다. 이런 비트코인에 대한 이야기를 들어보면
비트코인은 블록체인이라 거래를 불변의 데이터(블록)로 저장한다고 하고, 또 이러한 데이터를 주고 받을 수 있다고 하고, 사람들끼리 거래를 하고
또, 비트코인을 채굴하면 비트코인을 보상으로 받을 수 있다고 합니다. 이런 얘기들이 도대체 무슨 얘기일까요?
위 이야기를 이해하려면 블록체인의 "트랜잭션" 개념을 알아야 합니다. 이번 글에서는 블록체인의 트랜잭션에 대해서 학습한 내용을 정리해 보려 합니다. 이 글을 읽고 나면, 적어도 비트코인의 거래 방식에 대해서 조금이라도 이해할 수 있기를 바랍니다.
트랜잭션(Transaction) 이란?
한 트랜잭션은, 한 거래라고 표현을 할 수도 있습니다. 이해하기 쉽게, 거래 라는 용어로 얘기를 하자면
하나의 거래에는 입력값이 있고 출력값이 있습니다. 여기서 말하는 입력값과 출력값은 아래와 같습니다.
입력값은 거래를 실행하기 전에 "내가" 주머니에 있는 돈
출력값은 거래 후 각 "사람들이" 가지고 있는 돈
예를 들어보겠습니다.
Input: $5(me) // 내가 가지고 있는 5달러를 입력값으로 설정하여 거래를 하면
output: $5(you), $0(me) // 결과로 상대방은 5달러가 되었고, 나는 0 달러가 됨
Input: $10(me) // 10 달러를 주고, 5달러를 돌려 받는 경우
output: $5(you), $5(me)
즉, 코인에서 내가 얼마가가지고 있는 지를 확인하는 것은 거래의 출력 값을 보면 알수 있습니다.
시작 입력값이 어떻게 되었든, 출력값에서의 결과가 실제 내가 가지고 있는 코인의 수 이기 때문입니다.
그럼 이 입력값은 누가 입력하는 걸까?
입력값을 임의로 만들어내서 나에게 계속 주는 방식으로 만들수는 없는건가? 이 입력값은 어디서 오는거지? 하는 생각이 드실수도 있습니다. 이제 천천히 이 트랜잭션, 즉 거래의 입력값을 어떻게 만들어내는지에 대해서 살펴보도록 하겠습니다.
첫번째로 입력값을 만들어내는 여러 방법들이 있는데, 이번 본문에서는 "코인베이스" 에 대해서 얘기해보도록 하겠습니다.
코인베이스 트랜잭션
코인베이스는 간단히 말해, 입력값은 블록체인에 의해 생성되고, 출력값는 채굴자에게 주어지는 형식입니다.
"사람들은 코인을 채굴해서 보상을 받았다." 이런 얘기들을 하는데, 이 의미가 바로 코인베이스 트랜잭션을 통해 거래가 이루어졌다는 의미입니다. 즉, 입력값과 출력값으로 표기하게 되면 아래와 같이 표기될 수 있습니다.
Input: $10(blockchain)
output: $10(miner)
조금 더 구체적으로보면, 블록체인은 말 그대로 여러 블록들이 연결되어 있는 구조를 가지고 있습니다. 그리고 하나의 블록에는 거래 내역들, 즉 트랜잭션 내역들이 보이게 되는데, 그 블록의 간단한 형태를 보면 다음과 같습니다.
하나의 블럭에는 hash, height, difficulty 같은 필드들이 포함되는데 우선 무시하고, transactions 필드만 확인해보겠습니다.
transactions 필드에는 txIns 와 txOuts 필드가 포함되는데, 이들이 각각 입력값과 출력값을 나타냅니다.
이 transactions 필드에서 확인할 수 있는 것은 blockchain 이라고 하는 소유주가 miner 에게 10 만큼의 코인을 전달 했다 라는 것입니다. 결과적으로 출력값을 확인해보면 miner에게 10이 들어있는 걸 확인할 수 있습니다.
[
{
"hash": "005ad6bed87ef0096ad2d175fa1daeb19f4dcc776e1b13b14df85abd67379a78",
"height": 1,
"difficulty": 2,
"nonce": 0,
"timestamp": 1672387091,
"transactions": [ /* here */
{
"id": "9d9a882c84ec62d024c883bf41e44732f848b8635b76491f24df7d635daa14a2",
"timestamp": 1672387091,
"txIns": [ /* 입력값 */
{
"owner": "blockchain",
"amount": 10
}
],
"txOuts": [ /* 출력값 */
{
"owner": "miner",
"amount": 10
}
]
}
]
}
]
하지만, 단순히 입력값으로 blockchain이 10 을 건내는 값을 입력한다고 하면, blockchain 은 무한히 누군가에게 줄 수 있는 걸까요?
바로 이 과정에서 해당 입력값에 들어온 "owner" 가 거래하길 원하는 "amount" 만큼 소유하고 있는지를 확인하는 과정이 필요합니다.
이렇게 특정 소유주가 가지고 있는 잔액을 balance 라고 하고, 이 balance 를 찾아내는 방식은, 모든 트랜잭션들의 출력값을 확인하여 해당 소유주가 포함된 amout 의 합으로 확인할 수 있습니다. 즉, 위 코드에서는 miner가 10의 잔고를 가진 것으로 확인할 수 있고, 만약 위와 동일한 형태의 블록이 또 생성된다면, miner는 20의 잔고를 가진 것으로 확인할 수 있습니다.
즉.. 코드로 표현한다면 아래처럼 block을 순회하고, 각 block에 있는 트랜잭션들을 순회하고, 그리고 그 트랜잭션에 있는 출력값들을 순회하는 방식으로 내가 총 가지고 있는 잔액에 대해서 확인할 수 있습니다.
balance = 0
for block in blocks {
for tx in block.transaction {
for txOut in tx.txOuts {
if txOut.owner == "me" {
balance += txOut.amout
}
}
}
}
참고
'블록체인' 카테고리의 다른 글
[블록체인] 합의 알고리즘 이란? (0) | 2023.02.12 |
---|---|
[블록체인] 비트코인은 왜 암호화폐로 불릴까? (0) | 2023.02.05 |
[블록체인] 블록체인에서 말하는 트랜잭션 이란 무엇인가? - (3) UTXO (0) | 2023.01.24 |
[블록체인] 블록체인에서 말하는 트랜잭션 이란 무엇인가? -(2) 사용자간 트랜잭션 (0) | 2023.01.15 |
[블록체인] 간단하게 보는 mempool 이란? (2) | 2022.12.31 |
댓글