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

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

「良い」ハードフォークと「悪い」ハードフォーク

昨日、最近頻繁に行わているEthereumネットワークへの攻撃対策のため、イーサリアムが再びハードフォークを行ったようです。The DAOの件とは違い、理由が理由であるため今回は前回ほど大きな反対意見が出ることなく無事に実行されたと思われます。

そこで今日はハードフォークについて改めて考えてみます。

ハードフォークって何?

以前このブログでも多少書いたと思いますが、ハードフォークとは元々はソフトウェア開発関係の用語で、後方互換性・前方互換性のないアップデートのことです。ビットコインを例にすれば、ハードフォーク後の新バージョンでは、旧バージョンにより送信されたトランザクションを無効と見なし、旧バージョン側でも新バージョンにより送信されたトランザクションを無効と見なすということになります。

ここで少し混乱しやすいのが「フォーク」という言葉です。フォークには分岐するという意味があり、ブロックチェーンの分岐自体のことも「フォーク」と呼ぶことがあります。ハードフォークが行われる際には、新バージョンと旧バージョンで互換性がないので、ブロックチェーンの「フォーク」が発生することになります。(Ethereum Classicのように旧バージョンを使い続ける人がいない限り、旧バージョンは分岐せず実質的に消滅することになります。)

仮想通貨の世界では、フォークという言葉はさらに転じて、ハードフォーク(バージョンアップ)した際に発生する永続的なブロックチェーンの分岐状態のことを「ハードフォーク」と呼ぶこともあります。これに対して「ソフトフォーク」は一時的な分岐状態という意味で使われます。

過去、ビットコインにハードフォークはあったのか

ビットコインでは過去ハードフォークが行われたと言う人も行われていないと言う人もいます。

第一にハードフォークが行われたとされるのは、2010年8月に脆弱性を突いて総発行予定数を超える大量のビットコインが生み出された事件です。一時的に実質的な偽造がされてしまったいう点とロールバック的な対処が行われたという点ではビットコイン史上最大の事件といえますが、この対処はソフトフォークによりなされたので、ハードフォークであるというのは勘違いです。

第二は、2013年3月にバージョン0.8.0へのアップデート後にバグにより発生したブロックチェーンの分岐です。発生当時はハードフォークではないかと思われたようですが、その後の調査により、前のバージョンにすでに含まれていたバグであり、理論的には0.8.0へのバージョンアップがなされていなくても発生していた可能性があるという話もあるので、ハードフォークではなかったというのが一般的ではないかと思います。ただし、ハードフォークをブロックチェーンの分岐状態という意味で使うのであれば、ハードフォーク的な分岐は実際に発生していたので、ハードフォークが発生したとも言えるでしょう。

いずれにしてもビットコインでは意図してハードフォークが行われたことは過去にはないとは確実に言えるでしょう。

ハードフォークの何が悪いのか

では、しばしば悪者扱いされるハードフォークですが、何が問題とされるのでしょうか?

①ハードフォークの内容

まず問題とされるのがハードフォークで何が変わるのか、ということです。ハードフォークとは互換性のないアップデートなので、理論的に言えばどんな変更も可能となってしまいます。

例えば、ビットコインの総発行数は2100万BTCと決定されている、といろんなところに書かれていますが、ハードフォークを行えば総発行数を増やすことも減らすことも自由にできてしまいます。決められているというのは、仮に変えるようなアップデートを行っても誰も賛同しないだろうという前提のもとでしかないのです。実際にアルトコインの一つであるDogecoinなどでは、スタート時は発行枚数が有限の通貨であったのものの、その後しばらくしてハードフォークが行われ総発行数が無限に変更されたことがあります。

The DAO事件の際に実行したハードフォークではこの内容に大きな問題があると考える人が多かったためにEthereum Classicのようなフォーク版が誕生してしまったのだと思われます。一方で今回のイーサリアムのハードフォークは、セキュリティ対策という誰もが納得しやすい大義名分があるため、少なくとも前回ほどは反対意見が少ないなか実行されました。そのため、ゼロではありませんが、今回をきっかけに第二のEthereum Classicが生まれるような可能性は低いと言えるでしょう。

②ハードフォーク自体の問題

そもそもハードフォーク自体にも問題はあります。互換性が失われるので、ウェブウォレットやサーバークライアント型のウォレットの利用者を除き、その他のビットコインネットワークの参加者全てはアップデートをしないと使い物にならなくなってしまいます。全利用者にアップデート情報がいきわたるのは難しく、一時的なマイナーやノードの集中化などが発生する可能性があります。また、単純に送金トラブルが多発する可能性もあります。タイミングを見計らって単発でハードフォークを行う場合はそこまで問題とならないかもしれませんが、頻繁にハードフォークを行うと懸念が大きくなると言えるでしょう。

また、ブロックチェーンが完全分岐するというハードフォークの性質が①の内容の問題と合わさって、問題となる可能性もあります。特にビットコインやイーサリアムなどのようにコミュニティが大きい場合、Bitcoin Classicのように分裂する動きが出てきたり、Ethereum Classicのように実際に分裂してしまうこともあります。逆にコミュニティが小さい場合はそこまで問題とならず、大事件のように伝えられるビットコインやイーサリアムでのハードフォークとは対照的に、その他のアルトコインの世界ではハードフォークは日常茶飯事に行われており、むしろアップデートを頻繁に行う開発力のある通貨ということで評価されることもあります。

ビットコインにハードフォークは必要か

イーサリアムの現状を見ていたり、ビットコインコミュニティの分裂具合を見ていると、ハードフォークは(特にコミュニティがある程度大きい規模の場合)軽々しく行うものではないと思いますが、やはり自由に仕様変更できるというのは魅力的ですし、将来的には全く行わないという訳にはいかないでしょう。

今回はハードフォークについて書きましたが、ハードフォークより安全だと思われているソフトフォークの危険性についてもいずれ書いてみようと思います。

The DAOトークンからETH(ETC)への変換方法総まとめ

しばらく前のことなのでもう変換済みの方も多いかもしれませんが、DAOトークンからETC(Ethereum Classic)への変換が可能となりました。ICO後半に割高価格でDAOトークンを買った人への返金オプションも少し前に対応されたので、改めて最後にまとめておきます。

2017年はじめごろには引き出せなくなるらしいので、記念品としてとっておきたい人以外は早めに変換しておきましょう。

なお、全手順についてMyEtherWalletを使うのが楽です。普段Mistを使っている人でも、Mistのウォレット形式をそのままMyEtherWalletで読み込むことが可能です。Mistだけでやりたい人は自分で調べて実行できるレベルの人でないと恐らく難しいと思うので省略します。

①DAOトークンからETHへの変換:現在DAOトークンを持っている人

以前の記事で紹介した通りです。MyEtherWalletから「DAO払い戻し(Withdraw DAO)」タブを選択、さらに「ETHでDAOを払い出し(Withdraw DAO for ETH)」を選択すれば100DAO=1ETHで変換できます。送金手数料(スマートコントラクト実行手数料)のため、アカウントにETHを忘れずに入れておくようにしましょう。

②DAOトークンからETCへの変換:1,919,999ブロック時点でDAOトークンを持っていた人

ハードフォーク(7/20夜)の時点でDAOトークンを持っていた人のみが対象となります。同様に、MyEtherWalletから「DAO払い戻し(Withdraw DAO)」タブを選択してトークンを保有していたアカウントを読み込めば、「ETCでDAOを払い出し(Withdraw DAO for ETC)」からDAOをETCに変換できます。こちらは、払い戻し先のアドレスを指定できます。なお、試してみると分かると思いますが、ETCに変換できるように尽力してくれた善意のハッカー集団(ホワイトハット)に寄付を送ることもできます。好きなパーセントを入力してください。

①と同様に、送金手数料としてアカウント内にETC残高がある必要があります。持っていない人はShapshiftなどで少量購入しないといけないかもしれません。(MyEtherWalletにも書いてありますが、英語でメールを送っても手数料分無料配布してくれるようです。)

ETCのReplay Attackの問題は未だに根本的には対応されていないので(多くのウォレットが分けて送れるように対応されましたが)、返還後は誤ってETHとETCを同時に送信してしまわないように注意しましょう。

③extraBalanceのETH払い戻し:The DAOのICO後半に1ETH=100DAOよりも高い価格で購入した人

この人たちも払い戻しできるようになっています。購入したアカウント(DAOを購入するためにETHを送信した元アカウント)を同様にMyEtherWalletで読み込んでください。「DAO払い戻し(Withdraw DAO)」タブ内の「Withdraw extraBalance」を選択すれば実行できます。送金手数料としてETHを忘れずに入れておきましょう。

そのアカウントが払い戻しできるかどうかは以下のリンク先などから確認できるようです。MyEtherWalletの左側にも読み込み後残高が表示されます。(ExtraBalanceトークンというのが配布されているので、必要に応じて変換前に別のアカウントに移動することも可能です。)

Ethereum Account 0x5c40ef6f527f4fba68368774e6130ce6515123f2 Info

TheDAOData/CreatedTokenEventsWithNonZeroExtraBalance_v4.xlsx at master · bokkypoobah/TheDAOData · GitHub

イーサリアムのおすすめPC用ウォレット(2016年9月時点)

当ブログでは、MistやらMyEtherWalletやらイーサリアム用のウォレットについて、触れてきましたが、最近のアップデートによりMyEtherWalletはかなり進化しており、機能的にはMistと変わらないレベルになっています。

回しものではありませんが、今のイーサリアムウォレット(PC用に限る)のおすすめは公式のMist(Ethereum Wallet)ではなくずばりMyEtherWalletであると断言して簡単に説明を書いていきます。

インストール方法

前に少し触れましたが、やはりmyetherwallet.comにアクセスするのではなくソースコードをダウンロードして実行するのが良いと思います。

GitHub - kvhnuke/etherwallet at gh-pages

最近できたのか見落としていただけか分かりませんが、上のリンクから画面右部の緑ボタン「Clone or download」→「Download ZIP」を選択することにより、必要なファイルだけをまとめてダウンロードできます。(前の記事で紹介したときはChrome拡張機能版など不必要なソースコードも同時にダウンロードするものでした。)

使い方はビットコインなどに触れたことがあれば恐らく直観的に分かると思うので、申し訳ないですが省略します。

Mistとココが変わらない

必ずしもMyEtherWalletの使用をおすすめできなかったのは、単純にMistを使わなければならない場面が多く存在したのも大きい理由の一つです。現在ではそういう場面はほとんどなくなった気がします。

①日本語対応

最近のアップデートで日本語対応しました。index.htmlを開いて右上から選択できます(初期状態は「English」)。英語が苦手な人でも使えるようになりました。

②独自トークンが使える

Mistと同様にEthereum上で作成されたトークンを自由に表示・送信できるようになりました。「Send Tokens(トークン送出)」タブからアカウントを開いた後、「Custom」欄を選択しコントラクトアドレスなどを指定することで、トークンを自由に追加できます。

例えば、前はDAOやDigixなどごく一部を除いては、ICOで購入したりして入手した様々なトークンを表示するにはMistを利用しなければなりませんでしたが、現在ではMyEtherWalletで扱えます。

③スマートコントラクトを実行できる

「Deploy Contract(コントラクトをデプロイ)」タブからスマートコントラクトコードを実行(ネットワークに送信)できるようになりました。現実問題、一般ユーザーが利用することはほとんどないと思われますが、これで実質的にMistと遜色ないレベルになったと言えます。

ただし、コードを書いたりはできないので、スマートコントラクト関係をいじろうと思うと、MyEtherWalletでは微妙かもしれません。

Mistよりココが優れている

①生の秘密鍵をバックアップできる

ウォレットを作成すると、暗号化されたKeystore/JSONファイル以外にも生の秘密鍵が表示されます。普段使いは暗号化されたKeystore/JSONファイルのほうが良いでしょうが、緊急時のバックアップの際などは生の秘密鍵を紙ベースなどで保存していると何かと安心です。

秘密鍵が晒されるということである意味弱点にもなり得ますが、紛失リスクと盗難リスクを天秤にかけた場合、個人的には概して利点と言えるのではないかと思います。(ちゃんとリスクは理解して使いましょう。)

②オフライン取引ができる(コールドストレージとして利用できる)

MyEtherWalletでは「Send Offline(オフライン送出)」タブから、取引をオフライン環境下のPCで作成した後、オンライン環境のPCに移してネットワークに送信できます。通常のユーザーはほとんどこの機能を使うことはないでしょうが、うまく使えばMistより安全に使用することも可能です。

③同期を行う必要がない

ある意味ここが最大の利点です。ウェブ上から直接利用しようが、ローカルにダウンロードして利用しようが、膨大なブロックチェーンをダウンロードする必要がありません。しかし、外部サーバーなどに頼るということも意味するので、セキュリティ的には微妙かもしれません。

Mistは何がいい?

ではMistは何が良いのでしょうか?

1)公式ソフトである

最大の利点その1。開発者は名の知れた人で関わっている人数自体も多いです。MyEtherWalletはオープンソースですし、すでに公開から1年以上経っておりかなり多くの人が使っているので、実用には問題ないレベルだと思いますが、信頼性の面で大きく負けます。

2)ブロックチェーンをダウンロードする

最大の利点その2。外部に頼らず自前でブロックチェーンをダウンロードするのは、やはり安心できますしセキュリティ的に考えても良いです。ただし、利便性はもちろんセキュリティを考える上でも様々な要素がありますし、ウォレットファイルの紛失リスク、破損リスクなども考慮すると、ビットコインウォレットとしてBitcoin Coreをおすすめしないように玄人を除いてはMistもやはりあまりおすすめはできません。

3)DAppsブラウザとして

混同されて使われていますが、正確に言えば、実はMistはDApps(分散型アプリケーション)ブラウザのことであり、ウォレット自体はEthereum Walletという名称です。(Ethereum Walletという名称が一般的すぎて固有名詞とわかりづらいので、ここでは分かりやすくするため逆に混同して使っています。)

MistのGithubのダウンロードページを見てもEthereum WalletとMistで分かれてると思います。現時点では残念ながらまともに使えるDAppsは皆無ですし、MistにもEthereum Walletが内蔵されているので、どっちをダウンロードしても対して変わらないのですが、将来的にDAppsがリリースされるようになったら単なるウォレット用途ではなくDAppsブラウザとしてMistを使う場面も来るかもしれません。

まとめ

MyEtherWalletで作成できるKeystore/JSON形式のウォレットは公式ウォレットMist(Ethereum Wallet)にも対応しており簡単にインポート可能で、MyEtherWalletで作成したアカウントでトークンやらを受け取ってもなんとかなります。もしかしたら、Mistを使用しなければならない場面がくるかもしれませんが、迷った時はとりあえずはMyEtherWalletを試してみてはいかがでしょうか。

最近よくある仮想通貨の投資話からICOについて改めて考えてみる

なかなか個別の案件を見る時間がなく全然追いついていないのですが、最近もICOを行うプロジェクトが次々と出てきており各所で話題にもなっているようです。もしアドバイスを求められたら、この手のスタートアップは、仮想通貨業界に限らずほぼ確実に将来潰れてごく一部しか生き残らないので、とりあえず失敗して10年後には無くなっている、とでも言えば大体当たると思います。

しかし、こんなICOでもまだましだと思うことがあります。それは、最近身近なところでもしばしば耳にする仮想通貨の投資話です。仮想通貨に関する話題が一般にも広まってきたのは喜ばしいことかもしれませんが、その裏で詐欺も広まるということは好ましいことではありません。実際のところ詐欺の証拠を掴むのはとても難しく、詐欺かどうかはわからないのですが、一般的なICOのスキームと比較すると非常にお粗末なものなのです。そのため、身近な投資話に惑わされそうな人の説得や、勧誘をしてくる不届きもの相手には詐欺と言って一蹴するのではなく、単純に失敗する可能性が高いと説得する方が相手の心には響くかもしれません。

そもそもICOとは何か

Initial Coin Offeringの略で株式の世界のIPO(新規公開、Initial Public Offering)に対応するものです。ICOではそのコイン、仮想通貨の開発者が新しく発行したコインを売りに出すことで、プロジェクトの資金調達を行うことになります。

IPOになぞらえられていることからコインがプロジェクトの株式に例えらえることもよくありますが、プロジェクトによっては、送金手数料としてしか利用できなかったり、何らかの投票が可能で議決権を持っていたりいなかったり、あるいは持っているだけで配当のようなものがあったりなかったり、性質は様々で株式と必ずしも一致するものではありません。

利用者としては、むしろクラウドファンディング的なものをイメージしたほうが良い場合が多いと思われます。

そもそもProof of Workでコンピュータによる採掘・発行が可能な仮想通貨以外は、すべてIPO的な形態を経て利用者に仮想通貨を配布しなければなりません。逆にICOを行わない仮想通貨というのは、Proof of Workしかないと言えるでしょう。(Proof of Workであっても事前採掘を行いICOによりユーザーにコインが配布されることもあります。)

一般的なICOの特徴・傾向

ICOにおいて重要視されるのは、①公平性②透明性の2点です。②の透明性は正直微妙なものもかなり多いのですが、特に公平性というのは仮想通貨の世界でかなり重要だと考えられています。

例えば、当時機能だけを見ればMastercoin(Omni)のクローンでしかなかったCounterpartyは公平・透明なICOとしてProof of Burnにより配布を行ってアピールし、すぐにMastercoinを追い抜きました。Proof of Work型のMoneroも公平なスタートをアピールして、クローン元そのものであったBytecoinを追い抜きました。

(もっともこれらはその後の開発状況が優れていたのも大きな成功要因だと思われます。)

スタートが不公平であったと言われるDashやNxtは失敗とは言えないものの、常に不公平という批判にさらされ続けています。

中には公平性や透明性の観点から、事前採掘されているコインはすべて詐欺、ICOを行うコイン(≠Proof of work)はすべて詐欺、とまで言う人もいます。

 お粗末な仮想通貨の投資話の例

しかし、上記の(海外の仮想通貨コミュニティを見れば)常識的なことを全く知らないとしか思えないさらに残念な投資話も最近は横行しています。

また、ブロックチェーンの利点をほとんど無視している話も多くあります。ICOは個人で世界中どこにいても少額から参加できるというのが良い点であり、これらの特徴を無視するからには相応の理由をきちんと説明してほしいものです。

地域限定販売

よく見かけるのが日本だけ先行販売という手法です。もし、地域通貨としてのプロジェクトならばアリだとは思いますが、そうでなければ意味がよくわかりません。世界規模で成長をしていきたいのなら公平性という点で大きな弱点を抱えることになるでしょう。

世界中どこからでも一瞬で送金できるというブロックチェーンの利点を無視しており、馬鹿にしてるとしか思えません。

宣伝場所が限定的

この手のお粗末な投資話はセミナーが一般的であり大抵bitcointalkなどの主要コミュニティでは宣伝されていません。一部でこっそりとICOを行うやり方は忍者ローンチ(ninja launch)と呼ばれ公平性を損なうため嫌われる手法の一つです。

ごく一部の人の間だけで流通させたい特殊なコインならいいのですが、世界展開したいなら大きな弱点です。

購入金額に最低金額が設定されている

ブロックチェーンの利点は世界中のどこからであっても1円でも低手数料で送金できるということにあります。それに対応するかたちで一般的なICOでも最低金額は設定されていないのが普通です。数百円とかならまだしも最低○万円などというのは論外です。

必ず値上がりすると宣伝されている

この世に永続的に必ず値上がりする仕組みというものは残念ながら存在しません。もしポンジスキーム(自転車操業)のように必ず儲かる仕組みが入っているなら、そのあとに必ず破綻する仕組みが含まれているということを示しており、逆に危険であると自ら宣伝しているようなものです。

ビットコインも必ず値上がりすると宣伝されることがよくありますが、実際はそうではないのでそうやって勧誘するのは正直どうかと思います。また、気持ちはわからなくもないですが、最近はまじめにやってそうなところでも運営側・開発側でコインの売買を煽るようなコインもしばしば見られ、外から見てる側からすると印象が悪くなるだけでは?と思ってしまいます。

一番恐ろしいのは「普通の」ICO

明らかに詐欺っぽいプロジェクトや失敗しそうなプロジェクトはまだ良いのですが、最もひっかかりやすいのが「普通の」ICOです。過去の一見真面目なプロジェクトもICOだけやってほとんど消息不明であったり、1年2年と経っていまだにスタートしてない、トークンを受け取れないというものも数多くあります。

詐欺だろうがそうでなかろうがICOの非常に大きいリスクはトークン配布が実際行われるのかわからない、あるいは配布が行われた時点の価格が全く不明という点です。ハイリターンかもしれないがハイリスクのICOに参加するか、あるいは公開後にいつでも売買可能な取引所でトレードするか、ちゃんとリスクを認識して投資するようにしましょう。

Segwitの次の可能性(シュノア署名・MAST)

最新バージョンのBitcoin Coreに組み込まれ、次バージョンには有効化かと思われるSegwitですが、トランザクション展性やスケーラビリティ問題への対策だけではなく、新技術の実装が容易になるという大きなメリットもあると言われています。

これは、分離された署名の格納領域であるwitnessの中にスクリプトのバージョンを記述する欄が導入されるためです。

そもそもビットコインはトランザクション内に記述されたスクリプトを元に動作しており、そのスクリプトによって通常の送金取引だけでなく、様々な処理を実行することができます。ビットコインのスクリプトは、イーサリアムのようにチューリング完全ではないので、できることには限りがありますが、例えば、OP_CHECKLOCKTIMEVERIFYという処理を使えば、一定期間使用できない凍結されたBTCを送ることもできます。また、OP_RETURNという処理を使えばその時点でスクリプトを停止して後ろに任意のデータを挿入することができるので、その任意のデータを元にCounterpartyやFactomなどをはじめとして数多くのビットコイン上のプラットフォームが構築されています。

これまでスクリプトや署名に関する仕様を変更するのはかなり困難でハードフォークが必要となる場合も多いと考えられていましたが、Segwitにより導入されるwitnessにより今まで困難だった仕様変更が容易になると言われているのです。

Schnorr signature(シュノア署名)

中でもSegwitにより期待されているのがSchnorr署名という新しい署名方式の導入です。

ビットコインにおいて署名というのは根幹的な役割を果たしており、BTCの所有権を証明するために利用されています。署名はプライベートキー(秘密鍵)を利用することにより取引データから作成され、取引データから作成された署名は公開鍵(アドレスの元)により正しいものであると誰でも確認できます。正しい署名と一緒に「AからBに1BTC送る」というトランザクションをネットワークに送信すれば、Aの秘密鍵の所有者が送金処理を実行したとAの秘密鍵を知ることなく誰でも確認できることになります。

一般的に署名の方式には様々なものがあり、ビットコインではECDSAという方法が利用されています。このECDSAに変わる署名方式として提案されているのがSchnorr署名という方式です。

Schnorr署名は数ある署名方式の中でも最もコンパクトな署名であり、署名検証のスピードもECDSAより速いと言われています。

Schnorr署名は、複数の署名を一つに統合できるのが大きな特徴です。多くの場合、ビットコインのトランザクションは複数の「入力(input)」から成り立っています。Blockchain.infoなどのブロックエクスプローラーを見れば分かると思いますが、複数のアドレスから同時に送信する場合もそうですし、一つのアドレスから送信する場合もしばしば入力が複数になることがあります。

(ここらへんはUTXOという基礎知識があれば理解できると思います。)

このような場合、一つ一つの入力それぞれについて、署名を同時に添付する必要があります。そのため、署名の分だけサイズが大きくなってしまうのです。サイズが大きくなるということは、取引手数料が高くなるということを意味します。Schnorr署名では、これらの署名を一つに統合することができます。多くの署名が一つに統合されるので、サイズ的に非常にコンパクトになるのです。

Schnorr署名は通常の送金だけではなく、特にマルチシグネチャでの送金に大きな利点があります。マルチシグネチャアドレスでは複数人の署名を必要としますが、Schnorr署名を利用すれば一つの署名の統合できるので、大きくサイズ削減を行うことができます。

署名のサイズが小さくなればトランザクション全体のサイズも小さくなり、スケーラビリティ問題に対する大きな対策になるというわけです。

Schnorr署名はサイズをコンパクトにするという目的が大きいですが、セキュリティ面から考えた新しい署名方式の導入も一部では推されています。

しばしばビットコインは量子コンピュータが実用化されたら崩壊する(例えば公開鍵から秘密鍵を算出できるようになる)と言われることがありますが、これも新しい署名方式の導入により防げると考えられます。Lamport署名という署名方式は量子コンピュータに対して耐性があると言われており、特に有効だと考えられています。ただし実際には、Lamport署名自体に欠点が多く存在し、現段階でのビットコインへの実装はあまり現実的ではありませんが、従来のECDSA自体にセキュリティ上の懸念があっても、今までより簡単に署名方式を変更できるようになったのは大きいと言えるでしょう。

MAST(Merkelized Abstract Syntax Trees、マークル化抽象構文木)

もう一つスケーラビリティ問題への対策になると考えられているのが、MAST(マークル化抽象構文木)という技術です。

現在のビットコインのスクリプトは、scriptPubKeyと呼ばれる欄に送信者が直接記述する方式となっています。しかし、現在のスクリプトシステムにはある程度サイズ制限があることや、スクリプトの内容がすべて全世界に公開されてしまうというデメリットも存在します。

MASTではビットコインのスクリプトの条件処理の部分ごとに分割し、それぞれをマークル木(各データをツリー構造にハッシュ化して短くまとめたもの)として統合しようとするものです。

これによりサイズ削減できるだけではなく、ツリーの一部の枝部分のみを実行して、残りの実行しない部分はハッシュ化されており第三者から見えないという意味でプライバシー保護にもなります。例えば、Aさんが通常の送金処理の他に「もし一年間使用しなければ、BさんにBTCの使用権を引き渡す」というスクリプトを添付して送信したとします。このとき、後半のスクリプトはハッシュ化されており、第三者には一切見ることができません。

条件処理を使うような複雑なスクリプトはあまり使用されていないのが現状ですが、今後広く使用されるようになればメリットの大きい技術だと考えられます。(プライバシーの観点から使用可能性が増えるとも考えられます。)

このMASTもSegwitにより導入されるwitnessを利用することで今までより容易に導入することができます。

参考リンク

Bitcoin Core :: Segregated witness: the next steps

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かという話ではなく、どこにどの程度信用を置くのかということになってくるのでしょう。