Solidity
什麼是 Solidity 事件以及它們與主題和日誌的關係?
我知道索引參數索引這些參數的值,以便過濾更快。
但什麼是主題?它們是用來做什麼的?
我知道事件的簽名是一個主題。並且非常索引的論點也是一個話題。
在這裡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 客戶端中,您想要查看所有
age
26 歲的人的創建事件,您可以簡單地執行以下操作:var createdEvent = myContract.PersonCreated({age: 26}); createdEvent.watch(function(err, result) { if (err) { console.log(err) return; } console.log("Found ", result); })
或者您可以以類似的方式過濾所有過去的事件。
更多資訊在這裡
- http://solidity.readthedocs.io/en/develop/miscellaneous.html?highlight=topic#modifiers
- http://solidity.readthedocs.io/en/develop/contracts.html?highlight=topic#events
- https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e#.7w96id6rs
- https://emn178.github.io/online-tools/keccak_256.html