Monacoin用のElectrum試作版

ElectrumをMonacoinで使えるようにしてみました。 ただし、PoWとかのチェックは全く行っていませんので、あくまでもテスト用です。 また、Mで始まるアドレスの対応やBTCをMONAに変更する対応などもできていないところがあります。 サーバはCoinomiさんのものをお借りしております。

Commits · ohac/electrum · GitHub

以下のようなDockerfileを準備します。

FROM ubuntu:16.04
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y vim python-pip git python-qt4 pyqt4-dev-tools && \
    apt-get clean
RUN pip install --upgrade pip && \
    pip install dnspython pyaes ecdsa qrcode pbkdf2 protobuf pip requests \
                pysocks jsonrpclib ltc_scrypt
WORKDIR /root
RUN git clone https://github.com/ohac/electrum.git
WORKDIR /root/electrum
RUN git checkout monacoin-20170514
RUN pyrcc4 icons.qrc -o gui/qt/icons_rc.py

ビルドします。

$ docker build -t elemona .

以下のようなスクリプトを準備。

#!/bin/bash
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
USENET=
#USENET="--net=none"
if ! [ -a $XAUTH ]; then
  touch $XAUTH
  xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
fi
docker run -it --rm \
  -v $XSOCK:$XSOCK:rw -v $XAUTH:$XAUTH:rw \
  -e DISPLAY -e XAUTHORITY=${XAUTH} --ipc=host $USENET \
  elemona

立ち上げ。

# ./electrum

試しに少額のMONAを送信してみると表示された。

f:id:ohac:20170514153730p:plain

しかし6検証を終えているのに何故かNot Verifiedのまま。 頻繁にNot connectedになり、どこかおかしいようだ。

また、別アドレスに送信しようとしたが以下の例外が出てうまく動かなかった。 もう少し調整が必要っぽい。

Traceback (most recent call last):
  File "/root/electrum/gui/qt/main_window.py", line 576, in timer_actions
    self.do_update_fee()
  File "/root/electrum/gui/qt/main_window.py", line 1172, in do_update_fee
    fee_rate = fee * 1000 / tx.estimated_size()
  File "/root/electrum/lib/util.py", line 203, in <lambda>
    return lambda *args, **kw_args: do_profile(func, args, kw_args)
  File "/root/electrum/lib/util.py", line 199, in do_profile
    o = func(*args, **kw_args)
  File "/root/electrum/lib/transaction.py", line 788, in estimated_size
    return len(self.serialize(True)) / 2 if not self.is_complete() or self.raw is None else len(self.raw) / 2 # ASCII hex string
  File "/root/electrum/lib/transaction.py", line 737, in serialize
    nLocktime = int_to_hex(self.locktime, 4)
  File "/root/electrum/lib/bitcoin.py", line 168, in int_to_hex
    return rev_hex(s)
  File "/root/electrum/lib/bitcoin.py", line 162, in rev_hex
    return s.decode('hex')[::-1].encode('hex')
  File "/usr/lib/python2.7/encodings/hex_codec.py", line 42, in hex_decode
    output = binascii.a2b_hex(input)
TypeError: Non-hexadecimal digit found

23:53追記

blockchain_headersをダウンロード可能にしてやればうまく動きました。 electrum-serverの立て方は別途記事にします。

ネットワークから遮断されたDockerコンテナ内でElectrum

以下のような感じのDockerfileを用意してイメージをbuildする。

FROM ubuntu:16.04
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y vim python-pip git python-qt4 pyqt4-dev-tools && \
    apt-get clean
RUN pip install --upgrade pip && \
    pip install dnspython pyaes ecdsa qrcode pbkdf2 protobuf pip requests \
                pysocks jsonrpclib
WORKDIR /root
RUN git clone https://github.com/spesmilo/electrum.git
WORKDIR /root/electrum
RUN git checkout 2.8.2
RUN pyrcc4 icons.qrc -o gui/qt/icons_rc.py

ビルドする。

$ docker build -t electrum .

ネットで見つけた手順を少しアレンジした以下のような手順でコンテナを立ち上げる。

$ XSOCK=/tmp/.X11-unix
$ XAUTH=/tmp/.docker.xauth
$ touch $XAUTH
$ xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
$ docker run -it --rm \
    -v $XSOCK:$XSOCK:rw -v $XAUTH:$XAUTH:rw \
    -e DISPLAY -e XAUTHORITY=${XAUTH} --ipc=host --net=none \
    electrum
root@xxxxxxxxxxxx:~/electrum# ./electrum 

無事立ち上がった。

オフラインウォレットほど安全ではないが比較的安全かもしれない。

自作サンプリング音源を公開した

LinuxSamplerを使って、サンプリング音源を色々と物色していたら、自分でも作りたくなってきて、勢いで作ってしまいました。 以下からダウンロード可能です。

www.dropbox.com

音源とパッチは仕様がオープンなFLAC+SFZ形式なので、LinuxSamplerですぐに使えます。

TUNEのエレキベース

  • 型式は覚えていませんが、4弦24フレット、アクティブタイプの以下の写真に写っているやつです。

flic.kr

  • フロントピックアップ使用。弦はまあまあ新しいかな。
  • ノイズ除去以外のエフェクトはかけておりません。お好みのEQやアンプシミュレーターをお使いください。
  • ループは使っておりませんが、適当なところで音がなくなります。2秒以上はあります。
  • 半音ごとに1サンプルで弦違いの音やラウンドロビン用の重複音はありません。ベロシティのバラつきもありますので、コンプを使った方がいいです。
  • ライセンスはCC-BY 4.0です。
  • zip形式で10.31MBです。

tmbox.net

ミニガットギター ARIA PEPE

  • audio-technicaの安いマイクを使用。ノイズ除去やEQをかけてノイズや環境音を誤魔化しているため音は悪いです。
  • オクターブチューニングがあっていないため、高音はピッチがずれています。
  • ループは使っておりませんが、適当なところで音がなくなります。元々サステインは短めで、後半はS/Nが悪くなります。
  • 半音ごとに1サンプルですが、多少弦違いの音も収録しています。
  • ラウンドロビン用の重複音はありません。ベロシティや周波数特性のバラつきもありますので、コンプを使った方がいいです。
  • 音が悪いのでライセンスは放棄します。CC0です。
  • zip形式で3.72MBです。

tmbox.net

追記:

配布サイトを作りました。

Sound Library

WebTorrentとinstant.ioを試してみた

WebTorrentのアプリをWindows用とLinux用をインストールして試してみました。

webtorrent.io

アプリにファイルをドラッグアンドドロップするだけで簡単にシェアできるようです。

試しにギターの練習音源をシェアしてみました。 以下のリンクでinstant.ioを使って再生することができると思います。 (ChromeとかFirefoxでないとだめみたい。)

https://instant.io/#e14cef00945a8d99dc74d65cf52dcb892cf48ed1

家のWifiを経由して、スマホの回線から聞くことができました。これはすごいです。

ちなみにこのギターの練習はクレオフーガでも公開しています。

追記:

コンソールで使いたい場合はwebtorrent-hybridを使うとよいです。Dockerfileを用意しておきましたので、参考にしてみてください。

gist.github.com

BitcoinプロトコルをGo言語で少し書いてみた

前回、ビットコインピアと直接通信してみたいという話をしました。

ohac.hatenablog.com

今回はdnsseed-rubyの一部をGo言語に移植して、通信するところまで作成してみました。 プロトコルは下記サイトを参照。エンディアンが入り乱れていて、コーディングしにくかったです。

Protocol documentation - Bitcoin Wiki

以下のgistがソースコード。 ライブラリとかすでにありそうだけど、何も見ずに作りました。(dnsseed-rubyは見てます。) ライセンスはdnsseedと同じにしようと思います。

fake-coind.go · GitHub

以下、実行例。あ、ちなみにビットコインじゃなくてモナーコインで試しています。

$ go run fake-coind.go 
xx.xx.xx.xx
version 104
more data 1 [1]
/Satoshi:0.10.2.2/ 70003 692751
verack 0
alert 165
ping 8
inv 37
1
1
inv 37
1
1
inv 37
1
2
62804b60c5242c9882db6d28a83e0bb87be220d38dee863361edb6ffe890f09f

こんな感じでブロックのハッシュが届きます。

Insight でちゃんとあるかどうか確認するとよいと思います。

Go言語なのでコンパイルすればWindowsでも動くと思います。 試していませんが。

次は実際にブロックをダウンロードできるようにして、さらに並列ダウンロードに対応して bootstrap.dat の高速生成なんかができたらいいなぁと妄想しています。

最終的には electrum-server のお供にできるようにしたいです。

にほんブログ村 その他生活ブログ 仮想通貨へ
にほんブログ村

ビットコインピアと直接通信してみたい

タイトルでビットコインピアと直接通信してみたいと書いてみましたが、実はすでにアルトコインとはDNS Seedというサービスで通信しております。

http://seed.sighash.info/

ソースはこれ。

https://github.com/ohac/dnsseed-ruby

これはdnsseedというPHPで書かれているコードをRubyに移植したものです。

ただ、これで通信しているのは以下のような流れで、ほんの少ししかコマンドを使っていないのです。

  • version, verack でバージョンと最大ブロック高を送受信
  • getaddr で既知のピアの情報をもらう

一方、bootstrap.datを作成するためのblockchain2torrentというのがあります。

https://github.com/ohac/blockchain2torrent

これはRPCで通信しているので、自分で立ち上げたノードとしか普通は通信できません。

これは以下のRPCコマンドを使っています。

  • getinfo - 最大ブロック高を得るためだけに使用
  • getblockhash - 指定したブロック高のハッシュ値を得る
  • getblock - 指定したハッシュ値からブロックそのものを得る

これら3つのコマンドをRPCなしで得られれば、自分でノードを立ち上げる必要がなくなります。

ノードが信頼できるかどうか分かりませんので、なんらかの基準を設けて選定し、さらに複数ノードでベリファイするような処理が必要ですが、実験やbootstrap.datを得るためだけであればあまり慎重にならなくてもよいかもしれません。

さらにbitcoin-abeやelectrum-serverを動かすには下記RPCコマンドも必要となります。

  • bitcoin-abe, electrum-serverに必要
  • electrum-serverに必要
    • sendrawtransaction - 送金などのbroadcastで必要
    • estimatefee - feeの計算で必要
    • getinfo - relayfeeも見る必要がある

ここまでサポートできたらSPVが各種コアデーモンを立ち上げずに実現できるのでうれしいかもしれません。

にほんブログ村 その他生活ブログ 仮想通貨へ
にほんブログ村