ビットコインの情報サイトの運営者ブログ

サイトには掲載していない仮想通貨に関する時事的な情報や個人的な感想など。中級者以上向け。

bitcoin.orgに警告文が掲載、Bitcoin Coreが改ざんされていないか検証する方法

ビットコインの公式クライアントであるBitcoin Coreの新バージョン0.13.0が数時間前にリリースされました。このバージョンではSegwitのコードが初めて含まれることとなりますが、コードが含まれているだけでまだ有効化はされていないので、実質的なSegwitの実装は0.13.1になるものと思われます。

ところで、0.13.0のリリースの数日前にbitcoin.orgに謎の警告文が掲載されました。主な内容は、国主導(中国政府?)のアタッカーがBitcoin Coreのバイナリ(実行ファイル)を攻撃する恐れがあるから注意してダウンロードして使用するように、というようなものです。ただし、この警告文はbitcoin.orgの共同管理者の一人であるCobraという人の一存で勝手に掲載されたもので、表立ってなにか脅迫文なようなものが送られてきたというような情報は一切明らかになっておらず、なぜいきなりこのような警告文を乗せたのかは不明です。

とはいえ、仮に脅迫のようなものがあってもなくても常にbitcoin.orgのようなウェブサイトがハッキングされてBitcoin Coreの実行ファイルが改ざんされる恐れは常にあるので、この記事ではダウンロードしたファイルが改ざんされていないかどうかを検証する方法を書きたいと思います。

実際にここまでやっている人はほとんどいないですし、通常のユーザーは検証する必要もないと思いますが、ハッシュを計算したり電子署名を検証したりとビットコインの基礎的な技術とも関係するので暇なときに試しても面白いと思います。

(お金が直接関係するソフトなので理想を言えばやったほうが良いですが、手間を考えると非現実的なので、更新直後にダウンロードするのではなくしばらく待ってから何らかのトラブルがないか身近なコミュニティで確認した後にダウンロードすると良いでしょう。)

なお、記事を書いている時点ではBitcoin Core 0.13.0のビルド(ソースコードから実行ファイルを作成する手順)後のものがまだ公開されておらずインストーラー等は準備されていないので、0.12.1を例にします。

①Bitcoin Coreをダウンロード

好きなところから自分のOSに合ったBitcoin Coreをダウンロードします。Bitcoin.orgでは以下のURLにまとめて保存されています。

https://bitcoin.org/bin/

②署名をダウンロード

ダウンロードしたソフトが改ざんされていないことを証明する署名をダウンロードします。先ほどのURLにある「SHA256SUMS.asc」です。

ファイルをメモ帳などで開くと、以下のようにBitcoin Coreのファイルのハッシュ値が署名に添えて書かれていることが分かります。

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

abf0e7336621250702d7a55487c85b8de33c07a30fbc3ecf7f56c97007fcb4ce  bitcoin-0.12.1-linux32.tar.gz
54aca14b7512801ab78cc93f8576e1b66364a890e8017e8a187e4bf0209fd28c  bitcoin-0.12.1-linux64.tar.gz
91d14dcb9b88ca845df450ceb94250bb5c9a0d514d8ca0c55eb480d0ac77ef32  bitcoin-0.12.1-osx64.tar.gz
e1bc86d24dd978d64b511ada68be31057c20789fb9a6a86c40043a32bf77cb05  bitcoin-0.12.1-osx.dmg
08fc3b6c05c39fb975bba1f6dd49992df46511790ce8dc67398208af9565e199  bitcoin-0.12.1.tar.gz
fba73e4825a6421ce6cc1e48b67ff5f2847ae1b520d26272e69f7f25de4f36d1  bitcoin-0.12.1-win32-setup.exe
148fb438a32f1706a366a7825bbc5e770e5f9a20e5694f724a443275976a0791  bitcoin-0.12.1-win32.zip
c6e06f90e41c36c9a447f065952869e2d7d571ab34b86d061ae19ec25b2799d4  bitcoin-0.12.1-win64-setup.exe
d8e1ab9ff65b79c130ec6af8e36626310ffdaf6aacb7a40cfb76e7a63bdfcfd5  bitcoin-0.12.1-win64.zip
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAEBCAAGBQJXEIwgAAoJEJDIAZ42wulkXNcP/Re0iawPi8muiq6J36ZUZKws
KL2nwjCImj91on8wGoTUir1IytuIafA4JMHslos2Ak3za2UKAEZrEfx0dXm/FVql
AgRneYLYedMQ8127UkSho4rxuwjB3h2gR/FGPpPT0PmbNTWOFsKtV1V9zwsCeA9Q
br/ly2BfZHWsS1tpSK5ukP5W0q+Ii2fO4pcfaAsS2y/gc5kyj5hTiKQivwBVXoVA
cyH1splq1foM5BYwOuT/cUKGrpA8fWo7+xOaEhhFBlW0oJaSXcNSK9mVTSI/dQ/2
lINXcWBtotnH6/evS35pAIOe4PHg/URhXNT/Sdfwts4YL5nMtF+SPBrJWadPvx3C
qdSDZKMuM0cDjVg1F4rjoWAxyshWNKKU2J+qkNUBZ1LbpVyDR3Gl4LFwRjaw0wyZ
n6zHonPCtp33ErhsaY0GryHV1pKvL1h6uyDNWHbYpKny4F+TvbyQ6XNVHrx1IAn5
+9UMPB3Q962/8hrRqK95Cs6AJ/D1Wdw9rwEqOC48waDzttYCVknn4L6rGECDdRM4
6pbWNTf3m9lzThWjiuEdNnPoNuKoBD9/UHWW/WRHjT6tbcGqstoyRKTsi8jjmwnC
9g4xWRsTdqYIAL4PBv32T+QYW/YcyRNTT97t/M0aukXxxxjCObehWVmBXVeNn0/9
lvvCgGgSJXtJHxzqcJ2I
=a2/6
-----END PGP SIGNATURE-----

 ③Bitcoin Coreのファイルのハッシュ値を確認

続いてSHA256によりハッシュ値を計算します。Windowsの場合は、コマンドプロンプトを開いて作業用のフォルダに移動した後「certUtil -hashfile bitcoin-0.12.1-win64.zip SHA256」などと入力します。

※Macの場合は「shasum -a 256 bitcoin-0.12.1-osx.dmg」、Linuxの場合は「sha256sum bitcoin-0.12.1-linux64.tar.gz」など。Windows含めてOSのバージョンによっては違うかもしれません。

すると、ハッシュ値が表示されるので②に書かれているハッシュ値と一致するかどうか確認します。一致していれば改ざんされていないと確認できます。

④署名が正しいことを確認する

簡易的な確認であれば、③までで十分ですが、②内のハッシュ値が改ざんされている可能性もゼロではありません。そこで②のファイルも正しいかどうか確認します。

④-1:検証のための準備

検証のためにGnuPGという公開鍵暗号方式の暗号化ソフトを利用します。各OSごとにバージョンが用意されているので好きなものをダウンロードしましょう。

https://www.gnupg.org/download/index.html

ダウンロードしたらインストールします。Windowsの場合、KleopatraというGUIソフトも同時にインストールされますが、基本的にはコマンドプロントからコマンドをうって利用することになります。

④-2:PGP公開鍵をダウンロード

②のファイルはBitcoin Coreの開発者の一人であるWladimir van der Laanにより署名されています。そこで彼のPGP公開鍵をダウンロードします。

https://bitcoin.org/laanwj-releases.asc

上のURLのようにBitcoin.orgにもアップロードされていますが、ハッキングされて改ざんされる可能性も考えて複数の場所からダウンロードして確認するのが理想です。

④-3:公開鍵をインポート

先ほどダウンロードした公開鍵をインポートします。コマンドプロンプト(ターミナル)を開いて作業用フォルダに移動した後「gpg --import laanwj-releases.asc」と入力するとインポートされます。

④-4:②の署名ファイルを検証

続いて②の署名ファイルが正しいか検証します。「gpg --verify SHA256SUMS.asc」と入力します。正しければ「Wladimir~(中略)~からの正しい署名」と表示されます。不正な場合は「不正な署名」と表示されるはずです。

ちなみにこの際、この鍵は信用できる署名で証明されていません!という警告が表示される場合がありますが、自分自身の鍵を作成していないために発生する警告文なので、ファイルの改ざんを確認するだけの用途であれば無視して構いません。

⑤複数人の署名を確認する

一応は④までで完了ですが、Bitcoin Coreは信頼性を高めるためにGitianという方法により複数人のグループによってビルドされています。そこで、先ほど使用したWladimir van der Laan以外の署名を確認することも可能です。

それぞれの署名は以下のgithubのページに保管されています。

https://github.com/bitcoin-core/gitian.sigs

各バージョン、OSごとに分かれており、特定のバージョンのフォルダを開くと署名した人ごとにフォルダが分類されているのが分かります。最下層には生のファイル(拡張子:assert)と署名ファイル(拡張子:sig)があるので、両方をダウンロードします。生のファイルは②と同様にBitcoin Coreのハッシュ値がかかれています。

署名をした人のPGP公開鍵を④-2のようにダウンロード、インポートして「gpg --verify bitcoin-win-signer-build.assert.sig bitcoin-win-signer-build.assert」と入力すれば検証が行われます。

PGP公開鍵は各自探してくださいとしか言えませんが、bitcoinのgithubのページにもまとめて保存されているので参考にしてみてください。

https://github.com/bitcoin/bitcoin/tree/master/contrib/gitian-keys

(4か月前に移動されたばかりで今後も場所が変わる可能性があるのでご注意を)

他のソフトについて

本記事では実際にウォレットとして使っている人はほとんどいないであろうBitcoin Coreの例を紹介しましたが、他のソフトでもふつう署名やハッシュ値も同時に公開されているので、同様の手順で改ざんされていないか検証を行うことができます。

例えばElectrumの場合も以下のダウンロードページに署名(signature)が添えられています。

https://electrum.org/#download

Electrumの場合は、Bitcoin Coreと違いハッシュ値が署名ファイルには表示されていませんが、「gpg --verify electrum-2.6.4.exe.asc electrum-2.6.4.exe」などと入力すれば署名と実行ファイルを検証することができます。

もちろん事前に署名者のPGP公開鍵もインポートしておいてください。Electrumは製作者のThomasVによって署名されており、Electrum関連の人の公開鍵はgithubにまとめられているので参考にしてください。

https://github.com/spesmilo/electrum/tree/master/pubkeys

The DAO事件から考えるパブリックなスマートコントラクトプラットフォームの未来

たまにはポエムを書きます。

パブリックな「スマートコントラクトプラットフォーム」の定義

スマートコントラクトの定義は曖昧で共通認識は定まっていませんが、本記事ではブロックチェーン上でユーザーが自由にプログラムコードを記述することができるプラットフォームのことを「スマートコントラクトプラットフォーム」と呼ぶことにします。具体的にはEthereum、Lisk、Expanse、Rise(時価総額順)などです。

The DAO事件から見えること

これらのプラットフォームは、どんなプログラムも動作させることのできる分散型コンピュータとして大きな利点ばかり以前は宣伝されてきましたが、The DAO事件から欠点も見えてきました。それは、①プログラムには必ずバグがつきまとう②そのバグを容易に修正することができない、ということです。

①については、ある意味常識的な話でどんなプラットフォームを利用していようがプログラムを書く上でバグはつきものであり、どんな優秀なプログラマーであろうがバグを一つも出さないというのは不可能と言えます。従来のプログラムは例えバグが発生してもすぐ修正しても済む話なので大抵大きな問題にはなりませんが(時には大きな問題になることもありますが)、Ethereumの場合はそのバグをたとえ発見しても迅速に修正することが難しいので致命的になり得ます。

バグの修正能力をどこまで柔軟に持たせるか

そこで、このようなプラットフォームはどこまでバグに対して柔軟に対処させるか、ということが問題になります。Ethereum上で一度動かしたスマートコントラクトは永遠に止めることができないために事件は起きてしまいました。しかし、ではEthereum上のスマートコントラクトに全くバグに対する耐性がないかというとそういうわけではありません。Ethereum上のプログラム(スマートコントラクト)は他のプログラムからのトランザクションを受けて実行させることができるので、例えばバグを修正した新たなプログラムを作成し、元のプログラムから新しいプログラムに内部の保存データを移し「バージョンアップ」することも可能です。The DAOの場合は修正のために内部トークンの保有者の投票による賛成が必要であり「バージョンアップ」のハードルが非常に高かったので、迅速に対応することができず、バグが修正されることなく終了ということになってしまいました。

今回は正確にはバグ修正というかたちではありませんでしたが、ハードフォークもバグ修正の方法の一つといえるでしょう。

事件から感じたのは、バグを修正する「権力者」をスマートコントラクトに対して置くことが現段階ではまだまだ必要であるということです。

※超単純なプログラムであったり、十分な期間十分な人間によって安全だと確認されたプログラムはこの限りでありません。

完全な「信用が不必要」(trustless)は不可能

バグを修正する権力者を置くことは、当然その権力者がプログラムを悪意を持って改変する可能性があるということなので、プログラムを利用する上では権力者を信用しなければなりません。これは、信用が不必要(trustless)というEthereumなどの分散型プラットフォームの理念と真っ向から対立するものとも言えます。

しかし、コードを簡単に修正できないようにすれば「信用」が必要なくなるわけではありません。多くの人はプログラムコードを読むことができないので、プログラムを書いた人間、あるいはそのプログラムを監査してバグがないと発信する人間を信用せざるを得ません。仮にどんな言語で書かれたプログラムも完璧に読める天才であったとしても、いちいち自分が利用するプログラムのソースコードをすべて読み込むのは非現実的です。

そして、trustlessだったはずのコードに裏切られるかたちで事件が起きてしまいました。いろいろな意見があると思いますが、個人的にはThe DAOのコードを書いた開発者が無能だとかコードをチェックした開発者が無能であるとは思いません。プログラムにバグは必ずつきものなのです。

Ethereumのハードフォークには違和感

当初は特に書きませんでしたが、私自身はEthereumのソフトフォークにもハードフォークにも反対でした。なぜなら、Ethereum本体のバグではなくThe DAOのコードのバグであったことと、The DAO(+Ethereum)はそもそもこのようなバグに対して最初から迅速・柔軟に修正できる能力を放棄することによって「trustless」の理念を宣伝していたと思っていたからです。当初掲げていた理念と真逆のことを宣言されては違和感を感じてしまいます。唯一納得でき得る根拠は、ETHが盗難されることで将来Proof of Stakeに移行する際の懸念となるというものでしたが、この点もメインの根拠として議論されていたわけではなくまたPoS実装自体はまだまだ先でいくらでも対応のしようがあると思うので、それでも不十分であると感じていました。

ちなみにEthereum Classicにも反対です。フォーク前だったら支持したでしょうが、マイナーがフォークを支持した後の今となっては、ETCはReplay Attackなどの混乱を生むだけですし、開発を行う上でも余計複雑になって結果的にEthereum全体のマイナスとなると思うからです。

「ロールバック」を是とするならEthereumよりLisk

結果的にEthereumのコミュニティはハードフォークを支持して、コード上で書くことによって強制的に引き出されたETHを移動させて実質的な「ロールバック」を行うことになりました。

しかし、もし「ロールバック」を良しとするのであれば、Ethereumはベストの選択肢ではないと思います。なぜなら、Ethereum本体とは直接関係ないはずの一ユーザーが書いただけの一つのコントラクトコードの脆弱性のせいでEthereumの全利用者を巻き込まなければならないからです。

Liskのようにプログラムごとに独自のブロックチェーンを立ち上げるサイドチェーンを利用していれば、本体のブロックチェーンへの影響は最小限にそのサイドチェーンやプログラムの利用者の範囲内だけでロールバックが可能です。サイドチェーンであればコンセンサスアルゴリズムを自由に選ぶこともできるので、プログラムの修正もより柔軟に行うことが可能で、迅速な修正・対応を目的とするのであればEthereumよりもLiskが優れていると言えます。

※コンセプトだけを見ればLiskは優れていると感じていますが、個人的には開発チームの開発力に対する懸念やスマートコントラクト(DApps)の開発コミュニティがEthereumに比べて非常に小さいことなどから、必ずしもLisk自体が成功できるとは思っていません。

Ethereumの理想は遠い?

プログラムからバグを完全になくすことは不可能ですが、十分に単純であったりかなり長い期間、多くの人による検証が行われればある程度までバグの混入確率を減らすことは可能です。十分長い期間を掛ければ当初Ethereumが提唱していた改ざん・検閲不可能で止めることができないスマートコントラクトを安全に実行することもできるかもしれません。

しかし、利用者からみればコード開発者やそのコードを信用するのが完全に不要になることは永遠にありません。0か100かという話ではなく、どこにどの程度信用を置くのかということになってくるのでしょう。

半減期後にビットコインの価格が下落してマイナーの採算が取れなくなったらどうなる?

先日、香港の大手取引所Bitfinexのハッキング事件によってビットコインの価格が大きく下落しました。この件はこの件でいろいろと興味深いものの、情報が錯綜している部分もあるのでしばらく様子を見たいと思います。

今回は、収入が25BTC/ブロックから12.5BTC/ブロックに半減してしまったのにも関わらず価格が下がっている現状に関して、ビットコインの基本的な仕組みにはなりますが、マイナーの採算が取れなくなったらビットコインはどうなるか?について書いてみます。

長期的な視点

マイナーの採算が取れなくなったら、一部マイナーは採掘を止めてしまうことが考えられます。そのため、一時的にビットコインの採掘速度(ハッシュレート)が低下し、ブロックの生成間隔(取引の承認時間)が長くなってしまうことが考えられます。しかし、ビットコインにはdifficulty(採掘難易度)の調整が2016ブロックに1回(約2週間に1回)行われるので、ちょうど生成間隔が10分になるように調整された後はこれまでと同じように何の問題なくビットコインが続いていきます。

ビットコインの価格について書かれたサイトでは、マイナーの損益分岐点の話をしている記事をしばしば目にしますが、当然のことながら損益分岐点は変動します。

今回の場合、マイナーが減少⇒difficultyが減少⇒ハッシュレート(採掘力)あたりのブロック生成確率が上昇、という流れになりマイナーの損益分岐価格は下がることになるわけです。

例えば半減期前の損益分岐価格は40,000円/BTCだったとします。その他の条件が全て変わらないとすれば、半減期後は収入が半分になるので損益分岐価格は80,000円/BTCとなります。よってビットコイン価格が8万円以上にならないとマイナーの採算は取れなくなってしまいますが、マイナーが採掘を取りやめてdifficultyが減少すれば、採掘を続けているマイナーの利益率は上がっていくため、それに伴い損益分岐価格も80,000円/BTCから下がっていくことになるのです。

このようにビットコインにはハッシュレートの下落に対応できる仕組みを備えており、マイニングプールの集中化や一時的な取引承認時間(ブロック生成間隔)の増加などの懸念がないわけではないですが、成長し続けなければ破綻するというポンジスキーム的なものにはなっていません。

短期的な視点

問題とされるのが短期的な影響です。問題の最大の原因は、2016ブロックに1回、約2週間に1回「しか」difficultyの調整が行われないことにあります。この点は早くから問題にされ、今ではほとんどのアルトコインで1ブロック毎にdifficultyの調整が行われるよう設定されています。

実際に約半年前にビットコインの開発チームのメーリングリストで、difficultyの調整アルゴリズムをハードフォークによって修正するコードを用意すべきではないか、ということが議論になったこともありました。

メーリングリストの中で、もし価格が下落することによってハッシュレートが50%下落した場合、それによってブロックの生成間隔は20分となり、1ブロックあたりに含まれる取引量も2倍になるという仮定が挙げられています。現在のブロックサイズの上限は1MBであり、最近はその上限に近づいているので、仮にハッシュレートが半減しようものなら、ブロックサイズの上限から溢れて多くの取引がブロックに取り込まれない状況が続き、順番待ちの取引が無限に増えていくことになるわけです。ビットコインを送信しても全然承認されない、というのは大問題となります。このような状況となり、多くの人がビットコインはもうおしまいと思ってさらに価格が下落すれば、マイナーの採算が取れなくなってさらにどんどんハッシュレートも下がってしまう悪循環に陥ってしまうのです。

difficultyさえ調整されれば問題はありませんが、調整は2016ブロックに1回しか行われません。通常通り10分間隔でブロックが採掘されれば約2週間です。しかし、20分間隔になれば約4週間、最悪の場合は半永久的にdifficultyの調整がされないなんて可能性もあります。

万が一こんな状況になれば、ビットコインをハードフォークしてdifficultyを手動で設定するしかありません。

現実は?

先のメーリングリストでは議題に上ったものの、そもそもハッシュレートが急激に50%も下落するということは非現実的であると考えられ、実際には真剣に検討されることはありませんでした。(他にもハードフォークのリスクや新しい調整アルゴリズムの導入による脆弱性のリスクが大きすぎるため)

bitcoinwisdomによれば、半減期後のハッシュレートは下落傾向にありましたが、普段から観測されるような誤差範囲程度の下落にしかすぎず、しかも現在は回復傾向にあります。f:id:jpbitcoin:20160807152918p:plain

ハッシュレートが急激に下がることが非現実的である理由はいくつか考えられています。なかでも一番大きい根拠と考えられるのが、そもそもビットコインの採掘の経費は、マイニング設備への初期投資費用が多くを占め、継続してかかる(中国での)電気代は非常に少ないのではないか、ということです。中国のマイニング業者は、電気を一定量(例えば一年間分)ごと購入して支払っており、電気は貯めておくのが難しいので少なくとも購入した分は採掘し続けるだろうという話もあります。

実際の数値はよくわかりませんが、初期投資費用を無視してビットコインの採掘報酬(12.5BTC/ブロック)と電気代だけから考えれば、かなり高い利益率を上げられる、つまり損益分岐価格はかなり低いのではないかと考えられます。

いずれにしても、今回の半減期によるハッシュレートの低下は大方の予想通り限定的なものとなりました。2012年の1回目の半減期、2014年初めの中国での規制/Mt.Gox事件よるビットコイン大暴落、その他アルトコインの事例を見渡してみても、価格下落によるビットコインネットワークへの影響というのは小さいものと思われます。

Ethereum ClassicのReplay Attackとは何か?

先日コミュニティの多くの支持を受けてイーサリアムがハードフォークしました。一部がEthereum Classicとしてハードフォークに反対するバージョンを立ち上げブロックチェーンは分岐状態となっていますが、フォーク前には著名な賛同者がいなかったのでほどなく消えるものと思われました。しかし、ここにきて大手取引所のPoloniexがETC(Ethereum Classic, ETHC)のトレードを開始し、大手マイニングプールのF2Poolもマイニングを開始するというニュースが流れ少なくとも今すぐ消えるという状況ではなくなってしまいました。

ETCが無価値=0円になれば何の問題もありませんが、ETCに1円でも価値がある限り、特に取引所においてReplay Attackという危険性があります。

前提

ハードフォークは日本時間の7/20 22:30頃、1920000番目のブロックで行われました。このタイミングでイーサリアムのブロックチェーンはハードフォークを行うETHと行わないETCの二つに分岐しています。つまり、ハードフォーク直前にETHの残高があるアドレスに、誰でも等量のETHとETCを保有していることになります。

ETHとETCは全く同じアドレス・秘密鍵の構造やネットワークを利用しているので、「アドレスAからアドレスBへ10ETHを送信する」というトランザクションを送信すると、Ethereum Classicのノードもこれを受け取って同時に「アドレスAからアドレスBへ10ETCを送信する」トランザクションが送信されることになってしまいます。逆にEthereum Classic上で同じことを行っても同様の現象が発生します。

ただし、ハードフォークが行われたDAO関連のETHは全てEthereum Classicでは無効と見なされるのでETHのブロックチェーン上でしか移動が行われません。先日記事に書いたDAOと交換されたETHはEthereum Classic上のブロックチェーンでは存在し得ない(秘密鍵を所持していない)ことになります。

Replay Attackとは

ハードフォーク直前にあるETH残高はそのままETC残高に反映されるので、取引所のホットウォレット/コールドウォレットにETHがあるということは、同じ量のETCがあることになります。

何の対策もしていない取引所でハードフォーク後にETHの出金処理を実行した場合、同時にETCも引き出されることになります。ETCがただのゴミならいいのですが、現在は価値がついてしまっているのでこれが問題となります。

ETHとETCを個人のウォレットBに引き出してから、ETCだけ別のアドレスCに移しETHを再び取引所のウォレットAに預けた後、もう一回ETHの出金処理を実行すると再度ETCもウォレットBに一緒に引き出せてしまうのです。取引所のウォレットのETC残高が尽きるまで、ウォレットB(ETH)→A(ETH/ETC)→B(ETH/ETC)→C(ETC)へ移していく作業を繰り返せば一定のETHがあるだけで多額のETCを入手することができてしまいます。これがReplay Attackと呼ばれています。

この問題は秘密鍵がなくても自動的にプログラムにより送信処理が行われる取引所のウォレットなどに顕著なもので、ETHまたはETCのどちらかのアドレスの秘密鍵がわからない限り、基本的にReplay Attackはできないので1ユーザーのウォレットへのReplay Attackは心配する必要はありません。

日本の取引所は良く知りませんが(対策されていることを望みますが)、海外の大手Poloniex/Bitfinex/Krakenなどは対策されているようです。

追記:一般的にはETHとETCを同時に送信させること自体を「Replay Attack」と呼びますが、ここでは現実的な「攻撃」の例として取引所への攻撃を挙げています。

ユーザーが気を付けることは?

Ethereum Classicなんてどうでもいい、売って金になるとしてもどうでもいい、という人はいいのですが、そうでない人はハードフォーク後のETHの送信に気を付けなくてはなりません。ETHを送信する裏でETCも同時に送信することになるので、下手に取引所などに送ってしまうとETCが消失する可能性があります。

ETCを売りたいとき、現在のところ唯一対応しているのがPoloniexです。Poloniexの場合、ETHを送信すると同時にETCの残高にも反映してくれます。ただし、たまにETC側のノードが拾ってくれず、送信が遅れたり送信されなかったりすることもあるようなので、慎重に自己責任で行ってください。送信元のアドレスにETCがないともちろんPoloniex側のETCの残高には反映されないので、Ethereum ClassicのブロックエクスプローラーなどでETC残高を確認しておきましょう。

Ethereum Classic Block Explorer

※アドレスは小文字のみで入力しないと正しく表示されないようです。

ユーザーが取引所においてあるETHについて

Poloniexではユーザーが保有しているETH残高と同量のETCを付与することにしたようですが、他の取引所については各取引所側の判断となります。取引所がETCは取引所側の持ち分にすると決めてしまえば、ユーザーがETCを受け取ることは当然できません。ハードフォーク前に取引所にETHを持っていたとしても、そのままETCを持っていることにはならないので注意しましょう。

Ethereum Classicのウォレット

今の時点でEthereum Classicに標準対応しているウォレットはありません。Mistで別の名前のブロックチェーン保存用フォルダを作って、フォークを支持しないオプションを選んでからブロックチェーンをダウンロードすれば、ETHとETCを同時かつ分別して保管することも可能ですが、よくわからない人は触らないほうがいいでしょう。

Ethereum Classicが生き延びるとすればいずれウォレットが対応するはずなので、今の時点は何もしないか対応している取引所上に保管しておくのが無難だと思います。

ETHとETCを分けて送信する方法は?

ノードもウォレットも対応していないので、ETHとETCを分けて送信するにはスマートコントラクトを利用するしかありません。これもよくわからない人は、対応するまでは同時に送信されてしまう仕様だと思って触らないのが無難だと思います。

両方扱いたい場合、不便は不便なのでローカルのETC専用のアドレスを作ってからPoloniexに一度預けてから再度引き出して分別保管するのが安全かもしれません。(ただし上手くETCが送信できるかどうかはわからないので自己責任で。)

いくつかスマートコントラクトのコードが提案されているのでリンクだけ貼っておきます。

How to deal with the Ethereum Replay Attack — Medium

go ethereum - How to conditionally send ethers to another account post-hard-fork to protect yourself from replay attacks - Ethereum Stack Exchange

ttps://www.reddit.com/r/EthereumClassic/comments/4ucxdu/etc_and_eth_keep_them_separated/

Steemの長所と懸念を考察する

Steemシリーズはおそらくしばらくの間はこれが最後になります。Steemの長所と懸念について忘れないうちにまとめておきたいと思います。

長所

報酬を支払う主体がいない

コンテンツを投稿することにより報酬がもらえる、というようなSNSはこれまでにもいくつかありましたが、Steemのような分散型で誰も支払者がいないのに報酬がもらえるプラットフォームは初めてです。

今まで失敗したSNSはどうしても報酬コストがかかりすぎるため、ユーザーに報酬を支払い切れず企業として運営が成り立たないという側面がありました。Steemの場合は自動的に報酬を発行しており、根幹のシステムの部分はP2P型で一中央集権的企業ではなく各ユーザーが運営していることになるので、運用コストも少なく従来のものと比べると運営会社の倒産リスクなどが非常に小さいと思われます。そのため、一概に詐欺でどうせ失敗すると一言で終えられないプロジェクトであると思っています。

また、ほとんどのウェブ系事業の収益は広告収入がほとんどを占めますが、Steemでは広告による収入が必要なくユーザーの利便性も高いといえます。

オープンソースなブロックチェーンによる長所

Steemはブロックチェーンがベースとなっており、それによる恩恵がいくつかあります。

まずは、サーバーダウンのリスクが小さいことです。現在まともに稼働しているSteemの内容を閲覧できるサイトはSteemit.comのみですが、ブロックチェーン内にコンテンツが保存されているので、Steemit.comが落ちて見れなくなっても他のサイトを通じて見ることが可能です。このサイトは開発チームだけではなく誰にでも立ち上げることができ、実際に最近では開発段階ではあるもののローカルPC上でSteemを閲覧できるオープンソースのサービスも登場しています。最初に紹介した記事に書いたようにSteemit.comのようなサイトはSteemのブロックエクスプローラーにあたるため、ユーザーが誰にでも作ることができるのです。

また、検閲に耐性があるというのもメリットです。過去のデータを改ざんすることが非常に難しく、全投稿履歴・編集履歴が半永久的に残り続けることになります。サイト上で表示を制限することは可能ですが、ブロックチェーンの情報を直接見れば隠すことはできません。

ある程度の規模まで成長すれば、今の開発チームが解散しても有志によりSteemは続いていくことが考えられます。

懸念

先行者・大口保有者に有利すぎる?

Steemでは、SPに非常に高い利子がつくためどうしても大口保有者に有利になりがちです。利子の比率は一定ですが、1億円が2億円になるのと1000円が2000円になるのとでは大きな違いがあり、資産の格差が埋まりにくい構図になっていると思われます。

また、90%が利子分で残りの10%が報酬となるのですが、報酬の各獲得方法についても大口保有者が有利になる傾向があります。報酬を得るには①コンテンツ投稿②コンテンツへ投票③マイニング④分散型取引所への注文によるボーナスの4つがありますが、うち②と④については、かなり大量のSTEEM(SP)を保有していなければ実質的に報酬を得ることが難しく、大口保有者が有利となる要素でもあります。特に②の投票については、ライトユーザーの投票のモチベーション低下にもつながりかねません。ライトユーザーの投票が減り全体の投票数が減ると、無視されていると感じる投稿者が増えすぐに辞めてしまうユーザーも多くなってしまう可能性があります。とはいえ、誰でも簡単に投票により報酬が貰えるようになってしまっては、スパムが増える可能性も高く、良質なコンテンツを維持するためには、大口保有者を有利にすることは必要不可欠とも考えられます。

先行者利益が大きいというのも特徴です。90%/100%のインフレ率という言葉を繰り返し使っていますが、初年度の現在はさらに大きい数百%以上のインフレ率です。具体的なインフレ率の推移は面倒臭いので計算していませんが、4月から登録していた私のSP量は利子分だけで3ヶ月も経たないうちに既に3倍以上になっており、初期の初期から登録していた人などは1年で10倍近く、あるいはそれ以上になるのではないかと思います。

先行者・大口保有者に有利になりすぎると新規ユーザー獲得のマイナス要因になり得ます。

十分な報酬額を維持できるのか

1週間に1/104しか引き出せないことを勘案しても、少なくとも現在は、コンテンツの投稿をして大口保有者から投票されれば、かなり多額の報酬がもらえる状況です。しかし、報酬の全体のパイの大きさは決まっているので参加ユーザーが増えれば増えるほど一ユーザーあたりの報酬額が減ってしまいます。十分な報酬額と参加ユーザー数のバランスがとれるところが未知数であり、果たしてSteemが目標としている?Redditのレベルまで成長を続けられるかはなんともいえないところがあります。

逆にビットコインのマイニングと同じように、参加ユーザー数が減れば報酬額が増えるような構造になっているので、伸び悩んだ時にユーザー数を維持できるのかどうかも興味深いところであります。

誰もWitnessに興味がない

取引の承認を行っているwitnessもSP保有者による投票で選出されます。しかし、一般ユーザーは全く気にしていませんし、witnessについて書かれたガイドや各witnessの紹介ページのようなものを見つけるのも非常に難しいです。witnessはマイナーにあたるので、いちいち一般ユーザーが気にする必要があっては逆に不便ですが、DPOSはセキュリティシステムの根幹にあたるので、witnessへの投票率が下がることにより何らかの問題が起きないか不安ではあります。

今の大口保有者はBitSharesコミュニティからの出身者が大半なので、彼らはwitnessについて理解して投票もしていると思われ大きな問題はないでしょうが、Steemが大きく成長して全体の投票率が下がっていったときに何らかの問題が発生する懸念があります。もっともこれはBitSharesにも共通するまだまだ実験段階のDPOS自体の懸念でもあります。

ノード/マイナーの負担

Steemはその特性上ブロックチェーンの容量・成長速度が非常に大きく、ノードを立ち上げるPCに負担がかかりがちです。スタートから数か月程度の現在では問題ではありませんが、数年経って今後さらに成長した場合、一般ユーザーのPCでは容量が大きすぎてブロックチェーンをダウンロードすることさえできないのではないか、という不安があります。

SMDの意味はどれだけあるのか?

Steemには分散型の米ドル連動型通貨SMDがあります。SMDはBitSharesのSmartcoinsとは仕組みが違って緩いペグであるため、1USD=1SMDとうたってはいるものの大きな価格変動があると1USD=1.6SMDなどになることがよくあります。

SMDを使ったマーケットプレイスなども実装する予定らしいですが、STEEM(SP)と比べれば価格はかなり安定しているものの、この緩さでどれだけSMDを導入する効果があるのか疑問です。

仕組みが複雑すぎる

Steemはとにかく仕組みが複雑です。DPOSとか一般ユーザーが知る必要のない根幹部分はある面複雑でもなんでも許せますが、一般ユーザーの報酬の獲得スキームにいたるまでとにかく複雑です。ブログを書いている身としては、報酬配布の仕組みは公開当初から改良されており今後も改良される可能性があるため、記事にしたくてもしづらい面もあります。

この複雑さは新規ユーザーを獲得する上でマイナス要因と言えるでしょう。

ハイパーインフレ

Steemを調べてまず最初にヤバいと思うのが超高インフレ率です。個人的には正直なところハイパーインフレは大して問題じゃないだろうという気になってきていますが、週に1/104しか引き出せないというSPのシステムと合わさって初見の人からするといかにも詐欺的な雰囲気を漂わせる要因になっており、一部ユーザーから敬遠される可能性があります。

ここらへんの仕組みも非常に複雑であるので個人的にはまだ白とも黒とも判断できていません。

システム的に多言語対応に向いていない

日本人として最初に思う疑問は日本語対応しているかどうかです。一応、日本語でもアラビア語でも投稿はできます。今はサイトは英語表示に最適化されていますが、今後は言語フィルターが実装されたり、Steemit.com以外に他言語用のサイトを立ち上げる人がでてくるかもしれません。

しかし、フロントエンドでの多言語向けの最適化は今後徐々に行われる可能性があるものの、Steemというのはそもそも根本的に英語(一つの言語)に最適化されたプラットフォームです。それは、コンテンツの投稿による報酬が、STEEMの大口保有者による投票を受けて初めて貰えるためです。1000円とか10000円程度持っている人からいくら投票されても雀の涙程度の価値にしかなりません。その言語を使える人の中に大口保有者がいなければ原理的にほとんど報酬が貰えないのです。実際にSteemの日本人の大口ホルダーは今のところは見たことがないので、たぶん日本語で投稿してもどんなに多くの日本人から投票を受けたところで現在はほとんど金にならないと思います。

このような構図があるため、FacebookやTwitterのような世界規模のSNSに成長できるかと聞かれればかなりの疑問が残ります。

イーサリアムのハードフォークが成功、The DAO内のETHは返却へ

※新しく以下の記事にまとめなおしました。古いこの記事は参考にしないでください。

The DAOトークンからETH(ETC)への変換方法総まとめ - ビットコインの情報サイトの運営者ブログ

 

昨日The DAOから引き出されたETHを全額戻すためのイーサリアムのハードフォークが無事に行われたようです。The DAO事件については日本でも大きく取り上げられましたが、悲しいことにまだまともなハードフォーク後についての日本語記事がなさそうなのでとりあえず概要だけ書いておきます。

ハードフォークの内容

一時はソフトフォークなども検討されていましたが、バグが発見されるなどのトラブルがあったため、結局ハードフォークが行われることになりました。ハードフォークの方が解決法としてはシンプルで、複数の子DAO内に移動してしまったETHを一つの返却用のコントラクト(WithdrawDAO)に移すというものです。

ハードフォークを拒否する人たちがEthereum Classicというフォークをしないバージョンを作るなど一部分裂する動きもあって、現在ブロックチェーンは分岐しており旧バージョンのマイナーも少数いるようですが、主要取引所・マイニングプール等コミュニティのほとんどすべてはフォーク後の新Ethereumに移っているので、フォークをしないEthereumの旧ブロックチェーンはほとんど無価値になるものと予想されます。

一般ユーザーは何をすればいい?

PC用ウォレットの使用者:ウォレットのアップデート

手動でアップデートをしなければならないデスクトップウォレットを使用しているユーザーは新バージョンのウォレットにアップデートする必要があります。

Mist(Ethereum Wallet)を使用しているユーザーは最新版にアップデートするとフォークを支持するかどうか聞かれるので、フォーク後のEthereumを使用したければ「YES」を選択しましょう。

DAOトークンの保有者:ETHの返還手続き

ハードフォーク後すぐにDAOトークンをETHに交換できるようになっています。MyEtherWalletと公式ウォレットのMistから交換することが可能です。交換の期限はありませんが、もうThe DAOは解散することになっているので、記念に持っておきたいとか直接交換ではなく取引所で売りたいとか特に保有する理由がなければ、また何か問題が起きないうちに早めにDAOはETHに替えておくことをお勧めします。

最初のほうに貼ったWithdrawDAOのリンクを見れば分かるとおり、ハードフォークからまだ1日経っていませんが、既に約半分のDAOトークンは交換済みとなっています。

例によってMyEtherWalletが一番簡単なので以下のGithubのリンクからダウンロードしてローカルで実行すると良いです。

GitHub - kvhnuke/etherwallet

「The DAO」タブを選択してkeystoreファイルを選択後、「WITHDRAW YOUR DAO TOKEN TO ETH」というボタンをクリックすれば完了です。取引手数料としてアカウント内に少量のETHがないとうまくいかないのでご注意ください。MyEtherWalletではMistのkeystoreファイルとも互換性があるので、普段Mistウォレットしか使ってない人でも利用することができます。

多額のDAOトークンを保有している人は念のため最初に少額を別のアカウントに移して試すとか、一度ではなく複数アカウントに分けて実行するとかしたほうが良いかもしれません。

日本にはほとんどいないと思いますが、事件当日のハッキング最中に攻撃を止めるためにThe DAO運営(Ethereum開発チームの一部だったかも?)から呼びかけられたネットワークへの攻撃スクリプトを実行したアカウントからはうまく引き出せずにETHが失われてしまうというバグ?があるという噂もあるらしいので自己責任でお願いします。

やや面倒ですが、以下のリンク先などで書かれてるようにMistから交換を行うこともできます。英語ですがリンクを貼っておくだけにとどめておきます。

https://slacknation.github.io/medium/12/12.html

How to use the Withdraw Contract with Mist — Slock.it Blog

もう一つ有名なウォレットであるJaxxにはまだ交換機能が実装されていません。今後実装予定とのことなので、JaxxにDAOトークンを保管している人は実装されるまで待っていてもいいでしょう。

追記:DAOとETHの交換レートは100DAO = 1ETHです。

追記2:クラウドセール期間の後半に100DAO = 1ETHよりも高い価格で購入した人は今後その価格で返却可能なオプションも計画されているようです。100DAO⇒1ETHの変換処理に加えて追加というかたちで行われるらしいので、本記事の通り先に変換してしまっても恐らく問題ないと思われますが、念のため発表を待っていたほうが良いかもしれません。

追記3:追記2の事項に関してはやはり別にもらえそうです。WithdrawDAOに期限ができそうという話もあるので早めに交換することをお勧めします。

Steemの短期的暴騰は必然だった?複雑な供給量の仕組みと流動性について

どうやら以前少しだけ書いたSteemが一週間前の10倍以上の価格となっているようです。時価総額もRippleを抜いて現在の時点で第3位になっています。仕組みが複雑すぎるので相変わらず完璧に理解できている自信はありませんが、改めて書いてみます。

前回書いたようにSteemは供給量がもの凄い勢いで増えていくインフレ型の通貨ですが、それに対応して単純にすぐ価格が下がるとも限らない事情があります。それはSP(Steem Power)という存在のためです。なお、Steemの概要については前回の記事を見てください。

SPの性質により総発行量に対して流動性が極端に低くなる

SPは送受信することが一切できず、送受信可能なSTEEMに変換するためには、1週間後に1/104分、全額を変換するには約2年間かけなければなりません。

現在の送受信可能なSTEEMの量は?

現在のSTEEMの供給量はsteemd.comから確認できます。「current_supply」が総供給量で現在のところ、98,395,492.884 STEEMとなっています。(coinmarketcapに表示されているavailable supplyはSteemの開発企業Steemit Inc.が保有している分を除外しているためやや少なく表示されているようです。)

そのうちSPの供給量にあたるのが、「total_vesting_fund_steem」の欄で、現在96,263,193.852 STEEMです。

よってすぐには送信できないSPが96,263,193.852/98,395,492.884 = 97.8%を占めることになります。正確に言えば、送信できないSTEEMはさらにまだあり、「total_reward_fund_steem」の欄の56,479.464 STEEM、これはSteemへの投稿や投票の報酬として支払われるために確保されているSTEEM(SP)の量です。これらを足し合わせると送信できない割合は、(96,263,193.852+56,479.464)/98,395,492.884 = 97.9%ということになります。

つまり、実質的に取引所で取引を行える最大のSTEEM量は98,395,492.884 - (96,263,193.852+56,479.464) = 2075819.568 STEEMで全供給量の約2%となります。

7月4日の初報酬支払日以降ユーザー数が増加

7/4に初のSteem報酬支払日がありました。4日以降ユーザー数は右肩上がりに増え、STEEM(SP)への需要が増しました。4日には前日3日の3倍(約150人)の新規ユーザー、昨日12日は約20倍(約1200人)の新規ユーザーを獲得しています。

※7月4日以降は1日1回(各投稿or投票の24時間後)報酬をもらえることになっています。

総発行量・時価総額に対して流動性が極端に低い状況に

ユーザー数が増えると当然需要が増えることが予測されますが、Steemの場合、総発行量や時価総額に対して実際に市場で取引を行える供給量が極端に少なくなっています。最も主要な取引所であるBittrexを見ると、時価総額3位のコインである割にはSTEEMの取引板は非常に薄くスプレッドも広く、出来高も価格上昇率の割には低いことが分かります。

通常の他の仮想通貨の場合は、既存のホルダーがすぐに売り注文を出すことによってある程度に価格上昇が抑えられますが、STEEMの場合は売りたくても売れない状態のため、下げ圧力が非常に少なくとんでもない価格上昇になってしまったのだと考えられます。

しかし、この状態が長く続くわけではなく、急騰により既存ホルダーの一部が一週間かけてSPからSTEEMに変換することが考えられるので、流動性が増すことが考えられます。ただし、これもわずか1/104という量なので正直なところ値動きを読むのは難しいです。

供給量の仕組みについて

ここで一旦供給量の仕組みについてまとめてみます。

STEEMは基本的にSPのかたちで新規発行され、90%がSP保有者にそのまま還元され、10%はコンテンツの投稿や投票の報酬として支払われます。

絶対量としては最初は1分毎に800STEEMが発行されますが、年率100%ペースに到達すると常にインフレ率100%を保つようにさらに800STEEMを超える量が発行されます。現在は約1億STEEMですが、1年後には5億STEEM、その3年後(今から4年後)には50億STEEM近くになると予測されています。初年度の今は数百%のインフレ率になっていると考えられます。数分後にSteemitのウォレットを見るだけでわずかにSPの量が増えているのが確認できるほどのインフレ率です。

とんでもないインフレ率なので、50億STEEMとなることが予測される32,000,000ブロック毎(約3.32年)に「株式併合(reverse split)」というイベントも予定されています。

株式併合といっても馴染みがない人は、いわゆるデノミと考えると分かりやすいです。つまり強制的に通貨単位の切り上げが行われ、10STEEMが1STEEMとして取り扱われ、価格も10倍になります。1/10に切り上げられるので、供給量は50億STEEMから5億STEEMに戻るというわけです。reverse splitのサイクルは常に続き、STEEMの供給量は5億STEEMから50億STEEMの間を循環することになります。

※SMD(Steem Dollars)はSteemの時価総額の約5%発行されるようになっています。STEEMの新規発行量には直接関係なく、まだよく理解できていないので触れないでおきます。

「通常の状態」ならSTEEMの価格は下落する

現在はSTEEMの価格がとんでもなく暴騰していますが、よっぽど高い水準で需要の伸びを維持しない限りSTEEMの価格は下落傾向になるはずです。もし原理的に少なくとも一定の価格が保てるなら、SPを保有しているだけで年率90%、初年度の今は数百%増やせるSPホルダーは、永久に資産価値が増えていく夢の通貨が出来上がってしまうことになります。4年後には今の供給量の50倍ぐらいになっているので、時価総額ビットコイン越えも現実的になってしまいます。

STEEMの価格下落は問題にならない?

SP保有者にとっては2年目以降は年率90%増える計算になるので、それ以上の分だけ価格が下落しない限り、例えば年間で30、40%程度STEEMの価格が下落したとしても資産価値としては増えていることになります。インフレ率100%というと高すぎるように思えますが、SP保有者から見れば実質的なインフレ率は10%にしかすぎないと言うことも可能かもしれません。

逆に、SPとしてではなくいつでも送信可能なSTEEMを長期保有することのリスクは非常に高いといえます。

ただし、SPはSPで1週間に1回1/104しか資産を引き出せないリスクも存在します。年単位で保有するつもりの人は迷わずSPとして、短期間のトレードを行いたい人はSTEEMもありでしょう。

実際に使いたい場合は?

実用面でいうと、日本人が使うには正式に日本語対応していないなどまだまだ使うのには不便な面も存在します。

例えば日本語の場合は投稿の際のタグの先頭に「ja-」と言語のタグを付けるなどの方法が推奨されていますが、ローカルルールでしかなくほとんど形骸化してしまっています。多言語投稿はちらほら見られますが、例えばロシア語の場合は「ru」だけで投稿したり、フランス語の場合は「steem-fr」と後ろに言語を付けたり、投稿者が自由に投稿している状態です。

実用面はアップデートによる改善を期待するしかありません。

最後に

相変わらず理解しきれていないものの、改めてまとめてみました。個人的にSNSという分野にそれほど興味はありませんが、Steemについては、技術と経済的インセンティブの組み合わせという点にビットコインと共通するものがあり興味を持っているので、これからも見守っていきたいと思います。