ブロックチェイン上でKVS(Key-Valueストア)が使えるBlockstoreを調べてみた
Qiitaの記事で言及のあったBlockstoreというやつを調べてみました。(試してはいません。)
これはどうやらストレージ自体はブロックチェインに置かずに別のDHT(分散ハッシュテーブル)に置くようです。 ブロックチェインはBitcoinを使っており、おそらくハッシュ値だけを記録しているものと思われます。
ドキュメントを読んだ感じではNamecoinをかなり参考にしてそうな感じで、名前(name)の登録手順は似ていました。 Namecoinは独自のブロックチェイン上にデータを置いていましたが、BlockstoreはDHTに置くという違いがあります。
名前空間(namespace)の登録もできるようですが、0.4BTC以上と結構お高いので、普通は最初から用意されている .id という名前空間を使うことになりそうです。 例えば ohac.id みたいな感じでしょうか。名前空間上には名前空間の保有者でなくても名前を登録することができるようです。
名前は長さや記号の有無などでコストが変わるようで、長い文字列なら250uBTCで済むようです。 これらのコストは下記のProof of Burnのアドレスに送られるようです。
https://blockchain.info/address/1111111111111111111114oLvT2
1つの名前にはJSON形式でデータが保存でき、サイズの上限は8KBとなっているようです。
問題はDHTノード群をどのように維持していくのかといったところかと思います。
FAQを見たところ、現状ではノードを走らせるためのインセンティブがないようです。
Sybil attackも可能なようなので、DHT上にはいくつか冗長保存されるとしても少し安心感に欠けるように思います。
追記: Sybil attackについてはhttps://en.wikipedia.org/wiki/Kademlia#Next_generationに言及あり。
どの程度冗長保存されるのかまだ調べておりませんが、DHTノードだけを独立で走らせることができないのであれば各ノードはBitcoinの数十GBとDHTの両方を保存するためのストレージが必要となり、なかなかお気軽にノードを立ててみようとは思えないです。
追記: https://en.wikipedia.org/wiki/Kademlia#Locating_resources に少し書いてありました。具体的な数値はパラメータによるのかも。
このあたりがもうちょっと改善されればよさそうですね。
1,000円分のビットコインをamatenに入金してAmazonギフト券を買ってみた
amatenでAmazonギフト券などがビットコインで買えるとのことなので、ちょっと試してみました。
まずは最初なので1,000円分の入金を試してみたところ、0.01952744BTCの請求がありました。 このときのcoincheckでの相場が51,405円から51,424円でしたので、1,003.8円から1,004.2円程度の価値だったと思います。 まだ1回しか試してはいませんが、0.5%ぐらいの手数料に相当すると考えておいてよいのかもしれません。
30分以内に送金を済ませる必要があるようで、すぐにElectrumから送金してみました。 リンクが表示されていたので、そのリンクをコピーし、Electrumの送金アドレスの部分にペーストすると金額も込みで自動的に入力されました。
ネットワークへの送金手数料は大体10円ぐらいなので、トータル1015円程度のコストだったと思います。 金額がもっと大きければ送金手数料の比率が下がるので、頻繁に使うならもっとまとめた方がよさそうです。
amaten側では割とすぐに入金確認が完了し、ギフト券が買える状態となりました。 試しに250円のギフトカードを240円で買ってみました。4%オフですね。期限は2016/12末でした。 これで1,000円分買ったとすると、40円余るので25円程度お得だったということになります。
Amazonだと4%オフぐらいですが、iTunesだと12%オフとかもあるので、iTunesユーザーだと結構お得ですね。
monacoindを走らせつつbootstrap.datを共有するVagrantfile
作りました。
config.vm.box = "ubuntu-14.04"
の部分はお好きなboxをご指定ください。(Ubuntu 14.04系ならだいたいいけると思います。)
A list of base boxes for Vagrant - Vagrantbox.es
bootstrap.datはDropboxに置いてまして、それをWebseedで指定しています。 ノード提供にご協力いただけたらありがたいです。 ポートは6999で設定しておりますので、これを公開していただければさらにグッドです。 あと、その場合はついでにmonacoindのポート9401もお願いしたいです。
ちなみにbootstrap.datを使うよりも普通に接続した方が高速という見解もあるみたいですが、ノードの場所や数、性能、通信環境によってはそうとは言い切れないように思いますので、私としては今もbootstrap.datを支持しております。実際、MonacoinやDogecoinを試しに普通に立ち上げてみたところ、ものすごい時間がかかったため途中であきらめました。BitTorrentクライアントはmonacoindのようなフルノードを動かすよりも少ないリソースで簡単にマルチプラットフォームで動くので、ついでに動かしておいて損はないように思います。
次回はElectrumサーバをセットアップしてみたいですね。
torrentにWebseedを追加するスクリプト
UbuntuなどのCD/DVDイメージをダウンロードするときに、torrentがサポートされているケースがよくありますが、なぜかWebseedが有効になっていないことが多いです。
こういったときは次の手順で簡単にWebseedを追加することができます。(Rubyが必要です。)
まずは礼儀正しく、bundleを使います。
$ bundle init
$ vi Gemfile
次に使用するgemを指定します。
source "https://rubygems.org"
gem 'bencode'
addwebseed.rbというファイルを以下のように作成します。
require 'bencode'
a = ARGV
t = a.shift
tr = BEncode.load(File.open(t, 'rb', &:read))
tr["url-list"] = ((tr["url-list"] || []) + a).uniq
File.open(t + '.new', 'wb'){|fd|fd.write(BEncode.dump(tr))}
puts tr["url-list"].join("\n")
以上で完成。
使い方は次の例を参考にしてください。Ubuntu 15.10 Serverでの例です。
$ wget http://releases.ubuntu.com/15.10/ubuntu-15.10-server-amd64.iso.torrent
$ bundle exec ruby addwebseed.rb ubuntu-15.10-server-amd64.iso.torrent \
http://releases.ubuntu.com/15.10/ubuntu-15.10-server-amd64.iso
Ubuntu 14.04 LTSのVagrant Boxを作ってみた
Building a Vagrant Box from Start to Finish
を見ながら、Vagrant Boxを作ってみたので、手順をメモしておく。
まず、ベースとなるUbuntu 14.04 LTS ServerをVirtualBoxで作る。
- .isoを入手。aria2cとかdelugeとかでtorrentを使うとよいかも。
- 選択肢は無難なものを選択(USキーボードとか)
- ローカルタイムはとりあえずJSTにした。バグ出しをするならUTCとかの方がいいかも。
- ユーザー名はvagrant、パスワードもvagrant
- rootもパスワードをvagrantに設定しておく(これは好みかも)
- パスワードなしでsudoできるようにする。
- USB, Audioといった環境依存なものはオフ。
- SWAPなし
- NATでホストの2222をゲストの22に接続
- authorized_keysにデフォルトの秘密鍵を設定。sshd_configで有効にする。
- 最新パッケージにupgradeしておく
- 最後にhistory -rとかapt-get cleanとかしておいた方がよいかも。
- 好みでguest toolsを入れる(私は入れなかった)
完成したら、そのイメージの名前を指定して、package.box化する。
vagrant package --base ubuntu-14.04
package.boxをvagrant addする。
vagrant box add ubuntu-14.04 package.box
Vagrantfileのひな型を作成。
vagrant init ubuntu-14.04
Vagrantfileを編集し、guest toolsを入れてない場合はsynced_folderを無効にする。
config.vm.synced_folder ".", "/vagrant", disabled: true
立ち上げてSSH接続できることを確認。
vagrant up
vagrant ssh
うまくいかないときはGUIモードにして、いろいろ確認するとよいかも。 メモリも次のような感じで調整できる。
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.memory = "1024"
end
Electrumにbitcoindのlistsinceblockっぽいコマンドを追加してみた
bitcoindにはあるブロック以降のトランザクションを得るためにlistsinceblockというコマンドがあるが、Electrumには存在しない。 このコマンドがあれば、前回からの変化をチェックしやすくなるため、Webサービスでelectrum daemonを使う場合はぜひ欲しい機能である。
ということで作ってみた。
使い方は普通にlistsinceblockを呼ぶだけ。
$ ./electrum listsinceblock
[
{
"confirmations": 1001,
"height": 388000,
"txid": "xxxx",
"value": 0.04567
},
{
"confirmations": 1000,
"height": 388001,
"txid": "xxxx",
"value": 0.01234
}
]
オプションなしだと、このように全トランザクションが得られる。
$ ./electrum listsinceblock --height 388000
[
{
"confirmations": 1000,
"height": 388001,
"txid": "xxxx",
"value": 0.01234
}
]
--heightオプションを付けるとそのheightよりもあとのトランザクションだけが得られる。
valueは小数なので、satoshiの整数もあった方がよいかも。
electrum-ltcのpaytomanyでコインを移動してみた
以下のようにして、手数料0で送信元アドレスを指定し、2箇所の送信先に0.3と0.2を送ってみた。 残高はチェンジアドレスに送信元アドレスを指定して残るようにしてみた。
$ electrum-ltc paytomany -f 0 -F L... -c L... '[["L...", 0.3], ["L...", 0.2]]'
Password:
パスワードが設定されている場合はパスワードを聞かれるので入力する。 (なお、RPCの場合はパスワードを空にして、暗号化なしにしておく必要があるようだ。)
すると以下のようにhexが得られる。
{
"complete": true,
"hex": "01000000015...."
}
これをbroadcastしてみる。shellのhistoryに覚えさせたくないので、先頭にスペースを入れる。
$ electrum-ltc broadcast 01000000015....
すると次のようなエラーが出て拒否される。
The transaction was rejected by network rules.(66: insufficient priority)
どうやらFeeが少な過ぎるらしい。Feeを少しずつ上げてリトライしたところ、0.001LTC(0.5円ぐらい)でうまく行った。
$ electrum-ltc paytomany -f 0.001 -F L... -c L... '[["L...", 0.3], ["L...", 0.2]]'
$ electrum-ltc broadcast 01000000015....
..txid..
BTCよりお安く試せると思っていたのに期待外れだった。
Abeで確認してみると0.3は0.29999999となっており、浮動小数点で解釈されているようだ。 厳密な端数を扱うことはできないのかもしれない。
最新のelectrum(BTC)では浮動小数点の問題が起きないように対策されてそうに見える。 また、broadcastの引数はJSON形式に変わっているようで、'"0100..."'みたいな感じで指定しないといけなくなったようだ。