Проверка значения сопоставления 2 со структурой по одному и тому же адресу в блокчейне

#blockchain #solidity #remix

Вопрос:

я новичок в блокчейне и солидности, и я пытаюсь проверить результат сопоставления 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
        );
    }
 }
 

предполагается, что я вставляю 1-е данные в блокчейн :

  • Процесс регистрации(10001, «2020-10-11 08:10:00», «ПОДТВЕРЖДЕНИЕ_1», «C_1», 10001)

после этого я вставляю 2-е данные :

  • Процесс регистрации(10001, «2020-10-11 08:20:00», «ПОДТВЕРЖДЕНИЕ_2», «C_2», 10002)

когда я проверяю массив с помощью функции 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
  }
}
 

вопрос в том, где находится результат 1 — го массива ? как извлечь его из блокчейна? это удалено из блокчейна (насколько я знаю, данные блокчейна записаны навсегда ) ?

спасибо вам за помощь и ответ 🙂

Ответ №1:

Поскольку вы сохраняете сопоставление под одним и тем же ключом ( dictConfirmAccess[_nik] = ... ), значение перезаписывается.

Используя эмулятор виртуальной машины Remix, в настоящее время невозможно получить доступ к предыдущим состояниям.

Если бы такая ситуация произошла в реальной сети, вы могли бы подключиться к узлу архива и получить историческую ценность, используя комбинацию

  1. номер слота для хранения

    определяемый на основе порядка свойств в контракте и источника ключа сопоставления

  2. и номер блока

    для которого вы хотите получить значение

Например, с помощью метода web3 getStorageAt

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

Обратите внимание, что исторические значения доступны только с помощью инструментов вне цепочки и недоступны из самого контракта (или других контрактов).

Комментарии:

1. спасибо @Petr за ответ. итак, вы говорите, что блокчейн перезапишет существующие данные новыми данными. разве это не нарушает правило, согласно которому данные в блокчейне не могут быть удалены/удалены?

2. Данные не удаляются из блокчейна — вы все равно можете получить к ним доступ с помощью архивного узла. Это недоступно только для контрактов, потому что они могут получить доступ только к текущему (а не историческому) состоянию.

3. ладно, я понял, в чем дело. спасибо @Petr