Truffle-Migration: Bereitgestellte Vertragsadresse in Variable speichern

Wie kann ich die Adresse eines bereitgestellten Vertrags in einer Variablen eines anderen Vertrags speichern, zB mit einem Platzhalter?

contract One{ 
   function One(){
   }
}

contract Two{
   address oneAdd = "Put Contract One address here automatically?!";
   function Two(){
   }
}

Ist das durch Bearbeiten der Migrationsdatei von Truffle möglich?

Antworten (3)

Eine Möglichkeit, dies über die Truffle-Migrationsdateien zu erreichen, besteht darin, den Vertrag Twoso zu ändern, dass sein Konstruktor eine Adresse als Eingabe verwendet und als speichert oneAdd, und dann die Verträge mit der folgenden Migrationsdatei bereitzustellen:

var One = artifacts.require("./One.sol");
var Two = artifacts.require("./Two.sol");

module.exports = (deployer, network) => {
  deployer.deploy(One).then(function() {
    return deployer.deploy(Two, One.address)
  });
};

Alternativ können Sie zunächst eine Funktion bereitstellen Oneund Twodann aufrufen, Twoum die Adresse von Onemit einer asynchronen Migration wie folgt festzulegen:

var One = artifacts.require('./One.sol');
var Two = artifacts.require('./Two.sol');

module.exports = async(deployer) => {
    let deployOne = await deployer.deploy(One);
    let deployTwo = await deployer.deploy(Two);
    contractTwo = await Two.deployed()
    let setAddress = await contractTwo.setAddress(
        One.address,
        { gas: 200000 }
    );
  };

Beachten Sie, dass Sie bei Auswahl dieser Option sorgfältig darüber nachdenken müssen, wer die setAddressFunktion aufrufen kann, um zu verhindern, dass böswillige Akteure Ihren Vertrag brechen. onlyOwnerIdealerweise wäre es nur Transaktionen von autorisierten Adressen erlaubt, diese Funktion mit einer Art oder onlyAdminModifikator aufzurufen

Ich sehe, wie das funktioniert. Gibt es eine Lösung ohne den Konstruktor zu verwenden?
Ja - ich habe meine Antwort aktualisiert, um zu zeigen, wie dies möglich ist
Für mich erwies sich der zweite in der Antwort angegebene Codeblock als verständlicher.

Übergeben Sie es einfach durch den Konstruktor

pragma solidity ^0.4.23;


contract Two {
   address oneAdd;

   constructor(address _contractAddress) public {
      oneAdd = _contractAddress;
   }
}

oder noch besser

pragma solidity ^0.4.23;

contract One{ 
   function One(){
   }
}
contract Two {
   One one;

   constructor(address _contractAddress) public {
      one = One(_contractAddress);
   }
}

Wenn Sie den Vertrag über Truffle oder Web3 bereitstellen, müssen Sie die Adresse des ersten Vertrags im Konstruktor des zweiten Vertrags angeben.

Wenn Sie dies über Trüffelmigrationen tun, ist dies die Syntax

deployer.deploy(Two, '[one_address]');
Ich sehe, wie das funktioniert. Gibt es eine Lösung ohne den Konstruktor zu verwenden?
nein, es sei denn, Sie legen die Adresse manuell in Ihrem Vertrag fest.

im Jahr 2020 (Trüffelversion 5.x) erhalten Sie nach der Bereitstellung des Vertrags möglicherweise seine Adresse in der JSON-Datei:

Geben Sie hier die Bildbeschreibung ein

Sie können auch alle Verträge auflisten, die Sie mit diesem Befehl bereitgestellt haben:

$ truffle networks

Network: goerli (id: 5)
  Migrations: 0x306d1652867332aD51b9E2B321f6AE2395A6EA00
  MyTestNft: 0x494B51eA8c1a6e9994274141977186c809c68fb5