Huff: 构建 Gas 优化的智能合约 - 第一部分

本文是Huff语言系列教程的第一部分,介绍了Huff语言的特性、语法和结构,以及如何使用Huff构建优化的智能合约。通过ERC20的transfer函数和SumArray谜题两个实际案例,展示了Huff在gas优化方面的优势,并与Solidity进行了对比。文章还介绍了Huff的开发流程和工具。

简介

在竞争激烈的以太坊开发领域,每一 gas 单位都至关重要,Huff 是一种将智能合约优化推向极限的工具,因此脱颖而出。Huff 最初由 Aztec Protocol 团队开发,用于优化他们的 Weierstrudel 椭圆曲线库。Huff 是一种基于宏的低级语言,专为编写高效的 EVM 字节码而设计。它提供对 EVM 操作码的直接访问,使开发人员能够无与伦比地控制执行和性能。

然而,这种强大功能伴随着陡峭的学习曲线、极少的抽象和几乎没有内置的安全性。Huff 并不适合胆小的人 —— 它适用于那些愿意深入研究 EVM 内部结构以获得最大效率的开发人员。

这个分为三个部分的文章系列探讨了 Huff 的语法、优点和实际应用。在第 1 部分中,我们讨论:

  • 什么是 Huff
  • 其独特的语言功能
  • 语法、宏和结构
  • 诸如 ERC20 transfer 和 SumArray 谜题之类的用例

什么是 Huff?

Huff 是一种 EVM 的特定领域语言,完全专注于 gas 效率。 它去除了高级的便利,暴露了以太坊执行环境的本质。

起源

  • 创建于 2019 年,用于优化 Aztec Protocol 的加密库
  • 旨在让开发人员完全控制内存、存储和执行

主要特点

挑战

  • 复杂性: 需要深入了解 EVM 堆栈
  • 手动调试: 没有符号堆栈,调试完全是手动的
  • 容易出错: 缺乏安全网可能会引入细微的错误
  • 较小的生态系统: 比 Solidity 或 Vyper 更少的社区支持

为什么使用 Huff?

尽管 Huff 存在难度,但它在对性能至关重要的场景中表现出色:

  • 加密库: 例如,哈希、椭圆曲线
  • 对 Gas 敏感的智能合约: 例如,ERC20 代币、Uniswap 类型的 AMM
  • 自定义 EVM 逻辑: 专门的操作码序列
  • 学习工具: 非常适合掌握 EVM 内部结构

Huff 语法和结构

Huff 的核心围绕以下内容构建:

  • 常量
  • 操作码

常量

常量使用 #define constant 将原始值注入到字节码中:

##define constant BALANCE_SLOT = 0x00

宏是构建逻辑的主要方式。它们显式定义输入/输出堆栈大小并使用原始操作码。

示例:安全加法

##define macro MATH__ADD() = takes(2) returns(1) {
    // 堆栈:a, b
    dup2 add
    dup1 swap2 gt
    [OVERFLOW_ERROR] jumpi
}

函数分发器

Huff 不使用 Solidity 风格的选择器。相反,你可以使用 calldataloadjumpi 手动路由函数:

##define macro MAIN() = takes(0) returns(0) {
    0x00 calldataload
    0xe0 shr
    dup1 0xa9059cbb eq transfer jumpi
    0x00 0x00 revert
}

用例:Huff 中的 ERC20 Transfer

让我们在纯 Huff 中构建一个简单的 transfer(address,uint256)

常量

##define constant BALANCE_SLOT = 0x00
##define constant TRANSFER_SIGNATURE = 0xa9059cbb
##define constant TRANSFER_EVENT = 0xDDF252AD...

地址掩码

##define macro ADDRESS_MASK() = takes(1) returns(1) {
    0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff and
}

初始数据加载

##define macro TRANSFER_INIT() = takes(0) returns(6) {
    0x04 calldataload ADDRESS_MASK() // recipient
    caller                            // sender
    [TRANSFER_EVENT]                  // event signature
    0x20 0x00                         // memory layout
    0x24 calldataload                 // amount
}

贷记接收者

##define macro TRANSFER_GIVE_TO() = takes(6) returns(7) {
    dup6 0x00 mstore
    0x40 0x00 sha3
    dup1 sload
    dup3 add
    dup1 dup4 gt
    swap2 sstore
}

借记发送者

##define macro TRANSFER_TAKE_FROM() = takes(7) returns(8) {
    caller 0x00 mstore
    0x40 0x00 sha3
    dup1 sload
    dup4 dup2 sub
    dup5 swap3 sstore
    lt
}

主要逻辑

##define macro TRANSFER() = takes(0) returns(0) {
    TRANSFER_INIT()
    TRANSFER_GIVE_TO()
    TRANSFER_TAKE_FROM()
    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 [TRANSFER_SIGNATURE] eq transfer jumpi
    0x00 0x00 revert
transfer:
        TRANSFER()
    throw_error:
        0x00 0x00 revert
}

总结:

  • 手动执行溢出/下溢检查
  • 发出 Transfer 事件
  • 内联宏以提高效率

用例:SumArray 谜题

SumArray 谜题从 calldata 中获取 uint256[] 并返回它们的总和。

##define macro SUM_ARRAY() = takes(0) returns(0) {
    0x44 calldatasize sub
    push0
    push0

loopBegin:
        dup3 dup2 0x20 mul lt iszero end jumpi
        dup1 0x20 mul 0x44 add calldataload
        dup3 add
        swap2 pop
        0x01 add
        loopBegin jump
    end:
        pop
        push0 mstore
        0x20 push0 return
}

分发器

##define macro MAIN() = takes(0) returns(0) {
    0x00 calldataload 0xe0 shr
    dup1 0x1e2aea06 eq sumArray jumpi
    0x00 0x00 revert

sumArray:
        SUM_ARRAY()
}

Gas 比较:

  • Solidity: ~2910 gas
  • Huff: ~916 gas
  • 节省: ~68%

开发工作流程

工具

  • huffc: Huff 编译器
  • Foundry: 使用 Forge 进行测试和部署
  • HuffDeployer: 用于部署的 CLI 工具

步骤

  1. 使用宏编写 .huff 文件
  2. 编译:
huffc contracts/MyContract.huff --bytecode
  1. 使用 Foundry 进行测试

  2. 使用 forge script 部署

用户流程图

结论

在第 1 部分中,我们探讨了是什么让 Huff 成为一种独特而强大的语言,适用于专注于 Gas 优化的 EVM 开发人员。我们介绍了语法、宏系统和两个工作示例:ERC20.transfer()SumArray

👉 在第 2 部分中,我们将比较 Huff 与 Solidity 和 Yul,并继续构建 ERC20 代币

👉 在第 3 部分中,我们将探索高级优化和真实的 DeFi 用例。

  • 原文链接: medium.com/@ankitacode11...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ankitacode11
ankitacode11
江湖只有他的大名,没有他的介绍。