Hardhat-deploy: Proxy-Verträge MÜSSEN eine Art Validierung haben

Erstellt am 24. Juni 2021  ·  2Kommentare  ·  Quelle: wighawag/hardhat-deploy

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.

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:

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 (?)

Alle 2 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen