Hardhat-deploy: Los contratos de representación DEBEN tener algún tipo de validación

Creado en 24 jun. 2021  ·  2Comentarios  ·  Fuente: wighawag/hardhat-deploy

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.

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:

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

Todos 2 comentarios

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

smartcontracts picture smartcontracts  ·  20Comentarios

freebyte picture freebyte  ·  9Comentarios

tennox picture tennox  ·  4Comentarios

jaypaik picture jaypaik  ·  13Comentarios

lcswillems picture lcswillems  ·  14Comentarios