Wie rufe ich die Bibliotheksfunktion aus einem Vertrag auf? => [Fehler] Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge. nicht definiert

Wenn ich den folgenden Code unter " https://ethereum.github.io/browser-solidity/ " kompiliert habe, gibt es mir zwei Web3-Bereitstellungscodes für:

var libraryContract  = web3.eth.contract(...); //Web3 deploy code
var contractContract = web3.eth.contract(...); //Web3 deploy code

Dann muss ich den Web3-Bereitstellungscode für (libraryContract, contractContract) in Geth kopieren und einfügen, um meine Verträge zu minen.

Mein Code (ich habe das meiste davon der Einfachheit halber getrimmt):

library Library {
    function func () constant returns (uint8) {
        return 5;
    }
}

contract Contract {
    uint8 value;
    function call_library_function () {
        value = Library.func();
    }
}

Der Web3-Deployment-Code von „Library“ funktioniert einwandfrei, aber wenn ich versuche, den Web3-Deployment-Code von „Contract“ zu minen, erhalte ich die folgende Fehlermeldung:

> Fehler: Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge. nicht definiert

Wenn ich die folgende Zeile aus meinem Contract Link-Code entferne, wird der neu generierte Web3-Deployment-Code von „Contract“ abgebaut! ohne Probleme:

value = Library.func();

[F] Meine Frage ist, wie kann ich dieses Problem beheben, das ich habe? Was soll ich tun, um meine Funktion in einer Bibliothek von einem Vertrag aufzurufen, der es mir ermöglicht, sie abzubauen?

Wie habe ich meine private Ethereum-Blockchain eingerichtet: Siehe folgenden Link: Wie kann ich den Standardwert von homesteadBlock in meiner privaten Ethereum-Blockchain aktualisieren?

Vielen Dank für Ihre wertvolle Hilfe und Zeit.

Antworten (1)

Von der Bibliotheksvertragsmethode, die #2831 fehlschlägt :

Sie führen wahrscheinlich geth mit der Option --dev aus, um ein privates Netzwerk zu erstellen? Verwenden Sie in diesem Fall den Unterbefehl init, um eine private Kette zu erstellen. Anleitungen sind im Wiki zu finden. Oder nutzen Sie das Testnetz.

Das Problem ist , dass dieser Code den Delegatecall verwendet , der in der Homestead - Version hinzugefügt wurde . Das Flag --dev verwendet die Homestead-Blocknummer des Hauptnetzes, die 1150000 ist . Jede Transaktion vor diesem Block wird auf einen ungültigen Opcode stoßen, das gesamte Gas verbrauchen und alle Zustandsänderungen werden rückgängig gemacht.

Um dieses Problem zu umgehen:

...

Die Genesis-Konfigurationsdatei unterstützt einen Konfigurationsabschnitt. Momentan ist das Einzige, was Sie konfigurieren können, die Homestead-Blocknummer . Wenn Sie es nicht angeben, wird standardmäßig die Mainnet-Nummer 1150000 verwendet. Ihr Vertrag funktioniert also grundsätzlich nach diesem Block.

Probieren Sie die folgende Genesis-Datei aus:

{
  "config":{
     "homesteadBlock":"5"
  },
  "nonce":"0x0000000000000042",
  "timestamp":"0x0",
  "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData":"0x0",
  "gasLimit":"0x8000000",
  "difficulty":"0x400",
  "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase":"0x3333333333333333333333333333333333333333",
  "alloc":{

  }

}

Wenn der Kontrakt in Block <5 eingesetzt wird, gibt es das Gasbegrenzungsproblem.

Eingesetzt in Block >= 5 sollte es wie beabsichtigt funktionieren.

Weitere Informationen zur Verwendung der Genesis-Datei finden Sie unter geth init, was sind die Argumente? .



Update 10:33 14. Oktober 2016

Ich habe meine private Blockchain mit den folgenden Verfahren eingerichtet:


1. Richten Sie genesis.json ein

Wocket:ESE bok$ more genesis.json 
{
    "config": {
            "homesteadBlock": 10
    },
    "nonce": "0",
    "difficulty": "0x400",
    "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x",
    "gasLimit": "0x3B4A1B44",
    "alloc": {}
}


2. Passwortdatei

Ich habe eine Passwortdatei erstellt testpassword, die mein Kontopasswort enthält


3. Blockchain-Initialisierungsskript

Ich habe ein Skript erstellt, um meine Blockchain zu initialisieren:

Wocket:ESE bok$ more 02_runGethGenesisInit 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis init /Users/bok/ESE/genesis.json
geth --datadir /Users/bok/ESE/gethgenesis --password testpassword account new

Und ich habe chmod 700 02_runGethGenesisInitdas ausführbare Bit gesetzt.


4. Privates Knotenskript

Ich habe ein Skript erstellt, um meinen privaten gethKnoten im Mining-Modus zu starten:

Wocket:ESE bok$ more 02_runGethGenesis 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

Und ich habe chmod 700 02_runGethGenesisdas ausführbare Bit gesetzt.


5. Solidität des Browsers

Ich habe Browser Solidity von https://github.com/ethereum/browser-solidity/tree/gh-pages heruntergeladen .

Ich habe die Dateien entpackt und index.htmlin meinen Webbrowser geladen.


6. Beginnen Sie alles

Ich habe meine Blockchain-Daten mit dem folgenden Befehl initialisiert:

Wocket:ESE bok$ ./02_runGethGenesisInit 

Ich habe meinen Knoten mit dem folgenden Befehl gestartet und führe ihn seit einiger Zeit aus:

Wocket:ESE bok$ ./02_runGethGenesis
...
I1015 09:56:14.364062 miner/worker.go:342] 🔨  Mined block (#5210 / f881b1be). Wait 5 blocks for confirmation
I1015 09:56:14.364333 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 281.474µs
I1015 09:56:14.364360 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5205
I1015 09:56:14.364492 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 114.592µs
I1015 09:56:16.394886 miner/worker.go:342] 🔨  Mined block (#5211 / 420c7edc). Wait 5 blocks for confirmation
I1015 09:56:16.395189 miner/worker.go:539] commit new work on block 5212 with 0 txs & 0 uncles. Took 262.993µs
I1015 09:56:16.395222 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5206


7. Testen für den Homestead-Modus

Ich habe das Testskript von geladen. @TjadenHessWie kann ich den Standardwert von homesteadBlock in meiner privaten Ethereum-Blockchain aktualisieren? in den Solidity-Browser:

contract TestHomestead{
    function test () returns(bool){
        return address(4).delegatecall(1);
    }
}

Ich habe Solidity Browser mit meinem lokalen privaten Knoten verbunden, indem ich auf das Blocksymbol geklickt und Web3 Provider ausgewählt habe . Ich habe dann auf Erstellen geklickt , um den Vertrag oben in der Blockchain bereitzustellen. Ich habe auf Test geklickt und die Meldung Transaction cost: 21657 gas.zeigt, dass sich meine Blockchain im Homestead-Modus befindet.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Hinweis: Wenn ich die Funktion ändere, um sie zu einer Konstante zu machen function test () constant returns(bool){, erhalte ich die folgenden Ergebnisse für eine Blockkette im Homestead-Modus - true :

Geben Sie hier die Bildbeschreibung ein

Siehe Abschnitt 9 unten für die Meldung, die angezeigt wird, wenn sich die Blockchain im Nicht-Homestead-Modus befindet.


8. Testen des Quellcodes des Bibliotheksaufrufs

Ich habe den Quellcode des Bibliotheksaufrufs leicht geändert, um die valueVariable öffentlich zu machen, und diese in Browser Solidity geladen:

library Library {
    function func () constant returns (uint8) {
        return 5;
    }
}

contract Contract {
    uint8 public value;
    function call_library_function () {
        value = Library.func();
    }
}

Ich habe auf Create geklickt , um den Code bereitzustellen, auf call_library_function , um die Methode auszuführen, und auf value , um das Ergebnis der Bibliotheksaufruffunktion anzuzeigen:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Erfolg

Die Meldung Transaction cost: 41914 gas.und der Wert von valuezeigen, dass der Bibliotheksfunktionsaufruf erfolgreich war.


9. Was passiert, wenn sich mein Knoten im Nicht-Homestead-Modus befindet?

Ich habe Browser Solidity mit einer geth --devBlockchain verbunden:

geth --dev --datadir /Users/bok/ESE/gethdata --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

Ich habe denselben Homestead-Testcode ausgeführt, um die Meldung zu erzeugen, dass das erforderliche Gas die Grenze überschreitet: 50000000 , was zeigt, dass sich diese --devBlockchain im Nicht-Homestead-Modus befindet:

Geben Sie hier die Bildbeschreibung ein

Hinweis: Wenn ich die Funktion ändere, um sie zu einer Konstante zu machen function test () constant returns(bool){, erhalte ich die folgenden Ergebnisse für eine Blockchain im Nicht-Homestead-Modus - false :

Geben Sie hier die Bildbeschreibung ein

Danke mein Herr. Hat es bei Ihnen funktioniert, wenn das Gaslimit auf 5000000 aktualisiert wird?
Verzeihung. Mein Browser Solidity ist momentan offline. Die Neuerstellung meines Notebooks als Software-Upgrade führte dazu, dass es nicht mehr funktionierte. Stellen Sie Ihren Vertrag ohne das bereit list.append("abc","111"); und prüfen Sie, wie viel Gas es braucht. Fügen Sie dann 10 % mehr hinzu und prüfen Sie, ob dies Ihr Problem löst. Ich stelle fest, dass Sie Ihren Code schreiben und dann gethdirekt bereitstellen. Sie sollten in der Lage sein, Browser Solidity mit Ihrer lokalen gethInstanz zu verbinden, indem Sie den Web3-Anbieter im dritten Symbol von links auswählen – siehe das Bildschirmbild in ethereum.stackexchange.com/a/8970/1268 .
Ok, ich versuche deinen Vorschlag. Ich betreibe Geth auf meiner privaten Ethereum-Blockchain. Ich habe gezwungen, geth -targetgaslimit "994712388" auszuführen. Mein Gaslimit steigt von 470000 auf jetzt 500000. Der Solidity-Browser gibt immer 470000 für den Gasverbrauch an, also aktualisiere ich manuell den Wert "gas: <int>" für den Vertrag. Hoffentlich finde ich ein Gas, das der Vertrag abgebaut wird.
Wenn Sie über bereitstellen möchten , finden Sie in gethder Schritt-für-Schritt-Anleitung ethereum.stackexchange.com/questions/2751/… ein Beispiel für die Angabe von Gas für die Vertragsbereitstellung.
Ich habe das Gaslimit auf "15529600" aktualisiert, immer noch derselbe Fehler.
Ich habe einen Vorschlag gemacht, aber es scheint wieder so, als würde es nicht funktionieren. Ich arbeite noch daran. Danke für Ihre Hilfe.
Ich habe meine Antwort mit einem Link zur Verwendung der Genesis-Datei aktualisiert.
Vielen Dank, mein Herr, basierend auf Ihrer Anleitung habe ich meine Frage aktualisiert, wie ich meine private Ethereum-Blockchain erstellt habe. Aber es gibt mir immer noch den gleichen Fehler. Stimmt etwas nicht damit, wie ich meine private Ethereum-Blockchain erstellt habe?
Ich habe meine Antwort mit einer Schritt-für-Schritt-Anleitung zum erfolgreichen Bereitstellen des Bibliotheksfunktionsaufrufs aktualisiert.
Vielen Dank :) Ich schätze Ihre wertvolle Hilfe. Ich arbeite daran, dass es auf meiner Seite funktioniert.
Nun, es funktioniert!!
Ist es möglich, Ihre Antwort auch mit zu machen solc? @BokkyPooBah
Wäre es möglich, Ihre Antwort mit dem neuen Solidity-Browser zu aktualisieren? Die GUI von Solidity-Browser wurde geändert und ich kann meinen Vertrag nicht darüber bereitstellen :( @BokkyPooBah