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_;
  }
}

本文链接地址:https://www.wwsww.cn/jishu/8957.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读