宇宙際のホワイトハッカー ~5億円をめぐる4週間の攻防~
Kimura Yuは、薬漬けにして治りつつあった下半身後部の裂傷の癒えから、解放感を得ていた。2022年1月13日。ようやく新しい西暦の数字に慣れてきた頃だ。
もうこれで、毎朝の催し物が体内からExitする際の激痛に苦しむことはなくなったのだ―――
ベンチャー企業の創業社長をしながら、京都大学の大学院生でもある生活において、健康に勝る資本などない。健康という資本にExitは無いのだ。Yuはそれを肝に銘じていた。偏食で野菜はほとんど食べないが、毎日野菜ジュースは欠かさず飲み、寝る前には必ずヨーグルト。死角はない…はずだった。2021年末にその考えの甘さを痛感することとなったのだが。
京都帝国大学病院にて薬を開発してくれた先人に感謝しながら、外は粉雪のちらつく寒さの中、変温動物かのような指先を使って温かい紅茶を口元に運び啜る。コーヒー党か紅茶党かで言えば紅茶党だ。コーヒーは飲めない―――いや、飲めなくなったと言ったほうが正しいか。コーヒーを飲むとカフェインにより交感神経が刺激され、自律神経失調気味になる。シアトル系コーヒーチェーンでバイトしていた面影は、どこにもなかった。
細長い指先がホメオスタシスを取り戻した矢先、ツイッターのDMの通知がスマホを揺らす。
ブロックチェーン間の相互運用ネットワークCosmosに詳しいK氏からだった。
どうやらK氏の知人の投資家Y氏が何者かにより、シードフレーズを盗まれたようだ。シードフレーズからは、秘密鍵を計算して導出することができる。その秘密鍵を用いて作成したデジタル署名があれば、暗号資産の送金が可能だ。ちなみに、公開鍵は秘密鍵から計算して導出され、口座番号を意味するアドレスは公開鍵から計算して導出される。
Y氏が盗難を自覚したのは、Y氏がCosmos HubブロックチェーンにてステーキングしていたATOMトークンの残高が、身に覚えのないまま勝手にステーキング解除されていたからだ。
ステーキングとは、自身の所有する暗号資産を送金できなくする―――つまりロックする代わりに、ブロックチェーンの正しさの検証に貢献し、報酬を得る仕組みだ。
Cosmos Hubブロックチェーンでは、暗号資産ATOMがステーキングできるようになっており、ステーキング解除トランザクションを送信すると、約20日後にロックが解除される仕組みになっている。つまり約20日後には、ステーキング解除した何者かにも、このATOM残高を送金する力が渡ることになる。
約4億円の所有権が、このままでは20日と持たない―――そこでY氏は、懸賞金を賭けて、ステーキング解除された瞬間にY氏の別アドレスにATOMを自動送金するbotプログラムを募集したいと考えていた。
もちろん、公衆の面前で懸賞金を賭けて募集したプログラムには、マルウェア(maliceのあるsoftware)が混入している可能性が否定できない。
そこで、botのプログラムコード監査またはプログラム開発を信頼できる所に頼めないか?というのが、K氏経由の伝言だった。Yuは、自身の青く染まったGoogleカレンダーを横目に、話だけでも聞いてみることにした。
1月14日。自分自身または自社のメンバーで動ける人員のアテは無かったが、自社製のソフトウェアライブラリを使えば工数を短縮できるので、どこからか連れてきたエンジニアをディレクションするくらいは可能だろうという算段だった。Yuはどこからか連れてきたエンジニアをディレクションするくらいは可能である旨をY氏に伝えた。
その日の晩、Y氏からの返答は意外なものだった。
「可能なら木村さんと、他にCosmosに詳しいエンジニアA氏の2組に、別々でプログラム開発をお願いしたい。」
複数人による相互の不正監視と、責任の分散が必要であると考えていたYuにとって、懸念点の大部分は晴れた。残る懸念点としてスケジュール調整があったが、「2組に分かれるなら、ノード管理を別組の方に相乗りさせてもらえれば工数は短縮できそうだ」と、Yuは楽観視していた。ノードとは、ブロックチェーンを動かすコンピュータープログラムであり、botプログラムを開発したときはbotプログラムからノードに対してトランザクションの指令を送ることになる。つまり本件はbot開発だけで終わりではなく、ノードの管理まで行う必要があった。このノード管理部分を相乗りさせてもらえれば、必要な工数は短縮されるだろう―――
果たして、LINEグループ「ATOMサルベージ」が結成された。
1月17日。「ATOMサルベージ」内で電話ミーティングが行われた。まずはY氏から再び状況の説明を受ける。盗難されたと思われるシードフレーズは、ハードウェアウォレットで管理していた。ハードウェアウォレットとは、USBメモリのような外見をしている、パソコンにUSB接続できる端末である。ハードウェアウォレット内にシードフレーズが保存されており、接続されたパソコンはシードフレーズを読み取ることはできないが、ハードウェアウォレット内で作成したデジタル署名を受け取ることができる。
当然ながらそのハードウェアウォレット内のシードフレーズを使わなければ、botプログラムを走らせることはできない。そのハードウェアウォレット内のシードフレーズを用いて作られたアドレスの残高を送金する権限は、ハードウェアウォレット内で作成したデジタル署名によってしか得られないからである。
議論の末、Yuはbotプログラムのソースコードにシードフレーズを載せてしまうことにした。もちろんA氏に監査してもらう想定だった。というのも、基本的にシードフレーズをソースコードに直接書き込むのは、セキュリティの観点から好ましくない。また、Yuが開発したプログラムがマルウェアだったら、Y氏は被害を受ける。
一方でA氏は、ハードウェアウォレットを用いて事前にデジタル署名を複数パターン作成しておき、時が来たらそのデジタル署名を用いてトランザクション指令を一斉放出する方針でいた。このやり方は、ハードウェアウォレットからシードフレーズを取り出さなくても、ハードウェアウォレットを用いてデジタル署名を作成するだけで済むためセキュアである。
しかしYuはそのやり方は採らなかった。Cosmos系ブロックチェーンにはシーケンスという概念が存在する。これはアドレスと紐づく値で、アドレスがトランザクションを送信する度に1ずつ加算されていく値になるのだが、トランザクションにもアドレスのシーケンスを記載しなければならない決まりになっている。要するに、アドレスのシーケンス値と一致したシーケンス値を、トランザクションに記載しなければならないのだ。そしてそれはトランザクションが送信されるたびに加算されてゆく。
このシーケンスの決まりが原因で、事前にデジタル署名を作成する場合、複数のシーケンスを想定して複数パターン作成しなければならないのである。
「仮にハッカーがこちらの作戦に勘づいた場合、シーケンスを加算して攪乱するためにハッカーが無意味なトランザクションの送信を繰り返す可能性も無くはないな。」Yuはそう考えていた。
Yuは空き時間を見つけてはすぐにbot開発に取り掛かった。
1月24日。空き時間が多くなかったが、botのテストをできるまでに至ったYuは、テスト用のATOMトークンを貰うためにY氏に連絡を取った。Y氏は快くテスト用のATOMトークンをYuに送信した。
だがこのときすでに、Y氏の資産のうち、Cosmos HubブロックチェーンのATOMトークンだけでなく、OsmosisブロックチェーンのOSMOトークンまでもハッカーの手に渡りつつあった―――
発覚したのは数日前。同じハードウェアウォレットで管理しているOsmosisのY氏自身のアドレスからも、ハッカーによるものと思われる不審な挙動が見て取れた。
Osmosisブロックチェーンでは、OSMOトークンに加えて、取引ペアごとのLiquidity Providerトークン (LPトークン) をステーキングすることができる。例えばATOM/OSMOペアなら、ATOMトークンとOSMOトークンの組み合わせをATOM/OSMOペア用LPトークンに変換し、それをステーキングすることができる。
Y氏は、このようなLPトークンをステーキングしており、ハッカーに見つかる前にステーキング解除を行ったが、ステーキング解除には14日がかかる仕組みになっていた。
加えて、14日が経過するまでの間も、OsmosisではLPトークンステーキングの報酬が毎日日本時間未明に付与され続けるが、その付与された報酬分をY氏が毎日ハッカーより先に手動で引き出さなければならない。
このように毎日日本時間未明に手動で引き出すのはY氏の負担となっており、Y氏はYuに、Cosmos Hub用のbotプログラムをOsmosisに転用できないか相談した。
Yuは即答した。「可能です。」
Cosmos系ブロックチェーンは、基本構造は同じになっている。自社で開発したソフトウェアライブラリなら、Osmosisブロックチェーンにも対応できる確信がYuにはあった。
1月25日。Yuは、Y氏からテスト用のOSMOトークンを貰うのに加えて、ハックされたシードフレーズを引き渡してもらった。連絡はLINEからTelegramへ移行した。
テスト用の秘密鍵では動作が確認できたので、Y氏のハックされたシードフレーズの秘密鍵で動作確認をする必要があったのだ。
シードフレーズをTelegramと電話で受け取っている間、YuにとってY氏から意外な相談があった。
A氏と費用面等で折り合いがつかなかったので、YuのbotとY氏の手動の二刀流で進められないか、というものだった。
これではYuの最初の懸念点であった責任の分散は全く果たされない。だがしかし、Yuは答えた。
「大丈夫です。」
Yuは自身でbotプログラムをテストした範囲内で動作がうまくいっていたため、botプログラムに自信があったのだ。自信が楽観的観測を呼んでいた。
Yuはハックされたシードフレーズを用いてbotプログラムを起動する。
Y氏がハックされたシードフレーズのアドレスに対して、試験的にOSMOトークンを送信したと思われた瞬間、Slackの通知音が部屋に鳴り響いた―――
「スッコココ」
ハックされたシードフレーズのアドレスから、退避用の別アドレスに即時送金に成功した通知だった。
ブロックチェーンのエクスプローラーであるMintscanの画面を確認したY氏からメッセージが入った。
「これは!!」
「素晴らしすぎる」
Y氏の興奮は止まらない。
「神過ぎます‼猛烈に感動して、今すぐ京都に駆けつけてお礼に行きたいレベルですw」
「木村大先生‼ 素晴らしすぎます‼」
「そして、美しすぎてNFTにしたいレベルですw」
「今、僕には木村さんがディズニーランドの魔法使いにしか見えないです🤩」
0時0分。日が変わった瞬間、Yuは答えた。
「ハハッ」
このとき、Yuの楽観は最高潮に達していた。
さらにY氏は、Yuに対してJunoブロックチェーンのJUNOトークンの救出を追加で依頼した。同じハードウェアウォレットで管理していたものだ。
ネズミではなく、絨毯で飛べる中東の男性の歌を大声で歌いながら、Yuはテキストで即答する。
「了解です!」
直近の回収スケジュールは以下の通りとなった。まず、1/26-28の間、未明にOsmosisのLPトークンのステーキング報酬回収が続く。そして1/28の未明、ステーキング報酬回収より後の時刻に、LPトークンのステーキング解除が完了するので、LPトークンを回収する。2/2昼過ぎに、ATOMのステーキング解除が完了するので、ATOMトークンを回収する。2/11未明に、JUNOのステーキング解除が完了するので、JUNOトークンを回収する。
未明2:30頃に付与されるOsmosisのLPトークンのステーキング報酬を回収できるか確かめるため、本番用シードフレーズで稼働したままにして、この日の確認作業を終えることとなった。
Yuは寝具についた。botプログラムは本番用シードフレーズでも問題なく稼働したので、これで安心して眠れるだろうと思っていた。
正子の時刻を過ぎ、宇宙空間で太陽は地球の真裏を通過している。影の世界の中で、自分の目に刺さる光源は、月と、高騰を取り逃したLUNAのチャートを示すスマホ画面だけだ。
眠りにつくため、2つの月の光を遮った―――
だが眠れない。なぜか眠れないのではなかった。Yu自身にとって眠れない原因は明白だった。
「魔法の絨毯の歌が脳内で無限に再生され続ける…」
このときすでに、Yuの自律神経は正常ではなくなっていたのだろう。
1月26日朝。早くもYuが楽観モードを変えるときが来た。
日本時間未明2:30頃に付与されるOsmosisのLPトークンのステーキング報酬をbotが自動で回収することには成功していたものの、その後からbotプログラムがめっきり反応しなくなっていたのだ。その旨の連絡がY氏から来ていた。反応しなくなった直後は、Y氏が手動で回収を行っていた。
Yuはログを確認した。
「ノードが落ちてる。」
botのプログラムは落ちるはずがない。それに関しては確かな自信があった。その自信のちょうど盲点であった。
しかしその日のログではノードが落ちた原因を特定するに至らなかった。Yuは応急処置として、ノードが落ちるか定期的に巡回検査するスクリプトプログラムを書いた。
さらにOsmosisブロックチェーン上でOSMO以外のトークンを併せて回収できるよう改良を施した。
Yuは応急処置に確固たる自信を持てぬまま、寝具についた。
1月27日。
Yuが朝起きてすぐ確認したスマホの画面にあったのは、Y氏からのメッセージだった。
「25分前にテストした時は正常に動いてたんですけど、やっぱり2:15-2:30の間にまたノードが落ちたっぽいですね。」
二度目のログ確認で、ついにYuは原因を特定するに至った。
Osmosisブロックチェーンは、日本時間未明2:30頃にLPトークンステーキングの報酬が一斉に支払われる仕様になっていた。この一斉に支払われるタイミングだけ、ブロックチェーンのブロックのデータサイズが極端に肥大化していたのだ。
その極端に肥大化したブロックデータの情報をbotプログラムからリクエストされた際に、ノードは処理しきれずダウンし、結果としてbotがノードに対してトランザクション送信指令を出しても動かなくなっていた。
Yuは即座に対応した。まず、そもそもブロックデータの情報をとって最新ブロックが来たときに処理を行うのではなく、3秒などの間隔を決め打ちして無限ループを回す仕様にした。
さらに、2:30に問答無用でノードを再起動するよう設定を入れた。
Yuはこの原因の特定とその対処には的確に行えたとの自信があった。
1月28日。Yuに最悪の目覚めが訪れた。
凍てつく寒さの中、普段起きない早朝に目が覚めた。5時19分だった。
LINEを開くと、そこにはY氏からの着信履歴がズラリと並んでいた。Yuはスマホの着信音をオフにしていたため一切気づかずに寝ていた。
Yuは異様な緊迫感を感じながらTelegramを確認する。
日本時間未明2:26頃、OsmosisのLPトークンのステーキング報酬の回収に成功していたとのメッセージがY氏から入っていた。
「素晴らし過ぎます◎
ブロックが再開されるのが2:30だと思ってたら毎日前後するみたいですね。それでも2022-01-28 02:26:26にちゃんと全部送金出来てました👏
朝のLP解体とosmosisのunbondもかなり楽な戦いになると思います。
木村先生、有難う御座います☆」
Yuはスクロールして絶句した。OsmosisのLPトークンのステーキング解除が完了してからの時間帯に、OSMOトークンがハッカーに取られたとのメッセージが、4:15頃にあったのだ。
「木村先生、急遽事態です‼」
「https://www.mintscan.io/osmosis/txs/C6AC18B1452C404C59BA1DF664234BDA228FA2AAD3F430C8DDDAE5366CC426B0」
「ハッカーに取られました…」
「最悪、超申し訳ないです、、、至急ログ確認します、、、」
YuがTelegramでメッセージを送ると、即座にY氏から返信が来た。
13万ドルほどハッカーに取られ、即座に手動で5万ほど回収し、残りの大部分はステーキングを延長させて対処したとのことだった。
非常に的確な対処であった。Y氏からのメッセージが続く。
「こちらが延長戦にとりあえず持ち込みました。」
「いや、今日のリワードは完璧に取れたので油断してるのがありましたね。」
「最初から手動で張ってたら勝てたかもしれないので僕の警戒ミスですね……。」
Yuは謝るしかなかったが、立ち止まってもいられないのでログを確認した。
衝撃の光景が広がった。
「他のノードから通信切断されてる…」
ノード自体は動いていたが、接続先の他のノードとの通信が切断されていたのだ。そして通信切断されていたためbotからのトランザクション送信指令はもちろん機能していなかったが、ノード自体が落ちたわけではなかったために、ノードが落ちていたら再起動するスクリプトも機能していなかった。
「運が悪すぎる…」
Yuはログを見てそう思うしかなかった。
ステーキングが延長され、回収スケジュールは以下の通りに変わった。2/2昼過ぎに、ATOMのステーキング解除が完了するので、ATOMトークンを回収する。2/11未明に、JUNOのステーキング解除が完了するので、JUNOトークンを回収する。まず、1/29-2/11の間、未明にOsmosisのLPトークンのステーキング報酬回収が続く。そして2/11の昼過ぎ、LPトークンのステーキング解除が完了するので、LPトークンを回収する。
さらに、回収する時刻はYuが常駐してbotの状態を監視することとした。それを踏まえてOsmosisの延長戦の終了時刻は昼過ぎに設定された。
まだ5時台だったため、Yuは二度寝を試みた。
一切眠れなかった。ショックは大きかった。プログラムには自信があったが、ノードの管理でここまで足元をすくわれるとは―――
8時まで寝転がり続けたが、起きた。Y氏にメッセージを送信した。
「ショックでうまく二度寝できませんでしたが、現実を飲み込めてきました。 ATOM, OSMO, JUNOそれぞれサーバー2台体制計6台体制に増強して、片方ノード落ちてもうまくいけるようにします!! サーバー1台というのは、今思えば相手が玄人ではないということを聞いて生まれた油断だったなと思いました…。 初戦の失敗したおかげで後全て勝利できたと、終わってから思えるようにしていきたいと思います。」
すぐに返信が来た。
「何か、そこまで責任感持って頂けて本当に嬉しいです!!はい‼︎後程エクセル送るんですけど、全体の数%のhackedなので他の守られれば快勝です。」
返信の早さに、YuはY氏の睡眠時間が気になりつつも、心配する余裕は無かった。明らかに自律神経に支障をきたしていた。
自分が開発したプログラムには自信はある。それは揺らがなかった。
しかしながら、ノードの管理の自信を失い始めていた。ノードを建てることは簡単だが、ノードの高可用性を維持する難易度がとてつもなく高いように感じられた。
実はYuは2月2日に、大学院専門職修士課程の最終報告会も控えていた。その準備のため、毎日オンラインミーティングを行っていた。その負担が、大きかった。
この日の晩、Yuは大学院関係のテニス仲間とテニスに出かけた。コンディションは最悪だった。
走ればすぐ息が上がった。そして暗がりの中、コート照明だけでは一切ボールを目で追うことができていなかった。
虹彩の調節すらまともにできていなかった。自律神経は完全に支障をきたしていた。
1月29日。Yuは思い切って、他人の助けを借りようと決意した。
まず、大胆にTwitterにてCosmos Hubブロックチェーンのフルノードを建設・管理してくれる人を募集した。Yu自身の管理するノードに対してトランザクション送信指令を送るbotに加えて、他の人の管理するノードに対してトランザクション送信指令を送るbotを作ればよいという発想に至ったのだ。
さらに、Cosmos HubブロックチェーンやOsmosisブロックチェーンのコアメンバーや関係者、そしてCosmos系ブロックチェーンのノード管理を簡単にするサービスQuicksyncを提供するChainLayer社のエンジニアにアドバイスを乞った。多くの人が親切にYuに対応した。
どうやらこの手のハッキング事件はいろいろ前例があるようだった。
他人に助けを借り、Yuの気持ちはどん底からすぐに回復した。早くも自信が復活していた。元々プログラムに問題は無かったのだが、問題だったノード管理にも恒星のような光明が見えてきた。それも恒星はたった一つではなく、複数だった。
1月30日。増強と改善を施したOsmosis用のbotは、問題なくLPトークンのステーキング報酬を回収していた。
1月31日。Cosmos Hub用のbotは増備を重ね、5台のbotが同時並行で動き始めた。
2月1日。ATOM回収を前日に控え、前日テストを行う。
しかしなぜかこの日のbotは、処理に失敗するわけではないものの、非常にもたついていた。受信したブロックの4ブロック後に返送するなどしていたのだ。
Yuはすぐにログを確認し原因を突き止めた。トランザクション送信時に支払う手数料の設定を必要以上に丁寧に行っていたため、手数料設定の処理にもたついていたのだ。
すぐに手数料を丁寧に調整する機構を撤廃し、手数料を過剰に支払うことを妥協して手数料を決め打ちする仕様に変えた。
さらに、自動のbotのほかに、手動でボタンを押すとトランザクション送信指令が送られるプログラムを開発した。
再びテスト。自動のbotプログラムと、手動ボタンプログラムを組み合わせれば、悪くても受信後2ブロック、ほとんどの場合で受信後1ブロックの早さで回収することに成功した。
テストにて、手動ボタンプログラムのヒューマンエラーのパターンに遭遇し、予防策を考えることもできた。
Yuは思った。
「これは勝てる。」と。
専門職修士課程の最終報告会と、ATOMの回収を翌日に控えたYuは、質の低い睡眠についた。
2月2日。ついに専門職修士課程の最終報告会と、ATOMの回収の日が来た。
Yuは早くに目が覚めた。ほとんど寝れていなかった。朝から心臓の鼓動が鳴り響いていた。吐き気を押さえて朝食をとり、ZOOMを起動した。他人の発表を聞く余裕などどこにもなかった。
13時。最終報告会の発表順が来た。Yuは心臓の鼓動が鳴りやまない中、無事に発表を終えた。
YuはY氏に15時に事前リハーサルすることを頼んだ。その頃、Y氏は明治神宮に参拝していた。
15時。Y氏が帰宅し、ATOM回収前の最終リハーサルを開始した。
Y氏がハックされたシードフレーズのアドレスに対して少額のATOMを送る。
Yuは自動botプログラムを走らせつつ、手動ボタンプログラムを連打した。
受信後1ブロックでの回収が繰り返された。
自動botプログラムに関して、3秒間隔ではなく0.5秒間隔で動くbotも配備し、手動ボタンプログラム用のノードもこの日のために増設した。速くないはずがなかった。
「これを維持すれば絶対に勝てる。」
二人は同じことを考えていた。
15時39分。Yuは手動ボタンプログラムの準備を整え、メッセージを送る。
「41分になったら連打開始します。」
「はい」
15時41分。
キーボードの音以外は無音で、スローモーションの世界に変わった。
カタッ
カタッ
カタッ
カタッ
カタッ
カタッ
・
・
・
・
・
・
15時44分。
「勝ちました」
「https://www.mintscan.io/cosmos/txs/670DDE59C7B0C06C4D1965EB57BCCC4BF017C9DC3951D32808E7B728F9B14073」
YuはそうY氏にメッセージを送った。
手動ボタンプログラムが119,999ATOMを回収し、自動botプログラムが残りの端数を回収することに成功していた。
「おおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお」
「本当に有難う御座います‼」
「神様、仏様、木村様」
「無事着金も確認出来ました👏」
二人の興奮は十数分間収まることがなかった。それもそのはず、約4億円の救出に成功したのだ。
その後、Yuは大学院の最終報告会のZOOMが終了したことを確認し、やっと一息つくことができた。心の底からの休息が、とても久しぶりに感じられた。
その後、大学院の教員からメッセージが来た。
「最終報告会、教員の全会一致で最優秀賞でした。」
2月3日。Osmosis用のbotは相変わらず未明のLPトークンのステーキング報酬を回収してくれていた。
このまま2月11日まで放置で済むかというと全くそうではなかった。Yuは2月8日に大学院情報学研究科博士後期課程の入学試験を控えていた。
「試験勉強ほとんど時間とれてないのはまずい…」
心の底からの休息ができる時間はすぐに過ぎ去った。
2月4日。botはOsmosisの報酬回収に成功。仕事の合間を縫って勉強。
2月5日。botはOsmosisの報酬回収に成功。仕事の合間を縫って勉強。
2月6日。botはOsmosisの報酬回収に成功。仕事の合間を縫って勉強。
Yuはポップスタイルピアノのレッスンに出かけた。教科書の内容に従って取り組んでいた課題曲は、AKB48の「365日の紙飛行機」だった。
「弾けない…」
元々弾けていたものが、弾けない。注意散漫で、まともに弾くことができていなかった。
紙飛行機では、プレッシャーという超重力の空間を脱出することはできなかった。必要なのはロケットだった。
2月7日。botはOsmosisの報酬回収に失敗していた。またしても通信切断である。2台同時稼働なので同時に通信切断される確率は下がっているとYuは思っていたが、persistent_peersと呼ばれる常時接続するノードの設定がOsmosisの公式ドキュメントに従った同一の内容であるため、通信切断されるときは同時に通信切断されることが判明した。
Y氏からメッセージが届いた。
「最近順調だけど、昨日何か嫌な予感がして目視してから寝ようと思ったらナイスでした。 」
Yuは返事を送る。
「自分もそろそろこんな成功がずっとつづくわけではないだろうと思っていたところではありました…ありがとうございます。めっちゃナイスです。」
YuはChainLayer社のQuicksyncが提供するノード接続先データを利用して、安定したノードに接続するよう設定を変えて対処した。
加えてY氏からメッセージが届いた。
「ハッカーがChihuahuaブロックチェーンのHUAHUAトークンを触っているのを見てちょっと気になって寝れなくなりましたね」
Yuに依頼があったのはCosmos HubのATOMトークン、OsmosisのLPトークン、JunoのJUNOトークンだったが、加えてChihuahuaのHUAHUAトークンもお願いしたいとのことだった。
HUAHUAのステーキング解除が完了するのは、JUNOのステーキング解除完了の数分後であった。即座にChihuahuaのノードを建設し、botプログラムをChihuahua用の設定に変えて起動した。
2月8日。大学院情報学研究科博士後期課程の入学試験の日が来た。
自律神経は復活しつつあった。睡眠はとれた。しかしながら寿命が縮むような心拍は変わらなかった。
淡々と試験を終わらせた。
ペーパーテストに対してYuはいまいち良い感触を持っていなかった。
口頭試問は一方的に話してほとんど質問が来ぬまま終わった。
「うーん。どっちに転ぶかわからん。」
この日、YuはY氏とメッセージを一切交わさなかった。いや、交わす余裕は無かった。
2月9日。入試が終わり、時間だけは余裕が出てきたYuは、OsmosisのLPトークンに関して、LPトークンを解体してから回収するか、LPトークンそのものを回収するかをY氏と作戦会議を行った。
OsmosisはLPトークンを解体すると、そのLPトークンが消失する代わりにそのLPトークンの取引ペアのトークンが返却される。例えばATOM/OSMOペアのLPトークンを解体したらATOMトークンとOSMOトークンが返却される。
技術的にはLPトークンもトークンなので、LPトークンごと送信してしまうのが手っ取り早く確実だった。しかしながらOsmosisのWebアプリ上ではLPトークンの解体機能はあってもLPトークンそのものを送信する機能が無かった。この事実が、裏側の機能としてはLPトークンを送信することができるがWebアプリで対応してないだけなのか?もしくは裏側の機能としてもLPトークンを送信することになんらかの制約があるのか?という判断に関してYuを迷わせていた。
YuはOsmosisブロックチェーンのソースコードを解読し、"裏側の機能としてはLPトークンを送信することができるがWebアプリで対応してないだけ"であることが概ね正しいだろうという判断を持っていたが、確信に至るため、Osmosisのコア開発者にDiscordのダイレクトメッセージで質問を投げることにした。
Osmosisの開発者は非常に親切に対応してくれ、Yuの仮説が正しいことが裏付けられた。
2月10日。botはOsmosisの報酬回収に成功。
翌日は未明にJUNOとHUAHUAの回収があり、昼過ぎにOsmosisのLPトークンの回収がある。
未明に起きるため、Yuは晩の早い時間から仮眠をとり始めた。
2月11日。総額の大半を占めるATOMはすでに回収成功しているとは言え、今日こそが最終決戦の日である。
Yuは2:30に起床した。
botはOsmosisの報酬回収に成功。
しているとYuは思っていた。しかしながらTelegramでY氏からメッセージが届いていた。
「今日はbot駄目でしたねー」
そんなはずはない、とYuは思った。なぜなら自分が管理しているノードに対してトランザクション送信指令を送るbotだけではなく、Cosmos HubのChain Registryに登録されたOsmosisのREST API用ノードに対してトランザクション送信指令を送るbotを起動していたからだ。これはいわば準公式のノードのようなものだ。
それでもやはりY氏の言っていることは正しかった。
2:30頃の、極端にブロックのデータサイズが肥大化するのが原因なのか、Cosmos HubのChain Registryに登録されたOsmosisのREST API用ノードさえも正しい応答を返さなくなっていたのだ。
OsmosisのLPトークンのステーキング報酬を少額ずつ毎日未明に回収するのは今日が最後だった。
YuはOsmosisのbotが有終の美を飾ることに失敗したことに悔しさはあったものの、すぐにJUNOとHUAHUAのリハーサルに移った。
ほとんど受信後1ブロックで回収。たまに受信後2ブロックで回収。
ATOMの時と同じで、本番でこれが発揮できれば勝てる内容だった。
3時41分。Yuは手動ボタンプログラムのための連打を開始する。
再び、キーボードの音以外は無音で、スローモーションの世界に突入した。
カタッ
カタッ
カタッ
カタッ
カタッ
カタッ
・
・
・
・
・
・
3時44分。
「無事勝ちました。」
「https://www.mintscan.io/juno/txs/51CEF9A32FC9B319E47ECD6F3247A52814424F06F502A1CF73C4A37988D0DCE8」
3時45分。
「有難う御座います‼!‼️!」
「ではhuahua準備しておきます。」
「はい。お願いします」
喜んでいる暇など一切なかった。Yuは淡々とした会話をし、HUAHUAに気持ちを切り替えた。
3時53分。
無事だった。Y氏から返信が来た。
「よっしいいしいしいっしいしs」
興奮しすぎていて、なにを言っているのかわからなかった。
4時12分。
突然謎のメッセージがY氏から届いた。Yuへの依頼対象外であったSentinelブロックチェーンのDVPNトークンが、Y氏の手動より先にハッカーが回収してしまったとの悲報だった。
このときY氏のKeplrウォレットがエラーを表示してずっと使えなかったためにハッカーにスピード勝負に負けた、とのことだった。
8時28分。Yuは二回目の仮眠から目を覚ました。Y氏に、12時からリハーサルをすると連絡をとる。
このときYuはOsmosisのLPトークン回収に関して、一つ今までとは違う点を予期していた。これまではCosmos HubブロックチェーンならATOMトークンを、JunoブロックチェーンならJUNOトークンを回収していたが、これらはどれもトランザクションの手数料支払いに使うトークンでもある。したがって、残高を回収する際に手数料が足りないという事態が起きることはあり得ない。
一方で、OsmosisのLPトークン回収では、手数料はOSMOトークンで払うことになる。Osmosisブロックチェーンはその時は手数料0OSMOでトランザクションを送信することも可能だったが、トランザクションが承認されるまでの時間を短縮するには、手数料を支払わざるを得なかった。ここで、LPトークンのみ残高があり、OSMOトークンの残高が0であった場合、手数料が不足していてトランザクションを送信できない事態に陥ることが予期されたのだ。
このため、Yuは手動でボタンを押すだけでOSMOトークンを手数料分だけ補給する、つまりハックされたシードフレーズのアドレスに対して少額のOSMOトークンを送信するプログラムを事前に用意していた。
12時00分。二人はリハーサルを開始した。
Y氏がハックされたシードフレーズのアドレスに対して少額のOSMOを送る。
botは見事に回収した。
さらにYuはハックされたシードフレーズのアドレスに対して、事前に用意しておいた少額のLPトークンを送り、同時に手数料分のOSMOを補給するプログラムのボタンを押した。
botは見事に回収した。
このときには、Yuは緊張感から解放されていた。
ATOMとJUNOと同様に成功する。軌道に乗った。その確信しかなかった。
12時40分。
「41分になったら連打はじめます。」
「はい」
ルーティンと化したやり取りだけがなされた。
12時41分。
カタッ
カタッ
カタッ
カタッ
カタッ
カタッ
・
・
・
・
・
・
・
・
・
・
・
・
「!?」
いつもより明らかに連打を続ける時間が長い。一切Mintscanに受信情報も送信情報も反映されなかった。
とはいえ、Yuにとって、手動ボタンプログラムを連打する以外にできることはなかった。
「ゴクッ…」
カタッ
カタッ
カタッ
カタッ
カタッ
カタッ
・
・
・
・
・
・
12時46分。
Y氏のもとにYuからメッセージが届いた。
「全勝です!!」
「pool 1 https://www.mintscan.io/osmosis/txs/3D3A46E4DFCE092889C2E7905ED4F7E3A4CB9C5050C7680B3C32A206758C6F74」
「pool 2 https://www.mintscan.io/osmosis/txs/F2CADCF7CEAF5D62ACADB3E77DDCC98C049A1C8272D2B1B4E583E44FFC79C67B」
「pool 498 https://www.mintscan.io/osmosis/txs/A1CF9C7BD71C27F5311FB08FE829E5702E3A1443A7481C12E02F19B51FEFBAB5」
Yuは解放感を得ながら目をつむった。宇宙が見えていた。
12時47分。YuのTelegramの画面にある文字が浮かび上がる。
(Missed Call)
宇宙が見えている間に、Y氏からの着信をスルーしてしまっていた。
Y氏「ありがとうございます1!!!!!!!!!!!!!! しゃーーーーーーーー」
Yu「お疲れ様でしたー! 最後は手動ボタンプログラムより自動botプログラムのほうがはやかったみたいです。」
Y氏「なんか、ステーキング解除が表示されてた予定時刻よりもかなり遅れてされたみたいで焦りました」
Yu「自分もです。時間になってもなかなか残高に反映されないしちょっとビビりました。」
Y氏「全部終わったので報酬振込みますね。」
Yu「承知しました! 最初の頃のノード停止によるOSMOの一部はすみませんでしたが、あれ以外すべて勝てて本当に良かったです。お疲れ様でした。」
Y氏「とりあえず、ご苦労様でした‼やっと解放されました‼ 木村君がちゃんとスタンバイしてたのは全勝ですね👏」
Y氏「その辺はギリギリ過ぎて依頼に入ってなかったので、大丈夫です。むしろ、手動で早押ししたら勝てた可能性十分にあるので。後は、もしハッカーの情報掴めたら一応共有します‼」
プレッシャーから解放された。超重力の空間を脱出した。この空間なら紙飛行機でも飛べる―――
2月16日。入試結果が発表された。合格だった。
伏線は、これですべて回収した。
後日、ハッカーの足取りの追跡を軽く継続した。
盗難されたOSMOトークンはATOMトークンに変換されて大手取引所BINANCEに移動していたことまで判明。Y氏がBINANCEに凍結依頼を出し、司法等と連携して捜査中だ。ただし日本の警察は役に立たないようだ。
盗難されたDVPNトークンはATOMトークンに変換され、Accumulate ProtocolのCosmos用アドレスに移動していたことまでは判明した。
その後、未だにハッカーの正体は掴めていない。
だが二人は、必ずいつかハッカーをぶっ潰してやるという思いを持ちながら、平常の重力が感じられる日常の空間に戻っていった―――
※この物語はノンフィクションです。個人情報を伏せたうえで史実に基づいています。
この記事が気に入ったらサポートをしてみませんか?