版本化的Solidity智能合约

时间:2019-09-09 11:46:28

标签: ethereum solidity

我正在学习Solidity,并对合同的升级能力感到困惑。据我了解,已部署的智能合约是不可变的,无法更改。如果需要为合同添加其他功能,则可以对合同进行版本控制并部署新版本。但是旧合同中的存储数据保持原样。

我有如下合同

pragma solidity >=0.5.10 <0.7.0;

contract User {

struct UserEntity {
   address userAddress;
   uint8 UserID; 
   string  UserName;
}

UserEntity public _UserEntity;
mapping (address=> UserEntity) UserMapping;

function addUser(address _userAddress, uint8 _UserID, string memory _UserName) public {
   _UserEntity = UserEntity(_userAddress, _UserID, _UserName);
   UserMapping[_userAddress] = _UserEntity;
}

function getUserID(address _userAddress) public view returns(uint8) {
   return(UserMapping[_userAddress].UserID);
}
}

如果我需要搜索UserID,可以使用上述的getter方法。但是,如果我部署合同的新版本,则映射 UserMapping 不可用。能够在整个存储中搜索所需条目的最佳方法是什么?我在某处读到NameRegistry可能是一个选项,但是我不确定如何实现这一点。我的最终目标是让用户界面查询此数据,并且合同升级应该对用户界面透明

NB 我正在使用合同的单个部署,通过从部署地址中加载合同,使用web3js创建一个外部拥有的帐户,然后调用函数 addUser <,来添加多个用户。 / strong>,并将此EOA作为参数传递。

2 个答案:

答案 0 :(得分:0)

使用EternalStorage解决了该问题。进一步研究更优雅的升级技术。但是问题现在已经解决。

答案 1 :(得分:0)

可升级的智能合约
您可以使用OpenZeppelin SDK创建可升级的智能合约。
https://docs.openzeppelin.com/sdk/2.5/

OpenZeppelin使用“非结构化存储”代理模式。
有关详细信息,请参见文档:https://docs.openzeppelin.com/sdk/2.5/pattern

如果您对使用OpenZeppelin有疑问,可以在社区论坛中提问:https://forum.openzeppelin.com/

披露:我是OpenZeppelin的社区经理