electrumのコマンドラインからアドレスを作成する方法
bitcoindの場合、getnewaddressで簡単に新しいアドレスが作成できたが、electrumの場合、The gap limitである20個までしか最初は用意されていない。
Frequently Asked Questions — Electrum 2.5 documentation
How can I pre-generate new addresses? にあるようにGUIからだとコンソールからwallet.create_new_address()を呼び出せば作成できる。 しかし、CUIの場合はどうすればよいのか分からなかったため、以下のパッチを作成した。
これによりgetnewaddressというコマンドが追加され、呼び出すたびに新しいアドレスを生成してくれるようになる。
ElectrumのDeterministic Walletを実感してみる
Electrumは単一のパスフレーズから複数のアドレスを生成するしくみになっているが、 普通に使っているだけではなかなか実感しにくい。 そこでrestoreコマンドを使うことでDeterministic Walletを実感してみた。
まずは元となるウォレットを作成する。 実験なので、/tmp/1 ディレクトリをHOMEにして作成してみる。
$ mkdir /tmp/1
$ cd /tmp/1
$ HOME=$PWD electrum setconfig a a # おまじない
$ HOME=$PWD electrum create
Password (hit return if you do not wish to encrypt your wallet):
たくさんアドレスが生成される
Your wallet generation seed is:
"ここにseedが表示される"
...
$ HOME=$PWD electrum listaddresses|md5sum
76fbce5a77d734513b4eb8830cd81e23 -
最後のコマンドで生成されたアドレスのハッシュを求めている。
次に /tmp/2 で restore してみる。
$ mkdir /tmp/2
$ cd /tmp/2
$ HOME=$PWD electrum setconfig a a
$ HOME=$PWD electrum --offline restore "ここにseedを入力"
$ HOME=$PWD electrum listaddresses|md5sum
76fbce5a77d734513b4eb8830cd81e23 -
確かに同じアドレスが生成されていることが分かる。
CoinomiのMonacoinサーバがどうなっているのか調べてみた
CoinomiというAndroid用ウォレットでMonacoinが使えるようになっている。
このウォレットではelectrum-serverを使っているはずなので、ソースコードにサーバのアドレスが書かれているはずである。 調べてみると wallet/src/main/java/com/coinomi/wallet/Constants.java で定義されていた。
new CoinAddress(MonacoinMain.get(), new ServerAddress("mona-cce-1.coinomi.net", 5022),
new ServerAddress("mona-cce-2.coinomi.net", 5022)),
Litecoinも以下のように定義されている。
new CoinAddress(LitecoinMain.get(), new ServerAddress("ltc-cce-1.coinomi.net", 5002),
new ServerAddress("ltc-cce-2.coinomi.net", 5002)),
すべてcoinomi.netのサブドメインとなっているようだ。
Monacoin用のElectrumはまだないと思うので、とりあえずLitecoinでつないでみたところ、ちゃんと使えた。
$ electrum-ltc -1 -s ltc-cce-2.coinomi.net:5002:t
他にもいろいろとaltcoinがあるしtestnetもいくつかあるので、実験用にも使えそうである。
Transaction feeをケチると認証されない件
Bitcoinの送信でtx feeを0.00001BTCにして成功したことがあったので、何度か同じように試してみたが失敗することがあったので調べてみた。
Transaction fees - Bitcoin Wiki
Sending A transaction may be safely sent without fees if these conditions are met:
- It is smaller than 1,000 bytes.
- All outputs are 0.01 BTC or larger.
- Its priority is large enough (see the Technical Info section below)
つまり、以下の条件のときはtx feeなしで成功するかも、とのこと。
- 1,000バイトより少ない
- 出力が 0.01 BTCより多い
- プライオリティが十分に高い
3つ目が分かりにくいが、以下の計算式で求められるとのこと。
priority = sum(input_value_in_base_units * input_age)/size_in_bytes
例として、入力が次の2つ、10 confirmationsの5 BTCが1つと、3 confirmationsの2 BTCのときで、出力サイズが500バイトだとすると、プライオリティは以下の計算式となるようだ。
(500000000 * 10 + 200000000 * 3) / 500 = 11,200,000
要は額が大きくて、長いこと移動されていないコインはプライオリティが高いということだろう。
Otherwise, the reference implementation will round up the transaction size to the next thousand bytes and add a fee of 0.1 mBTC (0.0001 BTC) per thousand bytes[1].
つまり、上記の3つの条件が揃わないときは1,000バイト毎に0.0001 BTCをtx feeとして渡さないとうまくいかないようだ。
Electrum-DOGEも動かしてみた
Electrum-DOGEも動いたのでメモしておく。 ネットワークは doge-cce-1.coinomi.net tcp 5003 を使えばいける。doge-cce-2もついでに追加しておくとよい。 TX Feeは1DOGE(約0.015円)なので、テスト用には一番良いかもしれない。少し入手しておこうかと思う。
[追記] 動いたと思いましたが、着信がunverifiedのまま進みませんでした。例外も出ているので何か問題があるようです。
Litecoin用のElectrumを使ってみた
Electrumが結構お気に入りなので、Litecoin用のElectrumも使ってみた。
使い方はREADME.rstでは以下のようになっている。
./electrum-ltc
インストールするにはこんな感じか。
pyrcc4 icons.qrc -o gui/qt/icons_rc.py
python setup.py sdist --format=zip,gztar
sudo pip install --pre dist/Electrum-LTC-2.6.tar.gz
ただ、これだけだと初期ノードにつながらないので、以下のサイトにあるノードを追加した。
差分は以下のような感じ。ついでにRPCのポート番号を7777から7778に変更。
[追記] こんなことをしなくてもsetconfigでできました。
$ electrum-ltc setconfig rpcport 7778
立ち上げた後、コンソールでgetservers()すると7ノードほど表示された。 なお、上記パッチをあてる前に起動してしまった場合は ~/.electrum-ltc/recent_servers を一度消しておいた方がよさそう。
daemonとして立ち上げる場合は electrum-ltc daemon start とすればよい。
$ electrum-ltc daemon start
helpを見れば色々とコマンドが見れる。RPCなので、curlとかからでも操作できるので便利。