【问题标题】:Returned error: VM Exception while processing transaction: revert返回错误:VM Exception while processing transaction: revert
【发布时间】: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


    【解决方案1】:
    users[input_source].time[id] = input_time;
    
    users[input_source].emission[id] = Combustion + Process;
    

    正是这些行导致了还原。

    您正在尝试分配给time[id] 数组项,但id 索引不存在。


    您的用例更适合使用mappings

    struct UserInfo {
        uint index;
        mapping(uint => string) time;
        mapping(uint => string) source;
        mapping(uint => uint) emission;
    }
    

    然后你可以简单地通过id键赋值:

    users[input_source].time[id] = input_time;
    
    users[input_source].emission[id] = Combustion + Process;
    

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多