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.json
so 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)
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.json
darin 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,
});
};
Abgesehen davon, dass Truffle die JSON-Dateien aktualisiert, .address.json
enthält Ihre nur eine , {}
weil Sie fs.writeFileSync
zu früh.
Sie sehen, das Deployer-Ding, das Sie geschrieben haben, ist eine Versprechenskette, und die storage
Informationen sind erst fertig, wenn alle .then
s ausgelöst haben. Also musst du deine fs.writeFileSync
nach all dem gefeuert haben. Beachten Sie die vielen return
s:
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');
});
Es gibt eine einfache Möglichkeit, die Vertragsadresse abzurufen: Lesen Sie das JSON, das von generiert wurde, truffle migrate
und rufen Sie den letzten networks
Ereigniseintrag 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!
Xavier Leprêtre B9lab
fccoelho