Pular para o conteúdo principal

Uma postagem marcadas com "encryption"

Ver todas os Marcadores

Construindo Criptografia Descentralizada com @mysten/seal: Tutorial para Desenvolvedores

· Leitura de 14 minutos
Dora Noda
Software Engineer

A privacidade está se tornando infraestrutura pública. Em 2025, desenvolvedores precisam de ferramentas que tornem a criptografia tão fácil quanto armazenar dados. O Seal da Mysten Labs oferece exatamente isso—gerenciamento descentralizado de segredos com controle de acesso onchain. Este tutorial te ensinará como construir aplicações Web3 seguras usando criptografia baseada em identidade, segurança threshold e políticas de acesso programáveis.


Introdução: Por que o Seal Importa para Web3

Aplicações cloud tradicionais dependem de sistemas centralizados de gerenciamento de chaves onde um único provedor controla o acesso aos dados criptografados. Embora conveniente, isso cria pontos únicos perigosos de falha. Se o provedor for comprometido, ficar offline ou decidir restringir o acesso, seus dados se tornam inacessíveis ou vulneráveis.

Seal muda completamente esse paradigma. Construído pela Mysten Labs para a blockchain Sui, Seal é um serviço de gerenciamento descentralizado de segredos (DSM) que possibilita:

  • Criptografia baseada em identidade onde o conteúdo é protegido antes de deixar seu ambiente
  • Criptografia threshold que distribui acesso às chaves entre múltiplos nós independentes
  • Controle de acesso onchain com time locks, token-gating e lógica de autorização customizada
  • Design agnóstico de armazenamento que funciona com Walrus, IPFS ou qualquer solução de armazenamento

Seja construindo aplicações de mensagens seguras, plataformas de conteúdo restrito por tokens ou transferências de ativos com time lock, Seal fornece as primitivas criptográficas e infraestrutura de controle de acesso que você precisa.


Primeiros Passos

Pré-requisitos

Antes de mergulhar, certifique-se de ter:

  • Node.js 18+ instalado
  • Familiaridade básica com TypeScript/JavaScript
  • Uma carteira Sui para testes (como Sui Wallet)
  • Entendimento de conceitos blockchain

Instalação

Instale o SDK Seal via npm:

npm install @mysten/seal

Você também vai querer o SDK Sui para interações blockchain:

npm install @mysten/sui

Configuração do Projeto

Crie um novo projeto e inicialize-o:

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

Crie uma configuração TypeScript simples:

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

Conceitos Fundamentais: Como o Seal Funciona

Antes de escrever código, vamos entender a arquitetura do Seal:

1. Criptografia Baseada em Identidade (IBE)

Diferente da criptografia tradicional onde você criptografa para uma chave pública, IBE permite criptografar para uma identidade (como um endereço de email ou endereço Sui). O destinatário só pode descriptografar se conseguir provar que controla essa identidade.

2. Criptografia Threshold

Em vez de confiar em um único servidor de chaves, Seal usa esquemas t-of-n threshold. Você pode configurar 3-de-5 servidores de chaves, significando que qualquer 3 servidores podem cooperar para fornecer chaves de descriptografia, mas 2 ou menos não conseguem.

3. Controle de Acesso Onchain

Políticas de acesso são aplicadas por smart contracts da Sui. Antes que um servidor de chaves forneça chaves de descriptografia, ele verifica se o solicitante atende aos requisitos da política onchain (propriedade de tokens, restrições de tempo, etc.).

4. Rede de Servidores de Chaves

Servidores de chaves distribuídos validam políticas de acesso e geram chaves de descriptografia. Esses servidores são operados por diferentes partes para garantir que não haja um único ponto de controle.


Implementação Básica: Sua Primeira Aplicação Seal

Vamos construir uma aplicação simples que criptografa dados sensíveis e controla o acesso através de políticas blockchain da Sui.

Passo 1: Inicializar o 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 com servidores de chaves da 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 };
}

Passo 2: Criptografia/Descriptografia Simples

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

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

// Dados para criptografar
const sensitiveData = "Esta é minha mensagem secreta!";
const recipientAddress = "0x742d35cc6d4c0c08c0f9bf3c9b2b6c64b3b4f5c6d7e8f9a0b1c2d3e4f5a6b7c8";

try {
// Criptografar dados para um endereço Sui específico
const encryptedData = await sealClient.encrypt({
data: Buffer.from(sensitiveData, 'utf-8'),
recipientId: recipientAddress,
// Opcional: adicionar metadados
metadata: {
contentType: 'text/plain',
timestamp: Date.now()
}
});

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

// Depois, descriptografar os dados (requer autorização adequada)
const decryptedData = await sealClient.decrypt({
ciphertext: encryptedData.ciphertext,
encryptionId: encryptedData.encryptionId,
recipientId: recipientAddress
});

console.log('Dados descriptografados:', decryptedData.toString('utf-8'));

} catch (error) {
console.error('Falha na criptografia/descriptografia:', error);
}
}

basicExample();

Controle de Acesso com Smart Contracts da Sui

O verdadeiro poder do Seal vem do controle de acesso programável. Vamos criar um exemplo de criptografia com time lock onde os dados só podem ser descriptografados após um tempo específico.

Passo 1: Implementar Contrato de Controle de Acesso

Primeiro, precisamos de um smart contract Move que define nossa política de acesso:

// 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
}
}

Passo 2: Integrar com 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();

// Criar política de acesso na Sui
const txb = new TransactionBlock();

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

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

// Executar transação para criar política
const result = await suiClient.signAndExecuteTransactionBlock({
transactionBlock: txb,
signer: yourKeypair, // Seu keypair Sui
});

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

// Agora criptografar com esta política
const sensitiveData = "Isso será desbloqueado em 1 minuto!";

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

console.log('Dados com time lock criados. Tente descriptografar após 1 minuto.');

return {
encryptedData,
policyId,
unlockTime
};
}

Exemplos Práticos

Exemplo 1: Aplicação de Mensagens Seguras

// 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()
}
});

// Armazenar mensagem criptografada em armazenamento descentralizado (Walrus)
return this.storeOnWalrus(encryptedMessage);
}

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

// Descriptografar com 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) {
// Integração com armazenamento Walrus
// Isso faria upload dos dados criptografados para Walrus
// e retornaria o blob ID para recuperação
}

private async retrieveFromWalrus(blobId: string) {
// Recuperar dados criptografados do Walrus usando blob ID
}
}

Exemplo 2: Plataforma de Conteúdo com 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
) {
// Criar política de propriedade de NFT
const accessPolicy = await this.createNftPolicy(
requiredNftCollection,
creatorKeypair
);

// Criptografar conteúdo com requisito de acesso por NFT
const encryptedContent = await this.sealClient.encrypt({
data: Buffer.from(content, 'utf-8'),
recipientId: 'nft_holders', // Destinatário especial para portadores 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 propriedade de NFT primeiro
const hasAccess = await this.verifyNftOwnership(
userAddress,
contentId
);

if (!hasAccess) {
throw new Error('Acesso negado: NFT necessário não encontrado');
}

// Descriptografar conteúdo
const decryptedContent = await this.sealClient.decrypt({
encryptionId: contentId,
recipientId: userAddress
});

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

private async createNftPolicy(collection: string, creator: any) {
// Criar contrato Move que verifica propriedade de NFT
// Retorna ID do objeto de política
}

private async verifyNftOwnership(user: string, contentId: string) {
// Verificar se usuário possui NFT necessário
// Consultar Sui para propriedade de NFT
}
}

Exemplo 3: Transferência de Ativos com Time Lock

// 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();

// Criar política de time lock na Sui
const timeLockPolicy = await createTimeLockPolicy(
unlockTimestamp,
recipientAddress,
senderKeypair,
suiClient
);

// Criptografar dados de transferência de ativo
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(`Ativo bloqueado até ${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'));

// Processar a transferência de ativo
console.log('Transferência de ativo desbloqueada:', transferData);

return transferData;
} catch (error) {
console.error('Transferência ainda não desbloqueada ou acesso negado:', error);
throw error;
}
}

Integração com Armazenamento Descentralizado Walrus

Seal funciona perfeitamente com Walrus, a solução de armazenamento descentralizado da Sui. Veja como 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
) {
// Criptografar com Seal
const encryptedData = await this.sealClient.encrypt({
data,
recipientId: recipientAddress,
accessPolicy
});

// Armazenar dados criptografados no Walrus
const blobId = await this.walrusClient.store(
encryptedData.ciphertext
);

// Retornar referência que inclui informações tanto do Seal quanto do Walrus
return {
blobId,
encryptionId: encryptedData.encryptionId,
accessPolicy: encryptedData.accessPolicy
};
}

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

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

return decryptedData;
}
}

// Exemplo 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('Conteúdo de documento importante');
const recipientAddress = '0x...';

// Armazenar criptografado
const result = await integration.storeEncryptedData(
fileData,
recipientAddress
);

console.log('Armazenado com Blob ID:', result.blobId);

// Depois, recuperar e descriptografar
const decrypted = await integration.retrieveAndDecrypt(
result.blobId,
result.encryptionId,
recipientKeypair
);

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

Configuração Avançada de Criptografia Threshold

Para aplicações de produção, você vai querer configurar criptografia threshold customizada com múltiplos servidores de chaves:

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

async function setupProductionSeal() {
// Configurar com múltiplos servidores de chaves independentes
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',
// Opções avançadas
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 = "Dados criptografados de missão crítica";

// Criptografar com altas garantias de segurança
const encrypted = await sealClient.encrypt({
data: Buffer.from(criticalData, 'utf-8'),
recipientId: '0x...',
// Exigir todos os 5 servidores para máxima segurança
customThreshold: 5,
// Adicionar redundância
redundancy: 2,
accessPolicy: {
// Requisitos multifator
requirements: ['nft_ownership', 'time_lock', 'multisig_approval']
}
});

return encrypted;
}

Melhores Práticas de Segurança

1. Gerenciamento de Chaves

// src/security-practices.ts

// BOM: Usar derivação segura de chaves
import { generateKeypair } from '@mysten/sui/cryptography/ed25519';

const keypair = generateKeypair();

// BOM: Armazenar chaves de forma segura (exemplo com variáveis de ambiente)
const keypair = Ed25519Keypair.fromSecretKey(
process.env.PRIVATE_KEY
);

// RUIM: Nunca hardcodar chaves
const badKeypair = Ed25519Keypair.fromSecretKey(
"hardcoded-secret-key-12345" // Não faça isso!
);

2. Validação de Política de Acesso

// Sempre validar políticas de acesso antes da criptografia
async function secureEncrypt(data: Buffer, recipient: string) {
const { sealClient } = await createSealClient();

// Validar endereço do destinatário
if (!isValidSuiAddress(recipient)) {
throw new Error('Endereço de destinatário inválido');
}

// Verificar se política existe e é válida
const policy = await validateAccessPolicy(policyId);
if (!policy.isValid) {
throw new Error('Política de acesso inválida');
}

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

3. Tratamento de Erros e Fallbacks

// Tratamento robusto de erros
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('Acesso negado: Verifique suas permissões');
} else if (error.code === 'KEY_SERVER_UNAVAILABLE') {
// Tentar com configuração de backup
return await retryWithBackupServers(encryptionId, userKeypair);
} else if (error.code === 'THRESHOLD_NOT_MET') {
throw new Error('Servidores de chaves insuficientes disponíveis');
} else {
throw new Error(`Falha na descriptografia: ${error.message}`);
}
}
}

4. Validação de Dados

// Validar dados antes da criptografia
function validateDataForEncryption(data: Buffer): boolean {
// Verificar limites de tamanho
if (data.length > 1024 * 1024) { // Limite de 1MB
throw new Error('Dados muito grandes para criptografia');
}

// Verificar padrões sensíveis (opcional)
const dataStr = data.toString();
if (containsSensitivePatterns(dataStr)) {
console.warn('Aviso: Dados contêm padrões potencialmente sensíveis');
}

return true;
}

Otimização de Performance

1. Operações em Lote

// Agrupar múltiplas criptografias para eficiência
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. Cache de Respostas de Servidores de Chaves

// Cache de sessões de servidores de chaves para reduzir latência
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);
}
}

Testando Sua Integração Seal

Testes Unitários

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

describe('Integração Seal', () => {
it('deve criptografar e descriptografar dados com sucesso', async () => {
const { sealClient } = await createSealClient();
const testData = Buffer.from('mensagem de teste');
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('mensagem de teste');
});

it('deve aplicar políticas de controle de acesso', async () => {
// Testar que usuários não autorizados não podem descriptografar
const { sealClient } = await createSealClient();

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

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

Deploy para Produção

Configuração de Ambiente

// 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,
// Configurações de segurança
maxDataSize: 1024 * 1024, // 1MB
sessionTimeout: 3600000, // 1 hora
retryAttempts: 3
};

Monitoramento e Logging

// utils/monitoring.ts
export class SealMonitoring {
static logEncryption(encryptionId: string, recipient: string) {
console.log(`[SEAL] Dados criptografados ${encryptionId} para ${recipient}`);
// Enviar para seu serviço de monitoramento
}

static logDecryption(encryptionId: string, success: boolean) {
console.log(`[SEAL] Descriptografia ${encryptionId}: ${success ? 'SUCESSO' : 'FALHA'}`);
}

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

Recursos e Próximos Passos

Documentação Oficial

Comunidade e Suporte

  • Discord Sui: Junte-se ao canal #seal para suporte da comunidade
  • GitHub Issues: Reporte bugs e solicite funcionalidades
  • Fóruns de Desenvolvedores: Fóruns da comunidade Sui para discussões

Tópicos Avançados para Explorar

  1. Políticas de Acesso Customizadas: Construa lógica de autorização complexa com contratos Move
  2. Integração Cross-Chain: Use Seal com outras redes blockchain
  3. Gerenciamento de Chaves Empresarial: Configure sua própria infraestrutura de servidores de chaves
  4. Auditoria e Compliance: Implemente logging e monitoramento para ambientes regulamentados

Aplicações de Exemplo

  • App de Chat Seguro: Mensagens criptografadas de ponta a ponta com Seal
  • Gerenciamento de Documentos: Compartilhamento de documentos empresariais com controles de acesso
  • Gerenciamento de Direitos Digitais: Distribuição de conteúdo com políticas de uso
  • Analytics Preservando Privacidade: Workflows de processamento de dados criptografados

Conclusão

Seal representa uma mudança fundamental em direção a tornar privacidade e criptografia preocupações de nível de infraestrutura em Web3. Ao combinar criptografia baseada em identidade, segurança threshold e controle de acesso programável, ele fornece aos desenvolvedores ferramentas poderosas para construir aplicações verdadeiramente seguras e descentralizadas.

As principais vantagens de construir com Seal incluem:

  • Sem Ponto Único de Falha: Servidores de chaves distribuídos eliminam autoridades centrais
  • Segurança Programável: Políticas de acesso baseadas em smart contracts fornecem autorização flexível
  • Amigável ao Desenvolvedor: SDK TypeScript integra-se perfeitamente com ferramentas Web3 existentes
  • Agnóstico de Armazenamento: Funciona com Walrus, IPFS ou qualquer solução de armazenamento
  • Pronto para Produção: Construído pela Mysten Labs com padrões de segurança empresariais

Seja protegendo dados de usuários, implementando modelos de assinatura ou construindo aplicações complexas multipartidárias, Seal fornece as primitivas criptográficas e infraestrutura de controle de acesso que você precisa para construir com confiança.

Comece a construir hoje, e junte-se ao crescente ecossistema de desenvolvedores tornando a privacidade uma parte fundamental da infraestrutura pública.


Pronto para começar a construir? Instale @mysten/seal e comece a experimentar com os exemplos deste tutorial. A web descentralizada está esperando por aplicações que colocam privacidade e segurança em primeiro lugar.