이 글을 이해하기 위해 컴퓨터 공학 지식이 일부 필요할 수 있습니다.
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 을 전파합니다.