Chancellor on brink of second bailout for banks

genesis blockのコインベーストランザクションについて調べたのでメモする。

is_coinbase

コインベーストランザクションは、bitcoinを新規で発生させる唯一のtxである。
その構造は、以下の例外を除き、その他の普通のトランザクションと変わらない。
1. tx inputは必ず一つである
2. そのinputの一つ前のtxは32バイトの00である
3. そのinputの一つ前のtx indexは0xffffffffである

pythonで言えば、下記のコードの通りである。

def is_coinbase(self):  
    if len(self.tx_ins) != 1:
        return False
    first_input = self.tx_ins[0]
    if first_input.prev_tx != b'\x00' * 32:
        return False
    if first_input.prev_index != 0xffffffff:
        return False
    return True

script sigにも特に制限がなく(正確には途中からBIP0034がある)、script sig単独での評価が有効である限り、マイナーが好きな値を設定できる。

genesis blockのコインベーストランザクション

なので、一番最初のblockのコインベーストランザクションのscript sigには、satoshi nakamotoがメッセージを込めている。

from io import BytesIO  
from script import Script  
stream = BytesIO(bytes.fromhex('4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73'))  
s = Script.parse(stream)  
print(s.cmds[0]) # b'\xff\xff\x00\x1d'  
print(s.cmds[1]) # b'\x04'  
print(s.cmds[2]) # b'The Times 03/Jan/2009 Chancellor on brink of second bailout for banks'  

コマンドの1つ目(ffff001d)及び2つ目(04)についてはその意図は調べてもわからなかったが、3つ目はThe Times 03/Jan/2009 Chancellor on brink of second bailout for banksという、当時のイギリスの新聞の見出しとなっている。
※これらの文字は、ASCII文字に対応したbyteを、pythonが解釈して表示している

ちなみにだが、2つめのblockのコインベーストランザクションのscript sigには、特に解読できるメッセージは含まれていなかった。