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.
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? .
Ich habe meine private Blockchain mit den folgenden Verfahren eingerichtet:
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": {}
}
Ich habe eine Passwortdatei erstellt testpassword
, die mein Kontopasswort enthält
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_runGethGenesisInit
das ausführbare Bit gesetzt.
Ich habe ein Skript erstellt, um meinen privaten geth
Knoten 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_runGethGenesis
das ausführbare Bit gesetzt.
Ich habe Browser Solidity von https://github.com/ethereum/browser-solidity/tree/gh-pages heruntergeladen .
Ich habe die Dateien entpackt und index.html
in meinen Webbrowser geladen.
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
Ich habe das Testskript von geladen. @TjadenHess
Wie 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.
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 :
Siehe Abschnitt 9 unten für die Meldung, die angezeigt wird, wenn sich die Blockchain im Nicht-Homestead-Modus befindet.
Ich habe den Quellcode des Bibliotheksaufrufs leicht geändert, um die value
Variable ö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:
Die Meldung Transaction cost: 41914 gas.
und der Wert von value
zeigen, dass der Bibliotheksfunktionsaufruf erfolgreich war.
Ich habe Browser Solidity mit einer geth --dev
Blockchain 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 --dev
Blockchain im Nicht-Homestead-Modus befindet:
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 :
Alper
Datenschutz ist ein Menschenrecht.eth
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 danngeth
direkt bereitstellen. Sie sollten in der Lage sein, Browser Solidity mit Ihrer lokalengeth
Instanz zu verbinden, indem Sie den Web3-Anbieter im dritten Symbol von links auswählen – siehe das Bildschirmbild in ethereum.stackexchange.com/a/8970/1268 .Alper
Datenschutz ist ein Menschenrecht.eth
geth
der Schritt-für-Schritt-Anleitung ethereum.stackexchange.com/questions/2751/… ein Beispiel für die Angabe von Gas für die Vertragsbereitstellung.Alper
Alper
Datenschutz ist ein Menschenrecht.eth
Alper
Datenschutz ist ein Menschenrecht.eth
Alper
Alper
Alper
solc
? @BokkyPooBahDatenschutz ist ein Menschenrecht.eth
Alper