EIP-1167 Minimal Proxy – 低成本复制既有的合约
因为学长是portto的实习生,加上也在区块先知牛打滚许久,因此我自然而然有了Blocto的钱包。Blocto的钱包是一种合约钱包,借此来满足一些设计(例如代替使用者发起交易等等)。部署这样的一个合约钱包,从交易纪录可以看到他花费了0.02 ETH左右,在撰文当下就是26.64美金,这样的成本对营运者显然是过高,转交给消费者也不是很实际,有没有办法处理呢有的,透过Minimal Proxy Contract就可以达成。
什么是Minimal Proxy
对于在网络世界遨游许久的人,Proxy 应该不会是一个陌生的名词,简单来说,Proxy 可以理解成转送者,它基本上不会筛选或对收到的讯息做处理,只会转送给预先定义好的对象。
而在EIP-1167中,提出了Minimal Proxy。当使用者呼叫Proxy合约时,这个合约将把呼叫转送到另一个合约,称之为Implementation Contract(Proxy合约则称作Redirecting Contract)。
因此若是需要建立多个相同功能,但地址、状态需要独立的合约,那Minimal Proxy 或许就可以派上用场。例如前文提到的Blocto 合约钱包,必须要让每个使用者都有独立的地址,也需要独立储存各种状态。
由于Redirecting Contract 本身没有功能,因此在建立合约时就可以降低合约所需的储存空间大小,借此省下手续费。但在未来每次呼叫也都会额外经过一层合约,因此也会提高后面交易的手续费。这个手续费主要取决于函数参数的大小。
Minimal Proxy 的好坏
如前文所说,Minimal Proxy可以降低相同合约部署的费用,但也会提高未来呼叫时的手续费。因此在选用Minimal Proxy时,应考虑未来的使用状况,例如若每个函数都有大量的参数,并且可以预期会经常呼叫,那就需要斟酌是否直接部署完整合约较为合适。
使用Minimal Proxy 的方法
在使用Minimal Proxy时,需要针对原始的合约做调整,最重要的部分是不能在函数外或在constructor指派需要隔离的变数值。例如这个合约:
contract People { string public name = "Default"; function setName (string memory name_) public { name = name_; } }
以及
contract People { string public name; constructor (string memory name_) { name = name_; } }
中,复制出来的合约将会共用name 变数,这是由于在函数外部或在constructor 指派的变数(概念上)和合约程式码放在一起,无论谁呼叫都将使用相同的储存位置。而在函数内指派的就不会与合约程式码放一起,因此可以达到隔离。
接着,我们开始部署CloneFactory,提案者已经提供一份程序代码可利用了,只需要导入使用即可。
contract CloneFactory { // 略过 } contract PeopleFactory is CloneFactory { address public template; constructor (address template_) { template = template_; } function create (string memory name) public returns (People result) { result = People(createClone(template)); result.setName(name); } } contract People { string public name; function setName(string memory name_) public { name = name_; } }
声明:本站所提供的资讯信息不代表任何投资暗示, 本站所发布文章仅代表个人观点,仅供参考。