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 setCEO
korrekt 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?
Ich denke, Ihr Problem tritt auf, weil ceoAddress
es nicht richtig initialisiert ist und den Wert von 0x0000000000000000000000000000000000000000
.
Nun verlangt der Vertrag eine Änderung msg.sender == ceoAddress
, dies impliziert, dass msg.sender
das 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.
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 .
Richard Horrocks
ceoAddress
als festgelegt istmsg.sender
?Kollaborativer Lernender