vm исключение при обработке транзакции: нет газа

Я уже читал другие темы с той же ошибкой, но это не решило мою проблему...

Когда я пытаюсь связаться с тестовым rpc между моим веб-интерфейсом и моим смарт-контрактом, у меня всегда возникает ошибка «исключение vm при обработке транзакции: нет газа», тогда как, когда у меня есть только 4 ввода в моем смарт-контракте, проблем нет.

Я уже пытался использовать это для запуска tesrpc (потому что только testrpc не работал):

testrpc --account="0x7231a774a538fce22a329729b03087de4cb4a1119494db1c10eae3bb491823e7, 10000000000000000000000"

тестрпк -л 4500000000000

testrpc --gasPrice 20000

testrpc -g 10000000000000000

Независимо от того, что я использую, потребление газа остается на уровне 90000, и я думаю, что ошибка связана с этим ... Спасибо человеку, который мне поможет!

Вот мой контракт:

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);
   }  
}

А вот мой веб-интерфейс:

<!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>

Извините, мой ABI слишком длинный...

Предупреждение системы безопасности: звонить может любой function SendCoin!!!
Да, конечно, на данный момент только для проверки взаимодействия смарт-контракта и веб-интерфейса.
попробуйте testrpc --gasLimit=0xfffffffffff --account=0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef,1000000000000000000000000000000000000000(и убедитесь, что вы реплицируете --account=...уникальный ключ в соответствии со многими учетными записями, которые вы используете в своих тестах).
Я пытался, но у меня снова кончился бензин .. :(

Ответы (2)

попробуй testrpc --gas-limit 4600000.

имейте в виду, что testrpc был изменен на ganache-cli. я бегуganache-cli --gas-limit 4600000

также убедитесь, что ваш truffle.js настроен. Вы можете изменить цену на газ и цену на газ.

networks: {
    development: {
        host: "localhost",
        port: 8545,
        network_id: "0",
        gas: 10000000,
        gasLimit: 10000000
    },
 }
Спасибо за Ваш ответ. Даже если я запускаю testrpc --gas-limit 4600000 или ganache-cli --gas-limit 4600000, у меня всегда одна и та же ошибка. Ошибка: Транзакция: 0x... Использование газа: 90000 // он всегда остается на уровне 90000 все, что я запускаю. Время блокировки: вторник, 08 мая ... Ошибка выполнения: нет газа. Я не могу использовать "сети: { разработка: { хост: "localhost", порт: 8545, network_id: "0", газ : 10000000, gasLimit: 10000000 }, }", потому что я не использую трюфель.. Я использую ремикс
если вы используете ремикс, убедитесь, что на вкладке настроек установлен флажок «включить оптимизацию» — это помогает мне с ошибками газа
Теперь "включить оптимизацию" проверяется, но всегда одна и та же ошибка :(

Метод SendCoin будет потреблять 102912 единиц. Я предлагаю вам использовать estimateGas()функцию. Он вернет, сколько газа потребляется для заданных входов.

См. ниже измененный код:

    $("#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});
    });

Я предлагаю вам использовать асинхронный метод. MetaMask не будет выполнять методы синхронизации.

Спасибо за Ваш ответ. Да, газа не хватает, но я не понимаю, почему я меняю «использование газа» на testrpc .. Или, может быть, это на ремиксе?
И когда я добавляю "{gas:_gas}" в функцию SendCoin, у меня возникает ошибка. Я думаю, это потому, что для этого не запланировано никаких аргументов, нет?
Передайте идентификатор своей учетной записи ({from:'your account', gas:_gas}). Обновил мой ответ.
Хорошо, но куда я поместил это в свой код? (Извините, я новичок...)
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(), {от :'ваш аккаунт', gas:_gas});
Добавляю ваши ответы. Во-первых, я думаю, что это _gas = _ gas * 1.2, но даже с вашим ответом теперь у меня есть другая ошибка «Ошибка: число может безопасно хранить только до 53 бит»
И что вы подразумеваете под асинхронным методом? в чем будет разница по сравнению с моим кодом?
Методы Aync не будут блокировать ваш поток пользовательского интерфейса JS. В основном методы Aync управляются событиями. Вам не нужно ждать, пока будет выполнен метод(). И MetaMask выдаст ошибку, если это метод синхронизации.
Спасибо за ваше объяснение, вы имеете представление о причине моей ошибки "...", когда я добавляю то, что вы сказали мне поставить?