Сбой компилятора браузера Solidity

Кажется, что каждый раз, когда я пытаюсь выполнить функцию контракта через компилятор браузера, для выполнения которой требуется более 50 000 газов (плюс-минус), память вкладки браузера достигает около 1 ГБ, и компилятор падает.

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

Кто-нибудь еще сталкивался с этим и знает обходной путь?

Обратите внимание, что кажется, что это легче воспроизводится при использовании циклов/массивов, возможно, из-за назначений массивов?

Вот пример договора -

pragma solidity ^0.4.8;

contract TestContract {
    function TestContract() {
    }

    function test(uint256 iterations) constant {
        int256[] memory a = new int256[](1000);

        for (uint32 i = 0; i < iterations; ++i) {
            a[i] = i;
        }
    }
}

Я передаю более 500 в качестве аргумента функции, и компилятор умирает.

Не нормально. Можно ли опубликовать пример кода, чтобы мы могли воспроизвести проблему?
Добавлен пример
Подтвержденный. Интересный. Я не думаю, что дело в газе как таковом, потому что я тестировал заводские модели, которые намного дороже бензина. Играл с вариантами оригинала и заметил, что он всегда требует памяти, которая не возвращается после завершения функции. Итак, я подозреваю, что это связано со значительной отладочной информацией, доступной для проверки после завершения функции. Просто догадка. Надеюсь, кто-то откликнется с лучшим объяснением.

Ответы (1)

Газ используется для ограничения количества вычислительных шагов, которые может выполнить контракт или транзакция. Вот вам подробный ответ.

pragma solidity ^0.4.19;

contract TestContract {
    function TestContract() public {}

    function test(uint256 iterations) public pure returns(uint) {
        int256[] memory a = new int256[](1000);

        for (uint32 i = 0; i < iterations; ++i) {
            a[i] = i;
        }
        return a.length;
    }
}

https://ethfiddle.com/p96qnh9DJ4

Я немного изменил код вашего контракта, чтобы объяснить, что происходит. Сначала мы поставляем достаточное количество газа (по умолчанию 9000000) при развертывании этого контракта. Он может повторяться до тех пор, пока не получит out of gas.

Затем мы развертываем с расчетным газом 136914 и пытаемся запустить итерации. Теперь мы можем получить VM Exception while executing eth_call: out of gasошибку при попытке вызвать test()метод для больших значений.