10.Constructor


文档摘要

title: 10. Constructor tags: huff interface constructor bytecode WTF Huff极简入门: 10. Constructor 我最近在重新学Huff,巩固一下细节,也写一个“Huff极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAAScience 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTF-Huff 这一讲,我们介绍Huff中的 ,它可以在部署时用来初始化合约。 Constructor Huff中的 宏和Solidity的构造函数类似,它不是必须的,但是可以在部署时用来初始化合约状态变量。

title: 10. Constructor tags: - huff - interface - constructor - bytecode

WTF Huff极简入门: 10. Constructor

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

推特:@0xAA_Science

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

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

这一讲,我们介绍Huff中的Constructor,它可以在部署时用来初始化合约。

Constructor

Huff中的CONSTRUCTOR宏和Solidity的构造函数类似,它不是必须的,但是可以在部署时用来初始化合约状态变量。如果你不了解以太坊是如何通过交易创建合约的,可以阅读WTF EVM Opcodes第21讲

在下面的例子中,我们使用CONSTRUCTOR宏在合约部署时将存储槽VALUE_LOCATION的值初始化为0x69

/* 接口 */ #define function getValue() view returns (uint256) /* 存储槽位 */ #define constant VALUE_LOCATION = FREE_STORAGE_POINTER() /* 方法 */ // Constructor #define macro CONSTRUCTOR() = takes (0) returns (0) { 0x69 [VALUE_LOCATION] sstore // [] } #define macro GET_VALUE() = takes (0) returns (0) { // 从存储中加载值 [VALUE_LOCATION] // [ptr] sload // [value] // 将值存入内存 0x00 mstore // 返回值 0x20 0x00 return } // 合约的主入口,判断调用的是哪个函数 #define macro MAIN() = takes (0) returns (0) { // 通过selector判断要调用哪个函数 0x00 calldataload 0xE0 shr dup1 __FUNC_SIG(getValue) eq get jumpi // 如果没有匹配的函数,就revert 0x00 0x00 revert get: GET_VALUE() }

分析合约字节码

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

huffc src/10_Constructor.huff -b

打印出的bytecode为:

60695f55601c80600d3d393df35f3560e01c80632096525514610013575f5ffd5b5f545f5260205ff3

将这段字节码复制到evm.codes playground,并点击运行。可以看到存储槽0被初始化为69,并且返回了合约的runtime code: 5f3560e01c80632096525514610013575f5ffd5b5f545f5260205ff3,说明合约初始化成功!

总结

这一讲,我们介绍了如何在Huff中使用Constructor宏,它与Solidity中的构造函数类似,可以在部署时用来初始化合约。


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