Por el momento, si intenta implementar un contrato de proxy con una implementación que tiene una estructura no válida, aún tendrá éxito.
Por ejemplo, este contrato se implementará bien:
contract Foo {
uint public b;
uint public c = 5;
constructor(a uint) {
b = a;
}
}
Pero este contrato no es válido cuando se implementa desde un proxy. Porque cualquier proxy que se relacione con esta implementación no tendrá las variables c
o b
establecidas. Creo que debería arrojar un error aquí si el usuario intenta implementar esto o al menos algún tipo de advertencia.
También está relacionado con la actualización de proxies: las colisiones de almacenamiento causan errores no triviales. Obviamente, es más difícil verificar esto porque una actualización podría ocurrir en un punto distante en el futuro.
Implementación anterior:
contract Foo {
uint public b = 5;
};
Nueva implementación:
// 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
}
Sería útil tener una función que verifique que el nuevo contrato no entre en conflicto con el almacenamiento de contratos antiguos y sea una actualización de proxy válida.
// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");
OpenZeppelin tiene una verificación similar, pero está incorporada en su función de implementación, por lo que no es útil aquí en hardhat-deploy, aunque su código de verificación probablemente se pueda reutilizar en su mayoría (?)
Definitivamente querido :), esto también se mencionó aquí: https://github.com/wighawag/hardhat-deploy/issues/65
Comentario más útil
También está relacionado con la actualización de proxies: las colisiones de almacenamiento causan errores no triviales. Obviamente, es más difícil verificar esto porque una actualización podría ocurrir en un punto distante en el futuro.
Implementación anterior:
Nueva implementación:
Sería útil tener una función que verifique que el nuevo contrato no entre en conflicto con el almacenamiento de contratos antiguos y sea una actualización de proxy válida.
OpenZeppelin tiene una verificación similar, pero está incorporada en su función de implementación, por lo que no es útil aquí en hardhat-deploy, aunque su código de verificación probablemente se pueda reutilizar en su mayoría (?)