Почему функция контракта, которая развертывается внутри браузера Solidity, не развертывается внутри geth?

У меня есть собственная сеть Ethereum.

Внутри браузера Solidity:

  1. От провайдера Web3 я подключился к своему локальному узлу эфириума.
  2. Я нажал createкнопку и успешно развернул свой контракт.
  3. Теперь я мог вызвать любую функцию внутри моего контракта, и все было развернуто без каких-либо проблем.

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

В качестве примера: я развернул insertfront(string val)транзакцию в браузере Solidity (чтобы получить майнинг, требуется около минуты). Стоимость газа 203893.

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

Внутри Гета:

  1. Подключиться к частной сети ethereum.
  2. Получите адрес и abi (расположенные внутри окна интерфейса) из браузера Solidity, которые будут указывать на развернутый контракт.

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

  3. var mycontract = eth.contract(abi).at(address)

mycontract { ... insertfront: function(), allEvents: function(), construct: function(), delete_: function(), delete_items: function(), deleteback: function(), deletefront: function(), get: function(), get_: function(), get_map: function(), ... }

  1. mycontract.deletefront( {from: eth.accounts[0]} )// Это работает внутри geth, и функция делает то, что должна делать. Транзакции майнят и развертывают. Использование газа функцией deletefront() составляет 41920.
  2. Но когда я вызываю insertfront(string val)функцию внутри geth (пожалуйста, обратите внимание, что транзакция стоила 203893 газа внутри браузера Solidity), она никогда не разворачивается и не майнит в моем блокчейне (я ждал часы, но не помог).

    > mycontract.insertfront("some_string", {from: eth.accounts[0]} ) "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"

//Но это не влияет и не делает того, что должна делать функция.

[В] Почему функция, развернутая внутри браузера Solidity, не развертывается внутри geth? Может ли это быть из-за использования большого количества газа для функции?

Спасибо за ваше драгоценное время и помощь.

Ответы (1)

Я бы не сразу понял, но подозреваю, что это действительно проблема с газом. geth по умолчанию предоставляет только 90 тыс. газа, что было бы недостаточно. Вы можете установить газ внутри транзакции следующим образом: {from: eth.accounts[0], gas: 300000}. Обратите внимание, что вы хотите установить газ, а не gasPrice . Не беспокойтесь о точности, так как неиспользованный газ возвращается.

Вот дополнительный совет, который поможет отладке: используйте web3.getTransaction()и web3.getTransactionReceipt(). Шестнадцатеричная строка, которую geth дает вам после транзакции (т.е. "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"), является хешем этой транзакции. Используя getTransactionReceipt(hash), вы увидите, что произошло. Если getTransactionReceipt()говорится, что транзакция использовала столько же газа, сколько getTransaction()было заявлено изначально, транзакция, скорее всего, закончилась.