Развертывание нескольких контрактов с зависимостями — Truffle

Скажем, у меня есть два контракта, оракул и ридер. Как мне протестировать (или даже развернуть) их обоих?

    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?) И как я просто пишу тесты, чтобы увидеть, могу ли я хранить документы, а затем читать их ?

Ответы (3)

Вы развертываете 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
});

Я почти уверен, что нарушил синтаксис в этом (я просто говорю по звуку), но это должно дать вам общее представление. Главный вывод: они дают вам возможность передать необходимые параметры конструктора.

Надеюсь, поможет.

Потрясающе, как раз то, что я искал. Спасибо за вашу помощь. Я также видел эту структуру для получения адресов. Есть ли исходник, в котором выложен метод развертывания?
На практике я добавил function setOracle(address _oracle) onlyOwner ...для сложных систем взаимосвязанных контрактов. Просто кажется чище. 2_deploy_contracts.jsпросто запускает их легко/просто, а затем 3_set_params.jsпросто делает все необходимое для отправки транзакций для завершения начальной настройки.

Я предпочитаю этот синтаксис:

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);
});

Надеюсь, вы найдете это полезным.