Частная сеть: Закончился газ даже при высоком балансе

Контекст

  • geth: Geth/v1.4.18-stable/linux/go1.5.1
  • версия: 0.4.6

Пишу контракт на тестирование на частной сети с большим количеством заранее выделенного газа. Следующее работает отлично:

pragma solidity ^0.4.0;

contract accountList {

    address[] allowedClient;

    function add(address client) returns (bool) {
        allowedClient.push(client);
        return true;
    }

    function get() constant returns (address[]) {
        return allowedClient;
    }

}

Адреса хорошо добавляются, когда я вызываю метод добавления. Я могу получить их, вызвав метод get. Это мне ничего не стоило, так как я использую одну и ту же учетную запись для вызова контракта и для майнинга транзакции (я зарабатываю больше газа, добывая транзакцию, чем я использую для вызова контракта).

Проблема

У меня заканчивается газ, когда я добавляю второй массив с таким же поведением:

pragma solidity ^0.4.0;

contract accountList {

    address[] allowedClient;        
    address[] test;

    function add(address client) returns (bool) {
        allowedClient.push(client);
        test.push(client);
        return true;
    }

    function get() constant returns (address[]) {
        return allowedClient;
    }

}

Вызов метода добавления заставляет меня исчерпать бензин

 contractInstance.add(coinbase, {from: coinbase}, function(error, result) {
    ...
 }

Отладка в консоли geth:

> eth.getBalance(eth.accounts[0])
1.245e+21
> var t = web3.debug.traceTransaction('0x456...')
> t.structLogs[t.structLogs.length-1].error
"Out of gas"

Баланса 1.245e+21 должно быть достаточно, не так ли? Какую конфигурацию я могу использовать, чтобы избежать ограничения газа в моей частной сети?

Как вы назвали addметод? Можешь и это показать?

Ответы (1)

По умолчанию газ будет установлен на 90 000 при выполнении транзакции на смарт-контракт и на 21 000 при выполнении транзакции по переводу эфиров на другую учетную запись.

Вот снимок экрана, показывающий, что вам потребуется больше, чем 90 000 газа по умолчанию, и не менее 103 866.введите описание изображения здесь

Вам нужно будет вручную указать, каковы ваши лимиты газа, например:

eth.sendTransaction({from: ..., to: ..., gas: 150000})

И для сравнения, если опустить test.push(...)утверждение, стоимость газа для выполнения add(...)составляет 63 383, а газ в этой ситуации намного меньше, чем лимит газа по умолчанию в 90 000:

введите описание изображения здесь