05.Main宏


文档摘要

title: 05. Main宏 tags: huff macro main macro bytecode WTF Huff 极简入门: 05. Main 宏 我最近在重新学 Huff,巩固一下细节,也写一个“Huff 极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。 推特:@0xAAScience 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在 github: github.com/AmazingAng/WTF-Huff 这一讲,我们将介绍 Huff 中的 宏,它是合约的主入口。 Main 宏 宏是一个特殊的宏,作为合约的主入口,每个 Huff 合约必须有一个。

title: 05. Main宏 tags: - huff - macro - main macro - bytecode

WTF Huff 极简入门: 05. Main 宏

我最近在重新学 Huff,巩固一下细节,也写一个“Huff 极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。

推特:@0xAA_Science

社区:Discord微信群官网 wtf.academy

所有代码和教程开源在 github: github.com/AmazingAng/WTF-Huff

这一讲,我们将介绍 Huff 中的MAIN宏,它是合约的主入口。

Main 宏

Main宏是一个特殊的宏,作为合约的主入口,每个 Huff 合约必须有一个。它的作用类似于 Solidity 中的fallback函数,当对合约进行外部调用时,会运行这段代码来确定应该调用哪个函数。

声明时需要用MAIN()关键字:

#define macro MAIN() = takes (0) returns (0) { // ... }

下面我们写一个简单的合约:

#define macro PUSH_69() = takes(0) returns(1) { push1 0x69 // [0x69] } #define macro SAVE() = takes(1) returns(0) { // [0x69] [STORAGE_SLOT0] // [value_slot0_pointer, 0x69] sstore // [] } #define macro MAIN() = takes(0) returns(0) { PUSH_69() // [] SAVE() }

上面合约中的PUSH_69()宏会将0x69压入堆栈中(returns(1)),而SAVE()宏(takes(1))会将堆栈顶端的值保存到存储槽STORAGE_SLOT0。在Main宏中,我们一次调用了PUSH_69()SAVE()

分析合约字节码

我们可以使用huffc命令获取上面合约的 runtime code:

huffc src/05_Main.huff -r

打印出的 bytecode 为:

60695f55

转换成格式化的表格:

pc op opcode stack
[00] 60 69 PUSH1 0x69 0x69
[02] 5f PUSH0 0 0x69
[03] 55 SSTORE

我们可以看到,这个合约实际上做的就是使用SSTORE指令将0x69存储在存储槽0中。

总结

这一讲,我们介绍了 Huff 中的Main宏和MAIN关键字。Huff 中的Main宏是合约的主入口,每个合约必须包含它,功能与 Solidity 中的fallback函数类似。


发布者: 作者: 转发
评论区 (0)
U