Solidity

事件會導致狀態變化嗎?

  • April 29, 2022

我正在做一個簡單的 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可見性修飾符是被禁止的。不是事件會導致狀態改變,而是事件會導致狀態改變。

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