@@ -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