Leo's Garage

Mastering Bitcoin 2nd - Programming The Open BlockChain Ch.6-1 본문

BlockChain/Mastering Bitcoin

Mastering Bitcoin 2nd - Programming The Open BlockChain Ch.6-1

LeoBehindK 2020. 1. 15. 22:27
728x90
반응형

 Chapter 6. Transactions에 대해 요약해보도록 하겠다.

Transactions are the most important part of the bitcoin system. Everything else in bitcoin is designbed to ensure that transactions can be created, propagated on the network, validated, and finally added to the global ledger of transactions (the blockchain).

 6장의 가장 첫 문장이다. 비트코인은 거래를  생성, 전파, 검증, 기록을 하기 위해 만들어졌다.

이렇게 강조할 만큼, 비트코인 시스템에서 거래는 중요한 기능이면서 동시에 효율적이고 안정적으로 동작할 수 있어야 한다. 

이번 장에서는 다양한 형태의  Transaction을 시험해보고, 이들이 어떤 데이터를 포함하고 있는지, 어떻게 검증하는지 그리고 어떻게 영원히 기록되는지 살펴 볼 것이다.

 

위의 그림은  일반적인  block explorer이다. 아주 깔끔하게 특정 거래에 대한 내용을 보여준다. 하지만 사실 비트코인 네트워크에서는 위와 같이 친절하게 각 항목을 정리해서 보여주지 않는다. 위와 같이 깔끔한 화면 뒤에는 아래와 같은 내용들이 숨어있다.

 

{
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.01500000,
      "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": 0.08450000,
      "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }
  ]
}

위의  JSON으로 나온 결과 값들은 실제로 Bitcoin Core CLI를 통해 "raw" transaction을 호출했을 때 나오는 형태이다.

아마 보면 알겠지만 여기에는 보낸 사람의 주소나 받는 사람의 주소 그리고 실제로 전송된 0.1BTC에 대한 언급 등이 전혀 나타나 있지 않다. 실제로 이러한 결과값을 처음 보게되면 이상한 값 투성이로 보이게 될 것이다. 하지만 실제로 모든 내용은 이 JSON 내의 Hex Data에 담겨 있다!

앞으로 하나씩 알아보도록 하자

 

다음으로 넘어가기 전에 한 가지 알아야 할 개념이 있다.

바로 UTXO (Unspend transaction outputs) 이다. 이 말은 사용하지 않은 거래 결과라는 의미이며 비트코인은 모든 사용 가능하며 소비 가능한 이 출력을 추적한다. 이 말이 조금 이상하게 들릴 수도 있다. 천천히 설명해보겠다.

일반적으로 비트코인은 거래 시, 보내는 사람과 받는 사람 사이에서 실제 비트코인이 전송되는 개념이 아니다. 우리가 흔히 지갑이라고 말하는 매개체가 보내는 사람의 소유의  비트코인의 잔돈들을 모아 그 소유권을 받는 사람에게 이전하는 개념이다. 예를 들어 전세계에 흩어져 있는 비트코인 중 내 소유의 비트코인이 1비트, 0.5비트 0.3비트가 있고 이 중 0.8 비트를 누군가에게 보내야 한다면 지갑을 통해서 0.5비트와 0.3비트의 소유권을 받는 사람으로 이전하며, 이전 시에  0.5 비트와 0.3 비트의  상태 변경(State Transition)이 일어나며 총 0.8비트가 수신자의 소유가 된다.

이 때, 실제 비트가 건네지는 것은 아니며 UTXO형태로 Transaction에 남게 되며 Block에 기록된 이후에 Block을 추적하면 수신자의 소유의 비트가 있음을 확인할 수 있다.

조금 헷갈릴 수 있는데 비트코인은 달러 같은 개념으로 받아들이면 된다. 우리가 1달러를 가지고 50센트짜리 아이스크림을 사먹으면 50센트는 가게 주인에게 주고 우리는 50센트를 받는다. 이처럼 비트코인은 거래 시에 쪼개지며, 쪼개진 상태로 소유권이 이전된다. 실제 거래 시에 지갑 어플리케이션은 수천 수백개의 Transaction에서 내 소유의 UTXO를 찾아내어 거래에 활용하며, 대부분의 지갑 어플리케이션에서는 이러한 UTXO를 별도의 DB로 관리하여 좀 더 빠르게 처리하려고 노력한다.

따라서 대부분의 거래는 UTXO의  Input / Output 관계를 가진다고 볼 수 있다. 단, 한 가지 경우가 예외인데 바로 coinbase Transaction이다. 이 거래는 블록 당 첫 번째 거래인데 바로 miner가 새로운 블록을 생성 시 받는 완전히 새로운 비트코인에 대해서는 어떤 UTXO도 소비되지 않는다. 

 

 

모든 비트코인 거래는  Output을 생성하고, 이 Output은 비트코인 장부에 기록된다.  그리고 거의 대부분의 Output은 사용 가능한 비트코인 덩어리인 UTXO를 생성한다. 

UTXO set의 UTXO들은 모든 "Full-Node" 비트코인 클라이언트에 의해 추적되며, 거래가 새롭게 생길 때마다 하나 혹은 그 이상의 UTXO를 UTXO set에서 소비하게 된다.

"vout": [
  {
    "value": 0.01500000,
    "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY
    OP_CHECKSIG"
  },
  {
    "value": 0.08450000,
    "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
  }
]

아까 봤던 JSON 결과 중 "vout"으로 표시된 항목을 살펴보도록 하자.

이 부분이 바로 Transaction의 Output에 해당하는 부분이며, 보다시피 두 개의 Output을 포함하고 있다. 각각의 Output은 어떤 "value"와 특정한 암호 퍼즐로 구성되어 있음을 볼 수 있다. 

첫번째 "value"는 비트코인의 단위인 satoshis로 읽을 수 있는 비트코인 값이다. 두번째 "scriptPubKey"는 UTXO를 소비하기 위한 일종의 조건에 해당하는 값이다. 이 조건을 흔히 " Locking Script" 라고 부르는데 특정 명령을 내포하고 있어서 이 상태로 블록에 저장된 후에 추후 이 비트코인의 소유주가 이 UTXO를 사용하고자 할 때, 소유자의 특정 명령과 함께 합쳐져서 UTXO를 실제로 사용할 수 있도록 만들어 준다. 아직까지 감이 안 올 수도 있으나 추후 상세한 설명과 함께 이해를 돕도록 하겠다. [이러한 것을 Script Language라고 한다]

 

"vin": [
  {
    "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
    "vout": 0,
    "scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
    "sequence": 4294967295
  }
]

위의 항목은 위의 JSON 결과 중 "vin"으로 표시된 항목이다.

이 항목은 "txid"라고 하는 Transaction ID가 있고, 이 값을 통해서 소비된 UTXO가 포함된 transaction을 찾을 수 있다. 그리고 "vout"은 해당 거래에 참조되는 UTXO의 index 값으로 현재는 하나 밖에 참조되지 않으므로 0을 가진다. "scriptSig"는 input으로 사용하는 UTXO를 unlocking하는데 필요한 조건을 만족하는 script이다. 마지막으로 "Sequence"는 추후 내용을 이해한 뒤에 설명하는 것이 좋으므로 뒤로 미루도록 하겠다.

다음 포스팅에서는 실제로 Transaction Script Locking and Unlocking 동작을 살펴보도록 하자

정원삼 6년근 고려홍삼정 365 스틱 30포 + 쇼핑백, 300g, 1세트

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

728x90
반응형
Comments