Wenn Sie derzeit versuchen, einen Proxy-Vertrag mit einer Implementierung mit ungültiger Struktur bereitzustellen, wird dies dennoch erfolgreich sein.
Zum Beispiel wird dieser Vertrag gut bereitgestellt:
contract Foo {
uint public b;
uint public c = 5;
constructor(a uint) {
b = a;
}
}
Dieser Vertrag ist jedoch ungültig, wenn er von einem Proxy bereitgestellt wird. Weil für jeden Proxy, der an diese Implementierung weiterleitet, die Variablen c
oder b
festgelegt sind. Ich denke, es sollte hier einen Fehler auslösen, wenn der Benutzer versucht, dies oder zumindest eine Art Warnung bereitzustellen.
Ebenfalls verwandt ist das Upgrade von Proxys - Speicherkollisionen verursachen nicht triviale Fehler. Offensichtlich ist es schwieriger, dies zu überprüfen, da ein Upgrade zu einem entfernten Zeitpunkt in der Zukunft erfolgen könnte.
Alte Implementierung:
contract Foo {
uint public b = 5;
};
Neue Implementierung:
// Incorrect
contract Bar {
uint public c; // Collision here! - value is actually set to 5 not 0
}
// Correct
contract Bar {
uint public b; // value is 5 as expected
uint public c; // value is 0
}
Es wäre nützlich, eine Funktion zu haben, die prüft, ob der neue Vertrag nicht mit dem Speicher der alten Verträge in Konflikt steht und ein gültiges Proxy-Upgrade ist.
// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");
OpenZeppelin hat eine ähnliche Prüfung, aber sie ist in ihre Deploy-Funktion integriert, so dass sie hier beim Hardhat-Deploy keinen Nutzen hat, obwohl ihr Verifizierungscode wahrscheinlich größtenteils wiederverwendet werden kann (?)
Auf jeden Fall gewollt :), das wurde hier auch erwähnt: https://github.com/wighawag/hardhat-deploy/issues/65
Hilfreichster Kommentar
Ebenfalls verwandt ist das Upgrade von Proxys - Speicherkollisionen verursachen nicht triviale Fehler. Offensichtlich ist es schwieriger, dies zu überprüfen, da ein Upgrade zu einem entfernten Zeitpunkt in der Zukunft erfolgen könnte.
Alte Implementierung:
Neue Implementierung:
Es wäre nützlich, eine Funktion zu haben, die prüft, ob der neue Vertrag nicht mit dem Speicher der alten Verträge in Konflikt steht und ein gültiges Proxy-Upgrade ist.
OpenZeppelin hat eine ähnliche Prüfung, aber sie ist in ihre Deploy-Funktion integriert, so dass sie hier beim Hardhat-Deploy keinen Nutzen hat, obwohl ihr Verifizierungscode wahrscheinlich größtenteils wiederverwendet werden kann (?)