web-dev-qa-db-fra.com

Obtenir l'adresse d'un contrat déployé par un autre contrat

J'essaie de déployer un contrat provenant d'un autre contrat d'usine, puis de renvoyer l'adresse du contrat nouvellement créé. L'adresse qu'il renvoie est toutefois la transaction hash pas l'adresse du contrat. Je pense que c'est parce que le contrat n'est pas encore miné lorsque l'adresse est renvoyée. Lorsque je déploie un contrat à l'aide du déploiement Web3, il semble attendre que le contrat soit déployé avant de générer l'adresse.

Le contrat d'usine:

contract Factory {
mapping(uint256 => Contract) deployedContracts;
uint256 numContracts;
function Factory(){
    numContracts = 0;
}

function createContract (uint32 name) returns (address){
    deployedContracts[numContracts] = new Contract(name);
    numContracts++;
    return deployedContracts[numContracts];
}}

C'est ainsi que j'appelle la fonction createContract.

factory.createContract(2,function(err, res){
        if (err){
            console.log(err)
        }else{
        console.log(res)
        }
    });
7
Joe

Prenons l'exemple ci-dessous. Vous pouvez obtenir l'adresse du contrat de plusieurs manières:

contract Object {

    string name;
    function Object(String _name) {
        name = _name
    }
}

contract ObjectFactory {
    function createObject(string name) returns (address objectAddress) {
        return address(new Object(name));
    }
}

1 Enregistrez l'adresse et renvoyez-la:

Stockez l'adresse dans le contrat en tant qu'attribut et récupérez-la à l'aide d'une méthode de lecture normale.

contract ObjectFactory {
    Object public theObj;

    function createObject(string name) returns (address objectAddress) {
        theObj = address(new Object(name));
        return theObj;
    }
}

2 Call Avant de faire une transaction

Vous pouvez faire un call avant de faire une transaction:

var address = web3.eth.contract(objectFactoryAbi)
    .at(contractFactoryAddress)
    .createObject.call("object");

Une fois que vous avez l'adresse, effectuez la transaction:

var txHash = web3.eth.contract(objectFactoryAbi)
    .at(contractFactoryAddress)
    .createObject("object", { gas: price, from: accountAddress });

3 Calculer l'adresse future

Sinon, vous pouvez calculer l'adresse du futur contrat comme suit:

var ethJsUtil = require('ethereumjs-util');
var futureAddress = ethJsUtil.bufferToHex(ethJsUtil.generateAddress(
      contractFactoryAddress,
      await web3.eth.getTransactionCount(contractFactoryAddress)));
15

Nous avons rencontré ce problème aujourd'hui et nous le résolvons comme suit:

Dans la création du nouveau contrat, soulevez un événement.

Ensuite, une fois le bloc exploité, utilisez le hachage de transaction et appelez web3.eth.getTransaction: http://web3js.readthedocs.io/fr/1.0/web3-eth.html#gettransaction

Regardez ensuite l'objet logs et vous devriez trouver l'événement appelé par votre contrat nouvellement créé avec son adresse.

Remarque: cela suppose que vous puissiez mettre à jour le code Solidity pour le contrat en cours de création ou qu'il appelle déjà un tel événement lors de sa création.

1