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 ?
Implementa Oracle y luego tiene Oracle.deployed()
.
Habla Reader
sobre 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.
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.address
directamente 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.
el feto
Rob Hitchens
function setOracle(address _oracle) onlyOwner ...
para sistemas complejos de contratos entrelazados. Simplemente parece más limpio.2_deploy_contracts.js
simplemente los dispara fácilmente/simplemente, y luego3_set_params.js
hace lo que sea necesario para enviar transacciones para completar la configuración inicial.