Skip to content

Commit b7b9b99

Browse files
committed
Add study notes for 2025-08-14
1 parent 1e3530a commit b7b9b99

1 file changed

Lines changed: 245 additions & 0 deletions

File tree

tommyjqliu.md

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

1717
<!-- Content_START -->
18+
# 2025-08-14
19+
20+
# 以太坊 Gas 优化 & 审计技巧分享
21+
22+
## 概述
23+
24+
在以太坊智能合约开发中,Gas优化是降低交易成本的关键,而审计则是确保合约安全性的重要环节。本文分享一些实用的优化技巧和审计要点。
25+
26+
## Gas 优化技巧
27+
28+
### 1. 存储优化
29+
30+
- **使用打包结构体**
31+
```solidity
32+
// 不好的写法 - 浪费存储空间
33+
struct User {
34+
uint256 id;
35+
bool isActive;
36+
uint256 balance;
37+
}
38+
39+
// 好的写法 - 优化存储布局
40+
struct User {
41+
uint128 id;
42+
uint128 balance;
43+
bool isActive;
44+
}
45+
```
46+
47+
- **避免不必要的存储读写**
48+
```solidity
49+
// 不好的写法 - 多次读取存储
50+
function updateBalance(uint256 amount) external {
51+
balance += amount;
52+
emit BalanceUpdated(balance);
53+
require(balance <= maxBalance, "Exceeds limit");
54+
}
55+
56+
// 好的写法 - 使用局部变量缓存
57+
function updateBalance(uint256 amount) external {
58+
uint256 newBalance = balance + amount;
59+
require(newBalance <= maxBalance, "Exceeds limit");
60+
balance = newBalance;
61+
emit BalanceUpdated(newBalance);
62+
}
63+
```
64+
65+
### 2. 循环优化
66+
67+
- **缓存数组长度**
68+
```solidity
69+
// 不好的写法 - 每次迭代都读取长度
70+
for (uint256 i = 0; i < items.length; i++) {
71+
// 处理逻辑
72+
}
73+
74+
// 好的写法 - 缓存数组长度
75+
uint256 length = items.length;
76+
for (uint256 i = 0; i < length; i++) {
77+
// 处理逻辑
78+
}
79+
```
80+
81+
- **使用 unchecked 块(Solidity 0.8+)**
82+
```solidity
83+
for (uint256 i = 0; i < length;) {
84+
// 处理逻辑
85+
unchecked {
86+
++i;
87+
}
88+
}
89+
```
90+
91+
### 3. 函数修饰符优化
92+
93+
- **使用 external 而非 public**
94+
```solidity
95+
// 不好的写法 - 如果函数不会被内部调用
96+
function getData() public view returns (bytes memory) {
97+
return data;
98+
}
99+
100+
// 好的写法 - 使用 external 节省 gas
101+
function getData() external view returns (bytes memory) {
102+
return data;
103+
}
104+
```
105+
106+
- **合理使用 payable**
107+
```solidity
108+
// 如果函数不需要接收 ETH,不要使用 payable
109+
function withdraw() external payable {
110+
// 逻辑
111+
}
112+
```
113+
114+
### 4. 数据类型优化
115+
116+
- **使用合适的整数类型**
117+
```solidity
118+
// 不好的写法 - 过大的数据类型
119+
uint256 counter = 0;
120+
121+
// 好的写法 - 根据实际需求选择
122+
uint8 counter = 0; // 如果值不会超过 255
123+
```
124+
125+
## 智能合约审计要点
126+
127+
### 1. 重入攻击防护
128+
129+
```solidity
130+
// 好的写法 - 使用 ReentrancyGuard
131+
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
132+
133+
contract SafeContract is ReentrancyGuard {
134+
function withdraw() external nonReentrant {
135+
// 提取逻辑
136+
}
137+
}
138+
139+
// 好的写法 - 检查-效果-交互模式
140+
function withdraw(uint256 amount) external {
141+
require(balances[msg.sender] >= amount, "Insufficient balance");
142+
balances[msg.sender] -= amount; // 先更新状态
143+
payable(msg.sender).transfer(amount); // 再进行外部调用
144+
}
145+
```
146+
147+
### 2. 整数溢出检查
148+
149+
```solidity
150+
// Solidity 0.8+ 自动检查溢出,但要注意 unchecked 块
151+
function safeAdd(uint256 a, uint256 b) external pure returns (uint256) {
152+
return a + b; // 自动溢出检查
153+
}
154+
155+
// 对于 unchecked 块要格外小心
156+
function riskyOperation(uint256 a, uint256 b) external pure returns (uint256) {
157+
unchecked {
158+
return a + b; // 可能溢出!
159+
}
160+
}
161+
```
162+
163+
### 3. 访问控制
164+
165+
```solidity
166+
// ✅ 使用 OpenZeppelin 的访问控制
167+
import "@openzeppelin/contracts/access/Ownable.sol";
168+
169+
contract SecureContract is Ownable {
170+
function criticalFunction() external onlyOwner {
171+
// 只有所有者才能调用
172+
}
173+
}
174+
175+
// ✅ 多重角色控制
176+
import "@openzeppelin/contracts/access/AccessControl.sol";
177+
178+
contract RoleBasedContract is AccessControl {
179+
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
180+
181+
constructor() {
182+
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
183+
}
184+
185+
function adminFunction() external onlyRole(ADMIN_ROLE) {
186+
// 管理员功能
187+
}
188+
}
189+
```
190+
191+
### 4. 价格操作防护
192+
193+
```solidity
194+
// ✅ 使用时间加权平均价格
195+
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
196+
197+
contract PriceProtected {
198+
AggregatorV3Interface internal priceFeed;
199+
200+
function getLatestPrice() public view returns (int) {
201+
(
202+
uint80 roundID,
203+
int price,
204+
uint startedAt,
205+
uint timeStamp,
206+
uint80 answeredInRound
207+
) = priceFeed.latestRoundData();
208+
209+
require(timeStamp > 0, "Round not complete");
210+
return price;
211+
}
212+
}
213+
```
214+
215+
## 🛠️ 审计工具推荐
216+
217+
### 静态分析工具
218+
219+
1. **Slither** - 静态分析器
220+
```bash
221+
pip install slither-analyzer
222+
slither contracts/
223+
```
224+
225+
2. **MythX** - 商业级安全分析
226+
3. **Oyente** - 开源安全分析工具
227+
228+
### 形式化验证
229+
230+
1. **Certora** - 形式化验证平台
231+
2. **K Framework** - 语义框架
232+
233+
## 📊 Gas 优化检查清单
234+
235+
- [ ] 存储变量是否可以打包
236+
- [ ] 是否缓存了重复的存储读取
237+
- [ ] 循环是否优化了长度读取
238+
- [ ] 函数可见性是否合适
239+
- [ ] 是否使用了合适的数据类型
240+
- [ ] 是否移除了未使用的代码
241+
242+
## 🔐 安全审计检查清单
243+
244+
- [ ] 重入攻击防护
245+
- [ ] 整数溢出/下溢检查
246+
- [ ] 访问控制验证
247+
- [ ] 价格操作防护
248+
- [ ] 时间依赖漏洞检查
249+
- [ ] 随机数安全性
250+
- [ ] 拒绝服务攻击防护
251+
252+
## 📚 参考资源
253+
254+
- [Ethereum Gas Optimization Guide](https://ethereum.org/en/developers/docs/gas/)
255+
- [OpenZeppelin Security Guidelines](https://docs.openzeppelin.com/contracts/4.x/api/security)
256+
- [ConsenSys Smart Contract Best Practices](https://consensys.github.io/smart-contract-best-practices/)
257+
- [Trail of Bits Security Reviews](https://github.com/trailofbits/publications)
258+
259+
---
260+
261+
> **注意**: Gas 优化和安全审计需要在实际项目中根据具体情况进行调整。建议在主网部署前进行专业的安全审计。
262+
18263
# 2025-08-13
19264

20265
# 本地搭建区块链网络实战:Foundry Anvil & 测试网

0 commit comments

Comments
 (0)