Ethereum イベント ログについて
创宇区块链安全实验室
2022-11-17 06:19
本文约3606字,阅读全文需要约14分钟
イベントログは大海の一滴でしょうか?それどころか、イベント ログは開発者だけでなくユーザーにとっても不可欠です。この記事では、イベント ログとは何か、またイベント ログがハッ

最初のレベルのタイトル

序文

ブロックチェーン エクスプローラーでトランザクションを調べるとき、概要と内部トランザクションだけを見ていますか?イベントログはどうなるのでしょうか?目立たない隅っこで無視されているかどうか。

次に、イーサリアムのイベントログとその基礎知識について詳しく説明します。

最初のレベルのタイトル

イベント

2.1 イベントとは何ですか?

Event は、Ethereum 仮想マシンのロギング機能を簡単に呼び出すことができるインターフェイスです。

Solidity イベントは、EVM のログ機能を抽象化したものです。アプリケーションは、イーサリアム クライアントの RPC インターフェイスを通じてこれらのイベントをサブスクライブしてリッスンすることができ、ブロックチェーン上に情報を出力できるようになります。

  • したがって、Solidity イベントを通じて、次のことが可能になります。

  • スマートコントラクト内の特定の変数をテストする

  • 保存された状態を再構築するためのインデックス変数

  • リスニング イベントはフロントエンドの状態を変更するために使用されます。

サブグラフを作成してデータをより速く読み取る

2.2 宣言とイベントのトリガー

公式の ERC20 契約コードを例として、IERC20.sol ファイルのevent キーワードを通じて宣言してみましょう。

ERC20.sol の _transfer 関数では、対応するイベントが Emit キーワードによってトリガーされます (以前のバージョンでは Emit を使用する必要はありません)。

最初のレベルのタイトル

ログ

3.1 ログとは何ですか?

Ethereum では、イベントを保存するためにログが使用されます。イベントが呼び出されると、トリガー パラメーターがトランザクションのログに保存されます。スマート コントラクトからはアクセスできませんが、トランザクションに関する情報を提供し、ブロックで送信できます。

トランザクション (0x477ed7208127bea597142622d52df46d3e4967835bd3609995581eb5aaeeec3e) を自由に開いて、ログを表示してみましょう。

ログを通じて、ログを 4 つの部分に分割できます。

1. 住所: 住所。つまり、イベントを発行した契約またはアカウントのアドレスです。

2.名前:名前。つまり、トリガーされたイベントの名前とそのパラメーターです。

3. トピック: テーマ。つまり、イベントにはインデックス付きパラメーターが存在します。

4. データ: データ。つまり、イベント内のインデックスのないパラメーターです。

3.2 ロギングのトピック

上でトピックスについて説明しましたが、その後、そのトピックについて詳しく説明します。

各ログレコードには「トピック」と「データ」が含まれます。トピックは 32 バイト (256 ビット) で、イベントで何が起こったかを説明します。ログ レコードに含める必要があるトピックの数を記述するために、さまざまなオペコード (LOG0、LOG1、LOG2、LOG3、LOG4) が使用されます。

EVM には、イベント ログをトリガーし、ログ レコードを作成するために使用される 5 つのオペコードがあります。つまり、LOG0、LOG1、LOG2、LOG3、LOG4 です。これらは、トークン転送、所有権の変更など、スマート コントラクト内のイベントを記述するために使用されます。 LOG1 には 1 つのトピックが含まれており、1 つのログ レコードに含めることができるトピックの最大数は LOG4 の 4 つのトピックです。

通常、Topics0 はイベント名の署名 (keccak256 ハッシュ値) であり、パラメータのタイプ (アドレス、uint256 など) も含まれます。Topics1 は最初のインデックス パラメータの値、Topics2 は 2 番目のインデックス パラメータの値です。 。

このトピックの Topics0 の値は 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef で、そのイベントは Name の前の行の内容です。

ただし、イベント Transfer(address, address, uint256) を keccak256 で暗号化すると、結果は Name の値と同じになり、Name の値が確かにイベント名の署名であることがわかります。もちろん、イベント シグネチャがない例外が 1 つあり、それは「匿名イベント」がトリガーされる場合です。

Topics1 は、最初のインデックス パラメーターの値、つまりフォーム アドレスの値です。 Topics2 は 2 番目のインデックス パラメーターの値、つまり to アドレスの値です。内部コール分析からも、これが実際に当てはまることがわかります。

トピックには 32 バイトのデータしか含めることができないため、32 バイトを超える可能性のある配列、文字列などはトピックとして使用できません。32 バイトを超えるデータを含めようとする場合、トピックには次の条件が必要です。ハッシュで計算されるため、32バイトを超えた場合はログレコードにデータとして含める方がよいでしょう。

3.3 ログレコードのデータ

件名に加えて、ログ レコードの一部はデータです。データは、ABI コードまたはイベントの非インデックス パラメータのハッシュ値です。データ データの値を表示するには、10 進数または 16 進数を使用できます。

  • データとトピックの両方に長所と短所があります。

  • トピックは検索可能ですが、データは検索できません。

データはトピックよりも少ないガスを必要とします。

トピックはインデックス付きパラメータなのでログを直接検索できますが、データはABIコードやハッシュ値なので直接検索できません。

Yellow Paper によると、ログに関連するガス コストがわかります。ログの基本コストは 375 ガス、各トピックも 375 ガス、データ バイトのコストは 8 ガスです。

イエローペーパーから、ログのガスコストが非常に安いことがわかります。ERC20 トークン転送イベントのコストは、最大でも 1756 ガスしかかかりません (ログベースで 375 ガス、3 つのトピックで 375 * 3 = 1125 ガス)転送イベントの最大データ バイト 32 バイトは 8 * 32 = 256 ガス)、標準イーサの転送には 21000 ガスかかります。もちろん、上で述べたのはログ記録操作自体のコストであり、スマートコントラクトの開発においては、ログ記録操作のコストを単純に計算することはできませんが、開発ではスマートコントラクトが必要とするデータを保存することしかできません。状態変数でコントラクトし、他のイベントが処理に使用されるため、ガスコストを大幅に節約できます。

トリガーイベント

次に、例を使用してトリガー イベントを説明します。次のコードは、ERC20 標準に準拠したトークン コントラクトで使用される転送イベントを実装します。

上記は「匿名イベント」ではないため、最初のトピックにはイベントの署名が含まれます (署名に必要なのはパラメータの型のみです)。

次に、イベントのパラメーターを確認します。from アドレスと _to アドレスにはインデックスが付けられていますが、value にはインデックスが付けられていません。したがって、_from および _to アドレスはトピックとして扱われ、_value 値はデータとして扱われます。

3.3節でトピックは検索できるがデータは検索できないと述べましたので、ログ内のfromアドレスと_toアドレスの値に関連する転送ログは検索できますが、転送量を指定した転送ログは検索できません。 _value 値。イベントには 3 つのサブジェクト (イベントの署名、from、_to) があるため、このログ記録操作では LOG3 オペコードが使用されます。

では、データの内容を調べたい場合はどうすればよいでしょうか?ここでは、EVM のオペコードのパラメータを知る必要があります。 LOG3 には 3 つのトピックが含まれていますが、EVM には 5 つのパラメータがあります。

データの内容を読み出したい場合は、以下の方法でメモリからイベントデータを読み出すことができます。

釣り

5.1 フィッシングにおけるイベントの使用

先ほどたくさんのログイベントが紹介されましたが、これらは釣りとどのように関係しているのでしょうか?攻撃者は通常、ログイベントを使用して取引所や有名人になりすましてコインを被害者に送金します(コインには実際の取引価値はなく、フィッシングトークンです)。被害者は、コインが取引所や有名人から送金されたものであることを確認すると警戒を緩めます。攻撃者は、被害者をフィッシング トークンのプールに誘導します。被害者は、トークンの取引価値が高いことを確認すると、すぐに取引を承認します。このとき、攻撃者は、攻撃者が仕掛けた罠にはまってしまいます。被害者に被害者の財布の中のお金を許可させて盗ませる。

下の写真は以前発生したフィッシング事件で、攻撃者はBinanceのホットウォレットになりすまし、フィッシングトークンを他人に転送していました。

正式なアドレスは、BSC ブラウザのタブから確認できます。

クエリにより、Binance Hot Wallet 6 のアドレスは正確に 0x8894e0a0c962cb723c1976a4421c95949be2d4e3 であることがわかります。

ブラウザーのレコードはイベントに基づいているため、topics1 の値、つまり送信者の値は 0x8894e0a0c962cb723c1976a4421c95949be2d4e3 になります。

5.2 再発

以下は BEP20 の疑似コードです。BNB チェーンのメイン ネットワークを例として再現し、攻撃者は「フィッシング トークン」という名前のフィッシング トークンを作成します。 。

以下の図に示すように、新しい Binance パラメーターの値は 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3 です。

次に、下の図で赤でマークされたコードを変更し、送信トリガー イベントの送信者アドレスを Binance に変更する必要があります。配備された契約

次に、転送関数を呼び出してフィッシング トークンを被害者に転送します。

最初のレベルのタイトル

要約する

最初のレベルのタイトル

参考文献

创宇区块链安全实验室
作者文库