Welche Adresse setzt ein Vertrag im Trüffeltest ein

Ich habe einen Vertrag namens AccessControl, in dem der Eigentümer des Vertrags festgelegt wird, wenn er bereitgestellt wird.

Ich möchte testen, ob die Methode darauf setCEOkorrekt aktualisiert wird, aber dazu muss die Anfrage vom Eigentümer des Vertrags kommen.

contract AccessControl {

    address public ceoAddress;

    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    function setCEO(address _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }
}

Wenn ich mich in die Console.log einlogge testet die aktuelle ceoAddress so:

const paymentPipe = await PaymentPipe.deployed();
console.log(await paymentPipe.ceoAddress());

Ich sehe, dass die Adresse 0x000000000000000000000000000000000000000 ist.

Wenn ich versuche, setCEO in meinen Tests von diesem Konto aus so anzurufen:

await paymentPipe.setCEO(bob, {from: contractAddress});

Trüffel klagt:

Fehler: Absenderkonto nicht erkannt

Wenn ich es mit einem anderen Konto in der Trüffel-Testsuite versuche (z. B. Konten [x]), erhalte ich:

Fehler: VM-Ausnahme beim Verarbeiten der Transaktion: Zurücksetzen

Dies impliziert, dass die Methode die require-Anweisung nicht bestanden hat, da die aufrufende Adresse nicht die als CEO festgelegte war.

Von welcher Adresse aus werden Verträge in der Truffle Test Suite bereitgestellt? Und warum, wenn ich in meinem Vertrag eine Adresse als 0x000000000000000000000000000000000000000 sehen kann, kann ich diese Adresse nicht zum Aufrufen von Funktionen verwenden?

Hi. Nur zur Überprüfung, weil es nicht in Ihrem Vertragsausschnitt enthalten ist: Enthält Ihr Vertrag einen Konstruktor, und sind Sie sicher, dass er ceoAddressals festgelegt ist msg.sender?
@RichardHorrocks danke, das war tatsächlich das Problem!

Antworten (1)

Ich denke, Ihr Problem tritt auf, weil ceoAddresses nicht richtig initialisiert ist und den Wert von 0x0000000000000000000000000000000000000000.

Nun verlangt der Vertrag eine Änderung msg.sender == ceoAddress, dies impliziert, dass msg.senderdas sein sollte 0x0000000000000000000000000000000000000000. Dieser Vorgang kann nicht ausgeführt werden, da Sie nicht über den privaten Schlüssel verfügen, der eine solche Adresse generiert.

Eine Möglichkeit besteht darin, Ihre Variable im Konstruktor mit dem Absenderkonto zu initialisieren

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 verwendet die erste von zurückgegebene Adresse eth.accounts, um Verträge bereitzustellen.

2_deploy_contracts.js

module.exports = function(deployer, network, accounts) {
    // You can pass other parameters like gas or change the from
    deployer.deploy(AccessControl, { from: accounts[2] });
}

Weitere Optionen finden Sie in der Truffle -Dokumentation .