How to make smart contracts upgradable!

17/09/2018 – No importa cuán cuidadosos seamos o cuán bien probado esté nuestro código, si estamos creando un sistema complejo, hay buenas posibilidades de que necesitemos actualizar la lógica para parchar un error, arreglar un exploit o agregar una característica necesaria que falta. A veces, incluso podemos necesitar actualizar nuestros contratos inteligentes debido a cambios en EVM o vulnerabilidades recién descubiertas. Si usamos las técnicas adecuadas, podemos implementar un nuevo contrato en una dirección diferente e inutilizar el antiguo contrato.
1. Master-Slave: es una de las técnicas más básicas y fáciles para hacer que los contratos inteligentes sean actualizables. Implementamos un contrato maestro junto con contratos “esclavos”. El maestro almacena las direcciones de todos los demás y devuelve la dirección requerida siempre que sea necesario. Para actualizar un contrato inteligente, basta cambiar su dirección en el contrato maestro. Pero una de las muchas limitaciones de este método es que no podemos migrar fácilmente los datos o los activos del contrato a un nuevo contrato.
2. Técnica de contratos de almacenamiento eterno: separa los contratos de datos de los de lógica. El contrato de datos se supone permanente y no actualizable. El contrato lógico se puede actualizar tantas veces como sea necesario y el contrato de datos se notifica del cambio. (No sirve si se reuiere un cambio en la estructura de datos.)
3. Contratos de proxy de almacenamiento actualizable: se hace que los contratos de almacenamiento eternos actúen como un proxy para los contratos lógicos. El proxy tendrá una función alternativa que delegará la llamada al contrato lógico para que este pueda realizar cambios en el almacenamiento del proxy.
4. Delegatecall: es como una llamada normal excepto que el código en la dirección de destino se ejecuta en el contexto del contrato de llamada. El delegatecall básicamente permite al contrato objetivo hacer lo que quiera con el almacenamiento del contrato de la persona que llama.
5. Contratos de proxy de almacenamiento no estructurado y renovable: es uno de los métodos más avanzados. Funciona guardando las direcciones de la implementación y el propietario en posiciones fijas en el almacenamiento de modo que no se sobrescriban con los datos alimentados por el contrato de implementación/lógica. Podemos utilizar los códigos de operación sload y sstore para leer y escribir directamente en ranuras de almacenamiento específicas a las que hacen referencia los punteros fijos. Este enfoque aprovecha el diseño de las variables de estado almacenadas para evitar que el contrato lógico sobrescriba las posiciones fijas. (Más detalles en el texto original: Hackernoon)

Anuncios