10 minutos de lectura
Resumen
El programa Token-2022 de Solana introdujo varias extensiones potentes que mejoran la funcionalidad de los tokens más allá del programa estándar de tokens SPL. Entre ellas, destaca la extensión «Confidential Transfer», que permite realizar transferencias de tokens que preservan la privacidad en Solana. Esta guía analiza cómo funciona esta extensión, los componentes que la hacen posible y el flujo de trabajo para llevar a cabo operaciones privadas con tokens.
¿Prefieres un tutorial en vídeo? Sigue los pasos de Sahil y aprende los conceptos básicos de las transferencias confidenciales en Solana.
Tus funciones
En esta guía, vamos a:
- Explica los conceptos básicos de la «Extensión de transferencia confidencial» y cómo funcionan los «saldos confidenciales».
- Echa un vistazo general a un ejemplo de flujo de una transacción confidencial.
- Repasa las estructuras de las cuentas que permiten realizar la transacción.
- Echa un vistazo a las instrucciones concretas que hay que seguir para realizar la transferencia.
Lo que necesitarás
- Experiencia con las extensiones de tokens de Solana
- Conocimientos básicos sobre las pruebas de conocimiento cero
¿Qué es la prórroga de la transferencia confidencial?
La extensión «Confidential Transfer» permite realizar transferencias de tokens en Solana ocultando los saldos y los importes. Mediante técnicas criptográficas como el cifrado homomórfico y las pruebas de conocimiento cero, esta extensión permite a los usuarios:
- Mantener la confidencialidad de los saldos de sus cuentas
- Transferir tokens sin revelar las cantidades
- Mantener transacciones verificables que no puedan ser manipuladas
- Permitir, de forma opcional, que los auditores externos puedan consultar los importes de las transacciones y los saldos de las cuentas de tokens
Esta extensión combina la transparencia y la seguridad de la cadena de bloques con las características de privacidad que los usuarios esperan de los sistemas financieros tradicionales. Es importante señalar que los saldos y los importes confidenciales no implican un anonimato total. Las transacciones entre dos partes siguen siendo visibles públicamente en la cadena de bloques. Solo los importes están encriptados.
Entre bastidores: Protección de la privacidad
Al igual que todas las extensiones de tokens, las cuentas de acuñación/tokens que tienen activada la extensión de transferencia confidencial conservan todas sus funciones originales respectivas. Un usuario puede tener un saldo de tokens visible públicamente y transferir tokens a cualquier persona de forma pública. Las medidas de protección de la privacidad en este sistema se basan en varios mecanismos clave:
1. Cifrado específico de cada cuenta
La esencia de los tokens confidenciales reside en una potente combinación de cifrado y demostraciones matemáticas. En lugar de almacenar los saldos como números visibles, la extensión utiliza el «cifrado homomórfico», un tipo especial de cifrado que permite realizar operaciones matemáticas directamente sobre valores cifrados. Cuando envías tokens, el programa no ve «resta 10 a Alice, suma 10 a Bob». En su lugar, ve «resta este valor cifrado del saldo cifrado de Alice, suma este valor cifrado al saldo cifrado de Bob». El cifrado permite que la cadena de bloques procese las transacciones sin conocer las cantidades exactas.
A diferencia de los tokens estándar, en los que los saldos se almacenan en texto plano (por ejemplo, u64), los saldos confidenciales se cifran mediante:
- El cifrado homomórfico, que permite realizar operaciones matemáticas sobre valores cifrados. Esto significa que ni siquiera los validadores que procesan las transacciones pueden ver los importes reales de los tokens.
- Claves de cifrado específicas de la cuenta (no las claves del titular)
La configuración de las cuentas de tokens de transferencia confidenciales difiere de la creación de cuentas de tokens estándar, ya que requiere claves de cifrado facilitadas por el propietario. Las cuentas de tokens confidenciales solo deben ser configuradas por el propietario o el administrador de la cuenta de tokens para evitar comprometer el cifrado.
2. Pruebas de conocimiento cero
Para garantizar que todo funcione correctamente sin revelar valores, el sistema utiliza «pruebas de conocimiento cero». Se trata de pruebas matemáticas que verifican afirmaciones como «Tengo suficientes tokens para realizar esta transferencia» o «estos números cifrados equivalen al mismo valor» sin revelar los números reales. Al transferir o retirar tokens, el remitente debe proporcionar pruebas de conocimiento cero que:
- Comprueba que dispongan de fondos suficientes.
- Asegúrate de que la transacción sea coherente (que el importe deducido de tu cuenta sea igual al importe abonado al destinatario).
Estas demostraciones demuestran matemáticamente que se están cumpliendo las normas sin revelar ninguna cantidad concreta.
3. Modelo de saldo pendiente/disponible
Las transferencias confidenciales utilizan un sistema de dos fases (saldos «pendientes» y saldos «disponibles») para protegerse contra los ataques de «front-running»:
- Las transferencias recibidas se contabilizan en el saldo pendiente
- Solo el titular de la cuenta puede pasar los tokens de «pendientes» a «disponibles».
- Las transferencias salientes solo se deducen del saldo disponible
Esto evita que otros usuarios interfieran en tus transacciones (y, por lo tanto, en tus pruebas o validaciones ZK) manipulando tu saldo justo antes de que realices una transferencia.
4. Supervisión opcional por parte del auditor
Las casas de acuñación de tokens configuradas con la extensión de transferencia confidencial pueden, de forma opcional, configurarse con una clave pública de auditor que:
- Permite a una persona designada descifrar los saldos y los importes de las transferencias
- Ofrece un mecanismo de cumplimiento normativo sin poner en peligro la privacidad general de los usuarios
La privacidad en la práctica
Esta combinación de saldos cifrados y pruebas matemáticas garantiza la privacidad, al tiempo que mantiene la seguridad y la integridad de la cadena de bloques. En la práctica, esto se consigue mediante:
- Estructuras de cuenta avanzadas que almacenan claves públicas de cifrado, saldos confidenciales «disponibles» y «pendientes», así como otros contadores de cambios de saldo pendientes para la validación de pruebas.
- Un nuevo programa nativo, el programa Solana ZK ElGamal Proof (ZkE1Gama1Proof11111111111111111111111111111), destinado a la creación y verificación de pruebas en cadena.
- Claves de cuenta de usuario cifradas con ElGamal que permiten a los usuarios y a los auditores consultar los saldos y los importes de las transferencias cifrados.
Para obtener más información sobre el protocolo, la metodología de cifrado o las pruebas ZK, consulta la documentación oficial del Protocolo de Extensión de Tokens Confidenciales:
- Descripción general del protocolo de extensión de tokens confidenciales
- Cifrado
- Pruebas de conocimiento cero
Cómo funciona: Estado de la cuenta
Los tokens confidenciales introducen nuevas estructuras de datos tanto para las cuentas de emisión como para las cuentas de tokens. Veamos en qué se diferencian de los tokens estándar.
La cuenta «Confidential Mint»
La configuración confidencial de la acuñación se añade a una cuenta de acuñación de Token-2022 y contiene:
pub struct ConfidentialTransferMint {
pub authority: OptionalNonZeroPubkey,
pub auto_approve_new_accounts: PodBool,
pub auditor_elgamal_pubkey: OptionalNonZeroElGamalPubkey,
}
Fuente: github.com/solana-program/token-2022
Diferencias clave con respecto a las pastillas de menta normales:
- Una autoridad específica encargada de gestionar las transferencias confidenciales
- Una configuración de aprobación para las nuevas cuentas (aprobación automática o necesidad de aprobación por parte de una autoridad para que las cuentas de tokens puedan participar en las transferencias confidenciales de la casa de la moneda)
- Una clave pública opcional para el auditor que permite descifrar los importes de las transacciones. La clave pública debe ser una clave pública ElGamal, lo que permite al auditor descifrar los importes cifrados sin comprometer la privacidad general de las transacciones.
La cuenta de tokens confidenciales
Las cuentas de token con la extensión «confidential» tienen una estructura considerablemente más compleja que las cuentas de token estándar:
pub struct ConfidentialTransferAccount {
pub approved: PodBool,
pub elgamal_pubkey: PodElGamalPubkey,
pub pending_balance_lo: EncryptedBalance,
pub pending_balance_hi: EncryptedBalance,
pub available_balance: EncryptedBalance,
pub decryptable_available_balance: DecryptableBalance,
pub allow_confidential_credits: PodBool,
pub allow_non_confidential_credits: PodBool,
pub pending_balance_credit_counter: PodU64,
pub maximum_pending_balance_credit_counter: PodU64,
pub expected_pending_balance_credit_counter: PodU64,
pub actual_pending_balance_credit_counter: PodU64,
}
Fuente: github.com/solana-program/token-2022
Principales diferencias con respecto a las cuentas de tokens estándar:
- Utiliza una clave pública ElGamal para el cifrado (distinta de la clave del propietario)
- Contiene saldos cifrados en lugar de importes en texto sin cifrar
- Divide los saldos en las partes «pendientes» y «disponibles»
- Incluye contadores de crédito para realizar un seguimiento y limitar las operaciones pendientes (utilizados en las pruebas ZK para garantizar que podamos asociar claramente los saldos anteriores y posteriores con la transferencia entrante correcta).
- Se puede configurar para aceptar o rechazar diferentes tipos de transferencias
La característica más destacada es la clasificación de los saldos en:
- Saldo pendiente: lugar donde se almacenan inicialmente los tokens recién recibidos
- Saldo disponible: tokens que se pueden gastar o retirar
Flujo de transferencia confidencial
Antes de profundizar en las estructuras de las cuentas y los detalles de las instrucciones, veamos a grandes rasgos cómo se mueven los tokens por este sistema:

- Cuando un usuario desea realizar operaciones con saldos y transferencias confidenciales, primero debe
Depósitoal saldo «pendiente» de una cuenta de tokens confidenciales. Como ya hemos comentado, las cuentas de tokens confidenciales almacenan dos saldos cifrados diferentes en su estado: un saldo «pendiente» y un saldo «disponible». - Para convertir el saldo «pendiente» en saldo «disponible», el titular de la cuenta debe
Solicitarel saldo pendiente de su cuenta. - Los usuarios pueden
Retirarlos saldos «disponibles» en su cuenta pública oTraspasoa otros usuarios. Estas transferencias se validan mediante pruebas ZK. - Las Mints pueden configurarse, de forma opcional, con una cuenta de «Auditor» que tenga la capacidad de descifrar los importes de las transferencias del token.
Aquí hay mucho que analizar entre bastidores; repasemos todo el flujo de la transacción.
1. Inicializar Mint
Antes de utilizar tokens confidenciales, debemos inicializar nuestra casa de acuñación con las extensiones de transferencia de tokens confidenciales:
Inicialización de una casa de acuñación confidencial: Incluye una instrucción ConfidentialTransferInstruction::InitializeMint en la misma transacción que la inicialización estándar de la casa de acuñación mediante el Token 2022, la cual:
- Configura las claves de auditoría
- Establece la autoridad para aprobar o modificar
- Establece si se deben aprobar automáticamente las cuentas de token
2. Configurar la cuenta de tokens
A continuación, debemos crear una cuenta de tokens para utilizarla y prepararla para las transferencias confidenciales.
Crear una cuenta de tokens: Ejecuta TokenInstruction::InitializeAccount y TokenInstruction::Reallocate, especificando ExtensionType::ConfidentialTransferAccount.
Para obtener más información sobre cómo inicializar cuentas de tokens con extensiones, consulta nuestra guía: «¿Qué son las extensiones de tokens SPL de Solana y cómo empezar?».
Configuración de una cuenta de tokens: Ejecuta una transacción que configure la cuenta para su uso: ConfidentialTransferInstruction::ConfigureAccount
- Verifica la clave de cifrado ElGamal específica de esta cuenta
- Requiere una prueba de que la clave de cifrado es válida
- Requiere la aprobación de la autoridad emisora si la aprobación automática está desactivada.
- Inicializa los saldos confidenciales con un saldo cero cifrado
2. Introducir tokens en el sistema
Acuñación: En primer lugar, tendrás que acuñar tokens en tu cuenta de tokens llamando a TokenInstruction::MintTo.
Para obtener más información sobre la emisión de tokens fungibles, consulta nuestra guía: «¿Cómo crear un token SPL fungible en Solana?».
Depósito: La instrucción ConfidentialTransferInstruction::Deposit transferirá tokens desde el saldo público de la cuenta de tokens del usuario a su saldo confidencial pendiente. La instrucción:
- Cifra el importe del token utilizando la clave de cifrado de la cuenta
- Añade el importe cifrado al saldo pendiente
- Actualiza el contador de créditos pendientes
- Reduce el saldo público de tokens (por ejemplo, si el usuario tiene depositado el 100 % de sus tokens, su saldo público de tokens será 0)
Aplicar saldo pendiente: Trasladar tokens del saldo pendiente al saldo disponible ejecutando una instrucción ConfidentialTransferInstruction::ApplyPendingBalance.
- Transfiere los tokens cifrados del saldo pendiente al saldo disponible
- Solo puede ser ejecutada por el titular de la cuenta
- Actualiza los contadores para realizar un seguimiento de las operaciones aplicadas
Como puedes ver en el ejemplo siguiente, la cuenta muestra un «saldo cifrado»:

3. Transferencia confidencial de tokens
Para enviar tokens a otra cuenta confidencial, tu monedero o aplicación debe generar pruebas de conocimiento cero que verifiquen que la transacción es válida sin revelar los importes reales. Para ello, hay que seguir varios pasos:
Generar las pruebas de conocimiento cero necesarias: Tendrás que crear tres pruebas específicas fuera de la cadena, cada una de las cuales se verificará y almacenará en una cuenta dentro de la cadena:
- Prueba de igualdad: demuestra que se está deduciendo la misma cantidad de tu cuenta y añadiendo a la cuenta del destinatario (mediante la instrucción ProofInstruction::VerifyCiphertextCommitmentEquality ).
- Prueba de validez del texto cifrado: demuestra que el importe de la transferencia cifrado está correctamente formado y que puede descifrarse mediante las claves públicas del remitente, del destinatario y (si procede) del auditor (lo cual se lleva a cabo mediante la instrucción ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity ).
- Prueba de rango: comprueba que el saldo disponible cubre la transferencia y que el importe es positivo (se lleva a cabo mediante la instrucción ProofInstruction::VerifyBatchedRangeProofU128).
Ejecutar la transferencia: Ejecuta la transferencia propiamente dicha pasando las tres cuentas de prueba a la instrucción ConfidentialTransferInstruction::Transfer. Esta instrucción:
- Comprueba que se hayan verificado las pruebas requeridas (utilizando las cuentas del estado del contexto)
- Resta el importe cifrado del saldo disponible del remitente
- Añade el importe cifrado al saldo pendiente del destinatario
En el ejemplo que aparece a continuación, verás una transferencia en el explorador de Solana, ¡pero sin que se muestren los importes de las transferencias!

Limpieza del estado del contexto: Por último, podemos llamar a ProofInstruction::CloseContextState para cada cuenta de pruebas ZK con el fin de cerrar las cuentas en las que se almacenaron las pruebas ZK y recuperar la cuota.
En el momento de redactar este artículo, Solana tiene un límite estricto de 1.232 bytes para el tamaño de las transacciones (Fuente: github.com/solana-labs). Debido al tamaño de los parámetros de varias de estas instrucciones, que incluyen datos de prueba, a menudo será necesario procesarlas en varias transacciones secuenciales. Esto se puede lograr enviando varias transacciones de forma secuencial o utilizando Jito Bundles.
Echa un vistazo a nuestra guía «Cómo utilizar las tablas de consulta de Solana» para ver un ejemplo de cómo evaluar o comparar el tamaño en bytes de los datos sin procesar de una transacción.
4. Retirada de fichas
Para convertir tokens confidenciales en tokens públicos, primero debes asegurarte de que el saldo se encuentre en tu saldo «disponible» y, a continuación, crear una transacción de retirada con las pruebas necesarias:
Aplicar el saldo pendiente (si es necesario): Trasladar tokens del saldo pendiente al saldo disponible ejecutando una instrucción ConfidentialTransferInstruction::ApplyPendingBalance.
Generar las pruebas de conocimiento cero necesarias: Tendrás que crear dos pruebas específicas fuera de la cadena, cada una de las cuales se verificará y almacenará en una cuenta dentro de la cadena (esto es similar al proceso de transferencia; sin embargo, dado que la retirada da lugar a un saldo público, no es necesario verificar un importe de transferencia cifrado):
- Prueba de igualdad: comprueba que la cantidad que se va a retirar se representa correctamente tanto en formato cifrado como en texto sin cifrar (lo cual se lleva a cabo mediante la instrucción ProofInstruction::VerifyCiphertextCommitmentEquality ).
- Comprobación de rango: comprueba que el importe de la retirada sea positivo y se encuentre dentro de tu saldo disponible (se lleva a cabo mediante ProofInstruction::VerifyBatchedRangeProofU64).
Realizar una retirada: Realiza la retirada pasando ambas cuentas de prueba a la instrucción ConfidentialTransferInstruction::Withdraw. Esta instrucción:
- Comprueba que se hayan verificado las pruebas requeridas (utilizando las cuentas del estado del contexto)
- Resta el importe cifrado del saldo disponible del remitente
- Añade el importe en texto sin cifrar al saldo de tu token público
Limpieza del estado del contexto: Por último, podemos llamar a ProofInstruction::CloseContextState para cada cuenta de pruebas ZK con el fin de cerrar las cuentas en las que se almacenaron las pruebas ZK y recuperar la cuota.
Buenas prácticas y aspectos a tener en cuenta
-
Gestión del saldo
- Aplicar periódicamente los saldos pendientes para que los fondos estén disponibles para su uso
-
Seguridad clave
- Protege tus claves de cifrado con el mismo cuidado con el que proteges las llaves de tu cartera
- La pérdida de las claves de cifrado supone la pérdida definitiva de la capacidad de descifrar saldos confidenciales.
-
Limitaciones en materia de privacidad
- Los metadatos de la transacción (remitente, destinatario, marca de tiempo) siguen siendo visibles
- Solo los importes están cifrados y son confidenciales
- El análisis de patrones podría seguir aportando información sobre saldos o importes de transferencia
-
Auditorías de producción
- Asegúrate de que todo el código se haya probado y auditado minuciosamente antes de utilizarlo en producción.
Conclusión
La extensión «Confidential Transfer» supone un avance significativo en materia de privacidad configurable para los tokens de Solana. Al combinar las pruebas de conocimiento cero con el cifrado homomórfico, ofrece un equilibrio óptimo entre la velocidad, la seguridad y el coste de Solana, así como la privacidad que se espera en las transacciones financieras.
Tanto si estás desarrollando una aplicación centrada en la privacidad como si simplemente quieres comprender cómo Solana está ampliando las capacidades de sus tokens, la extensión de transferencia confidencial ofrece potentes herramientas para crear la próxima generación de aplicaciones financieras.
¿Listo para empezar a construir?
Regístrate para obtener una cuenta gratuita de Quicknode y empieza a probar la extensión de tokens confidenciales hoy mismo. Si eres una empresa que desea utilizar tokens confidenciales, ponte en contacto con nuestro equipo para comentarnos tus requisitos específicos en este ámbito.
Aquí tienes algunos ejemplos de proyectos para que te hagas una idea:
Si tienes alguna pregunta o idea que quieras compartir, ¡escríbenos en Discord o Twitter!
¡Nos encanta recibir comentarios!
Si tienes algún comentario o sugerencia sobre nuevos temas, no dudes en hacérnoslo saber. Nos encantaría saber tu opinión.
