Tengo un contrato llamado AccessControl, en el que se establece el propietario del contrato cuando se implementa.
Quiero probar que el método en él se setCEO
actualiza correctamente, pero para hacer esto, la solicitud debe provenir del propietario del contrato.
contract AccessControl {
address public ceoAddress;
modifier onlyCEO() {
require(msg.sender == ceoAddress);
_;
}
function setCEO(address _newCEO) external onlyCEO {
require(_newCEO != address(0));
ceoAddress = _newCEO;
}
}
Cuando consola.log en las pruebas, la dirección actual del director general es así:
const paymentPipe = await PaymentPipe.deployed();
console.log(await paymentPipe.ceoAddress());
Veo que la dirección es 0x00000000000000000000000000000000000000000.
Cuando intento llamar a setCEO en mis pruebas desde esa cuenta así:
await paymentPipe.setCEO(bob, {from: contractAddress});
Trufa se queja:
Error: cuenta del remitente no reconocida
Si pruebo con cualquier otra cuenta en el conjunto de pruebas de trufas (es decir, cuentas [x]), obtengo:
Error: Excepción de máquina virtual al procesar la transacción: revertir
Lo que implica que el método no pasó la declaración requerida porque la dirección de llamada no era la establecida como CEO.
¿Desde qué dirección se despliegan los contratos en el conjunto de pruebas de trufas? ¿Y por qué, si puedo ver una dirección en mi contrato como 0x00000000000000000000000000000000000000000 no puedo usar esta dirección para llamar funciones?
Creo que su problema aparece porque ceoAddress
no se inicializó correctamente y tendrá el valor de 0x0000000000000000000000000000000000000000
.
Ahora para cambiarlo lo exige el contrato msg.sender == ceoAddress
, esto implica que msg.sender
debe ser 0x0000000000000000000000000000000000000000
. Esta operación no se puede realizar porque no tiene la clave privada que genera dicha dirección.
Una opción es inicializar su variable en el constructor con la cuenta del remitente
contract AccessControl {
address public ceoAddress;
modifier onlyCEO() {
require(msg.sender == ceoAddress);
_;
}
constructor() {
// ---- Initialize ceoAddress ----
ceoAddress = msg.sender;
}
function setCEO(address _newCEO) external onlyCEO {
require(_newCEO != address(0));
ceoAddress = _newCEO;
}
}
Truffle usa la primera dirección devuelta por eth.accounts
para implementar contratos.
module.exports = function(deployer, network, accounts) {
// You can pass other parameters like gas or change the from
deployer.deploy(AccessControl, { from: accounts[2] });
}
Consulte la documentación de Truffle para ver más opciones de uso.
Richard Horrocks
ceoAddress
comomsg.sender
?Aprendizaje colaborativo