当前位置: 首页 > 知识库问答 >
问题:

版本化的固态智能合约

鲜于宏义
2023-03-14

我正在学习Solity,对合约升级能力感到困惑。据我了解,部署的智能合约是不可变的,不能更改。如果我需要向合约添加额外的功能,我可以对合约进行版本化并部署新版本。但旧合约中的存储数据保持不变。

我有如下合同

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);
}
}

如果我需要搜索用户ID,我可以如上所述使用获取器。但是,如果我部署新版本的合约,则映射用户映射不可用。能够在整个存储中搜索我需要的条目的最佳方法是什么?我在某处读到名称注册可能是一种选择,但我不确定如何实现这一点。我的最终目标是让 UI 查询此数据,并且合约升级应对 UI 透明

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

共有2个答案

聂涛
2023-03-14

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

辛弘壮
2023-03-14

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

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

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

披露:我是OpenZeppelin的社区经理

 类似资料:
  • > 我可以使用Solity在映射中存储多少对键/值? 映射(字节32 = 如果每秒存储一对密钥/值不是有效的,你能建议一个更好的方法吗?我想过使用群/ IPFS,但我需要最大限度地精简设计...

  • 查询智能合约状态 这种功能是由eth_call通过JSON-RPC调用来实现的。 eth_call允许你调用智能合约上的方法来查询某个值。此函数没有关联交易成本,这是因为它不改变任何智能合约方法的状态,它只返回它们的值: Function function = new Function<>( "functionName", Arrays.asLi

  • 指导编写一个EOSIO的智能合约 模块 Account API 查询账户数据的API. Chain API 查询链内部状态的API. Database API 存储和检索EOS.IO区块链的数据API根据以下广泛结构来组织数据. Math API 定义常用的数学函数. Action API 定义用于查询操作属性的API. Memory API 定义常用的记忆功能. Console API 使应用程

  • 编程语言 使用golang作为编程语言(对部分关键字限制,以保证处理的有序性),而不是重新创造编程语言。 golang是一个简单、易用的编程语言,它有完善的帮助文档和开发工具。 它是强类型校验,编译阶段就能够校验发现很多bug。 它是模块化的,本系统能够简单屏蔽外部功能,使智能合约处在简单可预期的环境中。 已经有大量的golang开发人员,他们如果要开发智能合约,非常容易上手。 智能合约的分类 公

  • 介绍 EOSIO 智能合约 编写智能合约需要的必备技能 C / C++ 相关 基于 EOSIO 的块链使用的是 WebAssembly(http://webassembly.org/) (WASM) 来执行用户编写的智能合约。WASM 是一种新兴的 Web 标准,广泛支持于谷歌、微软、苹果等。对编写 WASM 标准的智能合约来说使用 clang/llvm(https://clang.llvm.or

  • 原文:http://zeppelin-solidity.readthedocs.io/en/latest/bounty.html 这个例子结合了Truffle框架,如果你不知道如何集成,可以先看看,还挺方便的:http://me.tryblockchain.org/obust-smart-contracts-with-openzeppelin.html 要为你的合约创建一个赏金项目。需要继承父类B