Back to Blog

Asegurando el Ecosistema de Solana (3) — Actualización de Programas

March 27, 2022
6 min read

0. Revisión

1. Descripción General

En el artículo anterior, presentamos cómo implementar la invocación entre programas mediante la función invoke y la función invoke_signed. En esta publicación, introduciremos otro tema básico: la Actualización de Programas.

2. Desplegar un Programa Actualizable

Por defecto, todos los programas desplegados se implementan con el cargador BPFLoaderUpgradeable en Solana, lo que significa que pueden actualizarse. Además de esto, Solana proporciona la opción --final para garantizar que el programa desplegado sea inmutable. En este caso, se utilizará el cargador BPFLoader2 para desplegar el programa. Una vez desplegado, el programa no puede actualizarse.

El programa cargador BPFLoaderUpgradeable gestiona tres tipos de cuentas: cuentas de programa, cuentas de datos de programa y cuentas de búfer. En el proceso de despliegue, primero se crea una cuenta de búfer. Después de eso, la CLI de Solana carga los bytecodes del programa objetivo y los escribe en la cuenta de búfer. Finalmente, los bytecodes almacenados en la cuenta de búfer se copian en la cuenta de datos del programa.

Por lo tanto, las cuentas de búfer son utilizadas por el cargador BPF actualizable para almacenar temporalmente los bytecodes durante el proceso de despliegue, las cuentas de datos del programa almacenan los datos reales de un programa, y las cuentas de programa funcionan como proxies que apuntan a las cuentas de datos de programa correspondientes.

A continuación, repasaremos algunos ejemplos sobre cómo actualizar su programa. Todo el código utilizado en esta publicación se puede encontrar aquí.

2.1 Revisión del Código (Rectangle_Area)

En este contrato de ejemplo, definimos una estructura llamada Rectangle, que contiene tres atributos: width, height y area desde la línea 13 hasta la línea 17. También definimos una función area() para Rectangle. La función area() calcula el área del rectángulo usando width y height.

En la función process_instruction(), primero usamos la función unpack_u32() para extraer el width y el height del rectángulo desde los datos de instrucción (línea 45 - línea 46). En la línea 51, se extrae la cuenta utilizada para almacenar los datos del rectángulo. En la línea 59, la función try_from_slice_unchecked() deserializa los datos de la cuenta con el tipo de estructura Rectangle. A continuación, asignamos los datos a los campos correspondientes de la estructura y calculamos el valor del área (línea 61 - línea 63). El último paso es serializar los datos y escribirlos de vuelta en la cuenta de datos.

El programa desplegado se puede encontrar en el siguiente enlace.

https://explorer.solana.com/address/84mMqHRTQT6b2vfsD7XRxVKA3XMd7xoEXFdF6pLNw8y?cluster=testnet

2.2 Enviar Transacción

En el lado del cliente, primero enviamos una transacción para crear una cuenta que almacene datos. Establecemos el tamaño del espacio en 1.024 bytes para asegurarnos de que sea suficiente.

Luego enviamos otra transacción para calcular el área del rectángulo y almacenarla en la cuenta de datos.

La transacción se puede encontrar en el siguiente enlace.

https://explorer.solana.com/tx/4PybjXGRpuPKpak7FAz4BKMbcQCWmway69zAxtTnpFRuTTg7onyxW7agSe6ETx44iAGexbgnBUa8WdzdTTQSawJ3?cluster=testnet

3. Actualización

Ahora queremos agregar una nueva función en el programa, que consiste en calcular el perímetro del rectángulo.

Después de compilar el proyecto actualizado, actualizamos el programa desplegado en la cadena con el siguiente comando.

solana program deploy /path/to/program.so --program-id <PROGRAM_ID>

El contrato puede actualizarse directamente y puede ver la transacción relacionada a continuación.

https://explorer.solana.com/tx/4Dm9v4zMiijKjQBhatx1D9xbV9PvMLdaonUWLaC2VwzkFvzdgorzbX5vsy4VQ7VxSUmqadftjiDzbyUmXgQchYmk?cluster=testnet

Además, enviamos una transacción al programa para verificar que se actualizó correctamente. El resultado muestra que la función funciona bien.

La transacción relacionada se puede encontrar a continuación.

https://explorer.solana.com/tx/21c2G7kPVktAtdUFkH3QwGVi7orajRmy5PJo1UxX1mmAMU68eUkNuLzWYJRBaTzwGi5DxeocYjHfpWiU4hcSFtpQ?cluster=testnet

4 Segunda Actualización

Esta vez queremos almacenar el perímetro calculado en la cuenta de datos. En este caso, agregamos un atributo más, perimeter, a la estructura Rectangle (línea 18).

Dado que la estructura de la cuenta de datos es diferente a la anterior, primero necesitamos leer los datos de la cuenta de datos. Deserializamos los datos almacenados usando la estructura original (es decir, OldRectangle). Después de eso, asignamos los atributos relacionados a la nueva estructura (es decir, CurrentRectangle) e iniciamos el nuevo atributo (es decir, perimeter).

Finalmente, calculamos el valor del perímetro y lo asignamos de vuelta a update_account antes de serializarlo en account_data.

La transacción de actualización se puede encontrar a continuación.

https://explorer.solana.com/tx/5J3oKxZXtCi755gD7pMnVh48AFvmeVzRLPgJiyNn8JFeCKx1xpAfJtsi34zjyYKJmnMk8LtC3bcwfFSP7H2gtj5o?cluster=testnet

Después de la actualización, podemos verificar los datos almacenados en la cuenta con el comando solana account <DataAccount>. Puede ver que los atributos se almacenan en los primeros 32 bytes. El proceso completo de actualización ha finalizado.

5. Conclusión

En este artículo, presentamos cómo se puede actualizar un programa en Solana. Usamos diferentes ejemplos para ilustrar el proceso detallado. Permanezca atento, se publicarán más artículos sobre Solana.

Lea otros artículos de esta serie:


Acerca de BlockSec

BlockSec es una empresa pionera en seguridad blockchain establecida en 2021 por un grupo de expertos en seguridad de renombre mundial. La empresa se compromete a mejorar la seguridad y la usabilidad del emergente mundo Web3 para facilitar su adopción masiva. Con este fin, BlockSec ofrece servicios de auditoría de seguridad de contratos inteligentes y cadenas EVM, la plataforma Phalcon para el desarrollo de seguridad y el bloqueo proactivo de amenazas, la plataforma MetaSleuth para el rastreo e investigación de fondos, y la extensión MetaSuites para que los desarrolladores de web3 naveguen eficientemente en el mundo cripto.

Hasta la fecha, la empresa ha atendido a más de 300 distinguidos clientes como MetaMask, Uniswap Foundation, Compound, Forta y PancakeSwap, y ha recibido decenas de millones de dólares en dos rondas de financiamiento de inversores prominentes, incluidos Matrix Partners, Vitalbridge Capital y Fenbushi Capital.

Sitio web oficial: https://blocksec.com/

Cuenta oficial de Twitter: https://twitter.com/BlockSecTeam