Go言語でBitcoinの署名を検証してみた(その1)

最近はGo言語のトレーニングをしていますが、慣れていないので結構大変です。 早くいろいろと記憶して楽になりたいです。

ところでgocoinというソフトがあり、その中にsecp256k1というライブラリがあったので、これを使ってBitcoinの署名を検証してみました。

GitHub - piotrnar/gocoin: Full bitcoin solution written in Go (golang)

gocoin自体は非商用利用可のライセンスのようですが、secp256k1はMITライセンスとなっておりました。 gocoinのbtcというのを使えば簡単ではあるのですが、MITライセンスの方がよいので、とりあえずsecp256k1だけを使ってみました。

https://gist.githubusercontent.com/ohac/d58c474ad9aa74917ccd/raw/9a0c2011ceaefa58bab5e44d35835f0b670b3caf/verify.go

今のところ、このコードでは公開鍵のhex列がないと検証できませんが、一応動いております。 署名の形式もチェックしていないので、古いクライアントで署名したものだとうまくいかないかもしれません。 ちなみにこのテスト署名はElectrumを使って署名したものです。

Bitcoinアドレスは公開鍵そのものではなく、公開鍵のハッシュ値なんですね。 だからこんなに短くできるのかと納得しました。

Bitcoinアドレスで検証するためにはどうやら署名から公開鍵に戻して、そのハッシュと比較するようです。 今回は疲れたので、このへんでやめときます。

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

暗号通貨を使ったプロトコルを考えてみる

ここ何日か暗号通貨を使ったサービスを考えていたが、結局のところどのようなサービスでも共通している部分はプロトコルにしてしまった方がよいのではないかと考えるようになった。

なんとなく考えているイメージは以下のようなもの。

  • 基軸となる暗号通貨を決める(Bitcoin, Altcoinなど)
  • メッセージングのプラットフォームを決める(メール、Web、専用アプリなど)
  • メッセージングのデータフォーマットを決める(JSON, MessagePackなど)
  • 受付用のウォレットアドレスを決める
    • 公共・分散的なものの場合はスパム防止の意味でProof of Burnを選択

これらのパラメータは各々のサービス提供者が決めればよい。

あとはサービス提供者が受け取ったメッセージをどのように扱うかというところ。

サービス利用者は専用のウォレットアドレスを1つ決め、メッセージに対して署名し、サービス提供者に渡す。通信経路が暗号化されていない場合はオプションで暗号化してもよい。

場合によっては利用者に対して返信する必要があるので、そのようなメッセージングプラットフォームを選択するか、もしくはウォレットアドレスで暗号化してWebなどでブロードキャストしてもよい。

サービス提供者は受け取ったメッセージを検証し、問題なければメッセージに書かれている要求内容を確認し、入金などの条件を満たしておればそれを実行するといった感じ。

例えば以下のようなサービスが考えられる。

  • ストレージの提供
  • 計算資源の提供
  • 翻訳
  • 広告

現状ではこれらをまとめて簡単に構築できるようなフレームワークがないと思うので、いつか作ってみたいと考えている。

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

ブロックチェイン上でKVS(Key-Valueストア)が使えるBlockstoreを調べてみた

Qiitaの記事で言及のあったBlockstoreというやつを調べてみました。(試してはいません。)

qiita.com

blog.onename.com

これはどうやらストレージ自体はブロックチェインに置かずに別の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ギフト券などがビットコインで買えるとのことなので、ちょっと試してみました。

amaten.com

まずは最初なので1,000円分の入金を試してみたところ、0.01952744BTCの請求がありました。 このときのcoincheckでの相場が51,405円から51,424円でしたので、1,003.8円から1,004.2円程度の価値だったと思います。 まだ1回しか試してはいませんが、0.5%ぐらいの手数料に相当すると考えておいてよいのかもしれません。

coincheck.jp

30分以内に送金を済ませる必要があるようで、すぐにElectrumから送金してみました。 リンクが表示されていたので、そのリンクをコピーし、Electrumの送金アドレスの部分にペーストすると金額も込みで自動的に入力されました。

ネットワークへの送金手数料は大体10円ぐらいなので、トータル1015円程度のコストだったと思います。 金額がもっと大きければ送金手数料の比率が下がるので、頻繁に使うならもっとまとめた方がよさそうです。

amaten側では割とすぐに入金確認が完了し、ギフト券が買える状態となりました。 試しに250円のギフトカードを240円で買ってみました。4%オフですね。期限は2016/12末でした。 これで1,000円分買ったとすると、40円余るので25円程度お得だったということになります。

Amazonだと4%オフぐらいですが、iTunesだと12%オフとかもあるので、iTunesユーザーだと結構お得ですね。

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

monacoindを走らせつつbootstrap.datを共有するVagrantfile

作りました。

gist.github.com

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サーバをセットアップしてみたいですね。

Dropbox - You're invited to join Dropbox!

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

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

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