¿Qué dirección despliega un contrato en la prueba de la trufa?

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 setCEOactualiza 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?

Hola. Solo para verificar, porque no está incluido en el fragmento de su contrato: ¿su contrato incluye un constructor y está seguro de que se establece ceoAddresscomo msg.sender?
@RichardHorrocks gracias, ¡este era realmente el problema!

Respuestas (1)

Creo que su problema aparece porque ceoAddressno se inicializó correctamente y tendrá el valor de 0x0000000000000000000000000000000000000000.

Ahora para cambiarlo lo exige el contrato msg.sender == ceoAddress, esto implica que msg.senderdebe 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.accountspara implementar contratos.

2_deploy_contratos.js

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.