Para automatizar mi ciclo de desarrollo, quiero guardar las direcciones de los contratos implementados para que mi DApp pueda leer esta información y saber dónde encontrar los contratos en mi cadena de bloques privada:
por ejemplo, así es como se ve mi secuencia de comandos de migración de trufas:
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');
};
Pero el .address.json
generado de esta manera contiene simplemente un objeto vacío: {}
.
En el lado DApp, quiero conectarme a la dirección del Contrato
web3.eth.contract(address=contract_address, abi=contract_abi)
También debo mencionar que estoy usando Python y web3.py para escribir la DApp. De modo que, idealmente, la información de la dirección debería almacenarse en un archivo para ser leído por la aplicación Python.
¿Cuál es el patrón recomendado para esto?
El código para Python DApp (Incluyendo la solución propuesta)
Truffle crea archivos .json dentro del directorio build/. Hay un archivo para cada contrato, contienen la dirección del contrato implementado. Dentro hay build/contracts/MetaCoin.json
una sección "redes" que es un diccionario que asigna la identificación de la red a la dirección del contrato.
Puede utilizar el idioma de su elección para procesar estos archivos y generar un archivo de configuración con las direcciones que desee.
Otra opción es agregar un script de migración que se ejecutará después de todas las etapas anteriores. Este script escribirá las direcciones del contrato en un archivo de configuración de su elección.
Cree un archivo llamado 9_final_step.js en el directorio de migraciones
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,
});
};
Además del hecho de que Truffle actualiza los archivos JSON, .address.json
contiene solo un {}
porque es fs.writeFileSync
demasiado pronto.
Verá, la cosa del implementador que escribió es una cadena de promesas y la storage
información está lista solo cuando todos los correos electrónicos se .then
han disparado. Así que tienes que poner tu fs.writeFileSync
después de que todos hayan disparado. Observe los muchos 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');
});
Hay una manera fácil de obtener la dirección del contrato: lea el JSON generado por truffle migrate
y obtenga la entrada del último networks
evento, de la siguiente manera:
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;
});
¡Espero eso ayude!
Xavier Leprêtre B9lab
fcoelho