Ошибка смарт-контракта: возвращаемые значения недействительны, закончился газ?

Развернул контракт с помощью Remix IDE в тестовой сети Rinkeby.

Адрес и код контракта Etherscan здесь .

контракт SimpleCounter {
    внутренний счетчик;

    конструктор () общедоступный {
        счетчик = 0;
    }

    функция getCounter () возвращает публичное представление (int) {
        обратный счетчик;
    }

    приращение функции () общедоступный {
        счетчик += 1;
    }

    функция декремента() общедоступная {
        счетчик -= 1;
    }
}

Код клиента JavaScript:

    вар контракт;

    $(документ).готовый(функция(){
        инитконтракт();
        получитьСчетчикЗначения();
    })

    функция initContract () {
        web3 = новый Web3 (web3.currentProvider);

        адрес var = "0xc6482382047fb50e8e7b4658425c9756b28f995c";
        вар аби = [
                    ...
                    ];

        console.log('Создать контракт...');
        контракт = новый web3.eth.Contract (аби, адрес);
        console.log(контракт)

    } //initContract()


    функция getCounterValue () {
        console.log('getCounter()...');
        Contract.methods.getCounter().call().then((результат) => {
            console.log(результат);
        }).поймать(функция(ошибка){
            console.log('ошибка...\n'+ошибка);
        });
    }

Ошибка:

Создать договор...

(index):86 o {_requestManager: e, заданный провайдер: MetamaskInpageProvider, провайдеры: {…}, _provider: MetamaskInpageProvider, …}

(индекс):94 getCounter()...

(индекс):99 ошибка...

Ошибка: возвращаемые значения недействительны, закончился бензин?

ЗАМЕЧАНИЯ:

Это отлично работает в Remix IDE (chrome). Я могу увеличивать/уменьшать/getCounter... с версией компилятора: 0.4.25+commit.59dbf8f1.Emscripten.clang .

Почему происходит сбой при доступе к нему с помощью dist/web3.min.js из Web3.js (ветка 1.0)?

Ответы (8)

Я исправил аналогичную ошибку, удалив .jsonфайлы из папки build/contracts и запустив truffle migrateих в терминале.

Однако ошибка произошла в Visual Studio Code, а не в Remix IDE. Появилось после запуска truffle migrate --reset.

Я хотел бы добавить к этому комментарию, после того, как вы удалили файлы из папки build/contracts.json , проблема сохранялась, пока я не удалил файлы из корзины🗑 😅 Поэтому убедитесь, что корзина пуста

@monkrus Проблема, о которой я сообщил, была связана с использованием «адреса учетной записи» вместо «адреса контракта»! . Удаление .jsonне исправит это. Вы можете добавить «точную проблему» вместе с ошибкой, чтобы различать «ваш сценарий» и связанное с ним исправление для ясности.
@Ismael Спасибо, что указали на это. Чтобы добавить больше ясности ... проблема работала в Remix IDE, но не в пользовательском коде JavaScript.

Мне помог Вениамин .

У меня была ошибка «Ошибка: не удалось декодировать из ABI: 0x». при звонке получить запрос с неверным адресом контракта

Я сделал ошибку... Я использовал "адрес счета" вместо "адрес контракта"!

Код работает, если используется правильный «контрактный адрес».

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

Была та же проблема, и оказалось, что я был в сети Metamask, а не в Rinkeby, где был развернут мой контракт.

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

Ваш код кажется правильным. Я думаю, что ваша проблема связана с ошибкой Web3js. Взгляните на проблему, о которой сообщается в Github:

https://github.com/ethereum/web3.js/issues/1916

Я рекомендую вам вместо этого использовать web3.js 1.0.0-beta.35 .

Перешел на версию web3.js 1.0.0-beta.35. Но на этот раз ошибка другая: Error: Couldn't decode from ABI: 0x.
Проверьте адрес вашего контракта
Уже исправлено. Добавил мой ответ ниже. Получил помощь от GitHub.

У меня тоже была эта ошибка. Это было исправлено после того, как я изменил свою версию web3 на 2.0.0-альфа, которая раньше была 1.0.0-бета.55.

  1. Так что просто удалите свой web3 с помощью npm uninstall web3.
  2. Затем выполните npm install web3@2.0.0-alpha.

Надеюсь, это исправит это для вас.

В моем случае (я использую службу блокчейна Azure) я изменил файл контракта, но забыл сборку и снова развернул его в своей службе блокчейна Azure. Вместо этого я сразу перехожу к truffle execкоманде. Итак, после повторного выполнения этих двух недостающих шагов все работает нормально.

Это случилось со мной в моем приложении для реагирования.

Я подключился к сети Ropsten, но метамаск использовал учетную запись Rinkeby. Поэтому убедитесь, что какую бы сеть вы ни развернули, метамаска должна использовать учетную запись из этой сети.

В другой раз у меня было это в next.js. этот маршрут является динамическим маршрутом, который означает, что контракт будет получен по ${contractAddress}:

      Router.push(`/campaigns/${recipient}/requests`);

вместо {recipient}адреса мне пришлось указать адрес контракта для получения

+1 по этому поводу. У меня все еще была конечная точка ropsten Alchemy, настроенная в моем файле .env для моего приложения для реагирования, но я забыл, что я передислоцировался в тестовую сеть Rinkeby. Меня это мучило почти 2 дня. Спасибо, что предложили это!

В моем случае я вызывал метод «просмотра» контракта, развернутого в локальной каске.

и мой код nodejs выглядит так: contract.methods().getterName().call()и получил эту ошибку.

Я потратил на это часы, и мне не повезло. Наконец-то я переключился на Rinkeby Test Network, развернул контракт и вызвал метод «просмотра» почти с тем же кодом, все идет хорошо.

Итак, решение:

Если вы используете HardHat и столкнулись с этой странной проблемой, переключитесь на Rinkeby!