Marathonが凡ミスで2600万円分のビットコインを採掘し損ねた話
先日、アメリカで上場もしている大手マイナーのMarathon (Marathon Digital Holdings: MARA)が不正なブロックを採掘してしまい、せっかくの運をドブに捨ててしまったことが話題になりました。
It appears as if MARA mined an invalid Bitcoin block at height 809478@fgthielhttps://t.co/LVea3mRVrX
— BitMEX Research (@BitMEXResearch) September 27, 2023
この出来事に関して、「マラソンによる攻撃なのか?」という誤解やなぜそんなことが起こるのかという疑問を目にしたので、今日はそれにお答えします。
・マイナーが採掘する「ブロックテンプレート」の作り方
・今回破ってしまったルールは非常に初歩的なもの
・公式の言い分は「収益を最適化する実験のコードにバグがあった」
・もったいない凡ミスを防ぐ方法
マイナーが採掘するブロックテンプレートの作り方
マイニングを行う際、一般的にはマイニングプールが所属するマイナーに採掘すべき「ブロックテンプレート」を配布します。
ブロックテンプレートとは採掘を目指すブロックの中身をおおかた決定したもので、トランザクションの順序やヘッダー内の各変数の多くが代入されています。まだ埋められていない部分を任意のデータに置き換えて少しずつブロックの中身を変化させていきながら、マイナーは大量のハッシュ計算を行います。
実はビットコインノード最大手のBitcoin Coreにもマイニング用の機能が含まれており、その1つにブロックテンプレート生成機能があります。Bitcoin Coreのノードを運用している方は誰でもgetblocktemplateというAPIを使って「手数料を最大化させる」というルールで自分のノードにテンプレートを生成させることができます。Bitcoin Coreは生成したテンプレートを検証するため、これをこのまま使えば問題は起こりません。
「手数料を最大化させるルール」…そう、ここがポイントです。場合によってはマイナーはBitcoin Coreが作るブロックテンプレートとは異なる条件に合ったブロックを作りたいかもしれません。例えばMEVが得られるトランザクションを「MEVで得られる収益を含めた」手数料金額として評価したり、ノードのネットワークを通さず直接提出されたトランザクションを含める場合などです。あるいは特定のUTXOはどれだけ手数料を積まれてもテンプレートに含めたくない場合、つまり検閲したいケースでしょうか。
MEVについては過去記事をご覧ください。
「ノンスタンダードなトランザクション」とそれをマイナーに直接提出する方法については以下の記事で詳しく触れています。
マイニングにおけるブラックリストUTXOの検閲については以下の記事で。おっと、ここにもMarathonが出てきましたね。
初歩的なルールを破ってしまった
カスタムのブロックテンプレートを生成する場合、誤って不正なブロックをマイナーに採掘させないように気をつける必要があります。なぜなら不正なブロックの採掘にどれだけエネルギーを使おうと当然のようにそれはネットワークに受け入れられず、骨折り損になるためです。
理想的にはカスタムのブロックテンプレートを生成した後にそのテンプレートを検証してから採掘開始すべきですが、今回はその検証ステップが不十分だったようでMarathonは「あるルール」を破るブロックを採掘してしまいました。
そのルールとは、互いに依存関係にあるトランザクションが同じブロックに入っている場合、時系列順に含まれる必要があることです。(A→B、B→Cのトランザクションが同じブロックにある場合、隣接する必要はありませんが含まれているのはこの順番である必要があります。)
ちなみに数日前にはTestnetでも同じ問題を起こしていたようで、カスタムのブロックテンプレート生成にバグがある状態でメインネットで採掘してしまったと推察されます。採掘報酬6.619 BTC (約2600万円)が白紙になる手痛いミスです。
公式発表で火消しを図る
このミスに対し、Marathonは比較的迅速に公式アカウントからツイートしました。
We can confirm that Marathon did mine an invalid block. We utilize a small portion of our hash rate to experiment with our development pool and research potential methods to optimize our operations. The error was the result of an unanticipated bug that came from one of our…
— Marathon Digital Holdings (NASDAQ: MARA) (@MarathonDH) September 27, 2023
ただのミスだったのに一部のビットコイナーが「陰謀」を感じてしまっていたことに対して火消しを図るとともに、自社がミスしようがビットコインには影響ない!とポジティブに昇華させようとするツイートです。
ただテストネットで前日に6回も同じミスを犯していたようで、それに気づかずメインネットで無駄なことをしてしまったという意味でMarathonの技術的な評判には傷がついてしまったかもしれません。
It does not seem to me that your team noticed the six invalid blocks on testnet a day before switching to mining on mainnet.https://t.co/SoIfTl1CXe
— 0xB10C (@0xB10C) September 27, 2023
凡ミスを防ぐには
Ordinal InscriptionsやBRC-20のように追加収益をもたらしてくれるプロトコルの流行や規制の懸念によってマイナーはかつてないほどカスタムのブロックテンプレートを生成するインセンティブがあるといえるでしょう。今回Marathonはどうしたらよかったのでしょうか。
本当はBitcoin Coreに「ブロックテンプレート検証機能」があれば今回のような凡ミスは防げました。しかしBitcoin Coreが生成したブロックテンプレートを自主的に検証するコードは内部的なものであり、それをフォークして再利用したり、カスタムのAPIにして利用するには割と高い技術力が必要になります。
これからはrust-bitcoinやBDKなどを利用した、ブロックテンプレートの検証に特化したオープンソースソフトウェアなどが出てくるかもしれません。というかその需要はあると思います。(競争力という面ではマイナーには企業秘密として内製化するインセンティブがあるのかもしれませんが。)
また、仮にそのようなソリューションがあっても検証が終わるまでの数秒間は「検証前のテンプレートで採掘」「空っぽのテンプレートで採掘」「Bitcoin Coreのデフォルトで採掘」といった選択肢があります。ブラックリストを気にするなら前者2つから選ぶことになりますが、事故が起こる確率を含めて期待値計算して不正ブロック採掘リスクを許容するか排除するか選ぶことになると思います。まあ本当は不正になりうる(検証が必要な)テンプレートを生成しないことが一番なんですけどね。
以上、Marathonが凡ミスで2600万円分のビットコインを入手し損ねた話でした。
余談ですが、Marathonは上場企業なので株を持っている方もいらっしゃると思います。発行済株式は約1.5億株なので、今回の出来事は1株1300円あたりでは0.16円くらいの損失でしょうか。Marathonの事業規模が伺えます。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。

ディスカッション