Skip to content

Commit 97ceea0

Browse files
committed
Add study notes for 2025-08-14
1 parent 7d59c28 commit 97ceea0

1 file changed

Lines changed: 167 additions & 0 deletions

File tree

KKisacat.md

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,173 @@ timezone: UTC+8
1515
## Notes
1616

1717
<!-- Content_START -->
18+
# 2025-08-14
19+
20+
### 介面 (Interfaces) (接口)
21+
```solidity
22+
interface IERC20 {
23+
function transfer(address to, uint256 amount) external returns (bool);
24+
function balanceOf(address account) external view returns (uint256);
25+
}
26+
```
27+
特點:
28+
29+
1. 介面只定義函數簽名(function signature),沒有函數體。
30+
2. 所有函數默認都是 external。
31+
3. 不能定義狀態變量(state variables)。
32+
4. 不能有建構函數(constructor)。
33+
5. 用來 規範合約必須實現的函數,常用在 ERC20 或 ERC721 等標準中。
34+
35+
用法:
36+
37+
如果你有一個 ERC20 代幣合約,只要它實現了 IERC20 裡定義的函數,就可以把這個合約當成 ERC20 來使用。
38+
39+
### 抽象合約 (Abstract Contract)
40+
```solidity=
41+
// 介面定義
42+
interface IERC20 {
43+
function transfer(address to, uint256 amount) external returns (bool);
44+
function balanceOf(address account) external view returns (uint256);
45+
}
46+
47+
// 抽象合约
48+
abstract contract AbstractToken {
49+
string public name;
50+
51+
// 没有函数体的抽象函数,必须被子类使用 override 关键词重载实现
52+
function totalSupply() public virtual returns (uint256);
53+
54+
// 有函数体实现的抽象函数,子类可以不使用 override 关键词重载直接继承已有的实现,也可以选择使用 override 关键词重载实现
55+
function decimals() public view virtual returns (uint8) {
56+
return 18;
57+
}
58+
}
59+
```
60+
* 介面 vs 抽象合約
61+
62+
| 特性 | 介面(Interface) | 抽象合約(Abstract Contract) |
63+
| ---- | ------------- | ----------------------- |
64+
| 函數體 | 不可以 | 可以部分實現(有的函數有函數體,有的沒有) |
65+
| 狀態變量 | 不可以 | 可以 |
66+
| 繼承要求 | 必須實現所有函數 | 必須實現所有抽象函數 |
67+
| 建構函數 | 不可以 | 可以 |
68+
| 適合用途 | 規範標準、定義外部合約接口 | 做基礎模板或部分功能實現 |
69+
70+
### 事件(Events)
71+
事件是 Solidity 提供的一種 區塊鏈日誌機制。當事件被觸發(emit)時,它會把資料寫到 區塊鏈的日誌(logs) 中。
72+
73+
特點:
74+
75+
1. 事件資料存儲在區塊鏈上,但不會像狀態變量那樣消耗太多 gas。
76+
2. 外部應用程式(如 DApp、區塊鏈瀏覽器、前端界面)可以監聽這些事件,用來觸發 UI 更新或通知用戶。
77+
3. 事件可以帶 indexed 參數,方便快速查詢。
78+
79+
```solidity=
80+
contract EventExample {
81+
// 定義事件
82+
event Transfer(address indexed from, address indexed to, uint256 amount);
83+
// indexed → 可以用於篩選
84+
85+
mapping(address => uint256) public balances;
86+
87+
function transfer(address to, uint256 amount) public {
88+
require(balances[msg.sender] >= amount, "Insufficient balance");
89+
90+
balances[msg.sender] -= amount;
91+
balances[to] += amount;
92+
93+
// 触发事件
94+
// 可以在区块链浏览器查找到当前事件记录
95+
emit Transfer(msg.sender, to, amount);
96+
}
97+
}
98+
```
99+
100+
### Mapping
101+
mapping 是 Solidity 的一種 鍵值對(key-value)資料結構,類似 哈希表 / 字典 / Map。
102+
103+
格式:`mapping(KeyType => ValueType) name;`
104+
範例:`mapping(address => uint256) public balances;`
105+
106+
* public 關鍵字
107+
108+
同上例,public 會自動生成一個 getter 函數
109+
```solidity
110+
function balances(address _addr) public view returns (uint256) {
111+
return balances[_addr];
112+
}
113+
```
114+
外部合約或使用者可以直接查詢某個地址的餘額:
115+
```solidity
116+
uint256 aliceBalance = contract.balances(aliceAddress);
117+
```
118+
## 現代合約分享
119+
[現代合約架構&審計概述](https://hackmd.io/@wongssh/SyIUoNqdxx#%E5%90%88%E7%BA%A6%E5%BC%80%E5%8F%91%E6%9E%B6%E6%9E%84)
120+
121+
1. 盡量使用 Library 而非繼承
122+
* 更直觀
123+
* 沒有繼承順序問題,審計更容易
124+
* 不同合約可以直接 import 使用,減少重複代碼
125+
* Gas 成本可控 (內聯 library 會直接複製 bytecode,外部 library 可節省部署成本)
126+
```solidity=
127+
// 數學工具庫
128+
library MathLib {
129+
function add(uint a, uint b) internal pure returns (uint) {
130+
return a + b;
131+
}
132+
}
133+
134+
// 使用 Library 的合約
135+
contract MyContract {
136+
using MathLib for uint;
137+
138+
function sum(uint x, uint y) public pure returns (uint) {
139+
return x.add(y);
140+
}
141+
}
142+
```
143+
144+
2. 開發的時候就先分好 Libraries(放共用邏輯) 跟 types(放資料結構)
145+
* Libraries放數學運算工具(像 SafeMath、DecimalMath)、
146+
放字串處理工具(StringUtils)、
147+
放合約邏輯模組(例如 NFTMetadataLib、OrderMatchingLib)、
148+
放安全檢查工具(AccessControlLib)、
149+
150+
* Types放Structs(資料結構)、Enums(枚舉型別)
151+
```solidity=
152+
struct Order {
153+
address maker;
154+
address taker;
155+
uint256 amount;
156+
uint256 price;
157+
}
158+
159+
enum OrderStatus { Pending, Filled, Cancelled }
160+
```
161+
162+
3. 常見 Solidity 專案結構
163+
```bash
164+
contracts/
165+
166+
├── libs/ # 共用函數庫 (Library)
167+
│ ├── MathLib.sol
168+
│ ├── StringLib.sol
169+
170+
├── types/ # 資料型別定義
171+
│ ├── OrderTypes.sol
172+
│ ├── NFTTypes.sol
173+
174+
├── interfaces/ # 介面定義
175+
│ ├── IERC20.sol
176+
│ ├── IUniswapV2Router.sol
177+
178+
├── core/ # 核心業務邏輯
179+
│ ├── OrderBook.sol
180+
│ ├── NFTMarketplace.sol
181+
```
182+
183+
4. 不使用view函數而是使用Extsload合約,直接從外部合約讀取 storage slot(待補)
184+
18185
# 2025-08-13
19186

20187
## Solidity基本語法

0 commit comments

Comments
 (0)