본문 바로가기
블록체인

[블록체인] 블록체인에서 말하는 트랜잭션 이란 무엇인가? -(1) 코인 베이스 트랜잭션

by hayz 2022. 12. 30.

우리는 블록체인에  대해서 비트코인을 통해 가깝게 접하고 있습니다. 이런 비트코인에 대한 이야기를 들어보면

비트코인은 블록체인이라 거래를 불변의 데이터(블록)로 저장한다고 하고, 또 이러한 데이터를 주고 받을 수 있다고 하고, 사람들끼리 거래를 하고

또, 비트코인을 채굴하면 비트코인을 보상으로 받을 수 있다고 합니다. 이런 얘기들이 도대체 무슨 얘기일까요?

 

위 이야기를 이해하려면 블록체인의 "트랜잭션" 개념을 알아야 합니다. 이번 글에서는 블록체인의 트랜잭션에 대해서 학습한 내용을 정리해 보려 합니다. 이 글을 읽고 나면, 적어도 비트코인의 거래 방식에 대해서 조금이라도 이해할 수 있기를 바랍니다. 

 

출처: https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.wealthandfinance-news.com%2Fwhy-are-crypto-transaction-speeds-so-important%2F&psig=AOvVaw1hQBay15OskUVmqemMOu3o&ust=1672471180050000&source=images&cd=vfe&ved=0CBAQjRxqFwoTCLC9lOfmoPwCFQAAAAAdAAAAABAD


트랜잭션(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 필드에는 txInstxOuts 필드가 포함되는데, 이들이 각각 입력값과 출력값을 나타냅니다. 

이 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
                 }
           }
      }
}

 

 

 

참고

노마드코더의 노마드코인 Git

노마드코더 블록체인 강의 youtube

 

댓글