最小代理-Coinmonks

0岁

如果您曾经研究过如何廉价地大规模部署合约,那么您可能已经遇到过EIP-1167。这些最小的代理合约将DELEGATECALL执行到固定地址,并且仅用45个字节(如果您代理到以零个字节开头的紧凑地址,甚至更少),这使得部署效率更高。权衡一些增加的开销以供以后使用。

该标准正在大幅上涨,并且有充分的理由-对于具有重复逻辑的一组合约来说,只有将这种逻辑存在于一个地方(只要没有人采用该逻辑并意外杀死了它,这是一个好主意)。例如,它现在是OpenZeppelin SDK的一部分(他们刚刚发布了有关EIP-1167的工作原理的出色入门)。地狱,我本人为Erasure协议(称为Spawner)写了一个库,该协议吐出了EIP-1167代理。关键是,该EIP现在属于实际在野外采用的ERC的一位数公司。

这就是为什么我要解决一些在EIP-1167达到临界质量之前困扰我的问题。就是说,这不是最小的。

这是有问题的字节码,在EIP本身的措辞中阐明:

0x363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91​​602b57fd5bf3pc op / pushdata操作码堆栈(左上方)
—- ————- —————— ————— ——–
0x00 36个calldatasize cds
0x01 3d returndatasize 0光盘
0x02 3d returndatasize 0 0 cds
0x03 37 calldatacopy
0x04 3d returndatasize 0
0x05 3d returndatasize 0 0
0x06 3d returndatasize 0 0 0
0x07 36 calldatasize cds 0 0 0
0x08 3d returndatasize 0 cds 0 0 0
0x09 73bebebebebe push20 0xbebebebe 0xbebe 0 cds 0 0 0
0x1e 5a煤气0xbebe 0 cds 0 0 0
0x1f f4委托呼叫suc 0
0x20 3d returndatasize rds suc 0
0x21 82 dup3 0 rds suc 0
0x22 80 dup1 0 0 rds suc 0
0x23 3e returndatacopy suc 0
0x24 90 swap1 0成功
0x25 3d returndatasize rds 0 suc
0x26 91 swap2 suc 0位
0x27 602b push1 0x2b 0x2b suc 0 rds
0x29 57 jumpi 0 rds
0x2a fd恢复
0x2b 5b最远跳0杆
0x2c f3返回

那么,当您浏览此内容时,会跳到您身上的是什么?我会告诉你什么让我惊讶-交易所操作码。我们可以做得更好:

0x3d3d3d3d363d3d37363d73bebebebebebebebebebebebebebebebebebebe5af43d3d93803e602a57fd5bf3pc op / pushdata操作码堆栈(左上方)
—- ————- —————— ————— ———
0x00 3d returndatasize 0
0x01 3d returndatasize 0 0
0x02 3d returndatasize 0 0 0
0x03 3d returndatasize 0 0 0 0
0x04 36 calldatasize cds 0 0 0 0
0x05 3d returndatasize 0 cds 0 0 0 0
0x06 3d returndatasize 0 0 cds 0 0 0 0
0x07 37 calldatacopy 0 0 0 0
0x08 36 calldatasize cds 0 0 0 0
0x09 3d returndatasize 0 cds 0 0 0 0
0x0a 73bebebebebebe push20 0xbebebebe 0xbebe 0 cds 0 0 0 0
0x1f 5a燃气0xbebe 0 cds 0 0 0 0
0x20 f4委托呼叫suc 0 0
0x21 3d returndatasize rds suc 0 0
0x22 3d returndatasize rds rds suc 0 0
0x23 93 swap4 0次suc 0次
0x24 80 dup1 0 0 rds suc 0 rds
0x25 3e returndatacopy suc 0位
0x26 602a push1 0x2a 0x2a suc 0 rds
0x28 57 jumpi 0 rds
0x29 fd恢复
0x2a 5b最远跳0杆
0x2b f3返回

看到?减少一次交易所,并使用returndatasize而不是dup进行引导。这意味着部署的气体减少了200倍(运行时代码减少了一个字节),调用的气体减少了4倍(我们摆脱了这种交易所,节省了3种气体,而returndatasize的成本比dup减少了1种)。

它是客观的改进,但是值得花所有精力来更新所有工具,甚至修改EIP或起草新工具吗?我不知道。让我知道您是否有一种强烈的意见。

你可能还喜欢