ソース: Denchain コミュニティ
今日の投稿では、Solidity イベント(一般化されたEtherやEVMではログとして知られている)を見ていきます。これらの使用方法、定義、イベントトピックハッシュとシグネチャを使用したログのフィルタリング方法、また、これらがいつ使用されるべきかについてのアドバイスを見ていきます。
また、check-event-interactionパターンも取り上げます。なぜ、このようなパターンがトリガーイベントにも適用されるべきなのか、そして、潜在的なリスクとセキュリティの脆弱性が関係しているのかを見ていきます。
どのようにSolidityでイベントを定義するのですか?
Solidityでは、イベント
を使用してイベントを定義できます。span style="font-size: 18px;">キーワードを使用して、Solidity でイベントを定義できます。
interface ILight {
event SwitchedON();
event SwitchedOFF();
event BulbReplaced();
}
契約名を完全に修飾し、その後にを続けることでアクセスできます。
とイベント名を入力すると、次のように別の契約からイベントにアクセスできます:
event RegisteredSuccessfully(address user)
イベントの署名は次のようになります:
event RegisteredSuccessfully(address user)
The event subject hash will be:
bytes32 topicHash = RegisteredSuccessfully.selector;
Solidity v0.8.15以降のみ、イベントの.selector
メンバーのみ。
発信されたブロックチェーンのログを見ると、ログの件名のインデックス0(最初の)エントリーは、イベントトピックハッシュに対応します。トピックはログから検索できるコンテンツなので、イベントトピックハッシュでフィルタリングすることができます:
anonymous
匿名イベントはこのルールの例外です。anonymous
キーワードによって検索できなくなるので、"anonymous"となります。
この事実に基づいて、Solidity で定義された最も単純なイベントは、上記のようにパラメータを持たないことも推測できます。span>BulbReplaced
またはBulbReplaced
またはSwitchedON
は、一番下のLOG1
イベント自体が検索可能なので、ログ内のトピックをトリガーするためのオペコードです。
さらにトピックを追加することができ、他のトピックも使用されますLOG2, LOG3
LOG4
andandLOG5
、これらのパラメータがインデックスとしてマークされている限り、
としてマークされている限り、これらのパラメータはインデックス化されます。次のセクションでインデックス・パラメーターを見てみましょう。
イベント・パラメーターとインデックス・パラメーター
bytesN,bool
,address
...)struct
,,enum
およびユーザー定義値型。
この記事を書くにあたって私が調べたところによると、唯一許されない型は内部関数型です。外部関数型は許可されますが、内部関数型は許可されません。例えば、以下のコードはコンパイルできません。
// SPDX-License- 以下のコードはコンパイルできません。Identifier: UNLICENSED
pragma solidity ^0.8.0;
contract AnonymousEvents {
event SecretPasswordHashUpdated(bytes32 secretPasswordHash) anonymous;
}
イベントがとして宣言されている場合。span>anonymous
と宣言されている場合、コントラクトABIでは、イベントの"anonymous"
フィールドはtrue
としてマークされます。 とマークされます。
匿名イベントの利点の1つは、契約を展開するのが安くなり、トリガーされたときのガスが安くなることです。
匿名イベントの良いユースケースは、イベントが1つしかないコントラクトです。その1つのイベントだけがイベントログに表示されるため、コントラクト内のすべてのイベントをリッスンすることは理にかなっています。コントラクトが発するイベントは1つだけなので、その名前をサブスクライブすることは関係ありません。したがって、イベントを匿名として定義し、コントラクトからすべてのイベントログを購読し、それらがすべて同じイベントであることを確認することができます。
DappHubのDS-Noteコントラクト[7]など、人気のあるコードベースにおける匿名イベントの使用例を参照してください。
上のコード・スニペットでは、イベント宣言が匿名であるため、4番目の"indexed "パラメータを定義することが可能になります。
匿名イベントはbytes32 subject hash.を持たないため、サポートされていないことに注意してください.selector
メンバーです。
LOGオペコードを使用してアセンブリーでイベントをトリガーする
の詳細を見る。sup>を参照してください。
参考資料
匿名イベントの使用目的に関するドキュメントの欠落(何のためかを知る)[14]
[匿名イベントの利点]
。