Stellen Sie mehrere Verträge mit Abhängigkeiten bereit – Truffle

Angenommen, ich habe zwei Verträge, ein Orakel und einen Leser. Wie kann ich beide testen (oder sogar bereitstellen)?

    contract Oracle {
        struct DocumentStruct{bytes32 name; uint value;}
        mapping(bytes32 => DocumentStruct) public documentStructs;

        function StoreDocument(bytes32 key,bytes32 name, uint value) returns (bool success) {
            documentStructs[key].value = value;
            documentStructs[key].name = name;
            return true;
        }
    }

contract Reader {
      address public oracleID;
      Oracle d;
  function Reader(address OAddress){
      d = Oracle(OAddress);
      oracleID = OAddress;
          }
 struct DocumentStruct{bytes32 name; uint value;}
  function RetrieveData(bytes32 key) public constant returns(uint) {
    DocumentStruct memory doc;
    (doc.name,doc.value) = d.documentStructs(key);
    return doc.value;
  }
    }

Da der Leser also eine Oracle-Adresse in der Startfunktion benötigt, gibt es eine Möglichkeit, dies in Truffle zu tun (wie sieht die deploy_contracts.js aus?) Und wie ich einfach Tests schreibe, um zu sehen, ob ich Dokumente speichern und dann lesen kann ?

Antworten (3)

Sie stellen das Oracle bereit, und dann haben Sie Oracle.deployed().

Sie sagen das Readerüber Oracle mit dem Konstruktor, wie Sie es getan haben. Sie weisen Truffle an, den Anforderungsparameter in den Migrationen auszufüllen, z 2_deploy_contracts.js.

Zum Beispiel so etwas wie:

var oracle;
Oracle.deployed()
.then(function(instance) { 
  oracle = instance; 
  deployer.deploy(Reader, oracle}); // this is where you pass it in
});

Ich bin mir ziemlich sicher, dass ich die Syntax in diesem Fall vermasselt habe (ich gehe nur nach Ton), aber das sollte Ihnen die allgemeine Vorstellung vermitteln. Hauptsache, sie geben Ihnen die Möglichkeit, die erforderlichen Konstruktorparameter zu übergeben.

Ich hoffe es hilft.

Super, genau das was ich gesucht habe. Vielen Dank für Ihre Hilfe. Ich habe diese Struktur auch zum Abrufen von Adressen gesehen. Gibt es eine Quelle, die die Deployer-Methode ausgelegt hat?
In der Praxis habe ich function setOracle(address _oracle) onlyOwner ...für komplexe Systeme ineinandergreifende Verträge hinzugefügt. Es wirkt einfach sauberer. 2_deploy_contracts.jsfeuert sie einfach einfach aus und 3_set_params.jstut dann alles, was zum Senden von Transaktionen erforderlich ist, um die Ersteinrichtung abzuschließen.

Ich bevorzuge diese Syntax:

module.exports = function(deployer, network, accounts) {

    deployer.then(async () => {
        await deployer.deploy(A);
        await deployer.deploy(B, A.address);
        //...
    });
};

da es viel besser lesbar ist, wenn Sie viele Verträge haben.

Siehe auch: https://github.com/trufflesuite/truffle/issues/501#issuecomment-373886205

Sie können Oracle.addressReader auch direkt bereitstellen.

var Oracle = artifacts.require("./path/to/Oracle.sol");
var Reader = artifacts.require("./path/to/Reader.sol");

deployer.deploy(Oracle)
.then(function() {
  return deployer.deploy(Reader, Oracle.address);
});

Ich hoffe, Sie finden das nützlich.