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 ?
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.
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.address
Reader 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.
das Fett
Rob Hitchens
function setOracle(address _oracle) onlyOwner ...
für komplexe Systeme ineinandergreifende Verträge hinzugefügt. Es wirkt einfach sauberer.2_deploy_contracts.js
feuert sie einfach einfach aus und3_set_params.js
tut dann alles, was zum Senden von Transaktionen erforderlich ist, um die Ersteinrichtung abzuschließen.