NIP-XX: Public Whistleblowing & Urban Management System

Um protocolo aberto para transformar o Nostr em uma rede global de transparência pública. Permite que cidadãos reportem desde crimes e infrações até problemas de infraestrutura (como árvores caídas ou buracos) com provas multimídia via Blossom, geolocalização padronizada (ISO) e rastreamento de status em tempo real. Oferece um modelo único de privacidade que equilibra reputação anônima com identificação civil segura via burner keys.
NIP-XX: Public Whistleblowing & Urban Management System

NIP-XX: Sistema de Denúncias Público (Public Whistleblowing)

Descrição

Este NIP define um padrão para denúncias e registros de ocorrências públicas (crimes, infrações, zeladoria urbana). Ele estabelece o Kind 7384 como o evento raiz, utiliza o Kind 1985 para atualizações de status (labeling) e o Kind 1111 para discussões comunitárias, com suporte a evidências via servidores Blossom.

O Evento de Denúncia (Kind 7384)

O evento é um “Regular Event” e deve conter as seguintes tags e estruturas:

1. Proof of Work (PoW)

Para evitar spam e ataques de negação de serviço ao ecossistema de denúncias:

  • Tag: ["nonce", "{nonce}", "26"]
  • Exigência: Dificuldade mínima de 24-26 bits.

2. Localização Padronizada (ISO e Geohash)

Para garantir que a denúncia seja filtrável internacionalmente:

  • ["g", "{geohash}", "{precisao}"] (Geohash para mapas).
  • ["location", "{ISO_3166_2}", "{City}"]:
    • Exemplo: ["location", "BR-SP", "Osasco"] ou ["location", "US-NY", "New York City"].
    • O uso do padrão ISO 3166-1 alpha-2 (país) e ISO 3166-2 (subdivisão/estado) é obrigatório.

3. Identidade do Denunciante (O Modelo de Chaves)

O protocolo lida com a identidade de duas formas distintas:

  • Denunciante Anônimo: Deve utilizar sua pubkey persistente (ou uma identidade Nostr de longo prazo). Isso permite que o denunciante construa “reputação de veracidade” ao longo do tempo sem revelar sua identidade civil.
  • Denunciante Identificado: Deve gerar uma chave de uso único (burner key) especificamente para aquela denúncia. Seus dados civis são inseridos em tags específicas (ver abaixo). Isso protege o histórico social do usuário, separando sua vida pública da denúncia específica.

Tags de Identificação (Opcionais):

  • ["reporter_info", "nome", "contato", "documento_id"]
  • ["reporter_type", "pf" | "pj"]

Nota para Desenvolvedores de Clientes: É obrigatório exibir um aviso de que “Todos os dados enviados, incluindo nome e documento, tornam-se públicos e imutáveis na rede Nostr”.

4. Gestão de Evidências (Blossom)

As evidências devem ser hospedadas em servidores Blossom públicos.

  • ["imeta", "url {url}", "x {sha256}", "m {mime_type}", "alt {descricao}"]

5. Envolvidos (Suspeitos/Vítimas)

Para citar terceiros que podem não ter Nostr:

  • ["subject", "{nome_ou_descricao}", "{papel}"]
  • Papéis permitidos: suspect, victim, witness.
  • Se o envolvido tem Pubkey: ["p", "{pubkey}", "{relay}", "{role}"] onde role é suspect, witness ou victim.

6. Idioma

  • ["l", "{iso_639_1_code}"].

7. Relay Especializado

  • A inclusão da tag r é opcional e é usada para sugerir um relay onde a denúncia deve ser encontrada/respondida.

Exemplo de JSON (Denunciante Identificado com Burner Key)

{
  "kind": 7384,
  "pubkey": "<nova_chave_criada_so_pra_isso>",
  "content": "Caminhão de placa ABC-1234 descartando lixo hospitalar em terreno baldio.",
  "tags": [
    ["nonce", "892341", "26"],
    ["title", "Descarte Irregular de Lixo Hospitalar"],
    ["l", "pt-BR"],
    ["g", "7ez9q", "6"],
    ["location", "BR-MG", "Belo Horizonte"],
    ["subject", "Caminhão Placa ABC-1234", "suspect"],
    ["imeta", "url ![image](https://blossom.publico.com/foto.jpg)", "x 5f32...", "m image/jpeg"],
    ["visibility", "public"],
    ["reporter_type", "pf"],
    ["reporter_info", "João da Silva", "joao@email.com", "123.456.789-00"]
  ],
  "created_at": 1714376557
}

Identidade e Privacidade:

  • Denunciante Identificado: Deve usar uma Burner Key (chave de uso único). Dados sensíveis (nome, CPF, contato) são inseridos na tag ["reporter_info", ...].
    • Aviso obrigatório do cliente: “Estes dados serão públicos e imutáveis. Use apenas se desejar identificação oficial.”
  • Denunciante Anônimo: Deve usar sua chave Nostr persistente. Isso permite construir reputação pseudônima (um usuário cujas denúncias são sempre confirmadas ganha confiança da rede) sem revelar sua identidade civil.

2. Atualizações de Status e Moderação (Kind 1985)

Para indicar o progresso da denúncia (ex: “Em investigação”, “Resolvido”), utiliza-se o NIP-32 (Labeling). Isso permite que autoridades ou entidades de zeladoria “etiquetem” a denúncia original.

  • Estrutura da Tag l: ["l", "{status}", "status"].
  • Referência: Deve conter a tag e apontando para a denúncia Kind 7384.

Exemplos de Status:

  • ["l", "police_dispatched", "status"] (Polícia a caminho).
  • ["l", "resolved", "status"] (Árvore removida / Ocorrência encerrada).
  • Namespace UGC: Para usuários comuns confirmarem a veracidade: ["l", "verified_by_community", "ugc"].

3. Interação e Comentários (Kind 1111)

Qualquer pessoa pode adicionar informações extras, testemunhos ou perguntas através do Kind 1111 (NIP-22).

  • Root Tag: ["E", "{id_da_denuncia_7384}", "<relay_hint>", "{pubkey_do_denunciante}"].
  • Kind Tag: ["K", "7384"].
  • Uso: Testemunhas podem postar: “Eu vi o carro passar por aqui também” ou “A árvore já foi retirada, mas a calçada continua quebrada”.
  • Vantagem: Separa o log oficial de status (Kind 1985) da conversa informal da comunidade (Kind 1111).

4. Retratação e Deleção (Kind 5)

Se o denunciante cometer um erro, ele pode solicitar a deleção via Kind 5.

  • Para denunciantes identificados (Burner Key), o app deve garantir que o usuário salve a chave privada temporária caso ele deseje apagar ou atualizar a denúncia futuramente.

Exemplo de JSON Completo (Fluxo de Status)

1. A Denúncia (Kind 7384):

{
  "kind": 7384,
  "content": "Árvore caída bloqueando a Rua XV de Novembro.",
  "tags": [
    ["nonce", "...", "26"],
    ["location", "BR-PR", "Curitiba"],
    ["g", "6gkzwu"],
    ["t", "zeladoria"],
    ["visibility", "public"]
  ]
}

2. O Status da Autoridade (Kind 1985):

{
  "kind": 1985,
  "content": "Equipe de poda enviada ao local.",
  "tags": [
    ["e", "<id_da_denuncia_7384>"],
    ["L", "status"],
    ["l", "in_progress", "status"]
  ]
}

3. Comentário da Comunidade (Kind 1111):

{
  "kind": 1111,
  "content": "Cuidado ao passar, há fios de alta tensão entre os galhos!",
  "tags": [
    ["E", "<id_da_denuncia_7384>"],
    ["K", "7384"]
  ]
}

Últimas Considerações

  1. Chave de uso único para Identificados: Se o denunciante usar uma burner key e depois precisar apagar a denúncia (Kind 5), ele precisa guardar a chave privada dessa burner key. O seu sistema/app precisa salvar essas chaves temporárias para o usuário automaticamente somente para deleção

  2. Múltiplas ISOs: Em denúncias de crimes transfronteiriços (ex: algo que começou num país e terminou em outro), aceitaremos múltiplas tags location


Write a comment
No comments yet.