Solidity事件,等待事件

昏睡的云雪發表於2024-07-17

先定義一個事件

event Log(string message,uint vall);

然後規定一個函式來呼叫它

 function example()external { 
        emit Log("foo",123);  //觸發事件: "emit 事件名(資訊);",按定義好的資料型別輸出括號內的資訊
    }

此時部署後點選合約中名為”example“的按鈕時,則會將函式括號內的數值賦給事件內的變數。

如果想透過輸入數值的方式來給這個事件中的變數賦值則

 event Message(address indexed _from,address indexed _to,string message); //定義一個索引,最多三個有索引的

    function load(address _to,string calldata message) external {

        emit Message(msg.sender, _to, message);
  }

等待事件

先定義一個結構體與陣列

struct ToDo{
        string text;
        bool completed;
    }

    ToDo[] public todos;  //新增陣列

然後透過函式的形式來處理所定義的變數

function create(string calldata _text)external {  //輸入字串
       todos.push(ToDo({
        text : _text,     //將輸入值賦給狀態值
        completed : false
        }));
    }

定義完資料,處理完後就要將處理好的結果存入記憶體中

 function get(uint _index) external view returns (string memory,bool){ //輸入數字
        //裝到記憶體中的寫法,gas消耗多,複製兩次
        ToDo memory todo = todos[_index];
        return (todo.text,todo.completed);
       //將事情裝入記憶體一次
    }

存入的資料越多則消耗的gas值越多,同時也可以將事件存入儲存中去

//裝到儲存中:將“memory”改為“storage”,複製一次
    function updateText(uint _index,string calldata _text) external {  //輸入數字跟字串
        ToDo storage todo = todos[_index];  //新增變數“todo”
        todo.text = _text;
    } 

其實,存入記憶體跟存入儲存中只是將“memory”改為“storage”,其他都可以不改

存入資料後要反轉結構體中的布林值,讓它顯示已經存入了資料這一資訊

function toggleCompleted(uint _index) external {  //輸入數字
        todos[_index].completed = !todos[_index].completed;
    } //反轉完成變數的資料

相關文章