Hardhat-deploy: Os contratos proxy PRECISAM ter algum tipo de validação

Criado em 24 jun. 2021  ·  2Comentários  ·  Fonte: wighawag/hardhat-deploy

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.

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:

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

Todos 2 comentários

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

Esta página foi útil?
0 / 5 - 0 avaliações