私は今150GBのビットコインブロックをすべて持っていますか?それらを開いてPythonで読む方法は?これまでに使用したすべてのhash160を抽出する必要があります
Berkeley DBでそれらを開こうとしましたが、成功しませんでした。これらのファイルはBerkeley DBではないようです。とにかく、blkxxxxx.datファイルとrevxxxxx.datファイルの違いは何ですか。 revxxxxx.datファイルのファイルサイズが改善されたようです
少し単純なpythonスクリプトで、RPCを介してbitcoin-core
からすべてのアドレスを抽出できます。これには、bitcoin-core
がすべての解析および関連する問題を処理するという利点があります。動作させるには、bitcoin-core
をtxindex=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
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
ただし、これは不完全に同期されたビットコインノード上にあります。