У меня есть собственная сеть Ethereum.
Внутри браузера Solidity:
create
кнопку и успешно развернул свой контракт.В качестве примера: я развернул insertfront(string val)
транзакцию в браузере Solidity (чтобы получить майнинг, требуется около минуты). Стоимость газа 203893.
Внутри Гета:
Получите адрес и abi (расположенные внутри окна интерфейса) из браузера Solidity, которые будут указывать на развернутый контракт.
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(), ... }
mycontract.deletefront( {from: eth.accounts[0]} )
// Это работает внутри geth, и функция делает то, что должна делать. Транзакции майнят и развертывают. Использование газа функцией deletefront() составляет 41920.Но когда я вызываю insertfront(string val)
функцию внутри geth (пожалуйста, обратите внимание, что транзакция стоила 203893 газа внутри браузера Solidity), она никогда не разворачивается и не майнит в моем блокчейне (я ждал часы, но не помог).
> mycontract.insertfront("some_string", {from: eth.accounts[0]} ) "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"
//Но это не влияет и не делает того, что должна делать функция.
[В] Почему функция, развернутая внутри браузера Solidity, не развертывается внутри geth? Может ли это быть из-за использования большого количества газа для функции?
Спасибо за ваше драгоценное время и помощь.
Я бы не сразу понял, но подозреваю, что это действительно проблема с газом. geth по умолчанию предоставляет только 90 тыс. газа, что было бы недостаточно. Вы можете установить газ внутри транзакции следующим образом: {from: eth.accounts[0], gas: 300000}
. Обратите внимание, что вы хотите установить газ, а не gasPrice . Не беспокойтесь о точности, так как неиспользованный газ возвращается.
Вот дополнительный совет, который поможет отладке: используйте web3.getTransaction()
и web3.getTransactionReceipt()
. Шестнадцатеричная строка, которую geth дает вам после транзакции (т.е. "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"
), является хешем этой транзакции. Используя getTransactionReceipt(hash)
, вы увидите, что произошло. Если getTransactionReceipt()
говорится, что транзакция использовала столько же газа, сколько getTransaction()
было заявлено изначально, транзакция, скорее всего, закончилась.