10 minutos de lectura
El 29 de febrero de 2024, Elusiv anunció que iba a retirar la plataforma Elusiv. Esta guía tiene únicamente fines educativos y de carácter histórico.
Si buscas una alternativa moderna, echa un vistazo a «Transferencias confidenciales en Solana: guía para desarrolladores de Token-2022».
Resumen
Un obstáculo habitual para la adopción de la tecnología Web3 es la necesidad de mayor privacidad. Las transacciones en la cadena de bloques son públicas, lo que significa que cualquiera puede ver los detalles de una transacción, incluidos el remitente y el destinatario. Aunque hay muchas aplicaciones en las que esta transparencia resulta beneficiosa, también hay muchos casos en los que los usuarios necesitan privacidad. Por ejemplo, si eres propietario de un negocio, es posible que no quieras que tus competidores sepan cuánto pagas a tus empleados. O, si eres un usuario, quizá prefieras que tus amigos no sepan cuánto inviertes. La privacidad cobrará cada vez más importancia a medida que la Web3 llegue a más usuarios y se amplíen sus casos de uso.
En Solana están surgiendo varios protocolos para permitir las transacciones privadas. En esta guía, explicaremos cómo utilizar Elusiv, un protocolo de privacidad de conocimiento cero (ZK) en Solana, para realizar una transferencia privada de tokens SPL.
Tus funciones
En esta guía, aprenderás a:
- Descubre Elusiv, un protocolo de privacidad de conocimiento cero (ZK) en Solana
- Realizar una transferencia privada de USDC utilizando el SDK de Elusiv
- Comprueba que la transacción haya sido privada
Lo que necesitarás
- Conocimientos básicos sobre los fundamentos de Solana
- Conocimientos básicos sobre las pruebas de conocimiento cero
- Node.js (versión 18.16 o superior) instalado
- TypeScript y ts-node (última versión) instalados
¿Qué es Elusiv?
Las transacciones en Solana son públicas. Cualquier persona con acceso a un explorador y a la clave pública de un usuario puede seguir y supervisar la actividad transaccional de dicho usuario. Elusiv tiene como objetivo romper el vínculo entre remitentes y destinatarios para permitir transacciones privadas. Elusiv es un protocolo de privacidad basado en Solana que utiliza criptografía de conocimiento cero. El protocolo permite a los usuarios y a las aplicaciones acceder a un cifrado y un control universales, lo que les permite elegir qué se comparte y qué no. Elusiv utiliza zk-SNARKS para las transacciones privadas y las soluciones de cumplimiento normativo descentralizadas.
Elusiv tiene dos funciones principales:
- Programa Elusiv: Elusiv funciona mediante la gestión de un fondo común regulado por el programa Elusiv. Los usuarios pueden ingresar y retirar fondos del fondo común (transacciones públicas) y, a continuación, transferir fondos a otros usuarios dentro del mismo (transacciones privadas). Aunque los detalles de las transacciones son privados para el iniciador del pago, este puede crear claves de visualización para permitir que otros vean transacciones específicas.
- Elusiv Warden: Elusiv Warden se encarga de transmitir las solicitudes de los clientes a la red y (en el futuro) se encargará de gestionar las tareas relacionadas con el cumplimiento normativo (por ejemplo, impedir que las direcciones incluidas en listas negras realicen transacciones).
Elusiv ha creado una sencilla aplicación para mostrar la tecnología que permite realizar transferencias privadas de tokens. Échale un vistazo en https://app.elusiv.io/.

Echemos un vistazo al SDK de Elusiv para ver cómo integrar esta funcionalidad en nuestras aplicaciones.
Crear un nuevo proyecto
mkdir elusiv-demo && cd elusiv-demo && echo > app.ts
Instalar las dependencias de Solana Web3:
hilo init -y
yarn añadir @solana/web3.js@1 @solana/spl-token @elusiv/sdk @noble/ed25519
o
npm init -y
npm install --save @solana/web3.js@1 @solana/spl-token @elusiv/sdk @noble/ed25519
Importar dependencias
Abre el archivo app.ts en el editor de código que prefieras y, en la línea 1, importa lo siguiente:
import { Connection, Keypair } from '@solana/web3.js';
import { createAssociatedTokenAccountIdempotent } from '@solana/spl-token';
import { airdropToken, Elusiv, getTokenInfo, SEED_MESSAGE } from '@elusiv/sdk';
import { sign } from '@noble/ed25519';
Estas importaciones nos permitirán conectarnos a la red de Solana, crear un token e interactuar con el SDK de Elusiv. Trataremos cada elemento con más detalle más adelante en la guía.
Crear un nuevo par de claves
En primer lugar, necesitaremos un nuevo par de claves para nuestra demostración. Genera uno utilizando el widget que aparece a continuación y copia y pega el resultado en tu editor de código.
Deberías ver algo como esto; asegúrate de incluir la clave secreta generada por el widget:
const secreto = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...]; // pega tu clave secreta aquí
const par de claves = Keypair.fromSecretKey(nuevo Uint8Array(secreto));
Tendrás que recargar la cuenta con algo de SOL de la red de desarrollo (devnet) para poder realizar transacciones en dicha red. Puedes hacerlo accediendo a Solana Faucet y pegando tu nueva clave pública, o bien introduciendo el siguiente comando en tu terminal:
solana airdrop 1 <your public key> -ud
Si necesitas ayuda, echa un vistazo a nuestra guía completa sobre cómo participar en el airdrop de SOL en Devnet.
Conéctate a un clúster de Solana con tu punto de conexión de Quicknode
Para desarrollar en Solana, necesitarás un punto final de API para conectarte a la red. Puedes utilizar nodos públicos o implementar y gestionar tu propia infraestructura; sin embargo, si quieres tiempos de respuesta 8 veces más rápidos, puedes dejarnos a nosotros el trabajo pesado.
Descubre por qué más del 50 % de los proyectos en Solana Elige Quicknode y empieza tu prueba gratuita aquí. Vamos a utilizar un Solana Devnet punto final.
Copia el HTTP Enlace del proveedor:
A continuación, utilízalo para conectarte a la red Solana con el siguiente código:
const clúster = 'devnet';
const quickNodeEndpoint = 'https://example.solana.quiknode.pro/012345' // 👈 SUSTITUYE ESTO POR TU PUNTO FINAL
const conexión = new Connection(quickNodeEndpoint);
Estructura de la aplicación
A continuación, crea un principal función y la llamaremos al final del archivo. Ahí es donde escribiremos nuestro código.
async function main() {
// code goes here
}
main()
.catch(err =>console.error(err))
.finally(() => process.exit());
Genial. Ya estamos listos para empezar a desarrollar nuestra aplicación.
Compilar la aplicación
En el interior de nuestro principal función, vamos a crear seis pasos para mostrar cómo utilizar el SDK de Elusiv:
- Crear una instancia de Elusiv
- Envía un poco de «USDC» a nuestra cuenta de tokens asociada al USDC en la red de desarrollo
- Consulta nuestro saldo privado
- Recarga el saldo privado si es necesario
- Enviar de forma privada algo de USDC a una dirección aleatoria
- Comprueba que nuestro par de claves no figurara en la transacción
Crear una instancia de Elusiv
El SDK de Elusiv nos permite crear una instancia del programa Elusiv pasando una semilla, una clave pública, una conexión a Solana y un clúster.
Interior principal, añadir el paso 1:
// Paso 1: Crear una instancia de Elusiv
console.log('1. Creando una instancia de Elusiv');
const semilla = await sign(
Buffer.de(SEED_MESSAGE, 'utf-8'),
keyPair.claveSecreta.slice(0, 32),
);
const elusiv = await Elusiv.getElusivInstance(semilla, keyPair.clavePública, conexión, clúster);
Consulta el 2. Uso básico apartado sobre el Documentación del SDK de Elusiv si te encuentras con un etc.sha512Sync no está configurado error.
El semilla La clave que generamos se crea firmando una constante que hemos importado del SDK de Elusiv. Esta semilla permite a cualquiera descifrar y gastar los activos privados del usuario, por lo que hay que manejarla con cuidado en entorno de producción.
Guardamos nuestra instancia de Elusiv como esquivo para que podamos utilizarlo en toda nuestra aplicación.
Reparto de USDC de Airdrop Dev
El SDK de Elusiv cuenta con algunas herramientas de prueba muy útiles para generar tokens SPL. Dado que vamos a probar una transferencia privada de USDC, necesitaremos algo de USDC de la red de desarrollo para nuestra demostración. Añade el paso 2 a tu principal función:
// Step 2 - Airdrop some "USDC" to our devnet USDC associated token account
console.log('2. Airdropping USDC');
const usdcInfo = getTokenInfo('USDC');
const oneUsdc = 10 ** usdcInfo.decimals;
const usdcMint = usdcInfo.mintDevnet;
const ataAcc = await createAssociatedTokenAccountIdempotent(
connection,
keyPair,
usdcMint,
keyPair.publicKey,
{ commitment: 'finalized' }
);
await airdropToken(
'USDC',
1000 * oneUsdc,
ataAcc,
);
Antes de realizar un airdrop de USDC, debemos determinar primero la dirección de acuñación y, a continuación, crear (o recuperar) una cuenta de tokens asociada (ATA) para nuestro par de claves.
- Elusiv cuenta con una función auxiliar,
getTokenInfo, que recuperará los detalles del token (por ejemplo, la dirección de emisión en la red principal y en la red de desarrollo, los decimales, etc.) para un token concreto compatible con su protocolo. Utilizamos esto para obtener la dirección de emisión del USDC en la red de desarrollo y el número de decimales asociados a la emisión del token. - Definimos
oneUsdccomo 10 elevado al número de decimales. Esto nos permitirá calcular fácilmente los importes de las transferencias sin tener que preocuparnos por los decimales. - A continuación, pasamos ese objeto `mint` a una función auxiliar de SPL Token,
createAssociatedTokenAccountIdempotent. Esto creará un nuevo ATA si es necesario y devolverá la clave pública de dicho ATA. Para obtener más información sobre los ATA, consulta nuestra Guía: Cómo encontrar la dirección del token asociado a una cartera de Solana y acuñar tokens. - Pasamos nuestro token, el importe y el nuevo ATA a otra función de utilidad de Elusiv,
airdropToken. Esto ingresará 1.000 USDC en la ATA.
Consultar el saldo privado
Antes de continuar, comprobemos el saldo de nuestra cuenta privada (debería ser 0, ya que aún no hemos hecho nada). Añade el paso 3 a tu principal función:
// Paso 3: Comprobar nuestro saldo privado
console.log('3. Comprobando el saldo privado');
let saldoPrivado = await elusiv.getLatestPrivateBalance('USDC');
El protocolo Elusiv se encarga del descifrado de los saldos privados utilizando la instancia de Elusiv que hemos creado anteriormente.
Recargar saldo privado
Dado que no dispondremos de saldo privado para nuestras pruebas iniciales, vamos a ingresar (o «recargar») nuestra cuenta de saldo privado.
// Step 4 - Top up private balance if needed
if (privateBalance === BigInt(0)) {
console.log('4. Topping up private balance');
const topupTx = await elusiv.buildTopUpTx(500 * oneUsdc, 'USDC');
topupTx.tx.partialSign(keyPair);
await elusiv.sendElusivTx(topupTx);
privateBalance = await elusiv.getLatestPrivateBalance('USDC');
} else {
console.log('4. Private balance top up not needed. Current Balance: ', (privateBalance / BigInt(10 ** usdcInfo.decimals)).toString());
}
Analicémoslo por partes:
- En primer lugar, comprobamos que el saldo sea 0. Si no es así, nos saltaremos este paso.
- A continuación, utilizamos el sistema de Elusiv
buildTopUpTxfunción para crear una transacción que recargue nuestro saldo privado con 500 USDC. - Firmamos parcialmente la transacción con nuestro par de claves.
- Por último, enviamos la transacción a la red y recuperamos el último saldo privado.
Enviar USDC de forma privada
Tras el paso 4, deberíamos tener un saldo positivo en nuestra cuenta privada. Vamos a utilizarlo para enviar una transacción privada. Para ello, enviaremos algo de USDC a una dirección aleatoria. Añade el paso 5 a tu principal función:
// Step 5 - Send some USDC to a random address
console.log('5. Sending USDC to a random address');
if (privateBalance <= BigInt(0)) {
throw new Error("Can't send from an empty private balance");
}
const sendTx = await elusiv.buildSendTx(10 * oneUsdc, Keypair.generate().publicKey, 'USDC');
const sig = await elusiv.sendElusivTx(sendTx);
console.log(` https://explorer.solana.com/tx/${sig.signature}?cluster=${cluster}`);
En primer lugar, comprobamos dos veces que, efectivamente, tengamos un saldo positivo en nuestra cuenta privada. Si no es así, generamos un error. A continuación, utilizamos la función de Elusiv buildSendTx función para crear una transacción que envíe 10 USDC a una dirección aleatoria. A continuación, enviamos la transacción a la red y registramos la URL de la transacción en la consola.
En este momento, hemos enviado con éxito una transacción privada. ¡Buen trabajo!
Verificar transacción
Añadamos un paso adicional que compruebe que nuestra transacción es privada. Para ello, utilizaremos el getTransaction método del SDK de Solana Web3 y, a continuación, analizar los resultados. Añade el paso 6 a tu principal función:
// Step 6 - Check if our keypair was in the transaction
console.log('6. Checking if our keypair was in the transaction');
const txDetail = await connection.getTransaction(sig.signature, {
commitment: 'confirmed',
maxSupportedTransactionVersion: 0
});
const readonly = txDetail?.meta?.loadedAddresses?.readonly ?? [];
const writable = txDetail?.meta?.loadedAddresses?.writable ?? [];
const allAccounts = [...new Set([...readonly, ...writable])];
const isSenderInTx = allAccounts.some(pubKey => pubKey.toBase58() === keyPair.publicKey.toBase58());
if (isSenderInTx) {
console.log('❌ - Our Keypair was in the transaction (unexpected)');
} else {
console.log('✅ - Our Keypair was not in the transaction (expected)');
}
Repasemos el nuevo código:
- En primer lugar, llamamos a la
getTransactionmétodo sobre la firma de la transacción de nuestra transferencia privada. Esto devolverá los detalles de la transacción. - A continuación, analizamos los detalles de la transacción para obtener la lista de cuentas que se cargaron en memoria durante la transacción. Estamos recuperando el
solo lecturaygrabablecuentas y, a continuación, combinarlas en una única matriz que contenga todas las claves públicas utilizadas en la transacción. - Por último, comprobamos si nuestra clave de remitente figuraba en la transacción utilizando
.algunos. Esperamos que nuestra clave de remitente no aparezca en la transacción, por lo que registramos un mensaje de éxito si no aparece. Si aparece, registramos un error.
Ejecuta la aplicación
Ahora que ya hemos creado nuestra aplicación, vamos a ejecutarla. En tu terminal, escribe:
ts-node app.ts
Deberías ver algo como esto:
qn elusiv-demo % ts-node app
1. Creando una instancia de Elusiv
2. Distribución aérea de USDC
3. Consultar el saldo privado
4. No es necesario recargar el saldo privado. Saldo actual: 359777742
5. Envío de USDC a una dirección aleatoria
https://explorer.solana.com/tx/5fP4TvgCbYMWFRaQuzikmwovSgJWJM7F7c59kKMP82BJjgDurUPdwH49gbJxhhcjWHH1bxbxeYRorw9j6QFRE7HD?cluster=devnet
6. Comprobación de si nuestro par de claves estaba en la transacción
✅ - Nuestro par de claves no estaba en la transacción (esperado)
Nota: Consulte el 2. Uso básico apartado sobre el Documentación del SDK de Elusiv si te encuentras con un etc.sha512Sync no está configurado error.
Si ves el mensaje de éxito al final, significa que has enviado correctamente una transacción privada en Solana utilizando el SDK de Elusiv. Deberías poder consultar la transacción en Solana Explorer y comprobar que nuestra cartera de pagador no está asociada a la transacción. ¡Buen trabajo!
Conclusión
Habilitar las transacciones privadas en tu dapp puede ser una forma estupenda de proteger la privacidad de tus usuarios y reducir las barreras para la adopción de la tecnología Web3. Elusiv facilita la integración de esta funcionalidad en tu aplicación. ¡Estamos deseando ver qué se te ocurre!
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.
Recursos
- Introducción a las pruebas de conocimiento cero
- 🎥 ¿Qué son las pruebas de conocimiento cero? — Explícamelo como si tuviera cinco años
- Especificaciones técnicas de Elusiv
- Repositorio de GitHub de Elusiv
- Casos de uso reales de ZK Proofs
- SDK de Elusiv
- Muestras de Elusiv
- Aplicación de demostración de Elusiv
