Solc mit Geth-Problem verknüpfen

Nach dem Upgrade auf Geth 1.4.4 kann ich nicht mehr auf den Compiler von Geth verweisen.

Der Solc-Compiler ist in /usr/local/bin installiert, aber das bekomme ich, wenn ich nach verfügbaren Compilern suche:

> eth.getCompilers();
I0520 10:22:45.501340 common/compiler/solidity.go:114] solc, the solidity compiler commandline interface
Version: 0.3.2-7a51852a/Release-Darwin/appleclang/JIT

path: /usr/local/bin/solc

[]

Dann versuche ich den Compiler-Pfad erneut zu setzen:

> admin.setSolc("/usr/local/bin/solc")
I0520 10:25:49.234999 common/compiler/solidity.go:114] solc, the solidity compiler commandline interface
Version: 0.3.2-7a51852a/Release-Darwin/appleclang/JIT

path: /usr/local/bin/solc
"solc, the solidity compiler commandline interface\nVersion: 0.3.2-7a51852a/Release-Darwin/appleclang/JIT\n\npath: /usr/local/bin/solc"

Wenn ich die Compiler erneut überprüfe, bekomme ich immer noch:

> eth.getCompilers();
[]

Ich bekomme das gleiche mit:

> web3.eth.getCompilers();
[] 

Ich habe go-ethereum, npm neu installiert.

Kann mir jemand einen Tipp geben, was zu tun ist oder wo ich suchen muss?

Ich hatte keine Probleme vor dem Upgrade auf geth 1.4.4

Danke im Voraus

Antworten (1)

Zusammenfassung

Segmentierungsfehler mit Solc-Version 0.3.2-7a51852a/Release-Darwin/appleclang/JIT , behoben mit später aktualisierter Version .

UPDATE 26.06.2016

Dies ist ein Fehler im Solidity-Compiler.

Hier ein Schnelltest:

user@Kumquat:~$ echo '' | solc
Unknown exception during compilation.

Siehe eth.compile.solidityschlägt mit Solc-Version 0.3.5 #2703 fehl , die auf Exception on Compilation von stdin #651 verweist .

Und das Problem Fix crash for input from stdin. #652 wurde behoben, wird aber eine unbekannte (hoffentlich kurze) Zeit brauchen, um es in die Repository-Pakete zu schaffen.

Dies ist die Codeänderung für den Fix – Fix crash for input from stdin. #652 - Dateien geändert .

Sie können versuchen, die vorherige Version von zu installieren solc.

Oder eine Problemumgehung, die im ersten Link oben angeboten wird:

Für alle, die eine vorübergehende Problemumgehung wünschen, können Sie dieses Repo klonen: https://github.com/mattdf/solidity-static und einen eingebauten Docker erstellen und dann die Solc-Datei in Ihre Installation kopieren. Es erstellt einen statisch kompilierten Build von Solc, sodass es auf den meisten Distributionen funktionieren sollte.



Einzelheiten

Überprüfen Sie den Solidity-Compiler ingeth

Ich habe gerade die Installation (Linux) überprüft und die Ausgabe, die Sie erhalten, stimmt mit der Ausgabe überein, die ich erhalte, aber der Compiler funktioniert ordnungsgemäß.

Führen Sie den folgenden Test aus, um zu überprüfen, ob Ihr Compiler richtig konfiguriert ist.

Ich verwende den folgenden Code:

contract Test { 
    function double(int a) constant returns(int) {
        return 2*a;
    } 
}

Ich habe den obigen Code abgeflacht zu:

> var testSource='contract Test {  function double(int a) constant returns(int) { return 2*a; } }'
undefined

Ich habe versucht, den Code mit der folgenden Anweisung zu kompilieren:

> var testCompiled = web3.eth.compile.solidity(testSource);
undefined

Und überprüfte die Ergebnisse der Zusammenstellung:

> testCompiled
{
  Test: {
    code: "0x6060604052602a8060106000396000f3606060405260e060020a60003504636ffa1caa8114601a575b005b6002600435026060908152602090f3",
    info: {
      abiDefinition: [{...}],
      compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc935251869",
      compilerVersion: "0.3.2",
      developerDoc: {
        methods: {}
      },
      language: "Solidity",
      languageVersion: "0.3.2",
      source: "contract Test {  function double(int a) constant returns(int) { return 2*a; } }",
      userDoc: {
        methods: {}
      }
    }
  }
}

Und wenn Sie überprüfen möchten, ob der Code korrekt ausgeführt wird:

> var testContract = web3.eth.contract(testCompiled.Test.info.abiDefinition);
var test = testContract.new({
    from:web3.eth.accounts[0], 
    data: testCompiled.Test.code, gas: 2000000}, 
    function(e, contract) {
      if (!e) {
        if (!contract.address) {
          console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
        } else {
          console.log("Contract mined! Address: " + contract.address);
          console.log(contract);
        }
    }
})
...
Contract mined! Address: 0x5e3361efa79827d8a53a397b454770c6816585d7
> test.double(5)
10


Überprüfen Sie den Solidity-Compiler

Wenn Sie immer noch auf Probleme stoßen, versuchen wir, den Quellcode außerhalb zu kompilieren geth.

Speichern Sie den folgenden Code in Test.sol:

contract Test { 
    function double(int a) constant returns(int) {
        return 2*a;
    } 
}

Von Ihrem Terminal aus sollten Sie die folgenden Befehle ausführen können, wenn Ihr Solidity-Compiler ordnungsgemäß funktioniert:

user@Kumquat:~$ solc --bin Test.sol

======= Test =======
Binary: 
606060405260728060106000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480636ffa1caa146037576035565b005b604b60048080359060200190919050506061565b6040518082815260200191505060405180910390f35b6000816002029050606d565b91905056

user@Kumquat:~$ solc --abi Test.sol

======= Test =======
Contract JSON ABI
[{"constant":true,"inputs":  [{"name":"a","type":"int256"}],"name":"double","outputs":[{"name":"","type":"int256"}],"type":"function"}]

Wenn die obigen Befehle keine ähnliche Ausgabe erzeugen, stimmt etwas mit Ihrer solcBinärdatei nicht.


Prüfenweb3.js

Sie haben eine Fehlermeldung, die den Text enthält web3.js. Das Problem könnte bei diesem Modul liegen. Ich werde aktualisieren, wenn ich es ein bisschen mehr recherchiert habe.

Hallo, Danke für die Antwort. Beim Kompilieren erhalte ich eine Fehlermeldung: "solc: signal: segmentation fault at web3.js:3119:20 at web3.js:6023:15 at web3.js:4995:36 at <anonymous>:1:20 >"
Bestätigen Sie nur, dass Sie das nicht >am Anfang jeder Anweisung hinzufügen? Dies ist die Eingabeaufforderung in geth.
Hallo, ich habe schon viele Verträge zusammengestellt. Also kein Problem damit :-)
Ich habe auch cpp-ethereum (das den Solc installiert) neu installiert. Ich denke, es könnte ein Problem mit der node.js sein, aber ich bin mir nicht sicher
Jawohl. Können Sie überprüfen, ob Sie den Code von Ihrer Befehlszeile aus kompilieren können (outsite geth)?
Hallo, nein, tatsächlich bekomme ich diesen Fehler, wenn ich direkt kompiliere, wie Sie es angegeben haben: Segmentierungsfehler: 11
Aber ich denke, dass eth.getCompilers(); Gibt mir ein leeres Array von Compilern [] ist auch ein Problem?
Ich glaube nicht. Das leere Array []muss wie die undefinedNachricht sein. Läuft solcüberhaupt von Ihrer Kommandozeile aus? Ohne Parameter? Und mit den --helpParametern?
Ja: solc --version solc, die Befehlszeilenschnittstelle des Solidity-Compilers Version: 0.3.2-7a51852a/Release-Darwin/appleclang/JIT
Danke für deine Hilfe, aber bisher kein Glück. Ich werde versuchen, den Solc aus dem Quellcode zu erstellen, da die Neuinstallation von cpp-ethereum mit Brew nicht geholfen hat
Ich habe cpp-ethereum heute neu installiert und jetzt funktioniert der Compiler und auch in Geth. Das Array von Compilern in Geth gibt immer noch [] zurück, aber es funktioniert. Ich vermute, dass es ein Update gegeben hat. Danke für Ihre Hilfe.
Wenn ich versuche, den Vertrag zu kompilieren, erhalte ich folgende Fehlermeldung: exec: "solc": ausführbare Datei nicht gefunden in $PATH bei web3.js:3119:20 bei web3.js:6023:15 bei web3.js:4995 :36 um <anonym>:1:20 Kann jemand helfen?
@Physes versuchen Sie sudo apt-get update und dann sudo apt-get install solc