
出典:Dengchainコミュニティ
今日の記事では、堅実さを見ていきますイベントより一般的なイーサリアムとEVMで呼ばれますログエッセンスそれらの使用方法、それらの定義、イベントのテーマと署名を使用してログをフィルタリングする方法、およびいつの提案を確認します。
また、検査をカバーします –イベント– 相互作用モード、この有名なモデルは伝統的に州の変数の再所得に適用されていますが、このモデルをトリガーイベントと潜在的なリスクと関連するセキュリティの脆弱性にも適用する必要がある理由がわかります。
堅実さでイベントを定義する方法は?
利用可能になりますイベント
キーワードは、以下に示すように、イベントを堅牢性で定義します。
interface ilight {<< br/> event switchedon();完全な制限アクセスを通じて契約の名前を渡すことができます。次に、
以下に示すように、イベント名との別の契約からイベントにアクセスするには:
イベントドレスユーザー)
イベントの署名は次のとおりです。
イベントドレスユーザー)
イベントのテーマは次のとおりです。
bytes32 topichash = uccessely .Selector;
Solidity V0.8.15の後にのみ、事件は。セレクタ
メンバーはそれを使用できます。
ブロックチェーンログを確認すると、ログのテーマのインデックスが見つかります0
(最初)目的はイベントのテーマに対応しています。テーマはログを通して検索できるコンテンツであるため、できますイベントをテーマにしたフィルター:
-
特定のアドレスのスマートコントラクトで特定のイベントを検索します。
-
ブロックチェーン上のすべての契約で特定のイベントを検索します。
以下にさらに表示されます。
匿名
匿名のイベントは、このルールの例外です。匿名
キーワードは検索できないため、用語を使用してください"匿名"エッセンス
この事実に基づいて、Solidityで定義されている最も単純なイベントには、上記のイベントなどのパラメーターがないことも推測できます。bulbreplaced
またはSwitchedon
、下部に使用されますlog1
インシデント自体が検索可能であるため、操作コードはログ内のテーマをトリガーします。
テーマを追加できます。他のテーマが使用されますlog2
、、、、log3
、、、、log4
そしてlog5
これらのパラメーターがとしてマークされている限りインデックス付き
エッセンス次のセクションのインデックスパラメーターを見てみましょう。
イベントパラメーターとインデックスパラメーター
イベントは、値タイプを含むあらゆるタイプのパラメーターを受け入れることができます(uintn
、、、、bytesn
、、、、ブール
、、、、住所
...),,struct
、、、、列挙
ユーザーによって定義された値タイプ。
この記事の私の調査によると、許可されていない唯一のタイプは内部関数タイプです。外部関数タイプは許可されていますが、内部関数タイプは許可されていません。たとえば、次のコードはコンパイルされません。
// spdx- sライセンス識別子:免げ切れ
プラグマソリティ ^0.8.0; >
イベントステートメントがある場合匿名
契約ABIでは、インシデントが利用可能です"匿名"
フィールドにはとしてマークされます真実
エッセンス
<フィギュアスタイル= "Text-Align:center;">
匿名の利点は、契約をより安く、より安価にし、トリガーするとガスが安くなることです。
匿名イベントの良いケースは、1つのイベントとの契約です。このインシデントのみがイベントログに表示されるため、交渉契約のすべてのイベントは意味があります。契約を発行するために1つのイベントのみが定義されているため、その名前を購読することは無関係です。したがって、イベントを匿名で定義し、契約からのすべてのイベントログを購読し、それらが同じイベントであることを確認できます。
DappphubのDS-Note契約など、人気のあるコードライブラリで匿名使用の使用を確認してください[7]真ん中。
<フィギュアスタイル= "Text-Align:center;">
上記のコードフラグメントでは、イベントステートメントが匿名であるため、これにより4番目の「インデックス付き」パラメーターが定義できることがわかります。
匿名イベントにはBYTES32のテーマがないため、匿名イベントはサポートしていないことに注意してください。セレクタ
メンバー。
ログ操作コードを使用して、アセンブリ内のイベントをトリガーします
<フィギュアスタイル= "Text-Align:center;">
アセンブリでイベントをトリガーすることが可能です。logn
命令、命令は、EVM命令によって濃縮された操作コードに対応します。
アセンブリでイベントをトリガーするには、インシデントが発行したすべてのデータをで保存する必要がありますメモリ
特定の位置。
イベントからデータをメモリに保存してから、次のパラメーターをlogn命令に指定できます。
-
p =データのメモリ位置を取得します。基本的に、これはメモリポインター、または「オフセット」または「メモリインデックス」です。
-
s =イベントでPから発行されたバイト数が必要です。
-
他のすべてのパラメーター
T1
同様にT2
同様にT3
そしてT4
これは、インデックスを作成したいイベントパラメーターです。ここには2つの重要なことがあります。1)これらのパラメーターは、イベントの定義と同じ順序で定義されたパラメーターと同じである必要があります。2)これらのパラメーターは、データを取得するためにメモリに配置する必要があります。
次のコードフラグメントは、アセンブリでこの操作を実行する方法を示しています。
bytes32 topichash = empleseventasm.selector; mstor br/> mstore(add(freemomorypointer、32)、tokenid)
// `emplereventasm`イベントを排出します
log2(
freememorypointer、/// `p` p` p` p` p`p` p`p `p` p` p` p` p`p` p`p `p` P` P` P` P` P` =メモリでオフセットを開始
64、// `s =メモリからのバイト数` p`にイベントデータに含める
トピックをフィルタリングするためのトピックevent it self
tokenid // 1st Indexedパラメーター
)
}
}
イベントのガスコスト
<フィギュアスタイル= "Text-Align:center;">図>
すべてのレコード操作コード(log0
同様にlog1
同様にlog2
同様にlog3
同様にlog4
)ガスを消費する必要があります。パラメーター(テーマ)が多いほど、消費するガスが増えます。
<フィギュアスタイル= "Text-Align:center;">
さらに、インデックスやデータなどの他の要因により、イベントがより多くのガスを消費する可能性があります。
-Event -Iteractiveモードをチェックします
チェック効果のあるインタラクティブモード[9]また、インシデントにも適しています。
これらのモードを検出する1つの方法は、Remix Static Analysisツールを使用することです。
このモデルは、Slitherによって検出することもできます。契約が外部呼び出しと契約書を実行している場合、「再入力イベント」を促すために発見されます。
したがって、DAPPの場合、順序は非常に重要であるため、最初、次に、最終的に発行されたインシデントを正しく確認できます。これは、再帰的または再入力された呼び出しの場合に特に重要です。外部呼び出し後にイベントがトリガーされ、この外部呼び出しが繰り返される呼び出しで作成されている場合、次のようになります。
-
最初のインシデントは、コールが完了した後の2回目でした。
-
2番目のイベントは、最初のトランザクションの後に発行されました。
-
制限されたユーザーと住所を実行した場合、特定の操作(所有者または契約管理者など)。これには、人気のあるものなどが含まれます
転送所有権(住所)
関数、この関数は、契約所有者を変更するために所有者によってのみ呼び出されます。 -
契約のコアロジックを担当するいくつかの重要な変数または算術パラメーターを変更します。Defiプロトコルの背景で特に重要です。
-
異常を検出するために生産で展開された監視契約。
-
匿名イベントの使用を目的とした不足しているドキュメント(理由を知る)
[14] -
[匿名イベントの利点]
これを理解することで、チェーンの下での明確な監査追跡も契約通話を監視することができます。最初にどの関数と最終的に呼び出されるか、およびトランザクションの実行中に各ルーチンの実行順序を確認できます。
Slither Detectorドキュメント[10]– stidityとvyperの静的アナライザー。
この潜在的な脆弱性もビットの道にあります[11]スマートコントラクトの監査で見つけて報告します。
<フィギュアスタイル= "Text-Align:center;">
インシデントはいつトリガーされるべきですか?
契約には、イベントをトリガーするのに重要で有用な場合があるいくつかのケースがあります。
<フィギュアスタイル= "Text-Align:center;">
<フィギュアスタイル= "Text-Align:center;">
Slither Detectorドキュメント[12]これらの状況に関する詳細情報を説明してください。
これは、The LookeRareのTrail Auditレポートにも記載されています。
<フィギュアスタイル= "Text-Align:center;">
<フィギュアスタイル= "Text-Align:center;">
0xprotocolを表示します[13]事件に関連する安全関連の問題を理解するための詳細。