こんにちは!ブロックチェーンの世界やIoTのセキュリティに足を踏み入れたばかりだと、なんだか専門用語ばかりで難しそうに見えますよね。「スマートコントラクト」「イベントログ」「リアルタイム監視」……。文字を見ているだけで、頭がクラクラしてしまうかもしれません。
でも、安心してください!今回は、身近な「お家の防犯」にたとえながら、ブロックチェーンの世界でどうやって悪者(ハッカー)の侵入を防ぐのか、一緒に一歩ずつ優しく学んでいきましょう。
—
1. 家の鍵と「イベントログ」のお話
まずは、私たちが普段暮らしているお家を想像してみてください。
お出かけするとき、玄関のドアに鍵をかけますよね。では、もし夜中に泥棒が窓ガラスを割って侵入しようとしたら、どうやって気づきますか?
最近のスマートホームであれば、「窓が開きました!」というセンサーが反応して、あなたのスマホに「ピコーン!」と通知が飛ぶ仕組み(アラート)が入っているはずです。
ブロックチェーンの世界にある「スマートコントラクト(自動契約プログラム)」も、これとまったく同じです。
ブロックチェーン上でお金(暗号資産)のやり取りや大切なデータの管理をする際、プログラムがこっそり書き換わられてしまうと大変ですよね。
そこで登場するのが、今回の主役である「イベントログ(Event Logs)」です。
スマートコントラクトは、何か重要なことが起きるたびに、ブロックチェーンの台帳に向かって「今、こういうことが起きました!」というメモ(ログ)をペタッと貼り付ける機能を持っています。これがイベントログです。泥棒が窓を破った瞬間の「窓が開いたよ!」というセンサーの役割を、このイベントログが果たしてくれるわけですね。
—
2. 泥棒は「こっそり」やってくる:コントラクトの脆弱性
現実の泥棒も、大きな音を立てて正面から堂々と入ってくるわけではありません。忍者のように、誰も気づかないうちに裏口からこっそりと侵入しようとします。
スマートコントラクトを狙う攻撃者も同じです。例えば、「本当は1人1回しか買えないはずの限定アイテムを、プログラムの隙を突いて何個も盗み出す」ような不正(リエントランシー攻撃や、ロジックの裏をかいた不正な引き出しなど)を仕掛けてきます。
ここで怖いのが、ブロックチェーンの世界は「一度プログラムをデプロイ(公開)したら、簡単には書き換えられない」という特徴があることです。つまり、お家の鍵の建てつけが悪くても、すぐには新しい鍵に付け替えられないようなもどかしさがあります。
だからこそ、「攻撃されたことに、一秒でも早く気づく仕組み」が何よりも大切になってくるのです。
—
3. リアルタイム監視の番犬:Forta(フォータ)の仕組み
「でも、わざわざブロックチェーンの画面を24時間ずっと見張っているなんて無理だよ……」と思いますよね。
そこで活躍するのが、「Forta(フォータ)」のようなリアルタイム監視ネットワークです。Fortaは、いわば「ブロックチェーンの世界を24時間体制で見回りしてくれる優秀な警備員(または番犬)」だと思ってください。
私たちが書いたスマートコントラクトが動くたびに、Fortaの警備員さんはイベントログをじーっと観察しています。そして、普段とは違う「変な動き(例:通常はあり得ない大量の引き出しなど)」をイベントログから察知すると、一瞬で私たちのスマホやチャットツール(DiscordやSlackなど)にアラートを飛ばしてくれるのです。
—
4. 実践!イベントログを設計してみよう
それでは、実際に開発の現場でどうやってこのイベントログを書くのか、コードを見てみましょう。ここでは、Solidityというプログラミング言語を使います。
初心者の方でも分かりやすいように、銀行の口座から「お金を引き出す」機能を例にしますね。ここに「不正な引き出しがないか」を見張るためのイベントログを仕込んでみましょう。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleBank {
// ユーザーごとの残高を管理する台帳
mapping(address => uint256) public balances;
// 【防犯センサーの設置】
// 誰かがお金を引き出したときに、記録(ログ)を残すためのイベントを定義します。
// indexedを付けることで、後から「このユーザーのログだけ」をすばやく検索できるようになります。
event Withdrawn(address indexed account, uint256 amount, uint256 timestamp);
// お金を預ける関数
function deposit() public payable {
balances[msg.sender] += msg.value;
}
// お金を引き出す関数
function withdraw(uint256 _amount) public {
// 残高が足りているかチェック
require(balances[msg.sender] >= _amount, "Error: 残高が不足しています!");
// 残高を減らす
balances[msg.sender] -= _amount;
// 実際にユーザーにお金を送金する処理(省略)
// 【センサーを作動させる!】
// お金が動いた瞬間、ブロックチェーンの記録にこのメモ(イベントログ)を残します。
// Fortaのような監視ボットは、この "Withdrawn" というメモを常に監視しています。
emit Withdrawn(msg.sender, _amount, block.timestamp);
}
}
このコードのポイントは、emit Withdrawn(...) という部分です。
この一行があるおかげで、誰かがお金を引き出すたびに、ブロックチェーン上に「誰が・いくら引き出したか」の足跡が必ず残ります。
—
5. Fortaボットで異常を検知する設定を覗いてみよう
次に、先ほど仕掛けたイベントログ(Withdrawn)を、監視ネットワークであるForta側でどうやって見張るのか、設定のイメージを見てみましょう。
Fortaの監視スクリプト(TypeScriptなどで書かれます)のイメージは以下のようになります。
import { Finding, HandleTransaction, TransactionEvent, FindingSeverity, FindingType } from 'forta-agent';
// 監視するイベントのシグネチャ(設計図)を指定します
const WITHDRAWN_EVENT_ABI = "event Withdrawn(address indexed account, uint256 amount, uint256 timestamping)";
const handleTransaction: HandleTransaction = async (txEvent: TransactionEvent) => {
const findings: Finding[] = [];
// トランザクションの中から、先ほどの「Withdrawn」イベントログを探します
const events = txEvent.filterLog(WITHDRAWN_EVENT_ABI);
for (const event of events) {
const amount = event.args.amount;
// 【重要】もし「1回で100ETHを超えるような不自然な大金」が引き出されていたら...?
// ※ 実際の開発では、ethers.js等を使って数値の大きさを正確に比較します
if (amount > 100 * 10**18) {
findings.push(
Finding.from({
name: "異常な高額出金の検知",
description: `警告!通常を超えた大金(${amount})が引き出されました。不正アクセスの可能性があります!`,
alertId: "HIGH-AMOUNT-WITHDRAWAL",
severity: FindingSeverity.High, // 深刻度:高
type: FindingType.Suspicious, // 種類:不審な挙動
})
);
}
}
return findings;
};
export default {
handleTransaction,
};
このように、Fortaのボットはイベントログ(event.args.amount)の値をチェックし、「おや、いつもより金額が大きすぎるぞ!」と気づいた瞬間に、開発者へ警報を鳴らしてくれます。このスピード感こそが、被害を最小限に抑えるための最大の武器になるのです。
—
まとめ:一歩ずつ、安全な開発を身につけよう
いかがでしたでしょうか?
「イベントログ」と言われると難しく聞こえますが、要するに「プログラムが起きた出来事を後から追えるように残しておく、大事な足跡メモ」のことです。
そして、その足跡をFortaのような監視ツールに見守ってもらうことで、私たちは家の防犯カメラのように、24時間安心してスマートコントラクトを運用することができます。
セキュリティの世界は広くて奥が深いですが、こうして一つひとつの仕組みを身近な例に置き換えていけば、決して怖くありません。ぜひ、ご自身のプロジェクトでもイベントログを丁寧に設計し、安全なインフラストラクチャを作ってみてくださいね。一歩ずつ、着実に学んでいきましょう!
コメント