--- title: 'Solidity WTF 101 12 單元' lang: zh-tw --- Solidity WTF 101 12 單元 === :::info :date: 2024/09/28 ::: [TOC] # 課程學習 ## 事件 ### 簡要 首先,事件是`EVM`上的日誌抽象,這邊我認為與日誌差不多,他有以下兩點: - `响应`:应用程序(ethers.js)可以通过`RPC`接口订阅和监听这些事件,并在前端做响应。 這邊指能夠與前端搭配的意思,完全能通過返回的數據再前端進行一些`Logic`。 - `经济`:事件是`EVM`上比较经济的存储数据的方式,每个大概消耗`2,000 gas`;相比之下,链上存储一个新变量至少需要`20,000 gas`。(簡單來說就是相較其他儲存數據方式較為便宜) ### 聲明 聲明方式如下 ```xml= event Transfer(address indexed from, address indexed to, uint256 value); ``` 其中`indexed`關鍵字,是用來儲存再`EVM`日誌中`topics`內的。 ### 釋放事件 何謂釋放事件,可以當作處理事情的開始例如玩遊戲按下的Start鍵,遊戲就會開始,這邊使用方式如下 ```xml= // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; contract Helloweb3 { event Transfer(address indexed from, address indexed to, uint value); uint public a = 0; function trandfer(address from, address to, uint value) external { a = value; <!-- 這邊就是釋放事件的,emit一個交易 Transfer 並且給予三個參數 --> emit Transfer(from, to, value); } } ``` 這邊在`Remix`寫了一個測試圖片如下 ![image](https://hackmd.io/_uploads/HkUzhQ4R0.png) 再部屬後點選`trandfer`之後給`from`, `to`, `value`三個參數後 ![image](https://hackmd.io/_uploads/rJki3QNRA.png) 之後能夠在`Log`內看到詳細資訊 ![image](https://hackmd.io/_uploads/Syf-6Q4AR.png) ### 實測 - 這邊使用`MetaMask`去進行練習,首先創建完一個錢包後,去領測試幣(上一篇筆記有提到方法與教學),並且在`Remix`中實際使用此錢包進行交互。 ![image](https://hackmd.io/_uploads/S1ejTmN0R.png) - 按下部屬會要求簽章與一些`gas fee`按下確認。 ![image](https://hackmd.io/_uploads/HkXb074RC.png) - 要給予實際的錢包地址,也就是你上面簽章的錢包,因為你要從此地址轉出測試幣。 ![image](https://hackmd.io/_uploads/rkxURXVA0.png) - 這邊給予另一個創建好的錢包。 ![image](https://hackmd.io/_uploads/rkfq0XV00.png) - 給予50,會是`wei`。 ![image](https://hackmd.io/_uploads/By_60XVA0.png) - 之後按下交易會跑出此簽章 ![image](https://hackmd.io/_uploads/SJU1JNNC0.png) - 完成交易跳出成功後到[這裡](https://etherscan.io/),貼上你的交易`Hash`(在`log`裡面會有一個交易哈希直接複製),就可以成功看到`logs`啦 ![image](https://hackmd.io/_uploads/BynVg4VRC.png) :::warning :warning: 這邊指的 `logs` 和 `log` 代表不同意思,`log`是編譯出來的返回結果在`Remix`裡面,`logs`則是`Etherscan`裡面! ::: #### Etherscan 教學 - `Name`代表呼叫的事件,並且把它變成`keccak256(address,address,uint256)`,`topic`第一個就是此結果。 - `topic`是有設定indexed後會顯示的結果,每一個事件最多只能有三個。 - `Data`因為Value沒有做indexed的聲明,所以會存放在這,通常用於放資料量大的地方 ![image](https://hackmd.io/_uploads/HyTubNN00.png) ## <span style="color: yellow;">觀點重點整理</span> 這邊因為直接改變鏈上狀態變數在`gas`上遠超釋放事件所花費的`gas`,所以要注意改變狀態變數與使用事件的時機。