見えそうで見えないマイニング開発の糸口とは?マイニングシステムの現状について解説
2019年6月8日から9日にかけて、アムステルダムでBreaking Bitcoinというカンファレンスが行われました。本コラムは、公開された動画や書きおこしをもとに、その発表内容を追いかけ、ビットコインのセキュリティに関する取り組みの最先端を知ろうという試みです。発表内容を日本語で、かつ実際の事例などを交えて解説することで、少しでも皆様がビットコインの仕組みや最新の研究について詳しくなるための一助になれることを願います。今回もAlexei Zamyatin氏の、”Security and Attacks on Decentralized Mining Pools”という講演について、後半部分となります。
- 前回の記事はこちら
- 前回のコラムでは、公平性や透明性を確保するために適正と考えられるマイニングの開発状況についてお伝えしました。今回のコラムにつながる内容となっていますので、ぜひこちらから読んでいただけると幸いです。
51%攻撃にはこんな方法もある!
ビットコインのセキュリティには影響を与えられない小規模なマイナーであっても、p2poolと占有率をシェアした場合、攻撃できる可能性があります。
実際ネットワーク上で占めるハッシュレートの支配は、p2poolが10%、マイナーは5%程度とされていて、シェアしたとしても攻撃するのは難しい状況です。ですが、一部のマイナーが、p2poolシャアチェーン上で自分が有利になるように他のユーザーを欺き、マイニングを行うかもしれません。
例えば悪意を持ったマイナーがシェアチェーンブロックを分岐させる可能性はどうでしょうか。これについては、フォークできるシェアチェーンのブロック数に制限を課すというのが緩和策です。また、p2poolマイナーは相互に監視して悪意ある行為を素早く検出し、悪意を持ったマイナーを排除しようとします。
長期的には、誰かが攻撃を続けるとプールが存続できなくなり、ユーザー数が減少していく影響があるでしょう。一例として、大規模なマイナーやプールのオーナーがp2poolの存在を疎ましく思い、攻撃をするなどの動機は考えられるかもしれません。
過去には51%攻撃が可能な状態になったことも
ここでは、p2poolがネットワーク全体のうち30%のハッシュレートを占めると仮定します。
さらに、攻撃を行いたいユーザーが21%のハッシュレートを持っているとしましょう。(nicehashなどでお金をかければ確保可能でしょう)
このときにはユーザーがp2poolを攻撃したいと思うことでしょう。p2poolのハッシュレートを活用することで、51%攻撃が可能になるからです。
攻撃者はまず、秘密の攻撃用チェーンをマイニングし、ブロックを形成します。そのブロックを形成したときはネットワークに公開せず、そこから次のブロックをマイニングします。通常のマイニングにおける攻撃では、より早い通信速度で情報を伝達できる方がマイニングに勝ちやすくなっています。
しかし共有チェーンでは長さが優先されるため、この手法によって長いチェーンを生成し、都合のよいタイミングで公開することで、一時的にp2poolを51%攻撃に参加させることができるようになります。
これにより、攻撃者は21%のハッシュレートに加えて30%を持つp2poolを一時的に攻撃に参加させ、51%攻撃を行うことができます。この手法は「Selfish Mining」または「Block withholding attack」と呼ばれます。
また、リスボンで2018年に発表された内容によれば、72%のハッシュレートをp2poolが確保しているという事例もありました。こういったケースでは、利益を拡大するための処理としてp2poolに参加しているマイナーを説得する必要が出てくるでしょう。
Selfish Miningの参考情報:https://security.srad.jp/story/18/05/18/0630205/
p2poolに変わる新しいマイニングスタイル
p2poolは2017年以降、積極的に保守されなくなりました。最後のリリースは2017年8月のバージョン17.0です。
Githubを見てみると多くのフォークがあり、p2poolの仕組み自体を壊しかねないものも見受けられます。なぜp2poolが開発され、そして保守されなくなったのか。その答えは、多くのマイナーにとってp2poolのオーバーヘッドやブロックサイズなどの問題の解決が難しいと感じたからかもしれません。
また、多くのマイナーはp2poolには参加するが、自分のノードを用意したくないというケースもあります。こういった考えは、分散型マイニングの思想に真っ向から対立するものとなります。
そのため、スマートプール(smart pool)という新しいシステムが2017年に提案されました。スマートコントラクトを活用して確率的に検証を行い、報酬を明確に分配します。理論的にはp2poolでも適用できるものですが、シェアという部分に関して、独自のメカニズムを持っています。
マイナーがプールに参加するときは、スマートコントラクトを確認し、コントラクトのアドレスを支払い先とします。マイナーはローカルでマイニングを行いますが、その結果をネットワークに公開するのではなく、シェアが葉となる拡張マークルツリーを構築します。
詳細は2017年に書かれた論文に譲りますが、並べ替えエラーが発生するため、重複を含めることはできません。そのため、マイナーがツリーにシェアを含めることは1回しかできません。
マイナーは、このツリーのルートを参加しているプールに送信します。コントラクトでは、確認のためにいくつかの枝をランダムに辿ります。このアイディアにより、正直な行動と不正な行動で同じ程度の報酬しか得られないように調整し、しかも不正行為の方にはインセンティブをなくすという設定を可能にします。
興味深い点として、スマートプールでは各マイナーが難易度を選択することができます。コントラクトでは選択した難易度も考慮して報酬が決定されます。
p2pool:https://en.bitcoin.it/wiki/P2Pool
リリース履歴:https://github.com/p2pool/p2pool/releases
スマートプール:https://www.usenix.org/conference/usenixsecurity17/technical-sessions/presentation/luu
マイニングの開発に尽きない課題
スマートプールでは、不規則な間隔でシェアを送信することになります。各マイナーは協調して動作しないためです。したがって支払いが行われるためには当然マイニングされた結果が必要になりますが、スマートコントラクトをどう扱うかは課題と言えるでしょう。
論文では、スマートコントラクト機能を実装しているイーサリアム上でのビットコインのプルーフオブワークの可能性について言及されており、クロスチェーンアトミックスワップが検討されています。
また別な問題として、スマートコントラクトではトランザクションの有効性が検証できないという課題があります。具体的には、大規模なマイナーはブロックとしては有効だが、無効なトランザクションが含まれるというブロックを生成することが可能になります。
フォークの処理についても論文では説明されていません。p2poolと比較すると、スマートプールではシェアの間隔が不規則になるため、シェアを受信したとしてもブロックの有無が判断できず、やはりSelfish Mining攻撃が発生してしまう可能性があります。
最後にもう1つ課題として、プルーフオブワークの検証を行う際、スマートプールの根幹であるスマートコントラクトには、Bribe Attackの可能性が存在しています。簡単に説明すると、これは、攻撃者が秘密の長いチェーンを構築し、自分の支出トランザクションを後から遡って取り消す、というプルーフオブステークの脆弱性につながる攻撃です。
クロスチェーンを攻撃する場合、マイナーは参加する方にインセンティブが発生します。スマートコントラクトに対応するブロックチェーン上では、適切なモニタリング以外に検出する方法が今ところ存在していません。
まとめ
前後編で分散マイニングプールの攻撃可能性について解説してきましたが、開発が止まっているp2poolに代わるスマートプールについても、発表から2年で研究が進み、攻撃の可能性があるということが分かりました。最新の研究についての情報として読んでいただく他、日本語で攻撃手法を解説した記事などは非常に少ないため、興味のある方が調査を始めるとっかかりになれば幸いです。
なお、記事中の表現については講演資料を筆者なりに読み解きつつ、前後で独自の解説を加えておりますが、なにぶん新しい技術に関する内容ですので、もしも間違いなどございましたらお気軽にご指摘くださいませ。(特に技術的な指摘は大歓迎です)
引用元: CoinPost
「仮想通貨全般」カテゴリーの関連記事