微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Solidity 中迁移代理配置时恢复错误

如何解决在 Solidity 中迁移代理配置时恢复错误

说明

我正在学习可升级的智能合约,阅读代理。所以,我有 3 个合约:一个功能合约,其中逻辑发生并且会得到更新,功能合约和代理合约从中继承数据结构的存储合约,以及用户与之交互的代理合约本身。

问题

成功编译合同后,是时候迁移它们了。这是当我尝试通过代理从我的功能合约中调用函数时发生恢复错误的地方。下面我附上了错误代码和屏幕截图。 这是一个虚拟实现,尚未完成,但我在测试迁移时遇到了此错误,但尚未找到解决方案。

我建议先看一下这篇文章末尾的截图! 感谢所有花时间阅读本文的人。

合同:

  1. 仓储合同
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;
}
  1. 职能合同:
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;
  }
}
  1. 代理合同:
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 举报,一经查实,本站将立刻删除。