【Solidity Yul Assembly】4.1 | 100% Yul Contract

  • 0xE
  • 发布于 2024-09-04 10:01
  • 阅读 938

100% Yul 合约。

本节将通过简单的纯 Yul 合约示例,来讲解相关的知识点。

object "Simple1" {
    // 构造函数
    code {
        // 复制 runtime 对象的字节码到内存中,然后返回该字节码。
        // runtime 对象的代码将成为合约部署后的代码(即运行时代码)
        datacopy(0x00, dataoffset("runtime"), datasize("runtime"))
        return(0x00, datasize("runtime"))
    }

    // 部署后合约的实际字节码
    object "runtime" {
        code {
            mstore(0x00, 2)
            return(0x00, 0x20)
        }
    }
}

代码解释

Yul 中的合约可以由一个主对象和多个子对象组成。子对象可以是要部署的代码,也可以是这个合约可以创建的其他合约。

每个对象都有一个 code 部分,定义了当对象被执行时所运行的具体代码。比如,Simple1 对象中的 code 部分可以视作构造函数。而 runtime 对象中的 code 则是在合约调用时实际运行的代码。

Yul 中的每个命名对象或数据部分都会被序列化,并且可以通过特定的内置函数 datacopydataoffsetdatasize 来访问。在 Simple1 对象中的 code 部分中,使用 datacopyruntime 对象的字节码复制到内存地址 0x00 开始的位置。dataoffset("runtime") 获取了 runtime 对象的字节码的起始位置,datasize("runtime") 获取了字节码的大小。然后通过 return 返回这些字节码。这些字节码在合约部署后将作为合约在区块链上的实际存储内容。

在这个例子中,部署后的代码非常简单:它只是在调用时返回一个 2。

在合约字节码中存储数据


object "Simple2" {
    code {
        datacopy(0, dataoffset("runtime"), datasize("runti...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
0xE
0xE
0x59f6...a17e
17年进入币圈,Web3 开发者。刨根问底探链上真相,品味坎坷悟 Web3 人生。有工作机会可加v:__0xE__