03.常量


文档摘要

title: 03. 常量 tags: huff storage FREESTORAGEPOINTER bytecode WTF Huff极简入门: 03. 常量 我最近在重新学Huff,巩固一下细节,也写一个“Huff极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAAScience 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTF-Huff 这一讲,我们将介绍Huff中的常量和 关键字。 常量 Huff的常量和Solidity中的相似,它们不会被包含在存储(storage)中,而是在编译时在合约内调用(包含在字节码中)。

title: 03. 常量 tags: - huff - storage - FREE_STORAGE_POINTER - bytecode

WTF Huff极简入门: 03. 常量

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

推特:@0xAA_Science

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

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

这一讲,我们将介绍Huff中的常量和constant关键字。

常量

Huff的常量和Solidity中的相似,它们不会被包含在存储(storage)中,而是在编译时在合约内调用(包含在字节码中)。常量可以是最多32字节的数据或是FREE_STORAGE_POINTER()关键字(代表合约中尚未使用的存储槽)。

声明常量

你可以使用constant关键字在合约中声明常量:

#define constant NUM = 0x69 #define constant STORAGE_SLOT0 = FREE_STORAGE_POINTER()

使用常量

你可以使用括号表示法[CONSTANT]将常量压入堆栈。

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

在上面的MAIN()宏中,我们将常量NUM(值为0x69)和STORAGE_SLOT0(值为0)压入堆栈,然后使用sstore指令将0x69存入存储槽0

分析合约字节码

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

huffc src/03_Constant.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中的常量和constant关键字。常量不会占用存储,而是会在编译时被调用。


作者与出处
原作者: WTFAcademy
来源:WTFAcademy
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: WTFAcademy 转发
评论区 (0)
U