---
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`寫了一個測試圖片如下

再部屬後點選`trandfer`之後給`from`, `to`, `value`三個參數後

之後能夠在`Log`內看到詳細資訊

### 實測
- 這邊使用`MetaMask`去進行練習,首先創建完一個錢包後,去領測試幣(上一篇筆記有提到方法與教學),並且在`Remix`中實際使用此錢包進行交互。

- 按下部屬會要求簽章與一些`gas fee`按下確認。

- 要給予實際的錢包地址,也就是你上面簽章的錢包,因為你要從此地址轉出測試幣。

- 這邊給予另一個創建好的錢包。

- 給予50,會是`wei`。

- 之後按下交易會跑出此簽章

- 完成交易跳出成功後到[這裡](https://etherscan.io/),貼上你的交易`Hash`(在`log`裡面會有一個交易哈希直接複製),就可以成功看到`logs`啦

:::warning
:warning: 這邊指的 `logs` 和 `log` 代表不同意思,`log`是編譯出來的返回結果在`Remix`裡面,`logs`則是`Etherscan`裡面!
:::
#### Etherscan 教學
- `Name`代表呼叫的事件,並且把它變成`keccak256(address,address,uint256)`,`topic`第一個就是此結果。
- `topic`是有設定indexed後會顯示的結果,每一個事件最多只能有三個。
- `Data`因為Value沒有做indexed的聲明,所以會存放在這,通常用於放資料量大的地方

## <span style="color: yellow;">觀點重點整理</span>
這邊因為直接改變鏈上狀態變數在`gas`上遠超釋放事件所花費的`gas`,所以要注意改變狀態變數與使用事件的時機。