Saltar al contenido principal

Una publicación etiquetados con "encryption"

Ver Todas las Etiquetas

Construyendo Encriptación Descentralizada con @mysten/seal: Tutorial para Desarrolladores

· 14 min de lectura
Dora Noda
Software Engineer

La privacidad se está convirtiendo en infraestructura pública. En 2025, los desarrolladores necesitan herramientas que hagan la encriptación tan fácil como almacenar datos. Seal de Mysten Labs proporciona exactamente eso: gestión de secretos descentralizada con control de acceso onchain. Este tutorial te enseñará cómo construir aplicaciones Web3 seguras usando encriptación basada en identidad, seguridad threshold y políticas de acceso programables.


Introducción: Por Qué Seal Importa para Web3

Las aplicaciones cloud tradicionales dependen de sistemas centralizados de gestión de claves donde un solo proveedor controla el acceso a datos encriptados. Aunque esto es conveniente, crea peligrosos puntos únicos de falla. Si el proveedor se ve comprometido, se desconecta o decide restringir el acceso, tus datos se vuelven inaccesibles o vulnerables.

Seal cambia completamente este paradigma. Construido por Mysten Labs para la blockchain Sui, Seal es un servicio de gestión de secretos descentralizada (DSM) que permite:

  • Encriptación basada en identidad donde el contenido se protege antes de salir de tu entorno
  • Encriptación threshold que distribuye el acceso a claves entre múltiples nodos independientes
  • Control de acceso onchain con bloqueos temporales, token-gating y lógica de autorización personalizada
  • Diseño agnóstico de almacenamiento que funciona con Walrus, IPFS o cualquier solución de almacenamiento

Ya sea que estés construyendo aplicaciones de mensajería segura, plataformas de contenido con acceso restringido o transferencias de activos con bloqueo temporal, Seal proporciona las primitivas criptográficas y la infraestructura de control de acceso que necesitas.


Primeros Pasos

Prerrequisitos

Antes de comenzar, asegúrate de tener:

  • Node.js 18+ instalado
  • Familiaridad básica con TypeScript/JavaScript
  • Una wallet de Sui para pruebas (como Sui Wallet)
  • Comprensión de conceptos blockchain

Instalación

Instala el SDK de Seal vía npm:

npm install @mysten/seal

También querrás el SDK de Sui para interacciones blockchain:

npm install @mysten/sui

Configuración del Proyecto

Crea un nuevo proyecto e inicialízalo:

mkdir seal-tutorial
cd seal-tutorial
npm init -y
npm install @mysten/seal @mysten/sui typescript @types/node

Crea una configuración simple de TypeScript:

// tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}

Conceptos Fundamentales: Cómo Funciona Seal

Antes de escribir código, entendamos la arquitectura de Seal:

1. Encriptación Basada en Identidad (IBE)

A diferencia de la encriptación tradicional donde encriptas a una clave pública, IBE te permite encriptar a una identidad (como una dirección de email o dirección Sui). El destinatario solo puede desencriptar si puede probar que controla esa identidad.

2. Encriptación Threshold

En lugar de confiar en un solo servidor de claves, Seal usa esquemas threshold t-de-n. Podrías configurar 3-de-5 servidores de claves, significando que cualquier 3 servidores pueden cooperar para proporcionar claves de desencriptación, pero 2 o menos no pueden.

3. Control de Acceso Onchain

Las políticas de acceso son aplicadas por smart contracts de Sui. Antes de que un servidor de claves proporcione claves de desencriptación, verifica que el solicitante cumpla con los requisitos de política onchain (propiedad de tokens, restricciones temporales, etc.).

4. Red de Servidores de Claves

Los servidores de claves distribuidos validan políticas de acceso y generan claves de desencriptación. Estos servidores son operados por diferentes partes para asegurar que no haya un punto único de control.


Implementación Básica: Tu Primera Aplicación Seal

Construyamos una aplicación simple que encripte datos sensibles y controle el acceso a través de políticas blockchain de Sui.

Paso 1: Inicializar el Cliente Seal

// src/seal-client.ts
import { SealClient } from '@mysten/seal';
import { SuiClient } from '@mysten/sui/client';

export async function createSealClient() {
// Inicializar cliente Sui para testnet
const suiClient = new SuiClient({
url: 'https://fullnode.testnet.sui.io'
});

// Configurar cliente Seal con servidores de claves de testnet
const sealClient = new SealClient({
suiClient,
keyServers: [
'https://keyserver1.seal-testnet.com',
'https://keyserver2.seal-testnet.com',
'https://keyserver3.seal-testnet.com'
],
threshold: 2, // threshold 2-de-3
network: 'testnet'
});

return { sealClient, suiClient };
}

Paso 2: Encriptación/Desencriptación Simple

// src/basic-encryption.ts
import { createSealClient } from './seal-client';

async function basicExample() {
const { sealClient } = await createSealClient();

// Datos a encriptar
const sensitiveData = "¡Este es mi mensaje secreto!";
const recipientAddress = "0x742d35cc6d4c0c08c0f9bf3c9b2b6c64b3b4f5c6d7e8f9a0b1c2d3e4f5a6b7c8";

try {
// Encriptar datos para una dirección Sui específica
const encryptedData = await sealClient.encrypt({
data: Buffer.from(sensitiveData, 'utf-8'),
recipientId: recipientAddress,
// Opcional: agregar metadata
metadata: {
contentType: 'text/plain',
timestamp: Date.now()
}
});

console.log('Datos encriptados:', {
ciphertext: encryptedData.ciphertext.toString('base64'),
encryptionId: encryptedData.encryptionId
});

// Más tarde, desencriptar los datos (requiere autorización apropiada)
const decryptedData = await sealClient.decrypt({
ciphertext: encryptedData.ciphertext,
encryptionId: encryptedData.encryptionId,
recipientId: recipientAddress
});

console.log('Datos desencriptados:', decryptedData.toString('utf-8'));

} catch (error) {
console.error('Encriptación/desencriptación falló:', error);
}
}

basicExample();

Control de Acceso con Smart Contracts de Sui

El verdadero poder de Seal viene del control de acceso programable. Creemos un ejemplo de encriptación con bloqueo temporal donde los datos solo pueden ser desencriptados después de un tiempo específico.

Paso 1: Desplegar Contrato de Control de Acceso

Primero, necesitamos un smart contract Move que defina nuestra política de acceso:

// contracts/time_lock.move
module time_lock::policy {
use sui::clock::{Self, Clock};
use sui::object::{Self, UID};
use sui::tx_context::{Self, TxContext};

public struct TimeLockPolicy has key, store {
id: UID,
unlock_time: u64,
authorized_user: address,
}

public fun create_time_lock(
unlock_time: u64,
authorized_user: address,
ctx: &mut TxContext
): TimeLockPolicy {
TimeLockPolicy {
id: object::new(ctx),
unlock_time,
authorized_user,
}
}

public fun can_decrypt(
policy: &TimeLockPolicy,
user: address,
clock: &Clock
): bool {
let current_time = clock::timestamp_ms(clock);
policy.authorized_user == user && current_time >= policy.unlock_time
}
}

Paso 2: Integrar con Seal

// src/time-locked-encryption.ts
import { createSealClient } from './seal-client';
import { TransactionBlock } from '@mysten/sui/transactions';

async function createTimeLocked() {
const { sealClient, suiClient } = await createSealClient();

// Crear política de acceso en Sui
const txb = new TransactionBlock();

const unlockTime = Date.now() + 60000; // Desbloquear en 1 minuto
const authorizedUser = "0x742d35cc6d4c0c08c0f9bf3c9b2b6c64b3b4f5c6d7e8f9a0b1c2d3e4f5a6b7c8";

txb.moveCall({
target: 'time_lock::policy::create_time_lock',
arguments: [
txb.pure(unlockTime),
txb.pure(authorizedUser)
]
});

// Ejecutar transacción para crear política
const result = await suiClient.signAndExecuteTransactionBlock({
transactionBlock: txb,
signer: yourKeypair, // Tu keypair de Sui
});

const policyId = result.objectChanges?.find(
change => change.type === 'created'
)?.objectId;

// Ahora encriptar con esta política
const sensitiveData = "¡Esto se desbloqueará en 1 minuto!";

const encryptedData = await sealClient.encrypt({
data: Buffer.from(sensitiveData, 'utf-8'),
recipientId: authorizedUser,
accessPolicy: {
policyId,
policyType: 'time_lock'
}
});

console.log('Datos con bloqueo temporal creados. Intenta desencriptar después de 1 minuto.');

return {
encryptedData,
policyId,
unlockTime
};
}

Ejemplos Prácticos

Ejemplo 1: Aplicación de Mensajería Segura

// src/secure-messaging.ts
import { createSealClient } from './seal-client';

class SecureMessenger {
private sealClient: any;

constructor(sealClient: any) {
this.sealClient = sealClient;
}

async sendMessage(
message: string,
recipientAddress: string,
senderKeypair: any
) {
const messageData = {
content: message,
timestamp: Date.now(),
sender: senderKeypair.toSuiAddress(),
messageId: crypto.randomUUID()
};

const encryptedMessage = await this.sealClient.encrypt({
data: Buffer.from(JSON.stringify(messageData), 'utf-8'),
recipientId: recipientAddress,
metadata: {
type: 'secure_message',
sender: senderKeypair.toSuiAddress()
}
});

// Almacenar mensaje encriptado en almacenamiento descentralizado (Walrus)
return this.storeOnWalrus(encryptedMessage);
}

async readMessage(encryptionId: string, recipientKeypair: any) {
// Recuperar del almacenamiento
const encryptedData = await this.retrieveFromWalrus(encryptionId);

// Desencriptar con Seal
const decryptedData = await this.sealClient.decrypt({
ciphertext: encryptedData.ciphertext,
encryptionId: encryptedData.encryptionId,
recipientId: recipientKeypair.toSuiAddress()
});

return JSON.parse(decryptedData.toString('utf-8'));
}

private async storeOnWalrus(data: any) {
// Integración con almacenamiento Walrus
// Esto subiría los datos encriptados a Walrus
// y devolvería el blob ID para recuperación
}

private async retrieveFromWalrus(blobId: string) {
// Recuperar datos encriptados de Walrus usando blob ID
}
}

Ejemplo 2: Plataforma de Contenido con Token-Gating

// src/gated-content.ts
import { createSealClient } from './seal-client';

class ContentGating {
private sealClient: any;
private suiClient: any;

constructor(sealClient: any, suiClient: any) {
this.sealClient = sealClient;
this.suiClient = suiClient;
}

async createGatedContent(
content: string,
requiredNftCollection: string,
creatorKeypair: any
) {
// Crear política de propiedad NFT
const accessPolicy = await this.createNftPolicy(
requiredNftCollection,
creatorKeypair
);

// Encriptar contenido con requisito de acceso NFT
const encryptedContent = await this.sealClient.encrypt({
data: Buffer.from(content, 'utf-8'),
recipientId: 'nft_holders', // Destinatario especial para holders de NFT
accessPolicy: {
policyId: accessPolicy.policyId,
policyType: 'nft_ownership'
}
});

return {
contentId: encryptedContent.encryptionId,
accessPolicy: accessPolicy.policyId
};
}

async accessGatedContent(
contentId: string,
userAddress: string,
userKeypair: any
) {
// Verificar propiedad NFT primero
const hasAccess = await this.verifyNftOwnership(
userAddress,
contentId
);

if (!hasAccess) {
throw new Error('Acceso denegado: NFT requerido no encontrado');
}

// Desencriptar contenido
const decryptedContent = await this.sealClient.decrypt({
encryptionId: contentId,
recipientId: userAddress
});

return decryptedContent.toString('utf-8');
}

private async createNftPolicy(collection: string, creator: any) {
// Crear contrato Move que verifique propiedad NFT
// Devuelve ID del objeto política
}

private async verifyNftOwnership(user: string, contentId: string) {
// Verificar si el usuario posee NFT requerido
// Consultar Sui por propiedad NFT
}
}

Ejemplo 3: Transferencia de Activos con Bloqueo Temporal

// src/time-locked-transfer.ts
import { createSealClient } from './seal-client';

async function createTimeLockTransfer(
assetData: any,
recipientAddress: string,
unlockTimestamp: number,
senderKeypair: any
) {
const { sealClient, suiClient } = await createSealClient();

// Crear política de bloqueo temporal en Sui
const timeLockPolicy = await createTimeLockPolicy(
unlockTimestamp,
recipientAddress,
senderKeypair,
suiClient
);

// Encriptar datos de transferencia de activos
const transferData = {
asset: assetData,
recipient: recipientAddress,
unlockTime: unlockTimestamp,
transferId: crypto.randomUUID()
};

const encryptedTransfer = await sealClient.encrypt({
data: Buffer.from(JSON.stringify(transferData), 'utf-8'),
recipientId: recipientAddress,
accessPolicy: {
policyId: timeLockPolicy.policyId,
policyType: 'time_lock'
}
});

console.log(`Activo bloqueado hasta ${new Date(unlockTimestamp)}`);

return {
transferId: encryptedTransfer.encryptionId,
unlockTime: unlockTimestamp,
policyId: timeLockPolicy.policyId
};
}

async function claimTimeLockTransfer(
transferId: string,
recipientKeypair: any
) {
const { sealClient } = await createSealClient();

try {
const decryptedData = await sealClient.decrypt({
encryptionId: transferId,
recipientId: recipientKeypair.toSuiAddress()
});

const transferData = JSON.parse(decryptedData.toString('utf-8'));

// Procesar la transferencia de activos
console.log('Transferencia de activos desbloqueada:', transferData);

return transferData;
} catch (error) {
console.error('Transferencia aún no desbloqueada o acceso denegado:', error);
throw error;
}
}

Integración con Almacenamiento Descentralizado Walrus

Seal funciona perfectamente con Walrus, la solución de almacenamiento descentralizado de Sui. Aquí te mostramos cómo integrar ambos:

// src/walrus-integration.ts
import { createSealClient } from './seal-client';

class SealWalrusIntegration {
private sealClient: any;
private walrusClient: any;

constructor(sealClient: any, walrusClient: any) {
this.sealClient = sealClient;
this.walrusClient = walrusClient;
}

async storeEncryptedData(
data: Buffer,
recipientAddress: string,
accessPolicy?: any
) {
// Encriptar con Seal
const encryptedData = await this.sealClient.encrypt({
data,
recipientId: recipientAddress,
accessPolicy
});

// Almacenar datos encriptados en Walrus
const blobId = await this.walrusClient.store(
encryptedData.ciphertext
);

// Devolver referencia que incluye info tanto de Seal como Walrus
return {
blobId,
encryptionId: encryptedData.encryptionId,
accessPolicy: encryptedData.accessPolicy
};
}

async retrieveAndDecrypt(
blobId: string,
encryptionId: string,
userKeypair: any
) {
// Recuperar de Walrus
const encryptedData = await this.walrusClient.retrieve(blobId);

// Desencriptar con Seal
const decryptedData = await this.sealClient.decrypt({
ciphertext: encryptedData,
encryptionId,
recipientId: userKeypair.toSuiAddress()
});

return decryptedData;
}
}

// Ejemplo de uso
async function walrusExample() {
const { sealClient } = await createSealClient();
const walrusClient = new WalrusClient('https://walrus-testnet.sui.io');

const integration = new SealWalrusIntegration(sealClient, walrusClient);

const fileData = Buffer.from('Contenido de documento importante');
const recipientAddress = '0x...';

// Almacenar encriptado
const result = await integration.storeEncryptedData(
fileData,
recipientAddress
);

console.log('Almacenado con Blob ID:', result.blobId);

// Más tarde, recuperar y desencriptar
const decrypted = await integration.retrieveAndDecrypt(
result.blobId,
result.encryptionId,
recipientKeypair
);

console.log('Datos recuperados:', decrypted.toString());
}

Configuración Avanzada de Encriptación Threshold

Para aplicaciones de producción, querrás configurar encriptación threshold personalizada con múltiples servidores de claves:

// src/advanced-threshold.ts
import { SealClient } from '@mysten/seal';

async function setupProductionSeal() {
// Configurar con múltiples servidores de claves independientes
const keyServers = [
'https://keyserver-1.your-org.com',
'https://keyserver-2.partner-org.com',
'https://keyserver-3.third-party.com',
'https://keyserver-4.backup-provider.com',
'https://keyserver-5.fallback.com'
];

const sealClient = new SealClient({
keyServers,
threshold: 3, // threshold 3-de-5
network: 'mainnet',
// Opciones avanzadas
retryAttempts: 3,
timeoutMs: 10000,
backupKeyServers: [
'https://backup-1.emergency.com',
'https://backup-2.emergency.com'
]
});

return sealClient;
}

async function robustEncryption() {
const sealClient = await setupProductionSeal();

const criticalData = "Datos encriptados de misión crítica";

// Encriptar con garantías de alta seguridad
const encrypted = await sealClient.encrypt({
data: Buffer.from(criticalData, 'utf-8'),
recipientId: '0x...',
// Requerir todos los 5 servidores para máxima seguridad
customThreshold: 5,
// Agregar redundancia
redundancy: 2,
accessPolicy: {
// Requisitos multi-factor
requirements: ['nft_ownership', 'time_lock', 'multisig_approval']
}
});

return encrypted;
}

Mejores Prácticas de Seguridad

1. Gestión de Claves

// src/security-practices.ts

// BUENO: Usar derivación segura de claves
import { generateKeypair } from '@mysten/sui/cryptography/ed25519';

const keypair = generateKeypair();

// BUENO: Almacenar claves de forma segura (ejemplo con variables de entorno)
const keypair = Ed25519Keypair.fromSecretKey(
process.env.PRIVATE_KEY
);

// MALO: Nunca hardcodear claves
const badKeypair = Ed25519Keypair.fromSecretKey(
"hardcoded-secret-key-12345" // ¡No hagas esto!
);

2. Validación de Políticas de Acceso

// Siempre validar políticas de acceso antes de encriptar
async function secureEncrypt(data: Buffer, recipient: string) {
const { sealClient } = await createSealClient();

// Validar dirección del destinatario
if (!isValidSuiAddress(recipient)) {
throw new Error('Dirección de destinatario inválida');
}

// Verificar que la política existe y es válida
const policy = await validateAccessPolicy(policyId);
if (!policy.isValid) {
throw new Error('Política de acceso inválida');
}

return sealClient.encrypt({
data,
recipientId: recipient,
accessPolicy: policy
});
}

3. Manejo de Errores y Respaldos

// Manejo robusto de errores
async function resilientDecrypt(encryptionId: string, userKeypair: any) {
const { sealClient } = await createSealClient();

try {
return await sealClient.decrypt({
encryptionId,
recipientId: userKeypair.toSuiAddress()
});
} catch (error) {
if (error.code === 'ACCESS_DENIED') {
throw new Error('Acceso denegado: Verifica tus permisos');
} else if (error.code === 'KEY_SERVER_UNAVAILABLE') {
// Intentar con configuración de respaldo
return await retryWithBackupServers(encryptionId, userKeypair);
} else if (error.code === 'THRESHOLD_NOT_MET') {
throw new Error('Servidores de claves insuficientes disponibles');
} else {
throw new Error(`Desencriptación falló: ${error.message}`);
}
}
}

4. Validación de Datos

// Validar datos antes de encriptar
function validateDataForEncryption(data: Buffer): boolean {
// Verificar límites de tamaño
if (data.length > 1024 * 1024) { // límite de 1MB
throw new Error('Datos demasiado grandes para encriptar');
}

// Verificar patrones sensibles (opcional)
const dataStr = data.toString();
if (containsSensitivePatterns(dataStr)) {
console.warn('Advertencia: Los datos contienen patrones potencialmente sensibles');
}

return true;
}

Optimización de Rendimiento

1. Operaciones en Lotes

// Procesar múltiples encriptaciones por lotes para eficiencia
async function batchEncrypt(dataItems: Buffer[], recipients: string[]) {
const { sealClient } = await createSealClient();

const promises = dataItems.map((data, index) =>
sealClient.encrypt({
data,
recipientId: recipients[index]
})
);

return Promise.all(promises);
}

2. Caché de Respuestas de Servidores de Claves

// Cachear sesiones de servidores de claves para reducir latencia
class OptimizedSealClient {
private sessionCache = new Map();

async encryptWithCaching(data: Buffer, recipient: string) {
let session = this.sessionCache.get(recipient);

if (!session || this.isSessionExpired(session)) {
session = await this.createNewSession(recipient);
this.sessionCache.set(recipient, session);
}

return this.encryptWithSession(data, session);
}
}

Probando tu Integración Seal

Pruebas Unitarias

// tests/seal-integration.test.ts
import { describe, it, expect } from 'jest';
import { createSealClient } from '../src/seal-client';

describe('Integración Seal', () => {
it('debería encriptar y desencriptar datos exitosamente', async () => {
const { sealClient } = await createSealClient();
const testData = Buffer.from('mensaje de prueba');
const recipient = '0x742d35cc6d4c0c08c0f9bf3c9b2b6c64b3b4f5c6d7e8f9a0b1c2d3e4f5a6b7c8';

const encrypted = await sealClient.encrypt({
data: testData,
recipientId: recipient
});

expect(encrypted.encryptionId).toBeDefined();
expect(encrypted.ciphertext).toBeDefined();

const decrypted = await sealClient.decrypt({
ciphertext: encrypted.ciphertext,
encryptionId: encrypted.encryptionId,
recipientId: recipient
});

expect(decrypted.toString()).toBe('mensaje de prueba');
});

it('debería aplicar políticas de control de acceso', async () => {
// Probar que usuarios no autorizados no pueden desencriptar
const { sealClient } = await createSealClient();

const encrypted = await sealClient.encrypt({
data: Buffer.from('secreto'),
recipientId: 'authorized-user'
});

await expect(
sealClient.decrypt({
ciphertext: encrypted.ciphertext,
encryptionId: encrypted.encryptionId,
recipientId: 'unauthorized-user'
})
).rejects.toThrow('Acceso denegado');
});
});

Despliegue a Producción

Configuración de Entorno

// config/production.ts
export const productionConfig = {
keyServers: [
process.env.KEY_SERVER_1,
process.env.KEY_SERVER_2,
process.env.KEY_SERVER_3,
process.env.KEY_SERVER_4,
process.env.KEY_SERVER_5
],
threshold: 3,
network: 'mainnet',
suiRpc: process.env.SUI_RPC_URL,
walrusGateway: process.env.WALRUS_GATEWAY,
// Configuraciones de seguridad
maxDataSize: 1024 * 1024, // 1MB
sessionTimeout: 3600000, // 1 hora
retryAttempts: 3
};

Monitoreo y Logging

// utils/monitoring.ts
export class SealMonitoring {
static logEncryption(encryptionId: string, recipient: string) {
console.log(`[SEAL] Datos encriptados ${encryptionId} para ${recipient}`);
// Enviar a tu servicio de monitoreo
}

static logDecryption(encryptionId: string, success: boolean) {
console.log(`[SEAL] Desencriptación ${encryptionId}: ${success ? 'ÉXITO' : 'FALLÓ'}`);
}

static logKeyServerHealth(serverUrl: string, status: string) {
console.log(`[SEAL] Servidor de claves ${serverUrl}: ${status}`);
}
}

Recursos y Próximos Pasos

Documentación Oficial

Comunidad y Soporte

  • Discord de Sui: Únete al canal #seal para soporte comunitario
  • GitHub Issues: Reporta bugs y solicita funcionalidades
  • Foros de Desarrolladores: Foros comunitarios de Sui para discusiones

Temas Avanzados para Explorar

  1. Políticas de Acceso Personalizadas: Construir lógica de autorización compleja con contratos Move
  2. Integración Cross-Chain: Usar Seal con otras redes blockchain
  3. Gestión de Claves Empresarial: Configurar tu propia infraestructura de servidores de claves
  4. Auditoría y Cumplimiento: Implementar logging y monitoreo para entornos regulados

Aplicaciones de Ejemplo

  • App de Chat Seguro: Mensajería con encriptación extremo a extremo con Seal
  • Gestión de Documentos: Compartir documentos empresariales con controles de acceso
  • Gestión de Derechos Digitales: Distribución de contenido con políticas de uso
  • Análisis Preservando Privacidad: Flujos de trabajo de procesamiento de datos encriptados

Conclusión

Seal representa un cambio fundamental hacia hacer de la privacidad y la infraestructura de encriptación preocupaciones a nivel de infraestructura en Web3. Al combinar encriptación basada en identidad, seguridad threshold y control de acceso programable, proporciona a los desarrolladores herramientas poderosas para construir aplicaciones verdaderamente seguras y descentralizadas.

Las ventajas clave de construir con Seal incluyen:

  • Sin Punto Único de Falla: Los servidores de claves distribuidos eliminan autoridades centrales
  • Seguridad Programable: Las políticas de acceso basadas en smart contracts proporcionan autorización flexible
  • Amigable para Desarrolladores: El SDK TypeScript se integra perfectamente con herramientas Web3 existentes
  • Agnóstico de Almacenamiento: Funciona con Walrus, IPFS o cualquier solución de almacenamiento
  • Listo para Producción: Construido por Mysten Labs con estándares de seguridad empresarial

Ya sea que estés asegurando datos de usuarios, implementando modelos de suscripción o construyendo aplicaciones complejas multi-party, Seal proporciona las primitivas criptográficas y la infraestructura de control de acceso que necesitas para construir con confianza.

Comienza a construir hoy y únete al creciente ecosistema de desarrolladores haciendo de la privacidad una parte fundamental de la infraestructura pública.


¿Listo para empezar a construir? Instala @mysten/seal y comienza a experimentar con los ejemplos de este tutorial. La web descentralizada está esperando aplicaciones que pongan la privacidad y seguridad primero.