Ir para o conteúdo

Geolocalização

O serviço de Geolocalização DoubleZero ajuda os utilizadores a determinar a localização física de dispositivos usando medições de latência. As medições de RTT (round-trip time) entre infraestrutura com localização conhecida e um dispositivo alvo fornecem prova criptograficamente assinada de que um dispositivo está dentro de uma determinada distância de um ponto específico. O registo onchain das medições no DoubleZero Ledger está planeado para uma versão futura.

Os casos de uso incluem conformidade regulatória (por exemplo, RGPD — provar que validadores operam dentro da UE), auditorias de distribuição geográfica e qualquer aplicação que necessite de prova verificável de onde um dispositivo ou IP se encontra.


Como funciona

flowchart LR
     subgraph DZ["DoubleZero Network"]
         DZD["DZD\n(known location)"]
         Probe["geoProbe\n(bare metal server)"]
         DZD -- "TWAMP\n(continuous latency)" --> Probe
     end

     subgraph Target["Target Device"]
         T["Target\n(validator / server)"]
     end

     Probe -- "RTT measurement" --> T
     T -- "RTT response" --> Probe
     Probe -. "signed offset" .-> T

O diagrama seguinte mostra os três tipos de fluxo de sondagem — Outbound, OutboundIcmp e Inbound — que diferem na forma como o geoProbe comunica com o alvo:

flowchart TB
    subgraph out["Outbound Flow (TWAMP)"]
        direction LR
        P1["geoProbe"] -- "TWAMP probe" --> T1["Target"]
        T1 -- "TWAMP reply" --> P1
    end

    subgraph icmp["OutboundIcmp Flow"]
        direction LR
        P3["geoProbe"] -- "ICMP Echo Request" --> T3["Target"]
        T3 -- "ICMP Echo Reply" --> P3
    end

    subgraph in["Inbound Flow (NAT-friendly)"]
        direction LR
        T2["Target"] -- "signed packets" --> P2["geoProbe"]
        P2 -- "reply" --> T2
    end

A Geolocalização utiliza uma cadeia de medição de três níveis:

DZD (known location) ◄──TWAMP──► geoProbe ◄──RTT──► Target device
  • DZD <-> geoProbe: O TWAMP mede continuamente a latência entre o DoubleZero Device e a sonda. Os DZDs têm coordenadas geográficas fixas e conhecidas registadas no DZ Ledger.
  • geoProbe <-> Alvo: O RTT é medido entre a sonda e o dispositivo a ser localizado.

Os resultados de offset são criptograficamente assinados e entregues via UDP ao alvo ou a um destino alternativo especificado pelo utilizador.

Importante: A Geolocalização reporta apenas RTT — não distância inferida ou coordenadas. Uma forma comum de utilizar isto seria dividir o RTT por 2 e depois multiplicar pela velocidade da luz através do vidro (~200km/ms) para obter um raio em torno das coordenadas do DZD dentro do qual o alvo se encontra. A forma como interpreta o RTT (por exemplo, calcular um raio de distância máxima) depende de si.

Tipos de fluxo de sondagem

Existem três formas de uma sonda medir um alvo:

Fluxo Quem inicia Protocolo Usar quando
Outbound Sonda -> Alvo TWAMP O alvo tem um IP público, porta de entrada aberta e pode executar um refletor TWAMP
OutboundIcmp Sonda -> Alvo ICMP echo O alvo tem um IP público mas não pode executar um refletor TWAMP (ou o TWAMP está bloqueado pela firewall)
Inbound Alvo -> Sonda TWAMP assinado O alvo não pode aceitar conexões de entrada, ou pretende verificar a localização de uma chave de assinatura

Em todos os casos, a medição DZD <-> geoProbe acontece da mesma forma. Apenas a direção e o protocolo da comunicação geoProbe <-> alvo diferem.

Especificação Técnica

Para a especificação técnica completa do sistema de verificação de geolocalização, incluindo detalhes de assinatura criptográfica e o protocolo de medição, consulte RFC 16: Geolocation Verification.


Pré-requisitos

1. DoubleZero ID com créditos

Os utilizadores de Geolocalização precisam de um DoubleZero ID financiado. Não é necessário conectar-se à rede DoubleZero (não é necessário passe de acesso), mas a sua chave precisa de créditos no DoubleZero ledger para criar uma conta de utilizador e gerir alvos — cada operação de adicionar/remover alvo custa créditos.

Se não tem um DoubleZero ID:

doublezero keygen
doublezero address   # get your pubkey

Contacte a equipa DoubleZero com a sua pubkey para financiar o seu ID. Financie com um valor superior ao típico se espera adicionar e remover alvos dinamicamente.

2. Conta de token 2Z

Precisa de uma conta de token 2Z. As taxas de serviço são deduzidas desta conta numa base por-época.


Instalação

Num computador de gestão:

curl -1sLf https://dl.cloudsmith.io/public/malbeclabs/doublezero/setup.deb.sh | sudo -E bash
sudo apt install doublezero

Num alvo para Inbound ou TWAMP Outbound:

curl -1sLf https://dl.cloudsmith.io/public/malbeclabs/doublezero/setup.deb.sh | sudo -E bash
sudo apt install doublezero-geoprobe-target
Isto instala o doublezero-geoprobe-target (outbound) e o doublezero-geoprobe-target-sender (inbound)

ICMP Outbound

Alvos outbound-icmp não requerem qualquer software instalado.


Verificar o seu saldo

doublezero balance

Configuração

Passo 1: Criar um utilizador de geolocalização

doublezero geolocation user create \
  --env testnet \
  --code <your-user-code> \
  --token-account <your-2Z-token-account>
  • --code: um identificador curto e único para a sua conta (por exemplo, myorg)
  • --token-account: a chave pública da sua conta de token 2Z — as taxas de serviço são deduzidas daqui

Ativação da conta

Após criar um utilizador, contacte a DoubleZero Foundation para ativar a sua conta. O estado de pagamento deve ser marcado como ativo antes de a sondagem começar.

Passo 2: Listar sondas disponíveis

doublezero geolocation probe list

Tome nota do code ou public_ip, e da signing_pubkey (para alvos inbound) da sonda que pretende utilizar.

Passo 3: Adicionar um alvo

Use este fluxo se o seu alvo tem um IP público, uma porta de entrada aberta e pode executar um refletor TWAMP.

doublezero geolocation user add-target \
  --user <your-user-code> \
  --type outbound \
  --probe <probe-code> \
  --target-ip <target-public-ip>

--probe: o código do geoProbe que irá medir o alvo (por exemplo, ams-mn-gp1) --ip-address: o endereço IPv4 público do dispositivo alvo

Use este fluxo se o seu alvo tem um IP público mas não pode executar um refletor TWAMP, ou se o tráfego TWAMP está bloqueado pela firewall. O alvo apenas precisa de responder a pedidos ICMP echo (ping) — não é necessário software adicional.

doublezero geolocation user add-target \
  --user <your-user-code> \
  --type OutboundIcmp \
  --probe <probe-code> \
  --ip-address <target-public-ip>

--probe: o código do geoProbe que irá medir o alvo (por exemplo, ams-mn-gp1) --ip-address: o endereço IPv4 público do dispositivo alvo

Destino dos Resultados

Alvos ICMP Outbound apenas funcionam se o seu utilizador tiver um destino alternativo de resultados definido. (Ver Passo 3b)

Use este fluxo se o seu alvo está atrás de NAT ou não pode aceitar conexões de entrada.

doublezero geolocation user add-target \
  --user <your-user-code> \
  --type inbound \
  --probe <probe-code> \
  --target-pk <target-keypair-pubkey>

--probe: o código do geoProbe que irá medir o alvo (por exemplo, ams-mn-gp1) --target-pk: chave pública do par de chaves que o alvo usará para assinar mensagens — a sonda apenas aceita mensagens de chaves públicas registadas

Passo 3b: Definir um destino de resultados (opcional)

Configure um host:port alternativo onde os resultados compostos LocationOffset são entregues para qualquer tipo de alvo Outbound. Isto substitui o envio do LocationOffset para o alvo e é configurado numa base por-utilizador. Se for necessário um comportamento diferente por alvo, é necessário configurar dois utilizadores, um para cada tipo de comportamento desejado.

O destino alternativo é útil para agregar resultados de múltiplos alvos num único endpoint. É obrigatório para sondagem ICMP.

doublezero geolocation user set-result-destination \
  --user <your-user-code> \
  --destination <host:port>

--destination: um endereço IPv4 publicamente roteável ou nome de domínio válido com porta (por exemplo, 203.0.113.10:9000 ou results.example.com:9000). Passe uma string vazia para limpar.

Use user get para verificar o seu destino de resultados:

doublezero geolocation user get --user <your-user-code>

Passo 4: Executar a aplicação alvo

Tanto os fluxos outbound como inbound requerem a execução de uma aplicação no dispositivo alvo. Implementações de referência com exemplos estão disponíveis em Go — pode executá-las diretamente ou usá-las como ponto de partida para a sua própria integração.

Para sondagem outbound, o dispositivo alvo deve executar um refletor TWAMP para que o geoProbe possa medir o RTT. Execute a aplicação alvo no dispositivo a ser medido:

doublezero-geoprobe-target

Para sondagem inbound, o dispositivo alvo deve executar software que envia mensagens assinadas para a sonda.

No dispositivo a ser medido:

doublezero-geoprobe-target-sender \
  -probe-ip <probe-ip> \
  -probe-pk <probe-pubkey> \
  -keypair <path-to-keypair.json>

-probe-ip: endereço IP do geoProbe (de probe list) -probe-pk: chave pública do geoProbe (de probe list) -keypair: caminho para o par de chaves cuja chave pública foi registada como --target-pk no Passo 3

O emissor alvo utiliza um mecanismo de dois pares de sondas: envia duas sondas TWAMP pré-assinadas em rápida sucessão. A resposta da sonda ao segundo pacote inclui SinceLastRxNs — o tempo entre a sonda enviar a resposta 0 e receber a sonda 1 — que serve como o RTT medido pela sonda. Esta abordagem emparelhada fornece uma medição precisa de RTT mesmo quando o alvo não consegue realizar timestamping preciso ao nível do kernel.


Referência de comandos

doublezero geolocation user

Subcomando Descrição
create Criar uma nova conta de utilizador de geolocalização
get Obter detalhes de um utilizador específico
list Listar todos os utilizadores de geolocalização
delete Eliminar um utilizador
add-target Adicionar um alvo a um utilizador
remove-target Remover um alvo de um utilizador
set-result-destination Definir um host:port alternativo para entrega de offset
update-payment Atualizar estado de pagamento (uso da fundação)

doublezero geolocation probe

Subcomando Descrição
create Registar um novo geoProbe
get Obter detalhes de uma sonda específica
list Listar todas as sondas
update Atualizar configuração da sonda
delete Eliminar uma sonda
add-parent Vincular um DZD como pai da sonda
remove-parent Remover um DZD pai

Flags globais

Flag Descrição
--env Ambiente de rede: testnet, devnet ou mainnet-beta
--rpc-url Endpoint RPC DoubleZero personalizado
--keypair Caminho para o par de chaves de assinatura (obrigatório para operações de escrita)