Error: el gas requerido excede la asignación o siempre falla la transacción

Estoy empezando a programar con solidez e implementar contratos inteligentes en una cadena de bloques creada localmente.

Estoy tratando de implementar un contrato inteligente simple usando remix y el proveedor web3 y este error me está matando todo el tiempo.

Aquí está mi código. Simplemente estoy tratando de analizar un archivo json para guardarlo como estructuras. Si conoces una mejor manera de hacerlo, ¡sería genial! Ahora estoy usando una biblioteca de github que creo que es útil para mi caso de uso, pero necesito ayuda con el código.


pragma solidity ^0.4.21;

import 'github.com/chrisdotn/jsmnSol/contracts/JsmnSolLib.sol';

contract MusicalContract {

    struct parameters {
        string name;
        string mr_share;
        string pr_share;
        string sr_share;
        string country;
        string walletDir;
    }

    //event debugStr(string str);
    //event debugInt(uint i);

    parameters[] public params;

    string public json = '[{"name":"Martin","pr_share":"2","mr_share":"2","sr_share":"2","country":"2101","walletDir":"12345"},{"name":"Ahoj","share":"","walletDir":"2589","pr_share":"2","mr_share":"2","sr_share":"2","country":"36"},{"name":"Cus","share":"","walletDir":"12345","pr_share":"2","mr_share":"3","sr_share":"1","country":"2100"}]';

    /*
    function MusicalContract(string json) {

    }
    */

    function MusCo() public {
        uint returnValue;
        uint actualNum;
        JsmnSolLib.Token[] memory tokens;
        string memory jsonElement;
        JsmnSolLib.Token memory t;

        (returnValue, tokens, actualNum) = JsmnSolLib.parse(json, 200);

        for(uint ielement=0; ielement < actualNum-1; ielement++) {
            t = tokens[ielement];
            jsonElement = JsmnSolLib.getBytes(json, t.start, t.end);
            //emit debugStr(jsonElement);
            //emit debugInt(ielement);
            if(compareStrings(jsonElement, "name")) {
                t = tokens[ielement+1];
                params[ielement].name = JsmnSolLib.getBytes(json, t.start, t.end);
            } else if(compareStrings(jsonElement, "pr_share")) {
                t = tokens[ielement+1];
                params[ielement].pr_share = JsmnSolLib.getBytes(json, t.start, t.end);
            } else if(compareStrings(jsonElement, "mr_share")) {
                t = tokens[ielement+1];
                params[ielement].mr_share = JsmnSolLib.getBytes(json, t.start, t.end);
            } else if(compareStrings(jsonElement, "sr_share")) {
                t = tokens[ielement+1];
                params[ielement].sr_share = JsmnSolLib.getBytes(json, t.start, t.end);
            } else if(compareStrings(jsonElement, "country")) {
                t = tokens[ielement+1];
                params[ielement].country = JsmnSolLib.getBytes(json, t.start, t.end);
            } else if(compareStrings(jsonElement, "walletDir")) {
                t = tokens[ielement+1];
                params[ielement].walletDir = JsmnSolLib.getBytes(json, t.start, t.end);
            }
        }
    }

    function compareStrings (string a, string b) view returns (bool){
       return keccak256(a) == keccak256(b);    }

    function getContractAddress() public view returns (address) {
        return this;
    } }

Respuestas (1)

Buenas noticias. Desplegó multa costando 3531698 gas. Esto supera el valor predeterminado de 3M que está ahí para mantenernos honestos y advertirnos que podríamos estar cerrando el bloque gasList en una cadena real. Puedes aumentar el gasLimit (yo lo subí a 7M para intentarlo), y luego estarás bien.

Malas noticias. Este contrato es lo más no blockchain posible. Le mostraría cómo abordarlo, pero no estoy seguro de si alguno de los campos que se muestran es un identificador único para los objetos. Considere qué campos son absolutamente necesarios en el contrato inteligente y cómo deben organizarse los datos. https://medium.com/solidified/the-joy-of-minimalism-in-smart-contract-design-b67fb4073422

Lo último que debería hacer un contrato inteligente es analizar un objeto pasado por un cliente perezoso. Obligar al cliente a hablar el idioma del contrato.

Espero eso ayude.