Solidity
事件會導致狀態變化嗎?
我正在做一個簡單的 HelloWorld 類,嘗試包括發射事件在內的幾件事。我的契約程式碼如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract HelloWorld { string public myMessage = "Hello World!"; event MessageReturned( string message ); function setMessage( string memory newMessage ) external { myMessage = newMessage; } function getMessage() external view returns( string memory ) { return myMessage; } function sayMessage() external view { emit MessageReturned( myMessage ); } }
當我
TypeError
嘗試用truffle compile
. 我收到了這個消息表solc
:TypeError: Function cannot be declared as view because this expression (potentially) modifies the state. --> project:/contracts/HelloWorld.sol:18:14: | 18 | emit MessageReturned( myMessage ); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
誰能幫我解釋一下為什麼在這裡發出事件被視為狀態變化?是什麼在幕後導致它成為我的?
本質上,交易收據(包含日誌)用於形成交易收據樹,它將更新記錄在塊頭中的交易收據根(新塊本質上是對區塊鏈狀態的更新) .
因此,發出一個事件確實是一個狀態改變操作,所以
view
/pure
可見性修飾符是被禁止的。不是事件會導致狀態改變,而是事件會導致狀態改變。