트랙잭션 출력에 대해 알아보자.
Outputs
010000000181379011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d10000000
06b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf2132060277457c98f02
207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631
e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef0100000000
1976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c39800000000001976a9141c4bc
762dd5423e332166702cb75f40df79fea1288ac19430600
Outputs: 02a135ef0100000000
1976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c39800000000001976a9141c4bc
762dd5423e332166702cb75f40df79fea1288
- Output counts(Varint): 02
- First
- Bitcoin amounts: a135ef0100000000
- ScriptPubKey: 1976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac
- Second
- Bitcoin amounts: 99c3980000000000
- ScriptPubKey: 1976a9141c4bc762dd5423e332166702cb75f40df79fea1288
Bitcoin Amount
- 비트코인의 양을 나타낸다.
- 총액은 2100개, 2100조 사토시를 나타낸다.
- 2100조는 보다 크기 때문에 8바이트로 표현한다.
- 리틀 엔디안으로 표현한다.
ScriptPubKey
- ScriptPubKey는 비트코인 트랜잭션의 출력(Output) 부분에 해당하는 스크립트이다.
- 즉, 트랜잭션에서 받는 쪽이 비트코인을 받을 수 있는 주소와 관련된 정보가 포함되어 있다.
- 이 정보는 ScriptSig에서 사용되는 서명 및 인증 정보와 대조되어 검증된다.
UTXO
- 출력에 포함되지는 않으나 중요한 개념이라 설명한다.
- UTxO는 Unspent Transaction Output의 약자이다.
- 트랜잭션을 공부해봤으니, 트랜잭션이 입력과 출력으로 구성되어 있다는 것을 알 수 있다.
- 그렇다면, 가장 마지막에 있는 출력들이 있을 것이다.
- 이녀석들은 아직 입력으로 들어가지 않은 상태이다.
- 이 미사용 트랜잭션 출력의 전체 집합을 UTXO라고 한다.
- 결국 이건 현재 유통중인 모든 비트코인을 의미한다.
- 네트워크 상의 풀 노드는 UTXO 집합을 항상 최신으로 유지해야 한다.
- 왜냐하면 검증시, 결국 사용가능한 코인인지 확인하는 것은 이걸 보고 할 수 밖에 없기 때문이다.
- 이는 곧 이중 지불의 방지 방법이 된다. 모두 연결되어 있고, 가장 마지막 출력으로부터 지급 과정을 확인할 수 있기 때문이다.
TxOut
class TxOut:
def __init__(self, amount, script_pubkey):
self.amount = amount
self.script_pubkey = script_pubkey
def __repr__(self):
return '{}:{}'.format(self.amount, self.script_pubkey)
@classmethod
def parse(cls, s):
'''
Byte 스트림을 받아서 트랜잭션 출력을 파싱하고 TxOut 객체를 반환한다.
'''
# amount is an integer in 8 bytes, little endian
amount = little_endian_to_int(s.read(8))
# use Script.parse to get the ScriptPubKey
script_pubkey = Script.parse(s)
# return an instance of the class (see __init__ for args)
return cls(amount, script_pubkey)
def serialize(self): # <1>
'''Returns the byte serialization of the transaction output'''
result = int_to_little_endian(self.amount, 8)
result += self.script_pubkey.serialize()
return resultLocktime
010000000181379011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d10000000
06b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf2132060277457c98f02
207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631
e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef0100000000
1976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c39800000000001976a9141c4bc
762dd5423e332166702cb75f40df79fea1288ac19430600
Locktime: ac19430600
- Locktime은 트랜잭션의 입력이나 출력에 포함되는 것이 아니라, 트랜잭션 자체에 포함된다.
- 트랜잭션 전파 후 실행을 지연시키는 방법이다.
- 만약 600,000 블록이 지나면 실행되도록 설정하면, 600,000 블록이 지나기 전까지는 블록에 포함될 수 없다.
- “빈번한 거래” 상황을 위해 고안되었다.
- 이전에 보았던 TxIn의 sequence와 함께 사용된다.
- 4바이트로 표현되며, 리틀 엔디안으로 표현된다.
- 주요 문제는 Locktime에 도달했을 때, 수신자가 트랜잭션이 유효한지 확신할 수 없다는 점이다.
- 이는 시간이 많이 지나 부도가 난 수표와 비슷하다.