Hardhat-deploy: Les contrats de procuration DOIVENT avoir une sorte de validation

Créé le 24 juin 2021  ·  2Commentaires  ·  Source: wighawag/hardhat-deploy

Pour le moment, si vous essayez de déployer un contrat de proxy avec une implémentation dont la structure n'est pas valide, cela réussira toujours.
Par exemple, ce contrat se déploiera correctement :

contract Foo {
  uint public b;
  uint public c = 5;

  constructor(a uint) { 
    b = a; 
  }
}

Mais ce contrat n'est pas valide lorsqu'il est déployé à partir d'un proxy. Parce que tout proxy relayant vers cette implémentation n'aura pas les variables c ou b définies. Je pense que cela devrait générer une erreur ici si l'utilisateur essaie de déployer ceci ou au moins une sorte d'avertissement.

Commentaire le plus utile

La mise à niveau des proxys est également liée - Les collisions de stockage provoquent des erreurs non négligeables. Évidemment, il est plus difficile de le vérifier car une mise à niveau pourrait se produire à un moment éloigné dans le futur.

Ancienne implémentation :

contract Foo { 
  uint public b = 5;
};

Nouvelle implémentation :

// 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
}

Il serait utile d'avoir une fonction qui vérifie que le nouveau contrat n'entre pas en conflit avec l'ancien stockage des contrats et qu'il s'agit d'une mise à niveau de proxy valide.

// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");

OpenZeppelin a un contrôle similaire, mais il est intégré à sa fonction de déploiement et n'est donc d'aucune utilité ici dans hardhat-deploy bien que son code de vérification puisse probablement être principalement réutilisé (?)

Tous les 2 commentaires

La mise à niveau des proxys est également liée - Les collisions de stockage provoquent des erreurs non négligeables. Évidemment, il est plus difficile de le vérifier car une mise à niveau pourrait se produire à un moment éloigné dans le futur.

Ancienne implémentation :

contract Foo { 
  uint public b = 5;
};

Nouvelle implémentation :

// 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
}

Il serait utile d'avoir une fonction qui vérifie que le nouveau contrat n'entre pas en conflit avec l'ancien stockage des contrats et qu'il s'agit d'une mise à niveau de proxy valide.

// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");

OpenZeppelin a un contrôle similaire, mais il est intégré à sa fonction de déploiement et n'est donc d'aucune utilité ici dans hardhat-deploy bien que son code de vérification puisse probablement être principalement réutilisé (?)

Certainement recherché :), cela a également été mentionné ici : https://github.com/wighawag/hardhat-deploy/issues/65

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

jsidorenko picture jsidorenko  ·  3Commentaires

lcswillems picture lcswillems  ·  14Commentaires

freebyte picture freebyte  ·  9Commentaires

gitpusha picture gitpusha  ·  6Commentaires

smartcontracts picture smartcontracts  ·  20Commentaires