Qaupot Blog
Software Engineering, Trip

이 글을 이해하기 위해 컴퓨터 공학 지식이 일부 필요할 수 있습니다.

Transaction

Transaction 은 전자 결제 혹은 컴퓨터 공학에서의 Database Transaction 을 생각해 볼 수 있습니다.

'A가 B에게 $100 을 지불하였다' 라는 Transaction 이 있다고 하면, 아래와 같이 풀어 쓸 수 있습니다.

  • 지급인 (payer)
  • 수취인 (payee)
  • 자산은 $100

Bitcoin 은 "Payment System" 에 가깝기 때문에 위 정의와 유사한 형태를 가지지만, Ethereum 의 경우에는 "World's Computer" 라는 표현처럼, "Computing System" 에 가깝기 때문에, 컴퓨터 공학에서의 Database Transaction 에 가까운 정의를 가집니다.

Bitcoin Unspent Transaction Output (UTXO)

Bitcoin 의 경우, Transaction 을 처리할 때 UTXO 를 사용합니다.

위에서 풀어 쓴 내용을 다시 생각해 보면, 아래와 같다는 것을 알 수 있습니다.

  • 지급인 (payer) : Transaction Input
  • 수취인 (payee) : Transaction Output
  • 자산은 $100 : Transaction Amount

그렇다면, Unspent Transaction Output 라고 하면, 아직 소비 되지 않은 Output 이라는 뜻이 됩니다.

하나의 Transaction 는 다수의 Input 과 다수의 Output 으로 구성되어 있으며, Bitcoin 에서 모든 Transaction 은 CoinBase (신규 발행) 을 제외하면 Input Amount - Output Amount - Fee = 0 가 되어야 합니다.

  • 위 정의에 의해, Bitcoin 은 Fee 를 따로 데이터로 표기하지 않으며, Input Amount - Output Amount 를 Fee 로 취급합니다. 계산에 실수가 있으면, 과다한 fee 가 지급되기도 합니다.

Bitcoin Raw Transaction

아래는 Height 1의 Transaction ( 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098 ) Hex 입니다.

01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000
Name Byte Description Example
Version 4 버전 정보 01000000
Input Count 1 Input 개수 01
(Count 만큼 반복)
Input - TxID 32 어떤 Tx를 소비 (Spent) 할 것인지 00000000 ...
Input - VOut 4 ffffffff
Input - Script Size 1 script 의 길이 07
Input - Script 가변 script 04ffff001d0104
Input - Sequence 4 (현재 사용되지 않음) ffffffff
(반복 끝)
Output Count 1 Output 개수 01
(Count 만큼 반복)
Output - Value 8 Little Endian Satoshi 00f2052a01000000
Output - Script Size 1 script 의 길이 43
Output - Script 가변 script 410496b5 ...
(반복 끝)
Lock Time 4 기본 0인 경우, 별도 잠금 없음. 00000000
  • Lock Time :
    • 500,000,000 이상인 경우, Unix Time 으로 해석됩니다.
    • 500,000,000 이하인 경우, Block Height 로 해석됩니다.
  • Value : Little Endian 인 것에 주의합시다.
    • 00f2052a01000000를 Little Endian 으로 읽으면 000000012a05f200이 됩니다.
    • 12a05f200 (Hex) = 5000000000 (Decimal) satoshi = 1 BTC.

Bitcoin Transaction Script

Raw Transaction 의 구조를 보면, payer 와 payee 에 대한 정의가 없고, Address 도 등장하지 않습니다. 비밀은 Script 에 숨어 있습니다.

Script 에는 Bitcoin 에서 동작하는 프로그램으로, 여러 명령 코드로 이루어져 있습니다. 프로그래밍적으로는 Bitcoin Machine 위에서 동작하는 스크립트 라고 표현 가능합니다.

Op Code 목록 전체에 대해서는 여기서 다루지 않으므로, Script 에 대한 자세한 내용은 Bitcoin Wiki 를 참조해주세요.

아래는 알려진 script 중 pay-to-pubkey-hash 라는 이름을 가진 script 입니다.

scriptPubKey (Output Script) : OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig (Input Script) : <sig> <pubKey>

(Reference : Bitcoin Wiki)

A 가 B 에게 송금한다고 하는 상황을 표현하면 아래와 같습니다.

  • B는 A 에게 자신의 Address 를 알려줍니다.
  • A는 B 에게 자신의 아직 사용하지 않은 자산을 사용하여 B를 위한 새로운 자산을 만들어줍니다.

이를 다시 풀어쓰면,

  • B는 A 에게 자신의 "pubKeyHash" 를 알려줍니다.
  • A는 B 에게 자신이 가지고 있는 UTXO 를 Input 으로 하여, B가 다음번에 Input 으로 사용할 수 있는 새로운 Output 을 만들어 줍니다.
    • 이때 A 의 UTXO 를 소비하기 위해서 "sig" 와 "pubKey" 를 입력합니다.
    • 당연하게도, Output 에 필요한 "sig" 와 "pubKey" 를 제공할 수 없는 사람은 이 UTXO 를 사용할 수 없습니다.

Output 에 대한 Input 이 제공되면, 아래 처럼 Bitcoin 에 의해 실행되어, Transaction 이 처리됩니다.

Stack Script
Empty. <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> OP_CHECKSIG
true Empty.
(Reference : Bitcoin Wiki)

Comparing of Bitcoin and Ethereum Transaction

Ethereum 은 UTXO 를 사용하지 않고, Transaction 에는 sender 와 receiver 가 명시적으로 기록됩니다.

UTXO 구조는 Transaction 끼리 연결되어 있기 때문에 별도로 Transaction 의 실행 순서를 관리할 필요가 없는 장점이 있습니다.

  • Transaction 이 성립하기 위해서는 해당 Transaction 이 참조하는 모든 Transaction Output 이 아직 소비되지 않았어야 합니다.
  • 반대로, 이미 소비한 Transaction Output 을 바탕으로는 다른 Transaction 을 만들 수 없습니다.

Ethereum 은 Transaction 간에 관계가 없으며, Address 에 부여된 state 를 통해 가장 마지막 상태를 참조합니다.

  • 대신, 순차적으로 증가하는 Nonce 값을 지정하여 Transaction 의 처리 순서를 지정합니다.
  • 예) Nonce 3은 Nonce 1과 2가 처리된 이후에 처리될 수 있습니다. 다음 Nonce 는 4 입니다.

Transaction Propagation (트랜잭션 전파)

Transaction 을 만들었다면, Blockchain Network 에 전파하여, 다른 참여자들의 검증과 승인을 받아야만 합니다.

최초로 Transaction 을 만든 혹은 전달 받은 Node 는 자신과 연결된 다른 Node 들에게 Transaction 을 전파합니다. Transaction 을 전달 받은 Node 역시 자신과 연괼된 다른 Node 들에게 이 Transaction 을 전파합니다.

Reference

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.