先定義一個事件
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; } //反轉完成變數的資料