Huff :对比 Solidity、Yul 和原始 EVM 能力——第二部分
2025-06-18 18:00
登链社区
2025-06-18 18:00
订阅此专栏
收藏此文章
登链社区

引言

在 第 1 部分:精通 Huff:从零开始构建 Gas 优化的智能合约中,我们探索了 Huff 的语法、结构和初始用例。现在,在 第 2 部分 中,我们将 Huff 与 Solidity 和 Yul 进行比较,完成我们的 ERC20 合约实现,并检查开发和测试工作流程。

Solidity vs. Yul vs. Huff

image-20240930222847819.png

Gas 比较 (ERC20 transfer)

  • Solidity: ~22,000–25,000 gas
  • Yul: ~20,000–22,000 gas
  • Huff: ~21,000–22,000 gas ( 可能还有进一步优化 )

完成 ERC20 合约

Approve Macro

##define constant APPROVAL_EVENT = 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925
##define constant ALLOWANCE_SLOT = 0x03

##define macro APPROVE() = takes(0) returns(0) {
    UTILS__NOT_PAYABLE<throw_error>()
    0x04 calldataload ADDRESS_MASK()
    caller
    [APPROVAL_EVENT]
    0x20 0x00
    0x24 calldataload
    dup1
    caller 0x00 mstore
    [ALLOWANCE_SLOT] 0x20 mstore
    0x40 0x00 sha3
    0x20 mstore
    dup7 0x00 mstore
    0x40 0x00 sha3
    sstore
    0x00 mstore log3
    0x01 0x00 mstore
    0x20 0x00 return
}

Allowance Macro

##define macro ALLOWANCE() = takes(0) returns(0) {
    UTILS__NOT_PAYABLE<throw_error>()
    0x04 calldataload ADDRESS_MASK()
    0x00 mstore
    [ALLOWANCE_SLOT] 0x20 mstore
    0x40 0x00 sha3
    0x20 mstore
    0x24 calldataload ADDRESS_MASK()
    0x00 mstore
    0x40 0x00 sha3
    sload
    0x00 mstore
    0x20 0x00 return
}

TransferFrom Macros

Initialization Macro

##define macro TRANSFER_FROM_INIT() = takes(0) returns(6) {
    0x24 calldataload ADDRESS_MASK()
    0x04 calldataload ADDRESS_MASK()
    [TRANSFER_EVENT]
    0x20 0x00
    0x44 calldataload
}

Allowance Subtraction Macro

##define macro TRANSFER_SUB_ALLOWANCE() = takes(8) returns(9) {
    dup7 0x00 mstore
    [ALLOWANCE_SLOT] 0x20 mstore
    0x40 0x00 sha3
    0x20 mstore
    caller 0x00 mstore
    0x40 0x00 sha3
    dup1 sload
    dup5 dup2 sub
    dup6 swap3 sstore
    lt
}

Final TransferFrom Macro

##define macro TRANSFER_FROM() = takes(0) returns(0) {
    TRANSFER_FROM_INIT()
    TRANSFER_GIVE_TO()
    TRANSFER_TAKE_FROM<dup6>()
    TRANSFER_SUB_ALLOWANCE()
    callvalue or or or throw_error jumpi
    0x00 mstore log3
    0x01 0x00 mstore
    0x20 0x00 return
}

测试和部署

使用 Foundry 进行测试

import "foundry-huff/HuffDeployer.sol";
import "forge-std/Test.sol";

contract TestHuff is Test {
    function testTransfer() public {
        address token = HuffDeployer.deploy("ERC20");
        (bool success,) = token.call(abi.encodeWithSignature("transfer(address,uint256)", address(this), 100));
        assertTrue(success);
    }
}

Native Huff Testing

##include "TestHelpers.huff"

##define test TEST_TRANSFER() = {
    // 测试逻辑
}

Deployment Script

import "foundry-huff/HuffDeployer.sol";
import "forge-std/Script.sol";

contract Deploy is Script {
    function run() public returns (address) {
        return HuffDeployer.broadcast("ERC20");
    }
}

架构图

image-20240930222847819.png

结论

在本系列的这一部分中,我们将 Huff 与 Solidity 和 Yul 进行了比较,实现了 approveallowance 和 transferFrom 宏,并介绍了使用 Foundry 的测试和部署工作流程。

  • 原文链接:https://medium.com/@ankitacode11/huff-deep-dive-comparing-solidity-yul-and-raw-evm-power-part-2-a596b8c94288
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

登链社区是一个 Web3 开发者社区,通过构建高质量技术内容平台和线下空间,助力开发者成为更好的 Web3 Builder。

登链社区
  • 登链社区网站 : learnblockchain.cn
  • 开发者技能认证 : decert.me
  • B 站 : space.bilibili.com/581611011
  • YouTube : www.youtube.com/@upchain
登链社区

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

登链社区
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开