Кажется, что каждый раз, когда я пытаюсь выполнить функцию контракта через компилятор браузера, для выполнения которой требуется более 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 в качестве аргумента функции, и компилятор умирает.
Газ используется для ограничения количества вычислительных шагов, которые может выполнить контракт или транзакция. Вот вам подробный ответ.
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()
метод для больших значений.
Роб Хитченс
нергалл
Роб Хитченс