LoginSignup
8
4

More than 5 years have passed since last update.

pybitcointoolsを使ってビットコインネットワークに接続する

Posted at

pybitcointoolsとは

  • ビットコインネットワークとやり取りをするためのライブラリ、コマンドユーティリティ
  • Ethereum創設者のヴィタリック・ブテリンによって構築
  • pybitcointoolsコマンドでも実行できる
  • Electrum(ボランティアがビットコインクライアントの古ノードをAPI経由で提供している軽量版ビットコインクライアント)に接続することができる

参考:https://github.com/vbuterin/pybitcointools

インストール(bitcoin)

$ pip install bitcoin
Collecting bitcoin
  Downloading bitcoin-1.1.42.tar.gz
Building wheels for collected packages: bitcoin
  Running setup.py bdist_wheel for bitcoin ... done
  Stored in directory: 
 :
 :
Successfully built bitcoin
Installing collected packages: bitcoin
Successfully installed bitcoin-1.1.42

動作確認(bitcoin)

  • まずはpythonコードからbitcoinライブラリとしてインポートします
$ ipython
[1] from bitcoin import *
#[ウォレット内の秘密鍵の源泉となる文字列]
[2] priv = sha256('some big long brainwallet password')
[3] priv
Out[3]: '57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4'
# 秘密鍵から公開鍵を生成する
[4] pub = privtopub(priv)
[5] pub
Out[5]: '0420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9'
# 公開鍵から取引のアドレスを生成する
[6] addr = pubtoaddr(pub)
[7] addr
Out[7]: '1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'
[8] h = history(addr)
[9] h
Out[9]: 
[{'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6',
  'block_height': 262537,
  'output': u'4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1',
  'spend': u'772bebdf445d719d90d52a3029d27e90aa8f26eca8d431fc77cc487c377a89c4:1',
  'value': 50000},
 {'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6',
  'block_height': 363957,
  'output': u'b0aad2e5184099b20d53100a678e9bec2eab1b0710fb06930f333387492a82b3:0',
  'spend': u'05551814576ba084a0736abd8df411061c5ea7e4ae72d334317f5504f6b331d6:0',
  'value': 500000},
 {'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6',
  'block_height': 262537,
  'output': u'97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0',
  'spend': u'772bebdf445d719d90d52a3029d27e90aa8f26eca8d431fc77cc487c377a89c4:0',
  'value': 50000}]
[10] outs = [{'value': 100, 'address': '16iw1MQ1sy1DtRPYw3ao1bCamoyBJtRB4t'}]
# 取引を作成する
[11] outs
Out[11]: [{'address': '16iw1MQ1sy1DtRPYw3ao1bCamoyBJtRB4t', 'value': 90000}]
[12] tx = mktx(h,outs)
# 電子署名する
[13] tx
Out[13]: '010000000371d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c0100000000ffffffffb3822a498733330f9306fb10071bab2eec9b8e670a10530db2994018e5d2aab00000000000ffffffff5e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f7970000000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000'
[14] tx2 = sign(tx,0,priv)
[15] tx2
Out[15]: '010000000371d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c010000008b483045022100ec9817f8a9c88ab2bbb79900fb58a422a5ef37e6b4824a12b908c047134ba9d402201bdb6b2d303ee2a50be376388fcc73f5a67afb3be7c1eab312d51e6ee8c1b9ea01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffffb3822a498733330f9306fb10071bab2eec9b8e670a10530db2994018e5d2aab00000000000ffffffff5e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f7970000000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000'
[16] tx3 = sign(tx2,1,priv)
[17] tx3
Out[17]: '010000000371d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c010000008b483045022100ec9817f8a9c88ab2bbb79900fb58a422a5ef37e6b4824a12b908c047134ba9d402201bdb6b2d303ee2a50be376388fcc73f5a67afb3be7c1eab312d51e6ee8c1b9ea01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffffb3822a498733330f9306fb10071bab2eec9b8e670a10530db2994018e5d2aab0000000008a47304402200a7eda04709c50835fd4baa13dac3305bd32bbb2c8184529dcf30e92a931f4cd02205b9ee52d5a38665c132970842ce6df0a7d7f8b160ad77f2abcb23f22ab2b46af01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffff5e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f7970000000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000'
# トランザクションをブロードキャストする
[18] pushtx(tx3)
Out[18]: 'Transaction Submitted'

インストール(pybitcointools)

$ pip install pybitcointools
Collecting pybitcointools
  Downloading pybitcointools-1.1.15.tar.gz
Building wheels for collected packages: pybitcointools
  Running setup.py bdist_wheel for pybitcointools ... done
  Stored in directory: /Users/abenben/Library/Caches/pip/wheels/22/5f/48/7410a0e03801249fcc708771586cd5970d1105fa0d9d67d3d6
 :
 :
Successfully built pybitcointools
Installing collected packages: pybitcointools
Successfully installed pybitcointools-1.1.15

動作確認(pybitcointoolsコマンド)

pybitcointoolsのGitHub上のサンプルコマンドを実行してみました

  • 注意:historyのコマンドはすごく時間がかかりました。
$ # 乱数を生成する
$ pybtctool random_electrum_seed
e2221d71720a90f3167f5465d014feee

$ # 秘密鍵を作成する
$ pybtctool electrum_privkey e2221d71720a90f3167f5465d014feee 0 0
5c58bd2955c83b015f45cd62416f417e3821bb2a16745dae19d2aef0c97a2de9

$ # 秘密鍵から公開鍵を作成する
$ pybtctool electrum_mpk e2221d71720a90f3167f5465d014feee
05d54161b92b112718ac2de6af3ab6801fa8f268581c134f81432e2a37606ad55c9a8c7260b6bef22578874f9dcd93410ad0ea164d0e75c0b8b126a6ce76ed2b

$ pybtctool bip32_master_key 21456t243rhgtucyadh3wgyrcubw3grydfbng
xprv9s21ZrQH143K2napkeoHT48gWmoJa89KCQj4nqLfdGybyWHP9Z8jvCGzuEDv4ihCyoed7RFPNbc9NxoSF7cAvH9AaNSvepUaeqbSpJZ4rbT

$ pybtctool bip32_ckd xprv9s21ZrQH143K2napkeoHT48gWmoJa89KCQj4nqLfdGybyWHP9Z8jvCGzuEDv4ihCyoed7RFPNbc9NxoSF7cAvH9AaNSvepUaeqbSpJZ4rbT 0
xprv9vfzYrpwo7QHFdtrcvsSCTrBESFPUf1g7NRvayy1QkEfUekpDKLfqvHjgypF5w3nAvnwPjtQUNkyywWNkLbiUS95khfHCzJXFkLEdwRepbw

$ pybtctool bip32_privtopub xprv9s21ZrQH143K2napkeoHT48gWmoJa89KCQj4nqLfdGybyWHP9Z8jvCGzuEDv4ihCyoed7RFPNbc9NxoSF7cAvH9AaNSvepUaeqbSpJZ4rbT
xpub661MyMwAqRbcFGfHrgLHpC5R4odnyasAZdefbDkHBcWarJcXh6SzTzbUkWuhnP142ZFdKdAJSuTSaiGDYjvm7bCLmA8DZqksYjJbYmcgrYF

$ pybtctool sha256 'some big long brainwallet password' | \
   pybtctool -s privtoaddr | \
    pybtctool -s history | jq
[
  {
    "output": "4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1",
    "block_height": 262537,
    "spend": "772bebdf445d719d90d52a3029d27e90aa8f26eca8d431fc77cc487c377a89c4:1",
    "value": 50000,
    "address": "1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6"
  },
  {
    "output": "b0aad2e5184099b20d53100a678e9bec2eab1b0710fb06930f333387492a82b3:0",
    "block_height": 363957,
    "spend": "05551814576ba084a0736abd8df411061c5ea7e4ae72d334317f5504f6b331d6:0",
    "value": 500000,
    "address": "1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6"
  },
  {
    "output": "97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0",
    "block_height": 262537,
    "spend": "772bebdf445d719d90d52a3029d27e90aa8f26eca8d431fc77cc487c377a89c4:0",
    "value": 50000,
    "address": "1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6"
  }
]

$ pybtctool sha256 123 | \
   pybtctool -s changebase 16 256 | \
    pybtctool -b changebase 256 16
a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

$ pybtctool unspent 1FxkfJQLJTXpW6QmxGT6oF43ZH959ns8Cq | \
   pybtctool -j select 200000001 | \
    pybtctool -j mksend 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P:20000 1FxkfJQLJTXpW6QmxGT6oF43ZH959ns8Cq 1000 | pybtctool -s signall 805cd74ca322633372b9bfb857f3be41db0b8de43a3c44353b238c0acff9d523
0100000001c42fa5643c40022890a01096fcc84f48b6c39ab2a2c3f1c1776bad41f33bae7e000000008a47304402206b7fdbd574910550370a6a2b3c118a81914bc0b4b282a75a87c10fef3f6ef46902201b9087184868f50310d5f6e5a241aafafa692d93fd8bc970149bb1a741d2ea6c0141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff02204e0000000000001976a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ace648410c000000001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac00000000

$ pybtctool history 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P | \
   pybtctool -j multiaccess value | \
    pybtctool -j sum
Fetching more transactions... 50
Fetching more transactions... 100
Fetching more transactions... 150
 :
 :
625216206372

$ pybtctool history 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P | \
   pybtctool -j count
Fetching more transactions... 50
Fetching more transactions... 100
Fetching more transactions... 150
 :
 :
6198

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4