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?
Eine Möglichkeit, dies über die Truffle-Migrationsdateien zu erreichen, besteht darin, den Vertrag Two
so 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 One
und Two
dann aufrufen, Two
um die Adresse von One
mit 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 setAddress
Funktion aufrufen kann, um zu verhindern, dass böswillige Akteure Ihren Vertrag brechen. onlyOwner
Idealerweise wäre es nur Transaktionen von autorisierten Adressen erlaubt, diese Funktion mit einer Art oder onlyAdmin
Modifikator aufzurufen
Ü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]');
im Jahr 2020 (Trüffelversion 5.x) erhalten Sie nach der Bereitstellung des Vertrags möglicherweise seine Adresse in der JSON-Datei:
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
Aaron Digulla