Speichern der Vertragsadresse nach der Bereitstellung mit Truffle

Um meinen Entwicklungszyklus zu automatisieren, möchte ich die Adressen der bereitgestellten Verträge speichern, damit meine DApp diese Informationen lesen kann und weiß, wo sich die Verträge in meiner privaten Blockchain befinden:

So sieht beispielsweise mein Truffle-Migrationsskript aus:

const fs  = require('fs');
var  FunnyToken = artifacts.require("FunnyToken");
var  TokenSale = artifacts.require("TokenSale");
var storage = {};
module.exports  = function(deployer, network, accounts) {
    deployer.deploy(FunnyToken, 1000000000000)
        .then(function(){
            storage.TOKEN_ADDRESS = FunnyToken.address;
            deployer.deploy(TokenSale, 1, accounts[0], FunnyToken.address).then(function () {
                storage.SALE_ADDRESS = TokenSale.address;
            });
        });

    console.log("adresses:")
    console.log(storage)
    fs.writeFileSync('.address.json',JSON.stringify(storage), 'utf-8');
};

Aber das .address.jsonso generierte enthält einfach ein leeres Objekt: {}.

Auf der DApp-Seite möchte ich eine Verbindung zur Adresse des Vertrags herstellen

web3.eth.contract(address=contract_address, abi=contract_abi)

Ich sollte auch erwähnen, dass ich Python und web3.py verwende, um die DApp zu schreiben. Idealerweise sollten die Adressinformationen also in einer Datei gespeichert werden, die von der Python-Anwendung gelesen werden kann.

Was ist das empfohlene Muster dafür?

Der Code für die Python-DApp (einschließlich der vorgeschlagenen Lösung)

Hast du dir Trüffel angesehen? Dabei kann es Ihnen helfen: truffleframework.com/docs/truffle/getting-started/…
@XavierLeprêtreB9lab Ich verwende Trüffel.

Antworten (3)

Truffle erstellt .json-Dateien im build/-Verzeichnis. Für jeden Vertrag gibt es eine Datei, die die Adresse des bereitgestellten Vertrags enthält. Sie haben build/contracts/MetaCoin.jsondarin einen Abschnitt "Netzwerke", der ein Wörterbuch ist, das die Netzwerk-ID der Vertragsadresse zuordnet.

Sie können die Sprache Ihrer Wahl verwenden, um diese Dateien zu verarbeiten und eine Konfigurationsdatei mit den gewünschten Adressen zu generieren.

Eine weitere Option besteht darin, ein Migrationsskript hinzuzufügen, das nach allen vorherigen Phasen ausgeführt wird. Dieses Skript schreibt die Adressen des Vertrags in eine Konfigurationsdatei Ihrer Wahl.

Erstellen Sie eine Datei mit dem Namen 9_final_step.js im Migrationsverzeichnis

var ConvertLib = artifacts.require("./ConvertLib.sol");
var MetaCoin = artifacts.require("./MetaCoin.sol");

module.exports = function(deployer) {
  // Output to console or a configuration file
  console.log({
    MetaCoin: MetaCoin.address,
    ConvertLib: ConvertLib.address,
  });
};
Die JSON-Dateien in build/contracts sind das Ergebnis der Vertragskompilierung und nicht der Bereitstellung. sie enthalten also keine Information über die Adresse, an die der Vertrag geliefert wird.
Ich werde das Beispiel mit einer Illustration aktualisieren, warum dies nicht funktioniert
Ich verwende diese Funktion ständig, während der Migrationen werden die Artefakte mit der Bereitstellungsadresse aktualisiert. Am Ende der Artefakte befindet sich ein Abschnitt „Netzwerke“, der die Bereitstellungsadresse enthält.
@fccoelho Möglicherweise gibt es einen Fehler in Ihren Migrationsskripten, der dazu führt, dass Truffle Vertragsartefakte nicht aktualisiert.
Sie haben Recht, es gibt einen Fehler in der Bereitstellung des TokenSale-Vertrags, der verhindert, dass Truffle die Artefakte aktualisiert.
Mir fehlte die Rückgabe für die Deployer-Objekte.

Abgesehen davon, dass Truffle die JSON-Dateien aktualisiert, .address.jsonenthält Ihre nur eine , {}weil Sie fs.writeFileSynczu früh.

Sie sehen, das Deployer-Ding, das Sie geschrieben haben, ist eine Versprechenskette, und die storageInformationen sind erst fertig, wenn alle .thens ausgelöst haben. Also musst du deine fs.writeFileSyncnach all dem gefeuert haben. Beachten Sie die vielen returns:


return deployer.deploy(FunnyToken, 1000000000000)
    .then(() => {
        storage.TOKEN_ADDRESS = FunnyToken.address;
        return deployer.deploy(TokenSale, 1,...);
    })
    .then(() => {
        storage.SALE_ADDRESS = TokenSale.address;
        fs.writeFileSync('.address.json',JSON.stringify(storage), 'utf-8');
    });
Ja, das ist mir nach einiger Zeit aufgefallen. Auf jeden Fall habe ich mich entschieden, die JSON-Dateien zu verwenden, anstatt eine neue Datei zu generieren. Danke.

Es gibt eine einfache Möglichkeit, die Vertragsadresse abzurufen: Lesen Sie das JSON, das von generiert wurde, truffle migrateund rufen Sie den letzten networksEreigniseintrag wie folgt ab:

let contractAddress = await fetch('/build/contracts/ContractName.json')
        .then(response => response.json())
        .then(data => {
            let lastEvent = Object.keys(data.networks).pop();
            data.networks[lastEvent].address;
        });

Ich hoffe es hilft!