was genau macht `deploy.link` in `truffle`

Bitte erläutern Sie Anwendungsfälle für die deploy.link()Funktion bei Migrationen im Truffle-Framework. Wie würden Sie es verwenden und wofür.

Antworten (4)

BEARBEITEN: Wie im Kommentar von @feihcsim angegeben, autolinkwurde es abgelehnt

Nehmen wir an, das Ökosystem Ihrer DAPP verfügt über eine Bibliothek und einen Vertrag, der Funktionen aus dieser Bibliothek aufruft. Also hast du:

library Converter {
    function weiToEther() returns (uint256) { //return ether value }
}

Dann hast du Vertrag:

import "Converter.sol";

contract MainContract {
    function getBalanceInEth() returns (uint256) {
        return Converter.weiToEther(this.balance);
    }
}

Damit das MainContractfunktioniert, benötigen Sie also zunächst eine Bibliothek, die in der Kette bereitgestellt wird, und MainContractmüssen auch die Adresse dieser Bibliothek kennen. Um dies explizit zu tun, verwenden Sie:

module.exports = function(deployer) {
    deployer.deploy(Converter);
    deployer.link(Converter, MainContract);
    deployer.deploy(MainContract);
};

oder Sie können verwenden:

module.exports = function(deployer) {
    deployer.deploy(Converter);
    deployer.autolink();
    deployer.deploy(MainContract);
};

Viele nützliche Informationen finden Sie auch in diesem Video

autolinkist veraltet
Wäre es nicht besser, Versprechungen zu verwenden, indem Sie auf die Bereitstellung von Converter warten?
Die Funktionsweise besteht darin, dass die tatsächliche Adresse der bereitgestellten Bibliothek vor der Bereitstellung dieses Vertrags in den Bytecode des Vertrags eingefügt werden muss. Sie können also auf die asynchrone Antwort warten und sie dann an der richtigen Stelle einfügen. Schauen Sie sich beide Antworten auf die nächste Frage an, Sie können sehen, wie es funktioniert und wie es in web3 ethereum.stackexchange.com/questions/6927/… verlinkt werden kann . Meiner Meinung nach müssen Sie es nicht manuell tun, da Sie Trüffel verwenden, es sei denn, Sie haben einen triftigen Grund.

Diese Funktion fügt die angegebene Bibliothek zur linksEigenschaft des Zielvertrags hinzu. Dadurch wird sichergestellt, dass der Speicherort der bereitgestellten Bibliothek gefunden werden kann, wenn der Bytecode des Vertrags generiert wird.

Außerdem werden alle Ereignisse der Bibliothek mit dem Zielvertrag zusammengeführt.

API-Dokumentation hier: https://github.com/trufflesuite/truffle-contract#mycontractlinkinstance

Siehe Quelle hier: https://github.com/trufflesuite/truffle-contract/blob/develop/contract.js#L539

Wie oben von @feihcsim erwähnt, muss dies jetzt manuell erfolgen: https://github.com/trufflesuite/truffle-deployer/commit/52e63189453e078f64b84aa3a50a2c7991b022b4

Aus Dokumentation :

Verknüpfen Sie eine bereits bereitgestellte Bibliothek mit einem Vertrag oder mehreren Verträgen. Ziele können ein einzelner Vertrag oder ein Array aus mehreren Verträgen sein. Wenn ein Vertrag innerhalb des Ziels nicht darauf angewiesen ist, dass die Bibliothek verknüpft ist, ignoriert der Deployer diesen Vertrag.

Beispiel:

// Deploy library LibA, then link LibA to contract B, then deploy B.
deployer.deploy(LibA);
deployer.link(LibA, B);
deployer.deploy(B);

// Link LibA to many contracts
deployer.link(LibA, [B, C, D]);

Nehmen Sie zum Beispiel das Standard-Metacoin-Projekt, das mit Trüffel geliefert wird

// deploy ConvertLib into the network
deployer.deploy(ConvertLib);
// Take the deployed ConvertLib address and link it to MetaCoin contract in bytecode
deployer.link(ConvertLib, MetaCoin);
// Now deploy the linked metacoin contract to the network
deployer.deploy(MetaCoin);