トランザクション

トランザクションのコンポーネント
1. バージョン(追加機能)
2. インプット(どのビットコインを使用するか)
3. アウトプット(どのビットコインを移動するか)
4. ロックタイム(トランザクションが有効になるか)

from helper import (
    hash256,
)

class Tx:

    def __init__(self, version, tx_ins, tx_outs, locktime, testnet=False):
        self.version = version
        self.tx_ins = tx_ins 
        self.tx_outs = tx_outs 
        self.locktime = locktime
        self.testnet = testnet

    def __repr__(self):
        tx_ins = ''
        for tx_in in self.tx_ins:
            tx_ins += tx_in.__repr__() + '\n'
        tx_outs = ''
        for tx_out in self.tx_outs:
            tx_outs += tx_out.__repr__() + '\n'
        return 'tx: {}\nversion: {}\ntx_ins:\n{}tx_outs:\nlocktime: {}'.format(
            self.id(),
            self.version,
            tx_ins,
            tx_outs,
            self.locktime,
        )
    
    def id(self):
        return self.hash().hex()

    def hash(self):
        return hash256(self.serialize())[::-1]

idはトランザクションを見つける際にブロックエクスプローラが用いる。リトルエンディアンで返す16進数のhash256

トランザクションのパース

    @classmethod
    def parse(cls, serialization):
        version = serialization[0:4]

変数serializationはバイト配列

↓ ストリームを使用し、readメソッドを使う
read(4)なので、4文字を読み込むという意味

    @classmethod
    def parse(cls, stream):
        serialized_version = stream.read(4)