Monacoinのブロックチェインに含まれるOP_RETURNのデータを一覧表示

前回、MonacoinのブロックチェインにOP_RETURNのデータを保存する方法を説明しました。

OP_RETURNで80バイトまでのデータをMonacoinのブロックチェインに保存 - ohacのブログ

今回はこれを取り出して一覧表示する方法について説明します。

前回と同様に以下のpython-OP_RETURNの改造版をcloneします。

GitHub - ohac/python-OP_RETURN: Simple Python commands and library for using bitcoin OP_RETURNs

以下のようなスクリプトをlist-OP_RETURN.pyという名前で保存します。

import sys, string
from OP_RETURN import *

def OP_RETURN_list_sub(height, testnet=False):
    txns=OP_RETURN_get_block_txns(height, testnet)
    txids=txns.keys()
    for txid in txids:
        txn_unpacked=txns[txid]
        found=OP_RETURN_find_txn_data(txn_unpacked)
        if not found:
            continue
        vintxid = txn_unpacked['vin'][0]['txid']
        if vintxid == '0000000000000000000000000000000000000000000000000000000000000000':
            continue
        data = found['op_return']
        try:
            data = data.decode('utf-8')
            print(data)
        except:
            print OP_RETURN_bin_to_hex(data)

def OP_RETURN_list(testnet=False):
    max_height=int(OP_RETURN_bitcoin_cmd('getblockcount', testnet))
    heights = [655049, 660399, 660413, 684062, 684069, 859463, 860016, 873025,
               874951, 875066, 875582, 875615, 876901, 904773, 904868, 965884,
               965927]
    for height in heights:
        OP_RETURN_list_sub(height, testnet)
    for height in range(1005000,max_height):
        OP_RETURN_list_sub(height, testnet)

OP_RETURN_list()

heightsには既知のブロック高が入っており、range(1005000,max_height)で1005000から最新までを調べるようにしています。

以下、実行結果です。

$ python list-OP_RETURN.py 
Hello!
Hello world!
Hello! txout0!
0468507040118fd428901db808a1ff347ff9b2a68137403f79deed98cbb5e568
happy monacoin 80 byte op_return thank you for mr.watanabe 2016/06/09      
hello!
hello!
4d4e53540100000013c10000000000001343304e56426b36555141456f7a446d2e6a7067
4d4e5354ffffffff13c1000005af00001343304e56426b36555141456f7a446d2e6a7067
4d4e5354ffffffff7b0e0200730c0200e38188e38188e38198e38283e381aae38184e3818b2e6a7067
4d4e5354ffffffff1b700000706f0000e69982e99ba82e6a7067
4d4e5354ffffffff1b700000706f0000e69982e99ba82e6a7067
4d4e5354ffffffff1b700000606f0000e69982e99ba82e6a7067
4d4e5354ffffffff98fb000071f6000043746d58397a6356494141644a785f2e6a7067
4d4e5354ffffffff1b7000004c6f0000e69982e99ba82e6a7067
awduiefnpiuerhagnvaeuip;wiensaio;dwsdfviuvsndi uvsdn cubvsovdaduisnduipvndfb
vvm@wer0mv@0
Hello, Monacoin!
こんにちは世界

ここまでできたら、ポーリングで定期的に最新情報を取り出して、ある条件で絞り込んだ上位プロトコルを作ることもできそうですね。

今回の件は以下のAsk Monaの内容が大変参考になりました。ありがとうございます。

askmona.org

なお、今回結構苦労したのがSegwitのtx部分をスキップするところでした。

オリジナルのOP_RETURN.pyはSegwitに対応しておらず、ドキュメントをあちこち探しましたが、分かりやすく説明されたものがなくて、バイナリデータと英文を見比べながらようやく完成させることができました。