Solidity

為什麼通過 sstore 儲存比通過事件機制儲存更昂貴?

  • August 9, 2019

我就是不明白為什麼emit Event(...)a = b。我注意到事件和儲存變數之間的唯一區別是事件日誌不能從 Solidity 訪問。但是它們都儲存在區塊鏈中,並且都可以從外部應用程序訪問。那麼為什麼乙太坊開發者讓 SSTORE 變得如此昂貴呢?

發出事件使用log儲存,正如您所指出的,這是第四種形式的合約資訊,它比其他三種可從solidity(記憶體、儲存、堆棧)訪問的方式便宜得多。EVM 節點不需要永久保存日誌,並且可以垃圾收集舊日誌以節省空間。偵聽這些日誌的 Dapps 不能依賴它們被永久保存(例如,真正的舊事件),但可能可以偵聽新事件作為更新更改的一種手段。

我最喜歡的關於 EVM 事件/日誌儲存的文章在這裡 https://blog.qtum.org/how-solidity-events-are-implemented-diving-into-the-ethereum-vm-part-6-30e07b3037b9

雖然我不知道 EVM 設計者的確切理由,但我猜他們想提供一種廉價但不是免費的方式來儲存來自合約的資訊並為外部聽眾(而不是在區塊鏈上)發布通知資訊。免費儲存將容易受到濫用/拒絕服務攻擊。

特別是從文章中,我們可以比較儲存在日誌和儲存的成本storage(名稱的選擇有點令人困惑和遺憾,但你能做什麼)。這將解決您LOGSSTORE操作碼的問題。

Don’t forget the memory used, which is 3 gas per byte:
MemoryGas        uint64 = 3    
Wait what? It costs only 8 gas per byte of log data? That’s 256 gas for 32 bytes, and 96 gas for the memory use. So 322 gas versus 20000 gas for storing the same amount of data in storage, only 1.7% of the cost!

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