1. Introducción
Solana es un sistema de blockchain de Capa 1 de alto rendimiento y sin permisos que permite desarrollar programas (contratos inteligentes) en diferentes lenguajes (p. ej., Rust, C++ y C). Con la ayuda del Tower BFT (Tolerancia a Fallos Bizantinos), puede manejar miles de transacciones por segundo con tiempos de bloque reducidos. Una de las innovaciones principales de Solana es la Prueba de Historia (PoH), una fuente de tiempo disponible globalmente y sin permisos en la red que funciona antes del consenso. Hablaremos sobre PoH con más detalle en el futuro.
2. Nuestra Misión
BlockSec es una empresa de seguridad blockchain que tiene como misión "asegurar el ecosistema DApp". Por ello, ofrecemos no solo servicios de auditoría de contratos, sino también recomendaciones sobre cómo escribir contratos inteligentes seguros para toda la comunidad. Considerando la popularidad, el alto rendimiento y el gran diseño de Solana, esta serie se centrará en la seguridad de los contratos inteligentes en Rust sobre Solana.
3. Hola Solana
Antes de analizar los contratos inteligentes de Solana desde la perspectiva de la seguridad, primero necesitamos saber cómo escribir, compilar e implementar contratos inteligentes en Solana. Aquí usamos Hello World como ejemplo ilustrativo.
3.1 Revisión del Código
En Solana, un contrato inteligente se llama programa. El programa Hello World tiene como objetivo mantener un contador que registra el número de veces que el cliente llama a la cuenta objetivo (propiedad del programa), e imprime este número como salida.
Ahora recorramos el contrato completo.

Las líneas 1 a 9 incorporan explícitamente al ámbito muchas bibliotecas con la palabra clave use.

En la línea 12, [derive(BorshSerialize, BorshDeserialize, Debug)] se usa para serializar y deserializar los parámetros pasados a la estructura GreetingAccount, que se define desde la línea 13 hasta la línea 16. La estructura contiene un miembro público llamado counter de tipo u32. Después de eso, como se indica en el comentario, la línea 19 exporta el punto de entrada del programa, que es la función process_instruction.

La función process_instruction acepta tres parámetros (es decir, program_id, accounts y _instruction_data). Nótese que program_id es la clave pública (es decir, la dirección) del programa desplegado, mientras que accounts contiene la cuenta a la que saludar. El _instruction_data está vacío y no se utiliza.
Para saber más sobre los programas y las cuentas en Solana, consulte la documentación de Solana.
En la línea 27, se imprime un mensaje de saludo. Desde la línea 30 hasta la línea 33, se iterará sobre las cuentas y se extraerá la cuenta específica a la que saludar. Después de eso, se verificará el propietario de la cuenta, que debe ser igual al program_id para garantizar que el programa pueda escribir en la cuenta. Finalmente, se extraerá greeting_account con try_from_slice y el contador se incrementará en 1.
3.2 Compilar el Programa
Para compilar el programa, necesitamos instalar la CLI de Solana con el siguiente comando.
sh -c "$(curl -sSfL https://release.solana.com/v1.9.9/install)"
Para confirmar que la CLI de Solana se instaló correctamente, podemos verificar su versión con el siguiente comando.
solana --version
Tenga en cuenta que también se requieren Rust y NodeJS.
Para compilar el programa, podemos usar el siguiente comando.
cargo build-bpf --manifest-path=./src/program-rust/Cargo.toml --bpf-out-dir=dist/program
El programa compilado se generará en el directorio especificado en --bpf-out-dir, con el nombre helloworld.so.
3.3 Desplegar el Contrato
Para desplegar el programa compilado en Solana, primero debemos seleccionar un clúster. En Solana, existen cuatro clústeres diferentes: mainnet, testnet, devnet y localnet. En esta publicación, desplegamos el programa compilado únicamente en devnet a modo de demostración.
Usamos el siguiente comando para especificar el clúster.
solana config set --url https://api.devnet.solana.com
Después de eso, necesitamos generar la billetera para el despliegue. solana-keygen new --force ayuda a generar la billetera. Para más información, consulte la documentación de Solana.
Dado que la cuenta recién creada no tiene saldo para pagar las comisiones de transacción, transferimos por airdrop 1 SOL con el siguiente comando.
solana airdrop 1 <TuClavePublica> --url https://api.devnet.solana.com
Ahora estamos listos para desplegar el contrato.
solana program deploy dist/program/helloworld.so
Los usuarios pueden consultar los programas y las transacciones en el Explorador de Devnet. En esta demostración, puede encontrar el programa desplegado con este enlace.
3.4 Enviar una Transacción
Se recomienda escribir scripts, llamados clientes, para enviar transacciones en Solana. Afortunadamente, Solana proporciona el código de ejemplo. Para ejecutar el cliente, primero necesitamos instalar las dependencias del cliente.
npm install
Una vez completada la instalación, ejecutamos la función main en el archivo main.ts con el siguiente comando.
npm run start

En la función main, el cliente primero establece la conexión con el clúster especificado (es decir, Devnet) mediante la función establishConnection(), verifica al pagador que abona las comisiones de transacción con la función establishPayer, y valida la existencia del programa y la cuenta a la que saludar con la función checkProgram. Tenga en cuenta que si la cuenta requerida no existe, será creada enviando una transacción. En nuestra demostración, la cuenta se creó en esta transacción.

Cuando todo está listo, se invoca la función sayHello para saludar a la cuenta objetivo. La transacción consta de una instrucción. Esta instrucción recibe keys que contiene una cuenta. La clave pública de la cuenta (es decir, greetedPubkey) es la cuenta objetivo a la que saludar. Tenga en cuenta que esta cuenta se usa para almacenamiento y no es un firmante. En este caso, el atributo isSigner es false mientras que isWritable es true. El programId es el propietario de greetedPubkey y también es la dirección del contrato desplegado. Nótese que data está vacío y no se usará en esta transacción. En la línea 208, se invoca la función sendAndConfirmTransaction y la transacción será enviada al clúster.
Puede ver la transacción detallada aquí.
4. Conclusión
En este artículo, presentamos brevemente los antecedentes de Solana y recorremos el proyecto de ejemplo (es decir, Hello World). Aprendemos cómo desplegar un programa en Solana y cómo usar el cliente para interactuar con el programa en cadena. Siga nuestro blog, publicaremos más artículos de esta serie de forma continua.
Lea otros artículos de esta serie:
- Asegurando el Ecosistema Solana (2) — Llamadas entre Programas
- Asegurando el Ecosistema Solana (3) — Actualización de Programas
- Asegurando el Ecosistema Solana (4) — Validación de Cuentas
- Asegurando el Ecosistema Solana (5) — Multi-Firma
- Asegurando el Ecosistema Solana (6) — Multi-Firma 2
- Asegurando el Ecosistema Solana (7) — Confusión de Tipos



