@@ -15,6 +15,55 @@ timezone: UTC+8
1515## Notes
1616
1717<!-- Content_START -->
18+ # 2025-08-17
19+
20+ ### 一、文件架构:项目目录与工具实践
21+ 1 . ** 目录结构与依赖管理**
22+ - 以Uniswap V4 Core为例,核心目录包括` lib ` (依赖)、` src ` (源码)、` test ` (测试)等。依赖管理推荐使用` soldeer ` (类似npm,通过` soldeer.lock ` 锁定版本),替代Foundry默认的git modules,更高效。
23+ - 避免使用` remappings.txt ` ,转而在` foundry.toml ` 中配置remappings,明确依赖路径。
24+
25+ 2 . ** 测试相关目录与工具**
26+ - ` snapshots ` 目录:存储测试中的gas消耗数据,用于验证代码修改的gas优化效果,需通过` vm.startSnapshotGas ` 等手动记录。
27+ - 测试工具:` echidna ` 用于不变量测试,Uniswap V4较少使用;推荐关注Recon的` create-chimera-app ` 框架及相关入门文章。
28+ - ` test ` 目录细节:
29+ - ` bin ` 文件夹:存储版本不兼容合约的字节码(如Uniswap V3合约,因Solidity版本与V4冲突),通过` create2 ` 部署,需在` foundry.toml ` 配置文件读取权限。
30+ - ` js-scripts ` /Python脚本:用于数学计算等效性测试(如tick与price转化、EMA算法),通过Foundry的` ffi ` 特性在测试中调用,需注意` ffi ` 会拖慢测试速度,需限制fuzz次数。
31+
32+
33+ ### 二、开发架构:组合优先于继承的实践
34+ 1 . ** 核心原则:组合替代继承**
35+ 现代Solidity开发倾向减少继承,优先通过“自定义类型+library”实现功能,避免复杂的C3线性化问题。
36+
37+ 2 . ** 自定义类型的应用**
38+ - 用` solidity ` 的自定义类型语法(如` type Currency is address ` )定义专属类型,底层为基础类型(如address、bytes32),但提供类型安全,避免误操作(如利率类型` InterestRate ` 不提供运算符重载,防止错误计算)。
39+ - 可通过` wrap ` /` unwrap ` 转换与基础类型的关系,或通过内联汇编直接生成(如` PoolId ` 由` keccak256 ` 结果强转),ABI中会自动转为底层类型。
40+
41+ 3 . ** library的关键作用**
42+ - 作为组合的核心,通过存储指针(如` Position storage self ` )访问和修改合约状态,支持复杂结构体操作(如Uniswap V4的` Pool.sol ` 处理` State ` 结构体,包含mapping等嵌套类型)。
43+ - 调用方式:` internal ` 函数通过JUMP跳转,` public ` /` view ` 函数通过delegatecall/staticcall,需注意部署与调用成本(如AAVE v3的library用` public ` 避免合约体积过大)。
44+
45+ 4 . ** 继承的使用原则**
46+ - 避免多层级继承,` override ` 仅用于父合约需获取子合约数据的场景(如Uniswap V4中` _getPool ` 函数重写,方便协议手续费修改)。
47+
48+
49+ ### 三、现代合约特性:效率与灵活性优化
50+ 1 . ** Extsload合约:替代view函数**
51+ 当状态变量为` internal ` 时,通过` Extsload ` 合约提供的函数(如` extsload(bytes32 slot) ` )直接访问存储槽,避免编译器生成大量view函数导致合约体积膨胀,支持单槽、多槽(结构体)、批量槽读取。
52+
53+ 2 . ** 单体架构:按需选择**
54+ - Uniswap V4采用单体架构,优势在于优化链式兑换(减少cold合约调用的gas消耗)、配合Flash Account降低成本;
55+ - Licredity因跨池操作少,未采用,避免开发成本增加。
56+
57+ 3 . ** Balance Delta机制:高效清算**
58+ 类似金融轧差机制,在transit storage中记录用户与协议的资产负债(如用户提取资产时记为负数负债),支持用户多笔交互后统一清算,减少gas消耗,避免Uniswap V3的“callback地狱”。
59+
60+ 4 . ** unlock与终局原子性:灵活交互**
61+ - 用户交互需先调用` unlock ` ,再执行操作,最终通过` unlockCallback ` 检查核心状态(如Licredity检查头寸健康度,Uniswap V4检查资产是否清算完毕)。
62+ - 优势:用户可任意顺序交互,仅需保障最终状态合规,提升灵活性;缺点是需通过外围合约(如Licredity的` LicredityAccount.sol ` )转发交互,EOA无法直接交互。
63+
64+ 5 . ** transit storage支撑**
65+ 为上述特性(如Balance Delta、unlock)提供交易内可访问的临时存储,简化复杂递归逻辑的编写。
66+
1867# 2025-08-14
1968
2069# 汇编语言
0 commit comments