solidity使用mapping+struct复杂数据结构

BCOS评论1,126阅读模式
摘要

solidity中使用mapping+struct的复杂数据结构时,遇到的问题,Mappings cannot be assigned to。

出错的代码

代码

constructor() public{
  dataBases[TypeConvertUtil.stringToBytes32(TABLE_BAG_NAME)] = bagRecordOf;
  dataBases[TypeConvertUtil.stringToBytes32(TABLE_LOCATIONS_NAME)] = locationRecordOf;
  dataBases[TypeConvertUtil.stringToBytes32(TABLE_ATTENDLOCATION_NAME)] = attendLocationRecordOf;
}

这样写会出现以下报错:

browser/TableDefTools.sol:112:9: TypeError: Mappings cannot be assigned to.
dataBases[TypeConvertUtil.stringToBytes32(TABLE_BAG_NAME)] = bagRecordOf;
^----------------------------------------------------------------------^

正确的代码

定义结构:

struct RecordBean {
	// 表名称
	string tableName;
	// 主键值
	string primaryKey;
	// 内容值
	string[] values;
}
mapping(bytes32 => mapping(bytes32 => RecordBean)) dataBases;

赋值:

dataBases[TypeConvertUtil.stringToBytes32(_tableName)][TypeConvertUtil.stringToBytes32(_primaryKey)] = recordBean;

取值:

RecordBean recordBean = dataBases[TypeConvertUtil.stringToBytes32(_tableName)][TypeConvertUtil.stringToBytes32(_primaryKey)];

备注:

mapping 引用方式为 [ ]

struct      引用方式为   .

 

此外,mapping中对应的struct,以及struct中的某一值,都可以直接修改,实例如下。

pragma solidity ^0.4.24;

contract View {

    struct Info {
        uint256 X;
        uint256 Y;
    }
	mapping(address => Info) public InfoMap;
	

    /**
     * TEST 赋值/存储
     */
     function store(uint256 x, uint256 y) returns (uint){
        Info memory info = Info(x, y);
        InfoMap[msg.sender] = Info;
        return 1;
     }

    /**
     * TEST 更新
     */
     function update(uint256 z) returns (uint){
        InfoMap[msg.sender].X = z;
        return 1;
     }
}

 

BCOS最后更新:2021-3-29
以太坊之数据存储详解 以太坊

以太坊之数据存储详解

本文整理分析以太坊网络中的区块、交易以及合约数据是如何存储的。 区块结构 区块由两部分组成,分别是区块头(header)和区块体(body)两部分,详细结构图如下。 区块头(header) 区块头存储...
FISCO BCOS证书与鉴权体系 BCOS

FISCO BCOS证书与鉴权体系

区块链之所以被称为“信任的机器”,是因为其通过密码学算法使各不信任的节点互相协作达到信任。这一理念在联盟链中的体现主要是基于PKI(公钥基础设施)建立证书体系,FISCO BCOS中的证书主要满足SS...
Solidity合约间调用原子性操作实验 BCOS

Solidity合约间调用原子性操作实验

实验说明 为了测试在合约内调用另一个合约时,若在某一方法内,先调用另一个合约方法导致其数据更改成功,而执行后面的语句时由于某些原因导致交易失败,那么已经被调用的合约数据已然更改还是未被更改?针对这个问...