So verwenden Sie Trüffel mit Solidity 0.4

Ich habe gerade versucht, ein Trüffelprojekt auf die Beine zu stellen und einen Vertrag zu erstellen, den ich bereits geschrieben habe.

Dabei bekomme ich folgende Fehlermeldung:

/usr/lib/node_modules/truffle/node_modules/solidity-parser/index.js:39
      throw e;
      ^
SyntaxError: Expected "contract", "import", "library", comment, end of input, end of line or whitespace but "p" found. Line: 1, Column: 1
    at peg$buildException (/usr/lib/node_modules/truffle/node_modules/solidity-parser/build/imports_parser.js:423:14)
    at Object.peg$parse [as parse] (/usr/lib/node_modules/truffle/node_modules/solidity-parser/build/imports_parser.js:3355:13)
    at Object.module.exports.parse (/usr/lib/node_modules/truffle/node_modules/solidity-parser/index.js:34:23)
    at /usr/lib/node_modules/truffle/lib/profiler.js:134:36
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3)

Die erste Zeile, über die sich der Compiler beschwert, lautet:

pragma solidity ^0.4.0;

Soweit ich weiß, gibt es keine Möglichkeit, dass ich diese Linie herauslassen könnte. Gibt es eine Lösung, mit der ich Truffle mit der neuesten Solidity-Version verwenden kann?

Danke im Voraus.

Was ist Ihr Vertrag? Wäre hilfreich, wenn du es hier posten könntest
Ich denke, es wird ohne diese Pragma-Zeile funktionieren, bitte versuchen Sie es einmal ohne diese Zeile.
Ohne geht es nicht. Wenn ich Solidity 0.4 verwende, beschwert sich der Compiler über das _;
Was gibt solc --versiones? Wenn ich v0.3.6 verwende, erhalte ich denselben Fehler in der pragmaLeitung.
Meine Solc war noch 0.3, aber jetzt habe ich sie auf Version: 0.4.1-develop.2016.09.09+commit.79867f4.Linux.g++ aktualisiert und bekomme immer noch den gleichen Fehler

Antworten (4)

Ich habe gerade Support Solidity 0.4.x hinzugefügt und eine neue Version von Truffle veröffentlicht. Sie können die Ankündigung hier lesen: https://www.reddit.com/r/ethereum/comments/574rvr/truffle_v210_now_with_solc_04x_support/

Prost!

Ich hatte das gleiche Problem, also habe ich auf dem Gitter-Kanal von Truffle nachgefragt, und dies ist die Antwort, die ich erhalten habe:

Truffle wird solc 0.4.x nicht unterstützen, bis Truffle 3.0 veröffentlicht wird, da wesentliche Änderungen an Truffle erforderlich sind.

Hoffe das hilft!

Ich kann es ohne den Code für den Kontext nicht wissen, aber ich würde wetten, dass dies in einem Funktionsmodifikator ist und die Zeile darüber ist _.

In Solidity >= 0.4 _muss dahinter ein Semikolon stehen.

dh_;

Sie sollten auch die vorgeschlagene Pragma-Zeile am Anfang Ihrer Dateien hinzufügen, nur damit sie aufhört zu meckern.

Einzelheiten finden Sie in den Versionshinweisen

Genau das ist das Problem. Mein Code ist in Solidity 0.4 geschrieben und ich habe das _; in den Modifikatoren. Der Compiler beschwert sich, dass mein Code mit „pragma“ beginnt und nicht mit „contract“ oder „library“
Ach, ich verstehe. Ich denke, Truffle wird nur mit Ihrem lokalen Solc kompiliert. Solange das auf dem neuesten Stand ist, weiß ich nicht, warum es sich beschweren würde
Wie ich bereits oben erwähnt habe: Mein Solc war noch 0.3, aber jetzt habe ich ihn auf Version: 0.4.1-develop.2016.09.09+commit.79867f4.Linux.g++ aktualisiert und bekomme immer noch den gleichen Fehler

BEARBEITEN: Die kürzeste funktionierende Lösung ist die Verwendung von Browser Solidity ( https://ethereum.github.io/browser-solidity/ ) und sagen Sie ihm einfach, dass er Solidity 0.3.6 verwenden soll, dann werden die Dinge in Trüffel wieder funktionieren.

Ich kämpfe mit dem gleichen Problem, und schließlich gibt es eine Problemumgehung - ich habe es noch nicht selbst versucht:

  1. Kompilieren und implementieren Sie Ihren Vertrag "auf die harte Tour" über Solidity und Geth.
  2. laufen truffle migrateund truffle buildauf Ihr Trüffelprojekt ohne die pragma solidity ^0.4.0;in Ihrem Vertrag
  3. Nehmen Sie die Adresse Ihres "manuell bereitgestellten" Vertrags, öffnen Sie die von Truffle erstellte app.js unter /build/app.js, suchen Sie Contract.all_networksund ändern Sie die Adresse in die Ihres manuell bereitgestellten Vertrags.

Auf diese Weise könnten Sie möglicherweise Ihren Trüffel-Build austricksen, um den zuvor gut zusammengestellten Vertrag zu verwenden. Absolut keine Garantie, vielleicht kann jemand mit tieferem Verständnis von all dem sagen, ob dies völliger Unsinn oder eine praktikable Lösung ist.

PS: Kompilieren und Bereitstellen auf die harte Tour: 1. $ sudo apt-get install -y solc2. Entfernen Sie alle Zeilenumbrüche aus Ihrem Vertragscode (Online-Tools könnten helfen) 3. In geth: > var myContractSource = *paste contract source without linebreaks here*4. > var myContractCompiled = eth.compile.solidity(myContractSource)5. > var myContract = eth.contract(myContractCompiled.theContractNameInTheSolidityCode.info.abiDefinition);6. wieder ohne Zeilenumbrüche und mit aktiviertem Mining:

var myContractTransaction = myContract.new({
    from: eth.coinbase, 
    data: myContractCompiled.theContractNameInTheSolidityCode.code, 
    value: 1000000000000000000,
    gas: 1000000
  },
  function(err, contract) {
      if (err) {
        console.error(err); 
      } else {
        console.log(contract); 
        console.log(contract.address);
      }
});

Die zuletzt zurückgegebene Adresse ist die Adresse Ihres Vertrags.

PPS: Auch hier bin ich mir nicht sicher, aber vielleicht app.jsmüssen Sie in den Maßanfertigungen auch (unter contract.all_networks) durch das ersetzen, unlinked_binarywas Sie finden, code:wenn Sie gerade > myContractCompiledin geth nach der Definition dieser var. diese werte sehen für mich irgendwie mit der identifikation von verträgen zusammen.

Ich hoffe ich konnte helfen. Warten wir auf das Update von truffle..