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的社区经理看起来永久存储将解决这个问题:)进一步研究这个问题。