web3j Ошибка обработки запроса транзакции: недостаточно средств для газа * цена + стоимость

Следуя этому руководству https://github.com/web3j/web3j

Клиент geth запустил как частную сеть. Вот код контракта

pragma solidity ^0.4.10;

contract Counter {
    uint256 counter =0;

    function increase() public {
        counter++;
    }

    function  decrease() public{
        counter--;
    }

    function getCounter() public constant  returns (uint256) {
        return counter;
    }
}

Скомпилировал контракт и создал код оболочки для контракта. Был сгенерирован Java-код для Counter.sol, затем я попытался развернуть контракт

Web3j web3 = Web3j.build(new org.web3j.protocol.http.HttpService("http://localhost:8080"));
            Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
            String clientVersion = web3ClientVersion.getWeb3ClientVersion();

Counter contract = Counter.deploy(web3, credentials,Counter.GAS_PRICE;,Counter.GAS_LIMIT).send();  // constructor params
            System.out.println("before increase counter "+contract.getCounter());
            contract.increase();
            System.out.println("after increase counter "+contract.getCounter());
            contract.decrease();
            System.out.println("after decrease counter "+contract.getCounter());

Получение исключения

ontract gas limit 4300000
[info] counter gas price 22000000000
[error] java.lang.RuntimeException: java.lang.RuntimeException: Error processing transaction request: insufficient funds for gas * price + value
[error]     at org.web3j.tx.Contract.deploy(Contract.java:350)
[error]     at org.web3j.tx.Contract.lambda$deployRemoteCall$5(Contract.java:384)
[error]     at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30)
[error]     at models.smartcontract.FirstContractJava.main(FirstContractJava.java:33)
[error] Caused by: java.lang.RuntimeException: Error processing transaction request: insufficient funds for gas * price + value
[error]     at org.web3j.tx.TransactionManager.processResponse(TransactionManager.java:67)
[error]     at org.web3j.tx.TransactionManager.executeTransaction(TransactionManager.java:51)
[error]     at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:87)
[error]     at org.web3j.tx.Contract.executeTransaction(Contract.java:275)
[error]     at org.web3j.tx.Contract.create(Contract.java:317)
[error]     at org.web3j.tx.Contract.deploy(Contract.java:346)
[error]     ... 3 more

Затем я развернул контракт с использованием кошелька Ethereum, потому что он оценивает лимит газа и цену на газ для нас. По оценкам

gas price 86440
gas limit 186440

Итак, я изменил код вот так

BigInteger gp = BigInteger.valueOf(86440);
            BigInteger gl = BigInteger.valueOf(186440);
            Counter contract = Counter.deploy(web3, credentials,gp,gl).send();  // constructor params

Но исключение осталось таким же. Подскажите, пожалуйста, как разрешить это исключение, а также как оценить цену на газ и лимит газа для контракта.


person swaheed    schedule 21.07.2018    source источник
comment
Кажется, у вас возникла проблема с конфигурацией на вашем локальном узле. Мне удалось идеально развернуть ваш контракт в Ropsten и взаимодействовать с контрактом. Как вы это настроили? С Ганашем? Вы пользуетесь Гетом?   -  person juanba1984    schedule 22.07.2018


Ответы (1)


Web3j не дает очень хороших значений цены / пределов газа по умолчанию. Я считаю, что они жестко запрограммированы независимо от того, какой контракт вы разрабатываете или какие действия вы пытаетесь предпринять. При этом их значения по умолчанию ДОЛЖНЫ быть в порядке (большую часть времени), если у вас достаточно эфира в вашей учетной записи.

Цена на газ

Цены на газ колеблются в зависимости от активности в сети. Чем больше вы заплатите, тем больше вероятность (и быстрее) будет получена ваша транзакция. Цены на газ измеряются в Gwei (1 Gwei = 1000000000 Wei). Вы можете увидеть последние цены на газ в MainNet по адресу https://ethgasstation.info/. Обычно вы увидите, что большинство транзакций оплачиваются от 1 до 10 Gwei. Для транзакций с более высоким приоритетом (обычно переводы монет / эфира, поскольку эти транзакции не потребляют много газа), вы можете увидеть цены на газ на уровне 100 или даже 1000 Gwei. Если вы используете частную сеть, вы можете использовать любую цену на газ, которую хотите (даже 0), но вы должны настроить свои майнеры, чтобы они принимали работу по такой низкой цене. Например, с geth вы можете установить минимальную цену на газ с помощью опции --gasprice.

MINER OPTIONS:
  --mine                    Enable mining
  --minerthreads value      Number of CPU threads to use for mining (default: 8)
  --etherbase value         Public address for block mining rewards (default = first account created) (default: "0")
  --targetgaslimit value    Target gas limit sets the artificial target gas floor for the blocks to mine (default: 4712388)
  --gasprice "18000000000"  --> Minimal gas price to accept for mining a transactions <--
  --extradata value         Block extra data set by the miner (default = client version)

В вашем случае значение по умолчанию 22 Gwei нормально, но вы, вероятно, можете уменьшить его до 1-5. Однако 86440 Wei при развертывании через кошелек Ethereum почти наверняка не будет работать.

Лимит газа

Web3j просто использует старый лимит газа по умолчанию в качестве значения по умолчанию. Со временем он изменился и в настоящее время составляет около 8 миллионов. Ропстен зафиксирован и составляет около 4,7 миллиона. По умолчанию Web3j составляет 4,3 миллиона, чтобы убедиться, что вы не достигли пределов размера блока в тестовых средах. Однако, если вы начинаете транзакцию, указав 4,3 миллиона газа на 22 Gwei, у вас должно быть ~ 0,1 эфира на вашем счету. У вас должна быть возможность снизить лимит газа до 200000 (на основе результатов отладки при развертывании, но вам нужно будет опубликовать код контракта для подтверждения).

Остаток

Наконец, убедитесь, что в вашем аккаунте есть эфир! Запустите простой web3.eth.getBalance() в своей geth консоли, чтобы подтвердить свой баланс. Вы можете инициализировать баланс учетной записи в своей частной сети в файле genesis.json.

{
   ...
   "alloc": {
     "<ACCT_ID>": {
       "balance": "30000000000000000000000000000"
     }
   } 
}
person Adam Kipnis    schedule 22.07.2018