Warum wird die Vertragsfunktion, die im Solidity-Browser bereitgestellt wird, nicht in Geth bereitgestellt?

Ich habe mein privates Ethereum-Netzwerk.

Innerhalb des Solidity-Browsers:

  1. Vom Web3-Provider habe ich mich mit meinem lokalen Ethereum-Knoten verbunden.
  2. Ich habe die Schaltfläche gedrückt createund meinen Vertrag erfolgreich bereitgestellt.
  3. Jetzt konnte ich jede Funktion in meinem Vertrag aufrufen und alle ohne Probleme bereitstellen.

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

Innerhalb von Geth:

  1. Verbinden Sie sich mit einem privaten Ethereum-Netzwerk.
  2. Rufen Sie Adresse und abi (in der Schnittstellenbox) vom Solidity-Browser ab, die auf den bereitgestellten Vertrag verweisen.

    Geben Sie hier die Bildbeschreibung ein

  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]} )//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.
  2. 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.

Antworten (1)

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.