Implementar múltiples contratos con dependencias - Truffle

Digamos que tengo dos contratos, un oráculo y un lector. ¿Cómo pruebo (o incluso implemento) ambos?

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

Entonces, dado que el lector necesita una dirección de Oracle en la función de inicio, ¿hay alguna manera de hacer esto en Truffle (¿cómo se ve deployment_contracts.js?) Y cómo escribo pruebas para ver si puedo almacenar documentos y luego leerlo ?

Respuestas (3)

Implementa Oracle y luego tiene Oracle.deployed().

Habla Readersobre Oracle con el constructor, como lo ha hecho. Le dice a Truffle que complete el parámetro de requisito en las migraciones, por ejemplo, 2_deploy_contracts.js.

Por ejemplo, algo como:

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

Estoy bastante seguro de que me equivoqué en la sintaxis de este (solo me baso en el sonido), pero eso debería darte una idea general. La conclusión principal es que le brindan una forma de pasar los parámetros del constructor que necesita.

Espero eso ayude.

Genial, justo lo que estaba buscando. Gracias por tu ayuda. También he visto esta estructura para obtener direcciones. ¿Hay alguna fuente que tenga el método de implementación establecido?
En la práctica, he agregado function setOracle(address _oracle) onlyOwner ...para sistemas complejos de contratos entrelazados. Simplemente parece más limpio. 2_deploy_contracts.jssimplemente los dispara fácilmente/simplemente, y luego 3_set_params.jshace lo que sea necesario para enviar transacciones para completar la configuración inicial.

Prefiero esta sintaxis:

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

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

ya que es mucho más legible cuando tienes muchos contratos.

Consulte también: https://github.com/trufflesuite/truffle/issues/501#issuecomment-373886205

También puede usar Oracle.addressdirectamente para implementar 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);
});

Espero que encuentres esto útil.