No momento, se você tentar implantar um contrato de proxy com uma implementação que possui uma estrutura inválida, ainda assim terá sucesso.
Por exemplo, este contrato irá implantar bem:
contract Foo {
uint public b;
uint public c = 5;
constructor(a uint) {
b = a;
}
}
Mas este contrato é inválido quando implantado a partir de um proxy. Porque qualquer proxy retransmitindo para esta implementação não terá as variáveis c
ou b
definidas. Acho que deve lançar um erro aqui se o usuário tentar implantar isso ou pelo menos algum tipo de aviso.
Também relacionado, está na atualização de proxies - colisões de armazenamento causam erros não triviais. Obviamente, é mais difícil verificar isso porque uma atualização pode acontecer em um ponto distante no futuro.
Implementação antiga:
contract Foo {
uint public b = 5;
};
Nova implementação:
// 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
}
Seria útil ter uma função que verifique se o novo contrato não está em conflito com o armazenamento de contratos antigos e se é uma atualização de proxy válida.
// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");
O OpenZeppelin tem uma verificação semelhante, mas está embutido em sua função de implantação, portanto, não é útil aqui no hardware-implantação, embora seu código de verificação provavelmente possa ser reutilizado na maior parte (?)
Definitivamente desejado :), isso também foi mencionado aqui: https://github.com/wighawag/hardhat-deploy/issues/65
Comentários muito úteis
Também relacionado, está na atualização de proxies - colisões de armazenamento causam erros não triviais. Obviamente, é mais difícil verificar isso porque uma atualização pode acontecer em um ponto distante no futuro.
Implementação antiga:
Nova implementação:
Seria útil ter uma função que verifique se o novo contrato não está em conflito com o armazenamento de contratos antigos e se é uma atualização de proxy válida.
O OpenZeppelin tem uma verificação semelhante, mas está embutido em sua função de implantação, portanto, não é útil aqui no hardware-implantação, embora seu código de verificação provavelmente possa ser reutilizado na maior parte (?)