{"content":{"title":"比最小代理更小的代理合约","body":"# 比最小代理更小的代理合约\r\n## 备注\r\n时间：2023 年 9 月 17 日\r\n\r\n作者：[33357](https://github.com/33357)\r\n\r\n## 正文\r\n看过我写的[EIP7511 最小代理合约解析](./eip7511.md)，就能发现如果舍弃一些功能，可以写出比最小代理更小的代理合约。\r\n\r\n### 全功能最小代理\r\n```\r\n合约字节码：\r\n365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af43d5f5f3e5f3d91602a57fd5bf3\r\n运行gas: 192\r\n\r\n部署字节码：\r\n602c8060095f395ff3365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af43d5f5f3e5f3d91602a57fd5bf3\r\n部署gas: 8828\r\n```\r\n\r\n#### 场景\r\n可以用于所有代理交易。\r\n\r\n### 没有返回值\r\n#### 字节码\r\n```\r\n合约字节码：\r\n365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af4\r\n运行gas: 162\r\n\r\n部署字节码：\r\n601f8060095f395ff3365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af4\r\n部署gas: 6222\r\n```\r\n\r\n#### 分析\r\n- 复制 CALLDATA 到内存\r\n\r\n| 执行位置 | 字节码 | 操作名 | 堆栈 | 内存 | 说明 ｜\r\n|----|----|--------------|---------|----------|---------------------------------------------|\r\n| 00 | 36 | CALLDATASIZE | cds     |          | 将 calldatasize 计为 cds，并压入堆栈 |\r\n| 01 | 5f | PUSH0        | 0 cds   |          | 将 0 压入堆栈 |\r\n| 02 | 5f | PUSH0        | 0 0 cds |          | 将 0 压入堆栈 |\r\n| 03 | 37 | CALLDATACOPY |         | calldata | 将 0 - cds 的 calldata 复制到从 0 开始的内存空间 |\r\n\r\n- DELEGATECALL\r\n\r\n| 执行位置 | 字节码 | 操作名 | 堆栈 | 内存 | 说明 ｜\r\n|----|---------|----------------|-----------------------|----------|-----------------------------------|\r\n| 04 | 5f      | PUSH0          | 0                     | calldata | 将 0 压入堆栈 |\r\n| 05 | 5f      | PUSH0          | 0 0                   | calldata | 将 0 压入堆栈 |\r\n| 06 | 36      | CALLDATASIZE   | cds 0 0               | calldata | 将 calldatasize 计为 cds，并压入堆栈 |\r\n| 07 | 5f      | PUSH0          | 0 cds 0 0             | calldata | 将 0 压入堆栈 |\r\n| 08 | 73bebe. | PUSH20 0xbebe. | 0xbebe. 0 cds 0 0     | calldata | 将 20 个字节的数据压入堆栈 |\r\n| 1d | 5a      | GAS            | gas 0xbebe. 0 cds 0 0 | calldata | 将 gas 压入堆栈 |\r\n| 1e | f4      | DELEGATECALL   | suc                   | calldata | 将 0 - cds 的内存数据作为参数执行 0xbebe. 地址的代码，将执行是否成功计为 suc，并压入堆栈 |\r\n\r\n#### 场景\r\n用于不需要返回值的代理交易。\r\n\r\n### 没有参数和返回值\r\n#### 字节码\r\n```\r\n合约字节码：\r\n5f5f5f5f73bebebebebebebebebebebebebebebebebebebebe5af4\r\n运行gas: 153\r\n\r\n部署字节码：\r\n601b8060095f395ff35f5f5f5f73bebebebebebebebebebebebebebebebebebebebe5af4\r\n部署gas: 5422\r\n```\r\n\r\n#### 分析\r\n- DELEGATECALL\r\n\r\n| 执行位置 | 字节码 | 操作名 | 堆栈 | 内存 | 说明 ｜\r\n|----|---------|----------------|---------------------|-|------------------------|\r\n| 01 | 5f      | PUSH0          | 0                   | | 将 0 压入堆栈 |\r\n| 02 | 5f      | PUSH0          | 0 0                 | | 将 0 压入堆栈 |\r\n| 03 | 5f      | PUSH0          | 0 0 0               | | 将 0 压入堆栈 |\r\n| 04 | 5f      | PUSH0          | 0 0 0 0             | | 将 0 压入堆栈 |\r\n| 05 | 73bebe. | PUSH20 0xbebe. | 0xbebe. 0 0 0 0     | | 将 20 个字节的数据压入堆栈 |\r\n| 19 | 5a      | GAS            | gas 0xbebe. 0 0 0 0 | | 将 gas 压入堆栈 |\r\n| 1a | f4      | DELEGATECALL   | suc                 | | 将 0 - 0 的内存数据作为参数执行 0xbebe. 地址的代码，将执行是否成功计为 suc，并压入堆栈 |\r\n\r\n#### 场景\r\n用于不需要参数和返回值的代理交易。\r\n\r\n### 没有参数、返回值和指定代理地址\r\n#### 字节码\r\n```\r\n合约字节码：\r\n5f5f5f5f335af4\r\n运行gas: 154\r\n\r\n部署字节码：\r\n60078060095f395ff35f5f5f5f335af4\r\n部署gas: 1622\r\n```\r\n\r\n#### 分析\r\n- DELEGATECALL\r\n\r\n| 执行位置 | 字节码 | 操作名 | 堆栈 | 内存 | 说明 ｜\r\n|----|----|--------------|--------------------|-|------------------------|\r\n| 01 | 5f | PUSH0        | 0                  | | 将 0 压入堆栈 |\r\n| 02 | 5f | PUSH0        | 0 0                | | 将 0 压入堆栈 |\r\n| 03 | 5f | PUSH0        | 0 0 0              | | 将 0 压入堆栈 |\r\n| 04 | 5f | PUSH0        | 0 0 0 0            | | 将 0 压入堆栈 |\r\n| 05 | 33 | CALLER       | caller 0 0 0 0     | | 将调用地址压入堆栈 |\r\n| 06 | 5a | GAS          | gas caller 0 0 0 0 | | 将 gas 压入堆栈 |\r\n| 07 | f4 | DELEGATECALL | suc                | | 将 0 - 0 的内存数据作为参数执行 caller 地址的代码，将执行是否成功计为 suc，并压入堆栈 |\r\n\r\n#### 场景\r\n用于不需要参数、返回值和指定代理地址的代理交易。\r\n\r\n## 总结\r\n针对不同功能修改最小代理合约可以实现更低的 GAS 消耗。\r\n\r\n## 原文发布在 <https://github.com/33357/smartcontract-apps> 这是一个面向中文社区，分析市面上智能合约应用的架构与实现的仓库。欢迎关注开源知识项目！"},"author":{"user":"https://learnblockchain.cn/people/3877","address":"0x1f2479ee1b4aFE789e19D257D2D50810ac90fa59"},"history":"bafkreifd2d3qzv6qwqg4rdf6ksiy5ie2mbmgcq4jfcrcczuu646fip7gga","timestamp":1709347683,"version":1}