Ich habe mein privates Ethereum-Netzwerk.
Innerhalb des Solidity-Browsers:
create
und meinen Vertrag erfolgreich bereitgestellt.Als Beispiel: Ich habe eine insertfront(string val)
Transaktion im Solidity Browser bereitgestellt (um abgebaut zu werden dauert etwa eine Minute). Die Gaskosten betragen 203893.
Innerhalb von Geth:
Rufen Sie Adresse und abi (in der Schnittstellenbox) vom Solidity-Browser ab, die auf den bereitgestellten Vertrag verweisen.
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]} )
//Dies funktioniert innerhalb von Geth und die Funktion tut, was sie tun muss. Transaktion Minen und Bereitstellungen. Der Gasverbrauch der Funktion deletefront() beträgt 41920.Aber wenn ich die insertfront(string val)
Funktion in Geth aufrufe (bitte nicht, dass die Transaktion im Solidity Browser 203893 Gas gekostet hat), wird sie nie in meiner Blockchain bereitgestellt oder abgebaut (ich habe Stunden gewartet, aber keine Hilfe).
> mycontract.insertfront("some_string", {from: eth.accounts[0]} ) "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"
//Aber es hat keine Auswirkungen und hat nicht die Funktion erledigt, die es zu tun hat.
[F] Warum wird eine Funktion, die innerhalb des Solidity-Browsers bereitgestellt wird, nicht innerhalb von Geth bereitgestellt? Könnte es daran liegen, dass für eine Funktion eine hohe Gasmenge verwendet wird?
Vielen Dank für Ihre wertvolle Zeit und Hilfe.
Ich würde es nicht sofort wissen, aber ich würde vermuten, dass es tatsächlich ein Gasproblem ist. geth liefert standardmäßig nur 90.000 Gas, was nicht ausreichen würde. Sie können das Gas innerhalb der Transaktion wie folgt einstellen: {from: eth.accounts[0], gas: 300000}
. Beachten Sie, dass Sie das Gas einstellen möchten, nicht den gasPrice . Machen Sie sich keine Sorgen, es genau zu bekommen, da ungenutztes Gas zurückerstattet wird.
Hier ist ein zusätzlicher Tipp zum Debuggen: Verwenden Sie web3.getTransaction()
und web3.getTransactionReceipt()
. Der Hex-String, den geth Ihnen nach einer Transaktion gibt (dh "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"
), ist der Hash dieser Transaktion. Wenn Sie verwenden getTransactionReceipt(hash)
, sehen Sie, was passiert ist. Wenn getTransactionReceipt()
sagt, dass die Transaktion so viel Gas verbraucht hat, wie getTransaction()
sie ursprünglich gesagt hatte, ging der Transaktion höchstwahrscheinlich das Gas aus.