Skip to content

Commit dfae2a8

Browse files
committed
Add study notes for 2025-08-14
1 parent 39768e0 commit dfae2a8

1 file changed

Lines changed: 103 additions & 0 deletions

File tree

CodingGeoff.md

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

1717
<!-- Content_START -->
18+
# 2025-08-14
19+
20+
# A. 参加Dapp开发流程分享会
21+
22+
## 一、项目背景与分享概述
23+
1. **项目简介**
24+
项目基于 Uniswap V4 hook 构建,已获得 Uniswap Foundation 提供的安全审计赞助。核心代码采用大量 Gas 优化的合约实现,包含自主开发的 Oracle 数据库模块,源代码可在 GitHub 查阅。目前核心合约处于审计阶段,外围合约尚未完成审计,建议待审计完成后再复用代码以避免安全风险。
25+
26+
2. **分享重点**
27+
本次分享聚焦现代智能合约的架构设计与编程技巧,不涉及 DeFi 底层数学与金融原理。以 Uniswap V4(简称 V4)为核心案例,解析其架构逻辑(与 V3 核心逻辑一致,数学原理可参考 V3 相关文档),同时结合项目实践,阐述开发中的关键技术与最佳实践。
28+
29+
30+
## 二、依赖管理与项目结构
31+
1. **依赖管理工具**
32+
推荐使用 `soldeer` 替代传统 Git 模块管理依赖,优势包括:
33+
- 自动锁定依赖版本及校验和(如哈希值),避免供应链攻击;
34+
- 依赖管理目录简洁,无冗余模块配置;
35+
- 支持直接从 Git 仓库拉取依赖,通过指令 `soldeer install` 安装并锁定版本。
36+
相比之下,V4 仍使用基于 Git 模块的依赖管理,需维护 `remapping.txt` 配置文件,灵活性较低。
37+
38+
2. **项目目录结构**
39+
- **lib 目录**:存放 V4 依赖项(基于 Git 模块),现代项目建议用 `solder` 替代;
40+
- **unit 目录**:包含 Gas 优化报告(snapshot),需通过特定指令记录操作码与 gas 消耗,适用于团队协作中监控代码优化效果。
41+
42+
43+
## 三、合约部署与跨版本兼容
44+
1. **多版本合约部署**
45+
因 V3(锁定 Solidity 0.7.6)与 V4(锁定 0.8.26)存在编译器版本冲突,直接编译会报错,解决方案为:
46+
- 将 V3 编译为二进制字节码,通过部署器部署至测试环境;
47+
- lecurity 项目进一步激进,主合约锁定 0.8.30,通过指令获取 V4 字节码并转换为二进制,结合构造器参数拼接为 `creation code`,使用 `create2` 内联汇编部署,部署时需跳过字节码前 0x20 长度位。
48+
49+
2. **权限配置**
50+
部署过程中需通过配置文件声明文件可读性,避免 `forge` 工具因权限不足报错。外围合约中需显式配置可读资源,确保部署脚本正常执行。
51+
52+
53+
## 四、外部函数调用与验证(FFI)
54+
1. **FFI 机制**
55+
用于调用非 Solidity 代码(如 JavaScript、Python)验证合约逻辑,例如:
56+
- V4 中通过 JS 脚本计算指数函数,对比 Solidity 实现结果;
57+
- lecurity 项目用 Python 实现 EMA 算法(基于高精度库 `mpmath`),验证合约中指数平均数计算的准确性。
58+
59+
2. **使用注意事项**
60+
- 需在配置中开启 FFI 权限,否则存在安全风险;
61+
- FFI 会显著降低合约运行速度,建议减少调用次数(如 V4 限制 FFI 运行次数);
62+
- 输出结果默认为二进制,需转换为目标类型(如 `uint256`)后使用。
63+
64+
65+
## 五、现代合约开发技巧
66+
1. **组合优于继承**
67+
现代合约开发提倡用 `library` 组合替代多层继承,减少代码复杂度:
68+
- **V4 实践**:核心合约 `PoolManager` 仅继承基础功能合约(如 `ERC6909CM`),不重载父类函数,核心逻辑通过 `library` 实现;
69+
- **优势**:避免继承链混乱(如 V3 多层继承导致的可读性问题),便于审计与维护。
70+
71+
2. **自定义类型与运算符重载**
72+
- Solidity 0.8.30 后支持自定义类型(如 `type PoolId is bytes32`),本质为原始类型的零成本抽象,编译时还原为底层类型(如 `address`);
73+
- 支持运算符重载与隐式导入(通过 `global` 关键字),优化代码可读性(如 `isZero()` 替代直接比较);
74+
- 避免精度误用:例如 lecurity 定义 `Rate` 类型(27 位精度),编译时会拦截精度不匹配的运算(如与 18 位精度变量相乘),减少逻辑漏洞。
75+
76+
3. **Library 调用机制**
77+
- **内部调用**:含 `internal`/`private` 函数的 library 会被编译到调用合约中,通过 `jump` 指令直接执行,共享合约上下文;
78+
- **外部调用**:含 `public` 函数的 library 需单独部署,通过 `delegatecall` 执行,可读写调用合约状态(与传统认知中“library 不可修改状态”相反)。
79+
80+
81+
## 六、现代合约核心特性
82+
1. **弱化 view 函数**
83+
为减少合约体积(以太坊对合约大小有限制),现代合约(如 V4 `PoolManager`)几乎不提供 `view` 函数,而是通过 `export` 函数直接读取存储槽(`sload` 指令),需开发者本地计算存储槽位置(如通过工具生成存储分布表)。
84+
85+
2. **单体架构**
86+
V4 采用单体合约设计,通过 `Mapping(poolId => PoolState)` 管理所有资金池,优势包括:
87+
- 优化链式兑换 gas 成本:跨池操作仅需一次冷合约调用(2100 gas),后续为热调用(100 gas),相比 V3 多次冷调用显著节省成本;
88+
- 结合 Flash Account 进一步降低 gas 消耗。
89+
需根据项目场景权衡(如 lecurity 为借贷协议,跨池操作少,未采用单体架构)。
90+
91+
3. **Delta 机制与终局原子性**
92+
- **Delta 机制**:支持多笔操作统一清算(如 a→b→c 兑换中,仅需清算 a 和 c,抵消中间资产 b),优化递归回调逻辑(如 V3 中的嵌套回调);
93+
- **终局原子性**:要求交易结束时账户状态平衡(如借贷协议确保仓位健康),否则回滚所有操作,增强安全性(如 Flash Loan 无手续费的 Morpher 和 V4 均采用此机制)。
94+
95+
96+
## 七、审计流程与注意事项
97+
1. **审计流程**
98+
通过 Uniswap 官方平台提交项目,平台聚合顶级审计公司报价,选择后由 Uniswap Foundation 报销费用。需与审计公司沟通报价、工程师配置及附加服务(如形式化证明)。
99+
100+
2. **关键考量**
101+
- 优先选择有同类项目审计经验的公司;
102+
- 形式化证明成本高(报价可能从五位数升至六位数);
103+
- Bug Bounty 通常含 1-2 个月免费期,后续需付费,性价比需评估;
104+
- 部分审计公司分品牌运营(经济型与高端型),报价差异较大。
105+
106+
107+
## 八、学习路径与建议
108+
1. **入门标准**
109+
读懂 V4 非数据库部分代码(或 V3 核心逻辑),理解架构设计与优化技巧。
110+
111+
2. **学习资源**
112+
- 基础:实现 ERC20 合约,熟悉 Solidity 语法;
113+
- 进阶:阅读 Uniswap V2/V3 源码(侧重架构)、MORPHO 借贷协议(代码简洁,适合入门);
114+
- 内联汇编:通过项目实践学习(如改写 `ABI.encode` 为内联汇编)。
115+
116+
3. **工具推荐**
117+
- IDE:VS Code + 官方 Solidity 插件;
118+
- 依赖管理:soldeer;
119+
- 测试框架:Forge(支持 FFI、不变量测试)。
120+
18121
# 2025-08-13
19122

20123
# A. 参加本地搭建区块链网络实战知识分享会(Foundry Anvil & 测试网)

0 commit comments

Comments
 (0)