Guia de Implementação BSP
Versão 0.2 — Guia prático para construir sobre o Protocolo de Soberania Biológica.
Este documento é para quem quer construir, não apenas ler a especificação. Escolha sua persona abaixo e siga os passos em ordem.
Persona 1: O Desenvolvedor de App para Usuário
Objetivo: Construir um app onde usuários criam sua identidade BSP e gerenciam seus dados biológicos.
Passo 1 — Configurar o bsp-id-web
Faça um fork da implementação de referência ou construa sua própria UI. O app de referência fica em bsp-id-web/.
git clone https://github.com/Biological-Sovereignty-Protocol/bsp-id-web
cd bsp-id-web
npm install
cp .env.example .env.localPasso 2 — Configurar a URL do relayer
O relayer é a API off-chain que conecta seu app aos processos AO no Arweave. Aponte seu app para ele:
# .env.local
NEXT_PUBLIC_BSP_RELAYER_URL=https://api.seudominio.comPara desenvolvimento local, você pode rodar o relayer a partir de bsp-registry-api/:
cd bsp-registry-api
npm install
npm run dev
# Roda em http://localhost:3001Passo 3 — Implementar o fluxo de criação de BEO
A identidade de um usuário começa com uma frase-semente que gera um par de chaves, que então cria seu Objeto de Entidade Biológica (BEO).
import { BSPClient, generateKeypair } from 'bsp-sdk';
const client = new BSPClient({ relayerUrl: process.env.NEXT_PUBLIC_BSP_RELAYER_URL });
// 1. Gerar frase-semente (mostre isso ao usuário — ele deve guardá-la)
const { mnemonic, keypair } = await generateKeypair();
// 2. Criar o BEO on-chain
const beo = await client.identity.createBEO({
publicKey: keypair.publicKey,
metadata: {
alias: 'apelido-escolhido-pelo-usuario', // opcional, não é PII
created: Date.now(),
}
});
console.log('BEO ID:', beo.id); // armazene isso localmentePasso 4 — Implementar UI do ConsentToken
Antes que qualquer instituição possa acessar os dados de um usuário, o usuário deve emitir um ConsentToken. Mostre a ele o que está autorizando.
// Exibir a solicitação de consentimento ao usuário
function ConsentDialog({ request }) {
return (
<div>
<h2>Solicitação de Acesso aos Dados</h2>
<p>Instituição: {request.ieo.name}</p>
<p>Escopo: {request.scope.join(', ')}</p>
<p>Válido até: {new Date(request.period.end).toLocaleDateString()}</p>
<button onClick={() => issueConsent(request)}>Autorizar</button>
<button onClick={() => denyConsent(request)}>Negar</button>
</div>
);
}
// Emitir o token
async function issueConsent(request) {
const token = await client.consent.issue({
beoId: currentUser.beoId,
ieoId: request.ieo.id,
scope: request.scope,
period: request.period,
keypair: currentUser.keypair,
});
return token; // compartilhe este token com a instituição
}Passo 5 — Implementar exportação e backup de chave
Os usuários devem poder exportar sua chave privada. Se a perderem, seus dados ficam inacessíveis permanentemente.
// Exportar backup de chave criptografado
const backup = await client.identity.exportKey({
keypair: currentUser.keypair,
password: userEnteredPassword, // criptografar com senha escolhida pelo usuário
});
// Oferecer download
const blob = new Blob([JSON.stringify(backup)], { type: 'application/json' });
downloadFile(blob, `bsp-key-backup-${Date.now()}.json`);Apresente este passo como obrigatório durante o onboarding, não como opcional.
Persona 2: O Desenvolvedor Institucional (IEO)
Objetivo: Você gerencia um laboratório, clínica ou plataforma de saúde e quer receber dados de saúde BSP autorizados de usuários.
Passo 1 — Criar seu IEO
Um Objeto de Entidade Institucional (IEO) é a identidade on-chain da sua instituição. Crie-o uma única vez.
import { BSPClient } from 'bsp-sdk';
const client = new BSPClient({ relayerUrl: 'https://api.bsp.protocol' });
const ieo = await client.institutions.createIEO({
name: 'Laboratório Clínico Exemplo',
type: 'laboratory', // laboratory | clinic | platform | research
publicKey: yourInstitutionKeypair.publicKey,
metadata: {
jurisdiction: 'BR',
contact: 'tech@laboratorioexemplo.com',
}
});
console.log('IEO ID:', ieo.id); // armazene isso — identifica sua instituiçãoPasso 2 — Solicitar consentimento dos usuários
Direcione os usuários para autorizar seu IEO. Você pode criar um deep link para o bsp-id-web ou implementar o fluxo de consentimento em seu próprio app.
// Gerar um link de solicitação de consentimento
const consentUrl = client.consent.buildRequestUrl({
ieoId: yourIeo.id,
scope: ['BSP-HM', 'BSP-LF'], // códigos de categoria da taxonomia de biomarcadores
period: {
start: Date.now(),
end: Date.now() + 90 * 24 * 60 * 60 * 1000, // 90 dias
},
callbackUrl: 'https://seuapp.com/bsp/callback',
});
// Envie esta URL ao usuário (email, SMS, link no app)
// Ele aprova no seu app de identidade BSP e seu callback recebe o ConsentTokenPasso 3 — Verificar ConsentToken antes de aceitar dados
Nunca aceite envios de dados sem verificar o token. Isso não é opcional.
async function handleDataSubmission(payload) {
const { consentToken, biorecords } = payload;
// Verificar se o token é válido, não expirado e cobre o escopo enviado
const verification = await client.consent.verify({
token: consentToken,
ieoId: yourIeo.id,
requiredScope: biorecords.map(r => r.biomarkerCode),
});
if (!verification.valid) {
throw new Error(`Consentimento inválido: ${verification.reason}`);
}
// Seguro para prosseguir
await storeRecords(biorecords, verification.beoId);
}Passo 4 — Enviar BioRecords usando ExchangeClient
import { ExchangeClient } from 'bsp-sdk';
const exchange = new ExchangeClient({
ieoId: yourIeo.id,
keypair: yourInstitutionKeypair,
relayerUrl: 'https://api.bsp.protocol',
});
const result = await exchange.submitRecords({
consentToken: verifiedToken,
records: [
{
biomarkerCode: 'BSP-HM-HGB', // Hemoglobina
value: 14.2,
unit: 'g/dL',
collectedAt: '2024-01-15T09:30:00Z',
method: 'venous_blood',
},
{
biomarkerCode: 'BSP-HM-HCT', // Hematócrito
value: 42.1,
unit: '%',
collectedAt: '2024-01-15T09:30:00Z',
method: 'venous_blood',
}
],
});
console.log('ID da Transação:', result.txId); // Transação Arweave — permanentePasso 5 — Consultar registros autorizados
// Buscar todos os registros que seu IEO está autorizado a ler para um BEO específico
const records = await exchange.queryRecords({
beoId: patientBeoId,
scope: ['BSP-HM'],
dateRange: {
from: '2024-01-01',
to: '2024-12-31',
}
});
records.forEach(record => {
console.log(`${record.biomarkerCode}: ${record.value} ${record.unit}`);
});Persona 3: O Integrador de Protocolo
Objetivo: Rodar sua própria infraestrutura BSP — seu próprio nó/relayer para uma rede privada ou implantação regional.
Passo 1 — Implantar os processos AO
O BSP usa quatro processos AO no Arweave. Implante-os nesta ordem (cada um depende do anterior).
cd bsp-spec/contracts # ou obtenha do repositório de registro
# 1. BEORegistry — armazena todas as identidades de entidades biológicas
arweave deploy BEORegistry --wallet ./wallet.json
# 2. IEORegistry — armazena todas as identidades institucionais
arweave deploy IEORegistry --wallet ./wallet.json
# 3. AccessControl — gerencia tokens de consentimento e permissões de acesso
arweave deploy AccessControl --wallet ./wallet.json \
--init '{"beoRegistry":"<BEO_TX_ID>","ieoRegistry":"<IEO_TX_ID>"}'
# 4. DomainRegistry — gerencia o namespace .bsp
arweave deploy DomainRegistry --wallet ./wallet.json \
--init '{"accessControl":"<ACCESS_CONTROL_TX_ID>"}'Salve os quatro IDs de transação. São permanentes e identificam sua implantação.
Passo 2 — Configurar o bsp-registry-api (o relayer)
O relayer é a API HTTP com a qual seus apps se comunicam. Ele lida com batching, cache e tradução de chamadas REST em mensagens AO.
git clone https://github.com/Biological-Sovereignty-Protocol/bsp-registry-api
cd bsp-registry-api
npm installConfigure-o para apontar para seus contratos:
# .env
ARWEAVE_HOST=arweave.net
ARWEAVE_PORT=443
ARWEAVE_PROTOCOL=https
ARWEAVE_WALLET_PATH=./wallet.json
BSP_BEO_REGISTRY_TX=<SEU_BEO_TX_ID>
BSP_IEO_REGISTRY_TX=<SEU_IEO_TX_ID>
BSP_ACCESS_CONTROL_TX=<SEU_ACCESS_CONTROL_TX_ID>
BSP_DOMAIN_REGISTRY_TX=<SEU_DOMAIN_REGISTRY_TX_ID>
PORT=3001Inicie o relayer:
npm run build
npm start
# ou com PM2: pm2 start ecosystem.config.jsPasso 3 — Configurar callers autorizados
Restrinja quais origens e chaves de API podem escrever no seu relayer.
# .env — adicione estas linhas
ALLOWED_ORIGINS=https://seuapp.com,https://seupainelAdmin.com
API_KEYS=key_abc123,key_def456 # gere chaves aleatórias fortes
RATE_LIMIT_WRITES=100 # requisições de escrita por minuto por chave
RATE_LIMIT_READS=1000 # requisições de leitura por minuto por chavePara produção, coloque o relayer atrás de um proxy reverso (nginx, Caddy) com TLS.
Passo 4 — Apontar o bsp-id-web para seu relayer
Qualquer app compatível com BSP pode apontar para seu relayer configurando a URL do relayer:
# No bsp-id-web ou em qualquer consumidor do SDK
NEXT_PUBLIC_BSP_RELAYER_URL=https://relayer.seudominio.comApps e SDKs são independentes do relayer. O mesmo código bsp-sdk funciona contra qualquer relayer compatível.
Armadilhas Comuns
1. Perder a chave privada
O par de chaves do usuário é a única credencial de acesso. Não há redefinição de senha, e-mail de recuperação ou ticket de suporte que possa restaurá-la. Torne o backup da chave um requisito obrigatório durante o onboarding, não uma sugestão.
2. Pular a verificação do ConsentToken
Se sua instituição aceita dados sem verificar o token, você não tem prova de consentimento. Isso é um risco de conformidade e uma violação do protocolo BSP. Sempre chame client.consent.verify() antes de processar envios.
3. Usar metadados mutáveis para identidade
Registros BEO e IEO no Arweave são permanentes. Não armazene PII (nome, data de nascimento, e-mail) no objeto on-chain. Armazene apenas a chave pública e um alias estável. Mantenha metadados sensíveis em seu próprio banco de dados, vinculado pelo ID do BEO.
4. Implantar contratos na ordem errada
O Registro de Consentimento precisa dos IDs de transação dos registros BEO e IEO no momento da implantação. O Índice de BioRecord precisa do TX ID do Registro de Consentimento. Implante em sequência: BEO → IEO → Consentimento → Índice.
5. Escopo excessivo em ConsentTokens
Solicite apenas os códigos de taxonomia de biomarcadores que você realmente precisa. Os usuários veem o escopo durante o diálogo de consentimento. Solicitar BSP.* (todos os dados) fará os usuários recusarem. Solicite o escopo mínimo para seu caso de uso.
6. Não lidar com a latência do Arweave
Transações Arweave não são instantâneas. Após enviar um registro, o txId é retornado imediatamente, mas o registro pode levar de 10 a 20 minutos para ser totalmente confirmado. Projete sua UX para mostrar um estado "pendente" em vez de assumir disponibilidade imediata.
Perguntas ou correções? Abra uma issue ou PR. Este guia acompanha a especificação na versão 0.2.

