Veröffentlichung von zwei Verträgen

Ich werde zwei Verträge veröffentlichen: einen Standard-Token-Vertrag und einen Crowdsale-Vertrag. Was ist die beste Vorgehensweise dafür?

  1. Soll ich es in einer Datei veröffentlichen? Bedeutet das, dass nur der zweite Vertrag in der Datei sichtbar ist?

  2. Wenn ich zuerst den Token und dann den Crowdsale-Vertrag veröffentliche, muss ich dann die Adresse des Tokens im Crowdsale-Vertrag fest codieren?

  3. Wie mache ich in diesem Fall die anfängliche Token-Versorgung im Besitz des Crowdsale-Vertrags?

Verwenden Sie Trüffel?
Normalerweise mache ich das, aber ich habe bisher nur mit Einzelvertrags-Apps gespielt.

Antworten (3)

Sie können sie entweder beide in einer Datei ablegen und einzeln kompilieren/bereitstellen oder sie in separate Dateien ablegen.

Wenn Sie möchten, dass die Verträge sich gegenseitig Methoden aufrufen können, dann müssen Sie, wenn sie sich in separaten Dateien befinden, den anderen Vertrag am Anfang der Datei importieren (z . B. import "./Token.sol";). Sie können dann einfach eine Methode im Token-Vertrag aufrufen, z Token(someAddress).methodName(args).

In Bezug auf die Verwaltung der Adressen der separaten Verträge, damit sie miteinander kommunizieren können, können Sie die Adresse entweder in einer Zustandsvariablen speichern oder bei Bedarf als Funktionsargument übergeben, z

import "./Crowdsale.sol";    

contract Token {
    Crowdsale crowdsale;
    function Token(address theAddr) {
        crowdsale = Crowdsale(theAddr);
    }

    // You could do this
    function talkToCrowdsale() {
        crowdsale.someMethod();
    }

    // or this...
    function talkToCrowdsale(address theAddr) {
        Crowdsale(theAddr).someMethod();
    }
}

Nur ein paar Worte dazu, dies in Truffle zu tun (Harry hat den größten Teil der Frage beantwortet, daher liefere ich nur zusätzliche Informationen).

In Truffle ist dies kein Problem, Sie können beide Verträge gleichzeitig bereitstellen und sie in app.jsIhrer dezentralen Anwendung oder was auch immer Sie implementieren, verwenden.

Wenn Sie zwei Verträge anstelle von einem bereitstellen, führen Sie dieselben Befehle in Ihrer Befehlszeile aus, aber stellen Sie sicher, dass Sie Ihren migrationsOrdner bearbeiten, damit truffle migrateIhr zweiter Vertrag auch in der Blockchain bereitgestellt wird, wenn Sie ihn eingeben.

In Ihrem app.jsmüssen Sie Ihren zweiten Vertrag genauso initialisieren wie beim ersten Hinzufügen

$.getJSON('Second.json', function(data) {
      var SecondArtifact = data;
      App.contracts.Second = TruffleContract(SecondArtifact);

      App.contracts.Second.setProvider(App.web3Provider);

    }) 

Wenn ich zuerst den Token und dann den Crowdsale-Vertrag veröffentliche, muss ich dann die Adresse des Tokens im Crowdsale-Vertrag fest codieren?

Nein, tust du nicht. Wenn Sie Ihre Verträge in die Blockchain migrieren, sehen Sie so etwas wie

Running migration: 3_deploy_contracts.js
  Deploying Other...
  ... 0x197ae5e82bd7e3909b657df2e8d2d43d7184f58a2a05662d47c59e8244b608fd
  Other: 0xfb88de099e13c3ed21f80a7a1e49f8caecf10df6

und nach Erfolg wird die Vertragsadresse in Artefakten gespeichert und dann später in Ihren app.jsCode importiert, wie ich bereits erwähnt habe. Danach greifen Sie einfach auf Ihre Vertragsfunktionalität zu App.contracts.YourContract.

Das ist so ziemlich alles, was ich hinzufügen wollte.

Wenn Sie Ihre Verträge testen, müssen Sie immer noch beide "Dateien" anfordern.

Zum Beispiel habe ich zwei Verträge, NppToken und CrowdSale, in einer Datei, NppToken.sol. Das schreibe ich oben in meine Tests: var token = artifacts.require("./NppToken.sol"); var ico = artifacts.require("./CrowdSale.sol");

Hinter den Kulissen sieht Truffle „./CrowdSale.sol“ und sucht im Ordner „/build/contracts“ nach CrowdSale.json. Es spielt keine Rolle, dass es keine CrowdSale.sol-Datei gibt, solange CrowdSale.json existiert.