相关合约
使用openzeppelin两个代理辅助合同
ProxyAdmin.sol
TransparentUpgradeableProxy.sol
地址
openzeppelin-contracts/contracts/proxy/transparent at master · OpenZeppelin/openzeppelin-contracts
部署逻辑合同
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Web03{ constructor() public { } string public constant url = 'web03.cn'; mapping (uint => string) public names; uint public namesN; function addName(string memory _name) public { names[namesN ] = _name; } }
交易地址:
https://rinkeby.etherscan.io/tx/0xd11215fa054742276d378917b76093b51dd74124735d8bfffe14928f25d0fc07
合约地址:0xd37C4f32816Ac29a839ca2a854726432080D14c4
部署管理合同ProxyAdmin.sol
pragma solidity ^0.8.0; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/transparent/ProxyAdmin.sol"; contract Web03ProxyAdmin is ProxyAdmin{ constructor() { } }
交易地址:https://rinkeby.etherscan.io/tx/0xfabbdfb4fc9a0c0196a04d3fd1bfceafc23cc78e0351155a71415b37b91bd4b2
合约地址:0x60db1202a8c2d2b60d628a03741fed1920bf25f2
部署代理合同TransparentUpgradeableProxy.sol
pragma solidity ^0.8.0; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; contract Web03Proxy is TransparentUpgradeableProxy{ constructor(address _logic,address admin_,bytes memory _data) TransparentUpgradeableProxy(_logic, admin_, _data){ } }
参数解析
- address _logic 逻辑合同地址0xd37C4f32816Ac29a839ca2a854726432080D14c4】
- address admin_ 管理合同地址0x60db1202a8c2d2b60d628a03741fed1920bf25f2】
- bytes memory _data 发布逻辑合同时的参数字节码,0x表示无参数0x】
交易地址:https://rinkeby.etherscan.io/tx/0xbeb7bf1cae9b8c37035fd251080baefb9fb1d9d72c5498997685c2a429af1318
合约地址:0x82f4728Aa261eBd7887367096BCA4C15356CF188
验证合约
为了看到直观的效果,选择验证合同
如何验证?请查看以前的文章《solidity合同验证:https://web03.cn/blog/299
在 代码tab 选择More Option 再选择Is this a proxy?
他会自动找到你的逻辑合同,点击Verify即可
升级合约
-调用合同存数据,预验证代理数据-
先调用代理合同验证代理功能
调用addName,添加一组数据
此时,names也可以找到方法
1.发布新的逻辑合同
contract Web03V2{ constructor() { } string public constant url = 'web03.cn'; mapping (uint => string) public names; uint public namesN; uint public constant D = 1; function addName(string memory _name) public { names[namesN ] = _name; } function addD(uint _d) public pure{ D _d; } }
交易地址:https://rinkeby.etherscan.io/tx/0x887c2d2a5f7ebdf1c1b27902a7a03b3cb4da87102797a941909b93c595b09cbb
合约地址:0xdFEaA297C19622892a07e4Da428b377aDA10f0AD
2.调用升级方法
调用管理合同法
- upgrade,需要输入(代理合同地址,新逻辑合同地址)
- upgradeAndCall,需要传入(代理合约地址,新的逻辑合约地址,初始化调用数据,支付金额)
目前的升级不涉及初始数据和支付金额,因此调用upgrade即可
upgrade(0x82f4728Aa261eBd7887367096BCA4C15356CF188, 0xdFEaA297C19622892a07e4Da428b377aDA10f0AD)
升级交易地址:https://rinkeby.etherscan.io/tx/0x9de289d9a3fb021cdb04fa08301a706c3a7e1b52da5aa5c9f13cfb812c775a9f
-升级后,检查并验证数据-
可以看出,升级升级后的新方法D和方法addD都已经出现(addD写错,忽略,但不影响)
查询names[0]=零三
升级前的数据仍然保留,表明代理成功
- 代理合同存在于数据中,该数据在部署代理时初始化,后面只改变了逻辑符合地址,SO 数据一直保存着