
0. Revisión
- Asegurando el Ecosistema Solana (1) — Hola Solana
- 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
1. Descripción General
En el artículo anterior, discutimos la validación de cuentas, que es importante para el control de acceso en los programas de Solana. Sin embargo, para una DApp descentralizada y para proteger la posible filtración de claves privadas, el multi-sig es muy importante. En esta publicación, introduciremos la implementación del Multi-Sig.
2. Concepto de Multi-Sig
Multi-Sig es un esquema de firma digital que permite a un grupo de usuarios firmar una sola transacción. La transacción podría ser una llamada a una función privilegiada (por ejemplo, mint), una instrucción de transferencia de fondos, etc. El mecanismo del multi-sig consiste en que, dados n participantes con sus propias claves privadas, al menos m de las claves privadas deben firmar para ejecutar la transacción. Esto puede hacer que los fondos en DeFi sean mucho más seguros y puede proteger contra riesgos potenciales como la filtración de claves privadas y el rug pull.
3. Uso del Multi-Sig
En Solana, existe un programa multi-sig de Serum, que es bastante similar a la lógica del multi-sig desarrollado por OpenZeppelin. Esto permite que múltiples usuarios firmen una transacción completamente en cadena. Sin embargo, si puedes recopilar todas las firmas requeridas fuera de cadena, el proceso puede ser más sencillo. Para ilustrarlo, añadimos la funcionalidad multi-sig en el código de prueba de la última publicación. Todo el código de prueba se puede encontrar aquí.
3.1 Revisión del Código
En el proyecto introducido anteriormente, reemplazamos el administrador de la cuenta config con una cuenta multisig. En este caso, para ejecutar las instrucciones Lock y Unlock, el cliente tendrá que incluir suficientes firmas de los propietarios válidos en la transacción.

Añadimos una estructura llamada Multisig que consta de cuatro atributos. Estos son el número de firmas requeridas para ejecutar la instrucción, el número total de firmantes válidos, el estado de la cuenta (si está inicializada o no) y el arreglo de claves públicas de los firmantes válidos.

Correspondientemente, también añadimos la instrucción InitializeMultisig en instruction.rs. Nótese que recibe el argumento m (u8) del lado del cliente. Este valor se pasará a la función InitializeMultisig().

La función InitializeMultisig() recibe las cuentas creadas y el valor m. Para evitar que la cuenta sea re-inicializada por usuarios maliciosos, validamos si la cuenta ya ha sido inicializada (líneas 385-388). Después de eso, inicializamos la cuenta multi-sig asignando el valor m, n y la clave pública de los firmantes.

En la función Lock(), verificamos si la cuenta administradora de la cuenta config es una cuenta multi-sig. Si es así, validará y contará las firmas pasadas (líneas 151 a 158). Una vez que el número de firmas válidas alcanza o supera la cantidad requerida, las puertas se bloquearán (líneas 163 a 168). La implementación del multi-sig en la función Unlock() es similar a la función Lock().
Desplegamos el programa en la red de pruebas y se puede encontrar en el siguiente enlace.
https://explorer.solana.com/address/4g5ZA47pDQ1Bv93aNYdSKAXB6DvPAnnbi9cNEx7722SK?cluster=testnet
3.2 Enviar Transacción

En la función InitializeMultisig(), el parámetro keys incluye cuatro cuentas. Estas son la cuenta multisig y las cuentas de tres firmantes válidos. Nótese que uno de los firmantes también es el pagador de comisiones de la transacción. Establecemos el valor de m en 2, lo que significa que se requieren las firmas de dos de los tres firmantes para ejecutar funciones privilegiadas.

También establecemos el administrador de la cuenta config como la cuenta multisig pasando la clave pública de la cuenta multisig en los datos de la instrucción.

En la función lock(), además de la cuenta config (línea 410), pasamos la cuenta multisig (línea 411) y las cuentas de dos (como mínimo) firmantes válidos (línea 412 - línea 413). Establecemos el atributo isSigner en verdadero para los firmantes. De igual manera, la lógica de la función unlock() es similar a esta.
Todas las transacciones de prueba se enumeran a continuación. El proceso completo es AllocatePDA() -> InitializeMultisig() -> InitializeDoor() -> InitializeConfig() -> Unlock() -> Open() -> Close() -> Lock().
https://explorer.solana.com/tx/2inXLHv34NzkmwmvQ7iimdNbEX2Hj8qWS3MVteAPtwhCAPy1yxXXdvfzMmUL7tESsd4wat4LMcPNiEQav18kQTrZ?cluster=testnet
https://explorer.solana.com/tx/4GErNusHLXpUHBsAJ55c7v1Ur1jfv5hAR88CK8nabLnzc92b1UhDnNRryKVjKmcnJDXppmyk6m5RUdpR2w7MEbrU?cluster=testnet
https://explorer.solana.com/tx/2S8h66oWfh7cn4fwFCVPtgGw1o3NgzyWwU1GyRpDjH4PEBfe8LDMZGAEBYLRJpzL3anH9ENShntjg3q5K8gcZSrN?cluster=testnet
https://explorer.solana.com/tx/nVKxPYegbpH324y57uHDZiajpNA5u4bSSJ2gHFHHRx4GJBy1DcpxnccKh1Ltkv9dah1qJNi9jWuBnXbyHWXCJyw?cluster=testnet
https://explorer.solana.com/tx/3KK5CU88oV59VfdTrNpT4LsiUsetuGdc6qW3sNyyGEWVYtKJfD6XA2Nfknrriwuka9wknHpZs3WZ1WkeduDA1pZX?cluster=testnet
https://explorer.solana.com/tx/3rFo37CrLSsMehLk4kwmMSDnbRfLfoPCWZzRDXhwwLg1uq32gu4ddxkYYB3pJX1yiMN8MofnV1Y9CSaf8bQaNJ9Y?cluster=testnet
https://explorer.solana.com/tx/5yFq4dZAMpccn96jKNkYFVcmhmtrwZYSFEQ6pkNgSMd7e1Vy1ztAM3RdFUZjEtThjFssz1TFytowePPyY59we9rX?cluster=testnet
https://explorer.solana.com/tx/3Ut4DqjCQi1MoCsjRx24DxykyDMsmyRsjJSXS7D4FBeZQwrx4UzxWt2gDe6YRiwUHzFkH3eWkFHub6FNSp2Us4Q7?cluster=testnet
3.3 Transacción de Prueba
Para probar si el multi-sig realmente funciona, modificamos el script del cliente.

Como se muestra arriba, solo pasamos una cuenta firmante y proporcionamos únicamente una firma válida.

Observamos que la puerta no puede desbloquearse debido a firmas insuficientes.
4. Resumen
En este artículo, introducimos la implementación simple del multi-sig en Solana. Es para el escenario en el que puedes recopilar las firmas de múltiples usuarios fuera de cadena. El escenario en el que las transacciones deben ser firmadas completamente en cadena se introducirá más adelante. Mantente al tanto, y compartiremos más en las próximas publicaciones.
Lee otros artículos de esta serie:
- Asegurando el Ecosistema Solana (1) — Hola Solana
- 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 (6) — Multi-Sig2
- Asegurando el Ecosistema Solana (7) — Confusión de Tipos
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 está comprometida con mejorar la seguridad y la usabilidad para el emergente mundo Web3 con el fin de 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 constructores de web3 naveguen eficientemente en el mundo cripto.
Hasta la fecha, la empresa ha atendido a más de 300 clientes distinguidos como MetaMask, Uniswap Foundation, Compound, Forta y PancakeSwap, y ha recibido decenas de millones de dólares en dos rondas de financiación de inversores prominentes, incluyendo Matrix Partners, Vitalbridge Capital y Fenbushi Capital.
Sitio web oficial: https://blocksec.com/
Cuenta oficial de Twitter: https://twitter.com/BlockSecTeam



