在区块链上的同一地址中检查 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
);
}
}
假设我将第一个数据插入区块链:
- loggingAccess(10001, "2020-10-11 08:10:00", "CONFIRM_1", "C_1", 10001)
之后我插入第二个数据:
- loggingAccess(10001, "2020-10-11 08:20:00", "CONFIRM_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
}
}
问题是第一个数组的结果在哪里?如何从区块链中检索它?这是从区块链中删除的吗(据我所知,区块链数据永远记录在案)?
谢谢你的帮助和回答:)
由于您在同一个键 (dictConfirmAccess[_nik] = ...
) 下存储到映射,因此该值被 覆盖。
使用 Remix VM 模拟器,目前无法访问以前的状态。
如果这种情况发生在实时网络上,您可以连接到 archive node 并使用
的组合检索历史值
存储槽编号
可确定,基于合约中的属性订单和映射键-source
和块号
您要获取的值
例如使用 web3 getStorageAt 方法
const historicalValue = await web3.eth.getStorageAt(
contractAddress,
storageSlotNumber,
blockNumber
);
请注意,历史值只能使用链下工具访问,不能从合约本身(或其他合约)访问。
我是区块链和 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
);
}
}
假设我将第一个数据插入区块链:
- loggingAccess(10001, "2020-10-11 08:10:00", "CONFIRM_1", "C_1", 10001)
之后我插入第二个数据:
- loggingAccess(10001, "2020-10-11 08:20:00", "CONFIRM_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
}
}
问题是第一个数组的结果在哪里?如何从区块链中检索它?这是从区块链中删除的吗(据我所知,区块链数据永远记录在案)?
谢谢你的帮助和回答:)
由于您在同一个键 (dictConfirmAccess[_nik] = ...
) 下存储到映射,因此该值被 覆盖。
使用 Remix VM 模拟器,目前无法访问以前的状态。
如果这种情况发生在实时网络上,您可以连接到 archive node 并使用
的组合检索历史值存储槽编号
可确定,基于合约中的属性订单和映射键-source
和块号
您要获取的值
例如使用 web3 getStorageAt 方法
const historicalValue = await web3.eth.getStorageAt(
contractAddress,
storageSlotNumber,
blockNumber
);
请注意,历史值只能使用链下工具访问,不能从合约本身(或其他合约)访问。