本文是 Huff 系列教程的第三部分,主要探讨了使用 Huff 语言进行高级 Gas 优化的技术,并通过构建一个简化的 Uniswap 风格的 AMM 案例,展示了 Huff 在 DeFi 领域的应用。同时,文章还强调了在编写底层合约时需要考虑的安全因素,如溢出/下溢检查、calldata 边界检查和重入保护,并介绍了使用 Foundry 进行 Fuzz 测试等高级工作流程。
欢迎来到 Huff 之旅的第 3 部分。
在第 1 部分:掌握 Huff:从头开始构建 Gas 优化的智能合约中,我们介绍了 Huff 的底层语法和结构。第 2 部分:Huff 深度剖析:比较 Solidity、Yul 和原始 EVM 能力 采用了比较方法,最终完成了一个 gas 优化的 ERC20 合约。
这最后一部分探讨了 高级 gas 优化策略,在 Huff 中构建一个 Uniswap 风格的 AMM,并涵盖了 生产就绪型智能合约的安全最佳实践 —— 展示了 Huff 在 DeFi 领域中无与伦比的效率。
Huff 允许你编写超高效的 EVM 字节码。以下是最大限度节省 gas 的关键技术:
用更便宜的替代方案替换昂贵的操作码:
returndatasize
(2 gas) vs. push0
(3 gas)##define macro IS_EVEN_OPTIMIZED() = takes(0) returns(0) {
0x00 calldataload
0x02 mod
iszero
returndatasize mstore
0x20 returndatasize return
}
dup
和 swap
。0x00
到 0x1f
)进行重复写入。or
和 jumpi
组合条件检查,以减少分支并节省 gas。让我们在 Huff 中探索一个简化的 AMM 实现,重点是 swap(address tokenIn, uint amountIn)
。
##define constant RESERVE_A = 0x04
##define constant RESERVE_B = 0x05
##define constant SWAP_EVENT = 0xD78AD95FA46C994B6551D0DA85C8186D5F289C8B8C9A0E7B7A8F7C6A8F7C6A8F
##define macro ADDRESS_MASK() = takes(1) returns(1) {
0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff and
}
##define macro SWAP_INIT() = takes(0) returns(6) {
0x04 calldataload ADDRESS_MASK()
caller
[SWAP_EVENT]
0x20 0x00
0x24 calldataload
}
##define macro COMPUTE_AMOUNT_OUT() = takes(6) returns(7) {
[RESERVE_A] sload
[RESERVE_B] sload
dup3 mul
dup6 add
dup1 div
dup1 dup7 lt
swap2
}
##define macro UPDATE_RESERVES() = takes(7) returns(8) {
dup8 [RESERVE_A] sload add [RESERVE_A] sstore
dup3 [RESERVE_B] sload sub [RESERVE_B] sstore
dup3 dup6 lt
}
##define macro SWAP() = takes(0) returns(0) {
SWAP_INIT()
COMPUTE_AMOUNT_OUT()
UPDATE_RESERVES()
callvalue or or throw_error jumpi
0x00 mstore log3
0x01 0x00 mstore
0x20 0x00 return
}
##define macro MAIN() = takes(0) returns(0) {
0x00 calldataload 0xe0 shr
dup1 0x022c0d9f eq swap jumpi
0x00 0x00 revert
swap:
SWAP()
throw_error:
0x00 0x00 revert
}
实现 | 估计 Gas |
---|---|
Solidity | 30,000–35,000 |
Huff | ~25,000 |
→ 使用 Huff 减少 15-25% 的 gas。
在编写底层合约时,安全性至关重要:
始终安全地执行算术运算。在需要时使用 lt
、gt
和条件 revert
逻辑。
在处理之前,确保正确的 calldata 长度和结构。
##define constant LOCK_SLOT = 0x06
##define macro NON_REENTRANT() = takes(0) returns(0) {
[LOCK_SLOT] sload iszero throw_error jumpi
0x01 [LOCK_SLOT] sstore
}
forge test --gas-report
来进行性能分析。cast run
进行执行跟踪。name: Huff CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm install -g huff
- run: forge install
- run: forge test
在第 3 部分中,我们将 Huff 推向了极限 —— 通过 gas 优化的 swaps、宏级别的安全性和生产级工作流程,释放了其在 DeFi 中的全部力量。
Huff 不适合胆小的人,但对于要求 绝对控制和最佳 gas 效率 的开发人员来说,它是 Ethereum 工具箱中无与伦比的工具。
- 原文链接: medium.com/@ankitacode11...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!