在区块链上的同一地址中检查 2 映射与结构的值

Checking value of 2 mapping with struct in the same address on blockchain

我是区块链和 solidity 的新手,我正在尝试在一个地址上使用相同的密钥检查 2 个映射结果,假设我有这个代码

contract EventConfirmAccess{

struct eventStruct{
    string event_log_time;
    string event_name;
    string event_id;
    uint data_nik;
}
mapping(uint => eventStruct) public dictConfirmAccess;
uint[] public arrayOfData;

function loggingAccess(
    uint _nik, string memory _event_log_time,
    string memory _event_name, string memory _event_id,
    uint _data_nik
) public{
    dictConfirmAccess[_nik] = eventStruct(
      {
        event_log_time : _event_log_time,
        event_name : _event_name,
        event_id : _event_id,
        data_nik : _data_nik
      }
    );

    arrayOfData.push(_nik);
}
function checkData(uint _nik) view public returns(
        string memory ,string memory,
        string memory ,uint
    ){
        return (
            dictConfirmAccess[_nik].event_log_time,
            dictConfirmAccess[_nik].event_name,
            dictConfirmAccess[_nik].event_id,
            dictConfirmAccess[_nik].data_nik
        );
    }
 }

假设我将第一个数据插入区块链:

之后我插入第二个数据:

当我用 checkData 函数检查数组时,我得到这样的结果:

    Result {
  '0': '2020-10-11 08:20:00',
  '1': 'CONFIRM_2',
  '2': 'C_2',
  '3': BN {
    negative: 0,
    words: [ 51784655, 4, <1 empty item> ],
    length: 2,
    red: null
  }
}

问题是第一个数组的结果在哪里?如何从区块链中检索它?这是从区块链中删除的吗(据我所知,区块链数据永远记录在案)?

谢谢你的帮助和回答:)

由于您在同一个键 (dictConfirmAccess[_nik] = ...) 下存储到映射,因此该值被 覆盖

使用 Remix VM 模拟器,目前无法访问以前的状态。

如果这种情况发生在实时网络上,您可以连接到 archive node 并使用

的组合检索历史值
  1. 存储槽编号

    可确定,基于合约中的属性订单和映射键-source

  2. 和块号

    您要获取的值

例如使用 web3 getStorageAt 方法

const historicalValue = await web3.eth.getStorageAt(
    contractAddress,
    storageSlotNumber,
    blockNumber
);

请注意,历史值只能使用链下工具访问,不能从合约本身(或其他合约)访问。