比最小代理更小的代理合约

  • 33357
  • 发布于 2024-03-02 10:47
  • 阅读 1234

比最小代理更小的代理合约

比最小代理更小的代理合约

备注

时间:2023 年 9 月 17 日

作者:33357

正文

看过我写的EIP7511 最小代理合约解析,就能发现如果舍弃一些功能,可以写出比最小代理更小的代理合约。

全功能最小代理

合约字节码:
365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af43d5f5f3e5f3d91602a57fd5bf3
运行gas: 192

部署字节码:
602c8060095f395ff3365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af43d5f5f3e5f3d91602a57fd5bf3
部署gas: 8828

场景

可以用于所有代理交易。

没有返回值

字节码

合约字节码:
365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af4
运行gas: 162

部署字节码:
601f8060095f395ff3365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af4
部署gas: 6222

分析

  • 复制 CALLDATA 到内存
执行位置字节码操作名堆栈内存说明 |
0036CALLDATASIZEcds将 calldatasize 计为 cds,并压入堆栈
015fPUSH00 cds将 0 压入堆栈
025fPUSH00 0 cds将 0 压入堆栈
0337CALLDATACOPYcalldata将 0 - cds 的 calldata 复制到从 0 开始的内存空间
  • DELEGATECALL
执行位置字节码操作名堆栈内存说明 |
045fPUSH00calldata将 0 压入堆栈
055fPUSH00 0calldata将 0 压入堆栈
0636CALLDATASIZEcds 0 0calldata将 calldatasize 计为 cds,并压入堆栈
075fPUSH00 cds 0 0calldata将 0 压入堆栈
0873bebe.PUSH20 0xbebe.0xbebe. 0 cds 0 0calldata将 20 个字节的数据压入堆栈
1d5aGASgas 0xbebe. 0 cds 0 0calldata将 gas 压入堆栈
1ef4DELEGATECALLsuccalldata将 0 - cds 的内存数据作为参数执行 0xbebe. 地址的代码,将执行是否成功计为 suc,并压入堆栈

场景

用于不需要返回值的代理交易。

没有参数和返回值

字节码

合约字节码:
5f5f5f5f73bebebebebebebebebebebebebebebebebebebebe5af4
运行gas: 153

部署字节码:
601b8060095f395ff35f5f5f5f73bebebebebebebebebebebebebebebebebebebebe5af4
部署gas: 5422

分析

  • DELEGATECALL
执行位置字节码操作名堆栈内存说明 |
015fPUSH00将 0 压入堆栈
025fPUSH00 0将 0 压入堆栈
035fPUSH00 0 0将 0 压入堆栈
045fPUSH00 0 0 0将 0 压入堆栈
0573bebe.PUSH20 0xbebe.0xbebe. 0 0 0 0将 20 个字节的数据压入堆栈
195aGASgas 0xbebe. 0 0 0 0将 gas 压入堆栈
1af4DELEGATECALLsuc将 0 - 0 的内存数据作为参数执行 0xbebe. 地址的代码,将执行是否成功计为 suc,并压入堆栈

场景

用于不需要参数和返回值的代理交易。

没有参数、返回值和指定代理地址

字节码

合约字节码:
5f5f5f5f335af4
运行gas: 154

部署字节码:
60078060095f395ff35f5f5f5f335af4
部署gas: 1622

分析

  • DELEGATECALL
执行位置字节码操作名堆栈内存说明 |
015fPUSH00将 0 压入堆栈
025fPUSH00 0将 0 压入堆栈
035fPUSH00 0 0将 0 压入堆栈
045fPUSH00 0 0 0将 0 压入堆栈
0533CALLERcaller 0 0 0 0将调用地址压入堆栈
065aGASgas caller 0 0 0 0将 gas 压入堆栈
07f4DELEGATECALLsuc将 0 - 0 的内存数据作为参数执行 caller 地址的代码,将执行是否成功计为 suc,并压入堆栈

场景

用于不需要参数、返回值和指定代理地址的代理交易。

总结

针对不同功能修改最小代理合约可以实现更低的 GAS 消耗。

原文发布在 https://github.com/33357/smartcontract-apps 这是一个面向中文社区,分析市面上智能合约应用的架构与实现的仓库。欢迎关注开源知识项目!

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论