こんにちは、セキュリティリサーチャーの「私」です。
普段は工場の奥深くに眠るSCADA(監視制御システム)やIoTデバイスの中身をひっくり返して、「どうすればこの物理的なスイッチをハッカーから守れるか」といった泥臭い研究をしています。ですが、最近はそれと同じくらい、ブロックチェーン——特に「L2(レイヤー2)」と呼ばれるイーサリアムの拡張道路のセキュリティに没頭しています。
なぜかって? 実は、制御システムのセキュリティもブロックチェーンのセキュリティも、根底にあるのは「信頼の置き場所をどこに設計するか」という、人間味あふれる泥臭い駆け引きだからです。
今日は、Optimistic Rollup(オプティミスティック・ロールアップ)という技術に潜む、「不正証明(Fraud Proof)の遅延」と「検閲(Censorship)」という、ちょっと怖いけれど絶対に知っておくべき脆弱性について、家の防犯に例えて優しく紐解いていきましょう。
—
1. 「性善説」で動く街、Optimistic Rollup
まず、Optimistic Rollupの仕組みを「家の鍵の管理」に例えてみましょう。
イーサリアムという大きな本家(L1)は、土地代(ガス代)が高くて手続きも時間がかかります。そこで、隣に「L2」という便利な出張所を作りました。
Optimistic Rollupの「Optimistic」は「楽観的」という意味。つまり、「出張所での取引は、基本的にはみんな正直にやってるよね!」という性善説で動いています。
- シーケンサー(管理人): 出張所の取引をまとめて、本家に「はい、今回の取引記録です!」と報告する役割。
- 不正証明(不正の告発): もし管理人が嘘をついていたら、誰でも「異議あり!」と叫んで、本家に証拠を提出できます。
この「異議あり!」と言える期間(チャレンジ期間)は、通常7日間ほど。この間、誰も文句を言わなければ、取引は確定します。
—
2. 泥棒が狙う「沈黙の7日間」:不正証明の遅延リスク
ここで一つ、恐ろしいシナリオを考えてみましょう。
もし、悪意のある管理人が「あなたの銀行残高を全部自分のものにした」という嘘の報告を本家に送ったとしたら? あなたは慌てて「異議あり!」と叫ぼうとしますよね。
しかし、もし「あなたの叫び声が本家に届かないように、誰かが道を塞いでいたら」どうなるでしょうか。
不正証明が届かない!「検閲」という名の妨害
これが「検閲(Censorship)」です。シーケンサー(管理人)が、自分にとって都合の悪い「異議あり!」というトランザクションをわざと無視し、ブロックに入れないように操作することです。
そのまま7日間が過ぎてしまうと、本家は「あ、誰も文句を言わないなら、管理人の報告は正しかったんだな」と判断して、あなたの資産は盗まれたまま確定してしまいます。
「防犯カメラがあるのに、泥棒がカメラの前に目隠しを置いて、管理人が警察への通報を無視し続けている状態」。これがL2における検閲耐性の欠如が招く、最悪のシナリオです。
—
3. 現場のコードで見る「強制退去」の仕組み
「そんなの怖くて使えないよ!」と思うかもしれませんが、大丈夫。賢いエンジニアたちは、ちゃんと「裏口」を用意しています。
それが「L1からの強制トランザクション(Forced Transactions)」です。管理人が無視するなら、出張所を通さず、直接「本家(L1)」に訴え出る仕組みです。
以下は、スマートコントラクトにおける「強制的な資金引き出し」の概念を簡略化した Solidity(スマートコントラクト言語)のイメージです。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title L2資産救済の簡易イメージ
* シーケンサーが検閲を行っている場合に、L1から直接「引き出し」を予約する仕組み
*/
contract ForcedInclusion {
mapping(address => uint256) public pendingWithdrawals;
uint256 public constant CHALLENGE_PERIOD = 7 days;
// 1. シーケンサーを無視して、L1に直接「引き出し」を申請する
function requestForcedWithdrawal(uint256 _amount) public {
// L1のコントラクトに「この人は引き出したいと言っている」と記録
// シーケンサーはこの記録を無視できない(無視するとL2自体が止まる設計にする)
pendingWithdrawals[msg.sender] = block.timestamp;
emit WithdrawalRequested(msg.sender, _amount, block.timestamp);
}
// 2. 一定期間(例:7日間)経ってもシーケンサーが対応しなければ、
// L1側で強制的に資産を確定させる
function finalizeForcedWithdrawal(address _user) public {
require(pendingWithdrawals[_user] != 0, "申請が見つかりません");
require(
block.timestamp >= pendingWithdrawals[_user] + CHALLENGE_PERIOD,
"まだチャレンジ期間中です。管理人の反論を待つ必要があります"
);
// ここで実際に資産をユーザーに渡す処理(実際はもっと複雑な証明が必要)
// ...
}
event WithdrawalRequested(address indexed user, uint256 amount, uint256 timestamp);
}
このコードのポイント:
requestForcedWithdrawal: 管理人が意地悪して無視しても、本家(L1)に直接「私は辞めます!」とハンコをつきに行く機能です。CHALLENGE_PERIOD: 泥棒が「いや、その人は嘘をついている!」と言い返せる時間をあえて設けることで、公平性を保っています。
—
4. 私たちが気をつけるべき「防御のヘッダー」とは?
開発者やIT担当者として、新しいL2プロジェクトを評価するときは、以下のポイントをチェックしてみてください。これは家の防犯性能を確認するのと同じくらい重要です。
1. シーケンサーは分散されているか?
- 管理人が一人だけだと、その人が「悪魔」になった瞬間に詰みます。複数の管理人が交代で働く仕組み(分散型シーケンサー)があるか確認しましょう。
2. L1への「強制脱出ハッチ」があるか?
- 「シーケンサーが止まっても、L1から直接資産を取り戻せるか?」というドキュメントを必ず確認してください。
3. 不正証明の実装状況(Fraud Proofs: Enabled?)
- 実は、驚くべきことに「まだ不正証明がメインネットで有効になっていない」L2プロジェクトも存在します。これは「鍵のない金庫」を預けているようなものです。
—
まとめ:一歩ずつ、安全なWeb3の世界へ
Optimistic Rollupは、イーサリアムを使いやすくする魔法のような技術ですが、その裏側には「誰かが監視していること」と「監視の結果を報告する道が確保されていること」という大前提があります。
- 不正証明の遅延 = 警察への通報が遅れるリスク
- 検閲 = 犯人が電話線を切っている状態
このリスクを理解した上で、技術の進歩(ゼロ知識証明を用いたZK Rollupなど、より強力な防犯システム)に目を向けていくことが、これからのセキュリティ担当者には求められます。
小難しい用語に惑わされず、「これって、誰を信じれば安全なんだっけ?」と立ち止まって考えること。それが、IoTの世界でもブロックチェーンの世界でも、最強の防御になります。
一歩ずつ、一緒に学んでいきましょう!
コメント