excepción de vm al procesar la transacción: sin gasolina

Ya lei los demas temas con el mismo error, pero eso no soluciono mi problema...

Cuando trato de comunicarme con el rpc de prueba entre mi interfaz web y mi contrato inteligente, siempre aparece el error "excepción vm al procesar la transacción: sin combustible", mientras que cuando solo tengo 4 entradas en mi contrato inteligente, no hay problema.

Ya intenté usar eso para iniciar tesrpc (porque solo testrpc no funcionó):

testrpc --cuenta="0x7231a774a538fce22a329729b03087de4cb4a1119494db1c10eae3bb491823e7, 10000000000000000000000"

testrpc -l 4500000000000

testrpc --gasPrecio 20000

pruebarpc -g 1000000000000000

No importa lo que use, el uso de gas se queda en 90000 y creo que el error tiene que ver con eso... ¡Gracias a la persona que me ayudará!

Aquí está mi contrato:

pragma solidity ^0.4.18;
contract URP {

    uint8 x1; 
    uint8 x2;
    uint8 y1;
    uint8 y2;
    uint8 z1;
    uint8 z2;
    uint8 retailer; 
    uint8 value; 
    uint8 x; 
    uint8 y; 
    uint8 z;
    uint8 shopper;

function SendCoin(uint8 _x1, uint8 _x2, uint8 _y1, uint8 _y2, uint8 _z1, uint8 _z2, uint8 _ret, uint8 _value, uint8 _x, uint8 _y, uint8 _z, uint8 _shop) public {
       x1 = _x1;
       x2 = _x2;
       y1 = _y1;
       y2 = _y2;
       z1 = _z1;
       z2 = _z2;
       retailer = _retailer;
       value = _value;
       x = _x;
       y = _y;
       z =_z;
       shopper = _shopper;
   }

   function getSendCoin() public constant returns (uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8, uint8) {
       return (x1, x2, y1, y2, z1, z2, retailer, value, x, y, z, shopper);
   }  
}

Y aquí está mi interfaz web:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <link rel="stylesheet" type="text/css" href="main.css">

    <script src="./node_modules/web3/dist/web3.min.js"></script>

</head>
<body>
    <div class="container">

        <h1>SendCoin</h1>

        <h2 id="sendcoin"></h2>

        <label for="name" class="col-lg-2 control-label">x1</label>
        <input id="x1" type="text">

        <label for="name" class="col-lg-2 control-label">x2</label>
        <input id="x2" type="text">

        <label for="name" class="col-lg-2 control-label">y1</label>
        <input id="y1" type="text">

        <label for="name" class="col-lg-2 control-label">y2</label>
        <input id="y2" type="text">

        <label for="name" class="col-lg-2 control-label">z1</label>
        <input id="z1" type="text">

        <label for="name" class="col-lg-2 control-label">z2</label>
        <input id="z2" type="text">

        <label for="name" class="col-lg-2 control-label">retailer</label>
        <input id="retailer" type="text">

        <label for="name" class="col-lg-2 control-label">value</label>
        <input id="value" type="text">

        <label for="name" class="col-lg-2 control-label">x</label>
        <input id="x" type="text">

        <label for="name" class="col-lg-2 control-label">y</label>
        <input id="y" type="text">

        <label for="name" class="col-lg-2 control-label">z</label>
        <input id="z" type="text">

        <label for="name" class="col-lg-2 control-label">shopper</label>
        <input id="shopper" type="text">

        <button id="button">Push Data</button>


    </div>

    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>

    <script>
        if (typeof web3 !== 'undefined') {
            web3 = new Web3(web3.currentProvider);
        } else {
            // set the provider you want from Web3.providers
            web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
        }


        web3.eth.defaultAccount = web3.eth.accounts[0];

        var URPContract = web3.eth.contract([
    {
        "constant": true,
        "inputs": [],
        "name": "getSendCoin",
        "outputs": [
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            },
            {
                "name": "",
                "type": "uint8"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_x1",
                "type": "uint8"
            },
            {
                "name": "_x2",
                "type": "uint8"
            },
            {
                "name": "_y1",
                "type": "uint8"
            },
            {
                "name": "_y2",
                "type": "uint8"
            },
            {
                "name": "_z1",
                "type": "uint8"
            },
            {
                "name": "_z2",
                "type": "uint8"
            },
            {
                "name": "_retailer",
                "type": "uint8"
            },
            {
                "name": "_value",
                "type": "uint8"
            },
            {
                "name": "_x",
                "type": "uint8"
            },
            {
                "name": "_y",
                "type": "uint8"
            },
            {
                "name": "_z",
                "type": "uint8"
            },
            {
                "name": "_shopper",
                "type": "uint8"
            }
        ],
        "name": "SendCoin",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    }]);

            web3.eth.accounts.forEach (account => { 
            balance = web3.eth.getBalance (account); 
            console.log (balance); 
            })
        var URP = URPContract.at('0x538882ec49974f8815fee55ad7b40d6dd4b6b75d');
        console.log(URP);
        URP.getSendCoin(function(error, result){
            if(!error)
                {
                    $("#sendcoin").html(result[0]+' = x1 / x2 = '+result[1]+' / y1 = '+result[2]+' / y2 = '+result[3]+' / z1 = ' +result[4]+' / z2 = ' +result[5]+' / ret = '+result[6]+' / value = ' +result[7]+' / x = '+result[8]+' / y = '+result[9]+' / z = '+result[10]+' / shop = '+result[11] );
                    console.log(result);
                }
            else
                console.error(error);
        });

        $("#button").click(function() {
            URP.SendCoin($("#x1").val(), $("#x2").val(), $("#y1").val(), $("#y2").val(), $("#z1").val(), $("#z2").val(), $("#retailer").val(), $("#value").val(), $("#x").val(), $("#y").val(), $("#z").val(), $("#shopper").val());
        });
    </script>

</body>
</html>

Lo siento, mi ABI es demasiado largo...

Alerta de seguridad: ¡Cualquiera puede llamar function SendCoin!
Sí, por supuesto, de momento es solo para probar la interacción entre Smart Contract y la interfaz web.
intente testrpc --gasLimit=0xfffffffffff --account=0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef,1000000000000000000000000000000000000000(y asegúrese de replicar --account=...con una clave única de acuerdo con la cantidad de cuentas que use en sus pruebas).
Lo intenté pero me he vuelto a quedar sin gasolina.. :(

Respuestas (2)

prueba testrpc --gas-limit 4600000_

tenga en cuenta que testrpc se ha cambiado a ganache-cli. Corroganache-cli --gas-limit 4600000

también, asegúrese de que su truffle.js esté configurado. puede cambiar el precio del gas y el precio del gas.

networks: {
    development: {
        host: "localhost",
        port: 8545,
        network_id: "0",
        gas: 10000000,
        gasLimit: 10000000
    },
 }
Gracias por tu respuesta. Incluso si ejecuto testrpc --gas-limit 4600000 o ganache-cli --gas-limit 4600000, siempre tengo el mismo error. lo que sea que ejecute Tiempo de bloqueo: martes 08 de mayo... Error de tiempo de ejecución: sin gas No es posible para mí usar "redes: { desarrollo: { host: "localhost", puerto: 8545, network_id: "0", gas : 10000000, gasLimit: 10000000 }, }" porque no uso truffle.. uso remix
si está utilizando remix, asegúrese de que "habilitar optimización" esté marcado en la pestaña de configuración; esto me ayuda con los errores de gas
Ahora "habilitar optimización" está marcado pero siempre son el mismo error :(

El método SendCoin consumirá 102912 unidades. Te sugiero que uses estimateGas()la función. Devolverá la cantidad de gas consumida para una entrada dada.

Consulte a continuación el código modificado:

    $("#button").click(function() {
        var _gas = URP.SendCoin.estimateGas($("#x1").val(), $("#x2").val(), $("#y1").val(), $("#y2").val(), $("#z1").val(), $("#z2").val(), $("#retailer").val(), $("#value").val(), $("#x").val(), $("#y").val(), $("#z").val(), $("#shopper").val());
        _gas = Math.floor(gas*1.2); //For safe side.
        URP.SendCoin($("#x1").val(), $("#x2").val(), $("#y1").val(), $("#y2").val(), $("#z1").val(), $("#z2").val(), $("#retailer").val(), $("#value").val(), $("#x").val(), $("#y").val(), $("#z").val(), $("#shopper").val(), {from:'your account', gas:_gas});
    });

Te sugiero que uses el método asíncrono. MetaMask no ejecutará métodos de sincronización.

Gracias por tu respuesta. Sí, el gas no es suficiente, pero no sé por qué cambio el "uso de gas" en testrpc... ¿O tal vez está en remix?
Y cuando agrego "{gas:_gas}" en la función SendCoin tengo un error. Creo que es porque no hay ningún argumento planeado para eso, ¿no?
Pase la identificación de su cuenta ({from:'your account', gas:_gas}). Actualicé mi respuesta.
Está bien, pero ¿dónde puse eso en mi código? (Lo siento, soy novato...)
URP.SendCoin($("#x1").val(), $("#x2").val(), $("#y1").val(), $("#y2").val( ), $("#z1").val(), $("#z2").val(), $("#minorista").val(), $("#valor").val(), $("#x").val(), $("#y").val(), $("#z").val(), $("#comprador").val(), {de :'tu cuenta', gas:_gas});
Agrego tus respuestas. En primer lugar, creo que es _gas=_gas*1.2, pero incluso con su respuesta ahora tengo otro error "Error: el número solo puede almacenar de forma segura hasta 53 bits"
¿Y qué quiere decir con método asíncrono? ¿Cuál sería la diferencia en comparación con mi código?
Los métodos Aync no bloquearán su subproceso JS UI. La mayoría de los métodos de Aync se basan en eventos. No necesita esperar hasta que se ejecute el método a(). Y MetaMask arrojará un error, si es un método de sincronización.
Gracias por tu explicación, tienes idea del porque de mi error "..." cuando agrego lo que me dijiste que pusiera?