Solidity

什麼是 Solidity 事件以及它們與主題和日誌的關係?

  • June 25, 2021

我知道索引參數索引這些參數的值,以便過濾更快。

但什麼是主題?它們是用來做什麼的?

我知道事件的簽名是一個主題。並且非常索引的論點也是一個話題。

在這裡https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter當他們說“一組值必須每個都出現在日誌條目中時,它們是什麼意思。如果你願意,順序很重要將主題排除在外,請使用 null,例如

$$ null, ‘0x00…’ $$. 您還可以為每個主題傳遞另一個數組,其中包含該主題的選項,例如$$ null, [‘option1’, ‘option2’ $$]"

主題是事件的索引參數。

topic[0]總是指事件本身的雜湊值,最多可以有 3 個索引參數,每個參數都會反映在主題中。

EVM 使用稱為日誌的低級原語將它們映射到稱為 Event 的高級 Solidity 構造。日誌可能包含作為索引參數的不同主題。

考慮事件:

 event PersonCreated(uint indexed age, uint height);

然後你觸發它的foobar功能MyContract

 function foobar() {
       emit PersonCreated(26, 176);
 }

這將創建一個帶有主題的低級 EVM 日誌條目

  • 0x6be15e8568869b1e100750dd5079151b32637268ec08d199b318b793181b8a7d(Keccak-256 雜湊PersonCreated(uint256,uint256)
  • 0x36383cc9cfbf1dc87c78c2529ae2fcd4e3fc4e575e154b357ae3a8b2739113cf(Keccak-256 雜湊age),值 26

您會注意到身高不是主題,但它會包含在事件的數據部分中。

在內部,您的乙太坊節點(Geth / Parity)將索引參數以建立在可索引的搜尋索引上,以便您以後可以輕鬆地按值進行查找。因為創建索引需要額外的磁碟空間,所以事件中的索引參數有額外的 gas 成本。但是,以後按值對事件規模進行任何有意義的查找都需要進行索引。

現在在 web3 客戶端中,您想要查看所有age26 歲的人的創建事件,您可以簡單地執行以下操作:

var createdEvent = myContract.PersonCreated({age: 26});
createdEvent.watch(function(err, result) {
 if (err) {
   console.log(err)
   return;
 }
 console.log("Found ", result);
})

或者您可以以類似的方式過濾所有過去的事件。

更多資訊在這裡

引用自:https://ethereum.stackexchange.com/questions/12950