@@ -15,6 +15,42 @@ timezone: UTC+8
1515## Notes
1616
1717<!-- Content_START -->
18+ # 2025-08-18
19+
20+ 复杂数据类型深化
21+ (1)动态数组与固定数组
22+ 动态数组:uint[ ] (长度可变),学习 push(追加)、pop(删除末尾)、length(获取长度)等操作。
23+ 映射(Mapping)高级用法
24+ 嵌套映射:mapping(address => mapping(uint => bool)) public nestedMap;(地址 → 数字 → 布尔值)。
25+ 映射与数组结合:因映射无法直接遍历,需用数组记录键(如 address[ ] public keys; mapping(address => uint) public balances;),实现遍历逻辑。
26+ 结构体(Struct)与枚举(Enum)
27+ 结构体:定义复杂类型(如 struct User { string name; uint age; }),结合映射 / 数组存储(如 mapping(address => User) public users;)。
28+ 枚举:简化状态管理(如 enum Status { Pending, Approved, Rejected }),减少魔法值(Magic Number)。
29+ 合约继承(Inheritance)
30+ 基础继承:contract A { ... } contract B is A { ... },子类继承父类的状态变量、函数。
31+ 构造函数继承:constructor() 需用 constructor() A() {} 显式继承父类构造逻辑。
32+ 函数重写(Override):子类重写父类函数,需加 override 关键字(父类函数需标记 virtual)。
33+ 接口(Interface)与抽象合约(Abstract)
34+ 接口:interface IERC20 { function transfer(address to, uint value) external; },定义函数签名,用于跨合约调用(如与其他代币合约交互)。
35+ 抽象合约:含未实现函数(function foo() external pure virtual;),需被子类继承并实现,用于规范接口或复用部分逻辑。
36+ 重入攻击(Reentrancy)
37+ 原理:外部调用(如 call)前未锁定状态,导致合约被重复调用,篡改状态。
38+ 防范:
39+ 使用 reentrancy guard(锁变量:bool locked; modifier noReentrant { require(!locked); locked = true; _ ; locked = false; })。
40+ 遵循 “检查 - 效果 - 交互”(CEI)模式:先改状态(如扣余额),再外部调用。
41+ 整数溢出(Overflow/Underflow)
42+ 问题:uint8 a = 255; a++; 会溢出为 0(旧版本 Solidity 问题)。
43+ 防范:
44+ 使用 Solidity 0.8+(默认检测溢出,报错回滚)。
45+ 手动校验(如 require(a + b <= type(uint).max, "Overflow");)。
46+ 权限控制
47+ 最小权限原则:状态变量、函数可见性严格限制(如 private 变量仅内部访问)。
48+ 管理员权限:用 modifier onlyOwner { require(msg.sender == owner); _ ; } 控制关键操作(如 mint 代币)。
49+ Gas 优化
50+ 存储优化:状态变量尽量用 uint256(EVM 对 32 字节操作最友好),减少 storage 读写。
51+ 函数优化:external 函数优先用 calldata(而非 memory)传参,降低 gas。
52+ 避免循环:长循环会消耗大量 gas,甚至触发区块 gas 上限,尽量拆分逻辑。
53+
1854# 2025-08-16
1955
2056学习solidity。
0 commit comments