问题描述
说明
我正在学习可升级的智能合约,阅读代理。所以,我有 3 个合约:一个功能合约,其中逻辑发生并且会得到更新,功能合约和代理合约从中继承数据结构的存储合约,以及用户与之交互的代理合约本身。
问题
成功编译合同后,是时候迁移它们了。这是当我尝试通过代理从我的功能合约中调用函数时发生恢复错误的地方。下面我附上了错误的代码和屏幕截图。 这是一个虚拟实现,尚未完成,但我在测试迁移时遇到了此错误,但尚未找到解决方案。
我建议先看一下这篇文章末尾的截图! 感谢所有花时间阅读本文的人。
合同:
- 仓储合同
pragma solidity 0.8.1;
contract storageC {
mapping(string => uint256) _uintStorage;
mapping(string => bool) _boolStorage;
mapping(string => bytes4) _bytesstorage;
mapping(string => address) _addressstorage;
mapping(string => string) _stringStorage;
address public owner;
bool public _initialised;
}
- 职能合同:
pragma solidity 0.8.1;
import "./storage.sol";
contract Dogs is storageC {
modifier onlyOwner(){
require(msg.sender == owner);
_;
}
constructor() public{
owner = msg.sender;
}
function getNumberOfDogs() public view returns(uint256){
return _uintStorage["Dogs"];
}
function setNumberOfDogs(uint256 _toSet) public{
_uintStorage["Dogs"] = _toSet;
}
}
- 代理合同:
pragma solidity 0.8.1;
import "./storage.sol";
contract ProxyC is storageC {
address currentAddress;
constructor(address _currentAddress) public {
currentAddress = _currentAddress;
}
function upgrade(address _newAddress) public {
currentAddress = _newAddress;
}
fallback() external payable {
address implementation = currentAddress;
require(currentAddress != address(0));
bytes memory data = msg.data;
assembly {
let result := delegatecall(gas(),implementation,add(data,0x200),mload(data),0)
let size := returndatasize()
let ptr := mload(0x40)
returndatacopy(ptr,size)
switch result
case 0 {revert(ptr,size)}
default {return(ptr,size)}
}
}
}
这编译得很好,目前没有问题。
迁移:
const Dogs = artifacts.require('Dogs');
const ProxyC = artifacts.require('ProxyC');
module.exports = async function(deployer,network,accounts){
const dogs = await Dogs.new();
const proxy = await ProxyC.new(dogs.address);
var proxyDog = await Dogs.at(proxy.address);
await proxyDog.setNumberOfDogs(10);
nb = await proxyDog.getNumberOfDogs();
console.log(nb.toNumber());
}
我得到的错误如下: ErrorCapture
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)