web-dev-qa-db-ja.com

使用されているすべてのhash160アドレスをビットコインブロックチェーンから抽出する方法

私は今150GBのビットコインブロックをすべて持っていますか?それらを開いてPythonで読む方法は?これまでに使用したすべてのhash160を抽出する必要があります

Berkeley DBでそれらを開こうとしましたが、成功しませんでした。これらのファイルはBerkeley DBではないようです。とにかく、blkxxxxx.datファイルとrevxxxxx.datファイルの違いは何ですか。 revxxxxx.datファイルのファイルサイズが改善されたようです

11
John Kotkin

少し単純なpythonスクリプトで、RPCを介してbitcoin-coreからすべてのアドレスを抽出できます。これには、bitcoin-coreがすべての解析および関連する問題を処理するという利点があります。動作させるには、bitcoin-coretxindex=1で実行する必要があります

スクリプトを実行するには、次の依存関係をインストールしてください。

Sudo pip install python-bitcoinrpc

スクリプト:

import sys
from bitcoinrpc.authproxy import AuthServiceProxy

RPC_ADDRESS="127.0.0.1:8332"
RPC_USER="u"
RPC_PASSWORD="p"


def connect(address, user, password):
    return AuthServiceProxy("http://%s:%s@%s"%(user, password, address))

def extract_block_addresses(rpc, block_hash):
    block = rpc.getblock(block_hash)
    addresses = []
    for tx in block[u'tx']:
        raw_tx = rpc.getrawtransaction(tx, True)
        if not raw_tx.has_key('vout'):
            sys.stderr.write("Transaction %s has no 'vout': %s\n"%(tx, raw_tx))
            break
        for vout in raw_tx[u'vout']:
            if not vout.has_key("scriptPubKey"):
                sys.stderr.write("Vout %s of Transaction %s has no 'scriptPubKey'\n"%(vout, tx))
                break
            if vout["scriptPubKey"]["type"] == "nulldata":
                # arbitrary data
                break
            Elif vout['scriptPubKey'].has_key('addresses'):
                addresses.extend(vout['scriptPubKey']['addresses'])
            else:
                sys.stderr.write("Can't handle %s transaction output type in transaction %s\n"%(vout["scriptPubKey"]["type"], raw_tx))
    return addresses

if __name__ == "__main__":
    if len(sys.argv) > 1:
        start_block = int(sys.argv[1])
    else:
        start_block = 1

    if len(sys.argv) > 2:
        end_block = int(sys.argv[2])
    else:
        end_block = 0

    rpc = connect(RPC_ADDRESS, RPC_USER, RPC_PASSWORD)
    if end_block == 0:
        end_block = rpc.getblockcount()

    b = start_block

    for b in xrange(start_block, end_block+1):
        try:
            block_hash = rpc.getblockhash(b)
            for addr in extract_block_addresses(rpc, block_hash):
                print addr
        except:
            rpc = connect(RPC_ADDRESS, RPC_USER, RPC_PASSWORD)
            block_hash = rpc.getblockhash(b)
            for addr in extract_block_addresses(rpc, block_hash):
                print addr

デフォルトでは、bitcoin-coreは4つのRPCスレッドで実行されます。したがって、スクリプトの複数のインスタンスを開始して、すべてのコアを利用することは理にかなっています。さらに、生成されたアドレスのリストを圧縮することは理にかなっています。

time python bitcoin-addresses.py 1 100000 2> bad_transaction-1.log | gzip -9 > addresses-1.gz &
time python bitcoin-addresses.py 100000 200000 2> bad_transaction-2.log | gzip -9 > addresses-2.gz &
time python bitcoin-addresses.py 200000 300000 2> bad_transaction-3.log | gzip -9 > addresses-3.gz &
time python bitcoin-addresses.py 30000 2> bad_transaction-4.log | gzip -9 > addresses-4.gz &

私のように、ハードドライブがボトルネックであることが判明した場合、以前のアプローチでは1つのインスタンスのみを実行する方が適切です。

time python bitcoin-addresses.py 2> bad.log | gzip -9 > addresses.gz

スクリプトは既知のアドレスを追跡しないことに注意してください。したがって、出力には重複が含まれます。この問題はsort -uで解決できます。

zcat addresses.gz | sort -u
3
fzgregor

This ソフトウェアはあなたが望むことをしているようです。そのREADMEには次の例が含まれています:

. Compute and print the balance for all keys ever used since the beginning of time:

    ./parser all >all.txt

更新:

前のコマンドを実行すると、次の結果が得られます。

root@81d54ebe5b25:~/blockparser# ls -alh all.txt 
-rw-r--r-- 1 root root 900M Aug 25 09:33 all.txt
root@81d54ebe5b25:~/blockparser# head all.txt 
---------------------------------------------------------------------------
          State of the ledger at block 194124 (minted : Thu Aug 16 03:36:13 2012)
---------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
              Balance                      Hash160                             Base58                  nbIn        lastTimeIn          nbOut        lastTimeOut
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
         507335.01317523 8bf24a18a58ab500d30c73bf21dbf4703d31ad2c 1DkyBEKt5S2GDtv7aQw6rQepAvnsRyHoYM    152 Tue Aug 14 18:11:09 2012      17 Tue Jul 17 02:32:38 2012
         105555.03133700 582431b9e63d2394c8b224d1bc45d07ae95d2379 1933phfhK3ZgFQNLGSDXvqCn32k2buXY8a     48 Fri Jun 22 16:26:43 2012       0 Thu Jan  1 00:00:00 1970
          79957.03133700 a0b0d60e5991578ed37cbda2b17d8b2ce23ab295 1FeexV6bAHb8ybZjqQMjJrcCrHGW9sb6uF      4 Sun Jul 15 20:36:59 2012       0 Thu Jan  1 00:00:00 1970
          53000.03133700 3d9e561f21d312f9b8b46e74169263e2452d5591 16cou7Ht6WjTzuFyDBnht9hmvXytg6XdVT     16 Sun Jul 15 20:36:59 2012       9 Sun May 13 12:13:16 2012

ただし、これは不完全に同期されたビットコインノード上にあります。

2
fzgregor