以太坊的proxy contract pattern

Posted mutourend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊的proxy contract pattern相关的知识,希望对你有一定的参考价值。

1. 引言

智能合约一旦在以太坊上部署,就不可修改,若合约有漏洞,唯一的解决办法是找到并利用该漏洞,以比黑客更快的速度将资产转移到安全的账号。

尽管智能合约一经部署不可升级,但是,可建立a proxy contract architecture that will allow you to use new deployed contracts as if your main logic had been upgraded。

即,所有的message calls都将通过Proxy Contract直接指向最新部署的Logic Contract。部署新版本的Logic Contract合约升级时,只需修改Proxy指向新部署的合约地址即可。

Zeppelin提供了3种upgrade proxy模式:

  • 1)Inherited Storage
  • 2)Eternal Storage
  • 3)Unstructured Storage

这3种模式都依赖底层的delegatecalls。Solidity提供了delegatecall函数,但是该函数仅返回true/false来表示调用是否成功,并不支持对返回值进行操作。
这3种模式的主要区别在于,用不同的方式来解决相同的技术难题:how to ensure that the Logic Contract does not overwrite state variables that are used in the proxy for upgradeability。

需要理解一下两个关键要点:

  • When a function call to a contract is made that it does not support, the fallback function will be called. You can write a custom fallback function to handle such scenarios. The proxy contract uses a custom fallback function to redirect calls to other contract implementations.
  • Whenever a contract A delegates a call to another contract B, it executes the code of contract B in the context of contract A. This means that msg.value and msg.sender values will be kept and every storage modification will impact the storage of contract A.


借助calldatacopy和returndatacopy,可实现calldata的传入 和 结果的传出。

2. Upgradeability using Inherited Storage

3. Upgradeability using Eternal Storage

4. Upgradeability using Unstructured Storage

5. Proxy合约示例

具体参看:

参考资料

[1] Openzeppelin博客 Proxy Patterns
[2] Openzeppelin docs Proxy Upgrade Pattern
[3] 示例 第一个Proxy合约

以上是关于以太坊的proxy contract pattern的主要内容,如果未能解决你的问题,请参考以下文章

No data is deployed on the contract address!

以太坊的“分片”是指啥?

以太坊的“分片”是指啥?

Hyperledger Fabric Corda 和以太坊的区别

以太坊的市值会超越比特币吗?

关于 NFT 和以太坊的一些新手问题