Etherscan: Wie kann ich einen Vertrag mit mehreren Importen verifizieren, die mit Truffle bereitgestellt werden?

Wenn ich einen Vertrag mit Truffle bereitstelle, der eine importErklärung enthält, und versuche, ihn auf etherscan zu überprüfen, muss ich meines Wissens nach den Inhalt der importierten Datei einfügen.

Ich erhalte eine Fehlermeldung bei Etherscan, dass die Bytecodes der verketteten und bereitgestellten Dateien nicht identisch sind. Das Seltsame ist, dass, wenn ich den Vertrag (mit Importen) für Remix bereitstelle, der Bytecode mit der verketteten Quelldatei übereinstimmt.

Beispiel

Hier ist ein Minimalbeispiel für Verträge, die dieses Verhalten aufweisen.

Combined.solist die verkettete Datei und Outer.solenthält den bereitgestellten Vertrag.

Hier ist, was ich tue, das einen Fehler bekommt:

  1. Outer.solMit Trüffel bereitstellen
  2. Gehen Sie auf Etherscan zur bereitgestellten Vertragsadresse
  3. Geben Sie den Concatenated.solQuellcode ein und klicken Sie auf „Bestätigen“.

Fehler, Bytecodes stimmen nicht überein.

Mehr Info

  • Verwenden des Compilers 0.4.11in Remix und Trüffel.
  • Ubuntu 16.04.
  • Auf Kovan, nicht dass es eine Rolle spielen sollte.
  • Eingesetzter Vertrag
Für mich hat die Überprüfung verketteter Verträge früher wie ein Zauber funktioniert. Können Sie die Adresse des bereitgestellten Minimalbeispiels im Kovan-Netzwerk angeben, damit ich den Fall untersuchen kann?
@JakubWojciechowski Aktualisierte Antwort mit Adresse des bereitgestellten Vertrags
Haben Sie bei der Überprüfung des Codes auf Etherscan sowohl mit als auch ohne aktivierte Optimierungen versucht?

Antworten (3)

Derzeit unterstützt Etherscan keine Überprüfung von Multifile-Verträgen. Aber es gibt Diskussionen auf Reddit von Etherscan zu diesem Thema.

Das Verketten von Dateien zu einer hat vor einiger Zeit funktioniert, aber seit Version 0.4.7 fügt Solidity am Ende des kompilierten Vertrages einen Hash der Vertragsmetadaten hinzu . Da diese Metadaten Dateinamen und Hashes enthalten, erhalten Sie nach dem Verketten und Kompilieren möglicherweise denselben Bytecode, aber dieser Hash ist anders.

Ich denke, die Motivation hinter dem Hinzufügen des Hashs dieser Metadaten zum bereitgestellten Vertrag besteht darin, die Quellenüberprüfung automatisch zu machen, da jeder bereitgestellte Vertrag einen Schwarm-Link zu Quellen, Compiler-Version und Kompilierungsoptionen enthält.

Also ist die Überprüfungsfunktion seit solidity 0.4.7 ziemlich nutzlos?

Ich habe eine CLI namens multisol gebaut, die Ihnen helfen kann . Sie können es über Homebrew installieren, wenn Sie einen Mac verwenden, oder eine der ausführbaren Dateien herunterladen , die ich zur Verfügung stelle, wenn Sie Windows oder Linux verwenden:

$ brew tap paulrberg/multisol
$ brew install multisol

Dann kannst du es so verwenden:

$ multisol path/to/YourContract.sol

Dadurch wird ein Ordner mit dem Namen „multisol-yourcontract“ generiert, der verwendet werden kann, um den Quellcode auf Etherscan für eine bereitgestellte Instanz von YourContract.sol. Beachten Sie, dass der Überprüfungstyp "Solidity (Multi-Part files)" ist.

Ich habe erstellt truffle-plugin-verify, um die Truffle-Vertragsüberprüfung auf Etherscan zu automatisieren.


  1. Installieren Sie das Plugin mit npm
npm install truffle-plugin-verify
  1. Fügen Sie das Plugin zu Ihrer truffle.jsoder truffle-config.js-Datei hinzu
module.exports = {
  /* ... rest of truffle-config */

  plugins: [
    'truffle-plugin-verify'
  ]
}
  1. Generieren Sie einen API-Schlüssel in Ihrem Etherscan-Konto (siehe Etherscan-Website )
  2. Fügen Sie Ihren Etherscan-API-Schlüssel zu Ihrer Truffle-Konfiguration hinzu
module.exports = {
  /* ... rest of truffle-config */

  api_keys: {
    etherscan: 'MY_API_KEY'
  }
}

Nachdem Sie Ihren OuterVertrag zu Kovan migriert haben, können Sie ihn auf Etherscan überprüfen, indem Sie Folgendes ausführen:

truffle run verify Outer --network kovan

Weitere Informationen finden Sie im Repository oder in meinem Artikel Truffle Smart Contracts auf Etherscan automatisch verifizieren .

I am trying to verify a contract which uses multiple contracts but it fails with the below error: truffle run verify AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 --network kovan Verifying AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 Fail - Unable to verify Failed to verify 1 contract(s): AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 Zu überprüfender Code: github.com/dydxprotocol/solo/blob/master/contracts/protocol/… Ich habe genau das befolgt, was Sie vorgeschlagen haben, und versuche immer noch herauszufinden, was fehlt.
Wurde der Vertrag zufällig durch einen anderen Vertrag bereitgestellt?
Nein, es wird unabhängig bereitgestellt. Nach der Bereitstellung wird es in diesem Vertrag verwendet: github.com/dydxprotocol/solo/blob/master/contracts/protocol/…
Könnten Sie ein Problem auf GitHub öffnen (mit der Ausgabe des Befehls mit dem --debugFlag? github.com/rkalis/truffle-plugin-verify/issues/new