我正在学习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作为参数传递。
使用永久存储解决了该问题。进一步了解更优雅的升级技术。但这个问题现在已经解决了。
可升级智能合约
您可以使用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