Скажем, у меня есть два контракта, оракул и ридер. Как мне протестировать (или даже развернуть) их обоих?
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;
}
}
Итак, поскольку читателю нужен адрес Oracle в начальной функции, есть ли способ сделать это в Truffle (как выглядит deploy_contracts.js?) И как я просто пишу тесты, чтобы увидеть, могу ли я хранить документы, а затем читать их ?
Вы развертываете Oracle, а затем у вас есть Oracle.deployed()
.
Вы рассказываете Reader
об Oracle с помощью конструктора, как вы это сделали. Вы говорите Truffle заполнить параметр требования в миграции, например 2_deploy_contracts.js
.
Например, что-то вроде:
var oracle;
Oracle.deployed()
.then(function(instance) {
oracle = instance;
deployer.deploy(Reader, oracle}); // this is where you pass it in
});
Я почти уверен, что нарушил синтаксис в этом (я просто говорю по звуку), но это должно дать вам общее представление. Главный вывод: они дают вам возможность передать необходимые параметры конструктора.
Надеюсь, поможет.
Я предпочитаю этот синтаксис:
module.exports = function(deployer, network, accounts) {
deployer.then(async () => {
await deployer.deploy(A);
await deployer.deploy(B, A.address);
//...
});
};
так как это более читабельно, когда у вас много контрактов.
См. также: https://github.com/trufflesuite/truffle/issues/501#issuecomment-373886205 .
Вы также можете использовать Oracle.address
непосредственно для развертывания Reader.
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);
});
Надеюсь, вы найдете это полезным.
фетт
Роб Хитченс
function setOracle(address _oracle) onlyOwner ...
для сложных систем взаимосвязанных контрактов. Просто кажется чище.2_deploy_contracts.js
просто запускает их легко/просто, а затем3_set_params.js
просто делает все необходимое для отправки транзакций для завершения начальной настройки.