【发布时间】:2021-09-07 02:00:40
【问题描述】:
我正在尝试使用映射结构和数组来创建合同。我的目标是让公司在这个系统中保存一些数据。
我可以在 Remix 上部署它,但是当我想与函数 saveStandard 交互时遇到了问题 Returned error: VM Exception while processing transaction: revert。
但是,如果我去掉合同中的数组部分,它会很好地工作。有人知道发生了什么吗?
以下是我的代码(带数组)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Storage{
struct UserInfo {
uint index;
string[] time;
string[] source;
uint[] emission;
}
mapping (string => UserInfo) public users;
function saveStandard(uint input_material, uint weight, string memory input_time, string memory input_source)
public returns (string memory, uint, uint, string memory){
uint id = users[input_source].index + 1;
users[input_source].index = id;
users[input_source].time[id] = input_time;
uint Combustion = weight * input_material / 10;
uint Process = weight * input_material / 10;
users[input_source].emission[id] = Combustion + Process;
return (input_source, Combustion, Process, input_time);
}
function search(string memory input_source) public view returns (uint, string memory) {
uint id = 0;
while (id <= users[input_source].index) {
id += 1;
return (users[input_source].emission[id], users[input_source].time[id]);
}
}
}
下面是没有数组的,效果很好。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Storage{
struct UserInfo {
string time;
string source;
uint emission;
}
mapping (string => UserInfo) public users;
function saveStandard(uint input_material, uint weight, string memory input_time, string memory input_source)
public returns (string memory, uint, uint, string memory){
users[input_source].time = input_time;
uint Combustion = weight * input_material / 10;
uint Process = weight * input_material / 10;
users[input_source].emission = Combustion + Process;
return (input_source, Combustion, Process, input_time);
}
function search(string memory input_source) public view returns (uint, string memory) {
return (users[input_source].emission, users[input_source].time);
}
}
【问题讨论】:
标签: arrays struct mapping solidity remix