Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ethereum 版本化的实体智能合约_Ethereum_Solidity - Fatal编程技术网

Ethereum 版本化的实体智能合约

Ethereum 版本化的实体智能合约,ethereum,solidity,Ethereum,Solidity,我正在学习巩固,对合同升级能力感到困惑。根据我的理解,部署的智能合约是不可变的,不能更改。如果我需要向合同添加其他功能,我可以对合同进行版本控制并部署新版本。但旧合同中的存储数据保持原样 我有一份如下的合同 pragma solidity >=0.5.10 <0.7.0; contract User { struct UserEntity { address userAddress; uint8 UserID; string UserName; } Use

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

我有一份如下的合同

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);
}
}
pragma solidity>=0.5.10用户实体)用户映射;
函数addUser(地址_userAddress,uint8 _UserID,字符串内存_UserName)public{
_UserEntity=UserEntity(\u userAddress,\u UserID,\u UserName);
UserMapping[\u userAddress]=\u UserEntity;
}
函数getUserID(地址_userAddress)公共视图返回(uint8){
返回(UserMapping[\u userAddress].UserID);
}
}
如果我需要搜索UserID,我可以像上面那样使用getter。但是,如果部署新版本的契约,映射UserMapping将不可用。在整个存储中搜索我需要的条目的最佳方法是什么?我在某个地方读到,NameRegistry可能是一个选项,但我不确定如何实现它。我的最终目标是让UI查询这些数据,合同升级应该对UI透明


注意:我使用合同的单个部署来添加多个用户,方法是从合同的部署地址加载合同,使用web3js创建一个外部拥有的帐户,然后调用函数addUser,并将此EOA作为参数传递。

使用永久存储解决了问题。进一步了解更优雅的升级技术。但这个问题现在已经解决。

可升级智能合约
您可以使用OpenZeppelin SDK创建可升级的智能合约。

OpenZeppelin使用“非结构化存储”代理模式。
有关详细信息,请参阅文档:

如果您对使用OpenZeppelin有疑问,可以在社区论坛上提问:


披露:我是OpenZeppelin的社区经理

看起来永久存储将解决这个问题:)进一步研究这个问题。