#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, в настоящее время невозможно получить доступ к предыдущим состояниям.
Если бы такая ситуация произошла в реальной сети, вы могли бы подключиться к узлу архива и получить историческую ценность, используя комбинацию
- номер слота для хранения
определяемый на основе порядка свойств в контракте и источника ключа сопоставления
- и номер блока
для которого вы хотите получить значение
Например, с помощью метода web3 getStorageAt
const historicalValue = await web3.eth.getStorageAt(
contractAddress,
storageSlotNumber,
blockNumber
);
Обратите внимание, что исторические значения доступны только с помощью инструментов вне цепочки и недоступны из самого контракта (или других контрактов).
Комментарии:
1. спасибо @Petr за ответ. итак, вы говорите, что блокчейн перезапишет существующие данные новыми данными. разве это не нарушает правило, согласно которому данные в блокчейне не могут быть удалены/удалены?
2. Данные не удаляются из блокчейна — вы все равно можете получить к ним доступ с помощью архивного узла. Это недоступно только для контрактов, потому что они могут получить доступ только к текущему (а не историческому) состоянию.
3. ладно, я понял, в чем дело. спасибо @Petr