Géolocalisation
Le service de géolocalisation DoubleZero aide les utilisateurs à déterminer l'emplacement physique des appareils à l'aide de mesures de latence. Les mesures de RTT (temps aller-retour) entre une infrastructure à emplacement connu et un appareil cible fournissent une preuve signée cryptographiquement qu'un appareil se trouve dans un certain rayon autour d'un point donné. L'enregistrement onchain des mesures sur le DoubleZero Ledger est prévu pour une version future.
Les cas d'utilisation incluent la conformité réglementaire (par ex., RGPD — prouver que des validateurs opèrent au sein de l'UE), les audits de distribution géographique, et toute application nécessitant une preuve vérifiable de l'emplacement d'un appareil ou d'une IP.
Fonctionnement
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
Le diagramme suivant montre les trois types de flux de sonde — Outbound, OutboundIcmp et Inbound — qui diffèrent par la manière dont le geoProbe communique avec la cible :
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
La géolocalisation utilise une chaîne de mesure à trois niveaux :
DZD (known location) ◄──TWAMP──► geoProbe ◄──RTT──► Target device
- DZD <-> geoProbe : TWAMP mesure en continu la latence entre le DoubleZero Device et la sonde. Les DZD ont des coordonnées géographiques connues et fixes enregistrées sur le DZ Ledger.
- geoProbe <-> Cible : Le RTT est mesuré entre la sonde et l'appareil à localiser.
Les résultats d'offset sont signés cryptographiquement et transmis via UDP à la cible ou à une destination alternative spécifiée par l'utilisateur.
Important : La géolocalisation rapporte uniquement le RTT — pas une distance inférée ni des coordonnées. Une utilisation courante consiste à diviser le RTT par 2, puis à multiplier par la vitesse de la lumière dans le verre (~200 km/ms) pour obtenir un rayon autour des coordonnées du DZD dans lequel la cible se trouve. L'interprétation du RTT (par ex., le calcul d'un rayon de distance maximale) vous appartient.
Types de flux de sonde
Il existe trois façons pour une sonde de mesurer une cible :
| Flux | Qui initie | Protocole | À utiliser quand |
|---|---|---|---|
| Outbound | Sonde -> Cible | TWAMP | La cible a une IP publique, un port entrant ouvert, et peut exécuter un réflecteur TWAMP |
| OutboundIcmp | Sonde -> Cible | ICMP echo | La cible a une IP publique mais ne peut pas exécuter un réflecteur TWAMP (ou TWAMP est bloqué par le pare-feu) |
| Inbound | Cible -> Sonde | TWAMP signé | La cible ne peut pas accepter de connexions entrantes, ou vous souhaitez vérifier l'emplacement d'une clé de signature |
Dans tous les cas, la mesure DZD <-> geoProbe fonctionne de la même manière. Seuls la direction et le protocole de la communication geoProbe <-> cible diffèrent.
Spécification technique
Pour la spécification technique complète du système de vérification de géolocalisation, incluant les détails de signature cryptographique et le protocole de mesure, voir RFC 16: Geolocation Verification.
Prérequis
1. DoubleZero ID avec des crédits
Les utilisateurs de la géolocalisation ont besoin d'un DoubleZero ID approvisionné. Vous n'avez pas besoin de vous connecter au réseau DoubleZero (aucun pass d'accès requis), mais votre clé a besoin de crédits sur le DoubleZero Ledger pour créer un compte utilisateur et gérer les cibles — chaque opération d'ajout/suppression de cible coûte des crédits.
Si vous n'avez pas de DoubleZero ID :
doublezero keygen
doublezero address # get your pubkey
Contactez l'équipe DoubleZero avec votre clé publique pour faire approvisionner votre ID. Approvisionnez-le à un montant supérieur à la normale si vous prévoyez d'ajouter et de supprimer des cibles de manière dynamique.
2. Compte de jetons 2Z
Vous avez besoin d'un compte de jetons 2Z. Les frais de service sont déduits de ce compte sur une base par époque.
Installation
Sur un ordinateur de gestion :
curl -1sLf https://dl.cloudsmith.io/public/malbeclabs/doublezero/setup.deb.sh | sudo -E bash
sudo apt install doublezero
Sur une cible pour 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
doublezero-geoprobe-target (outbound) et doublezero-geoprobe-target-sender (inbound)
ICMP Outbound
Les cibles outbound-icmp ne nécessitent aucun logiciel installé.
Vérifier votre solde
doublezero balance
Configuration
Étape 1 : Créer un utilisateur de géolocalisation
doublezero geolocation user create \
--env testnet \
--code <your-user-code> \
--token-account <your-2Z-token-account>
--code: un identifiant court et unique pour votre compte (par ex.myorg)--token-account: la clé publique de votre compte de jetons 2Z — les frais de service sont déduits d'ici
Activation du compte
Après avoir créé un utilisateur, contactez la DoubleZero Foundation pour activer votre compte. Le statut de paiement doit être marqué comme actif avant que le sondage ne commence.
Étape 2 : Lister les sondes disponibles
doublezero geolocation probe list
Notez le code ou l'public_ip, ainsi que la signing_pubkey (pour les cibles inbound) de la sonde que vous souhaitez utiliser.
Étape 3 : Ajouter une cible
Utilisez ce flux si votre cible a une IP publique, un port entrant ouvert, et peut exécuter un réflecteur TWAMP.
doublezero geolocation user add-target \
--user <your-user-code> \
--type outbound \
--probe <probe-code> \
--target-ip <target-public-ip>
--probe : le code du geoProbe qui mesurera la cible (par ex. ams-mn-gp1)
--ip-address : l'adresse IPv4 publique de l'appareil cible
Utilisez ce flux si votre cible a une IP publique mais ne peut pas exécuter un réflecteur TWAMP, ou si le trafic TWAMP est bloqué par le pare-feu. La cible doit uniquement répondre aux requêtes ICMP echo (ping) — aucun logiciel supplémentaire requis.
doublezero geolocation user add-target \
--user <your-user-code> \
--type OutboundIcmp \
--probe <probe-code> \
--ip-address <target-public-ip>
--probe : le code du geoProbe qui mesurera la cible (par ex. ams-mn-gp1)
--ip-address : l'adresse IPv4 publique de l'appareil cible
Destination des résultats
Les cibles ICMP Outbound ne fonctionnent que si votre utilisateur a une destination de résultat alternative définie. (Voir Étape 3b)
Utilisez ce flux si votre cible est derrière un NAT ou ne peut pas accepter de connexions entrantes.
doublezero geolocation user add-target \
--user <your-user-code> \
--type inbound \
--probe <probe-code> \
--target-pk <target-keypair-pubkey>
--probe : le code du geoProbe qui mesurera la cible (par ex. ams-mn-gp1)
--target-pk : clé publique de la paire de clés que la cible utilisera pour signer les messages — la sonde n'accepte que les messages provenant de clés publiques enregistrées
Étape 3b : Définir une destination de résultat (optionnel)
Configurez un host:port alternatif où les résultats composites LocationOffset sont transmis pour tout type de cible Outbound. Cela remplace l'envoi du LocationOffset à la cible et est configuré par utilisateur. Si un comportement différent par cible est nécessaire, il est requis de configurer deux utilisateurs, un pour chaque type de comportement souhaité.
La destination alternative est utile pour agréger les résultats de plusieurs cibles vers un seul point de terminaison. Elle est requise pour le sondage ICMP.
doublezero geolocation user set-result-destination \
--user <your-user-code> \
--destination <host:port>
--destination : une adresse IPv4 publiquement routable ou un nom de domaine valide avec port (par ex., 203.0.113.10:9000 ou results.example.com:9000). Passez une chaîne vide pour effacer.
Utilisez user get pour vérifier votre destination de résultat :
doublezero geolocation user get --user <your-user-code>
Étape 4 : Exécuter l'application cible
Les flux outbound et inbound nécessitent l'exécution d'une application sur l'appareil cible. Des implémentations de référence avec des exemples sont disponibles en Go — vous pouvez les exécuter directement ou les utiliser comme point de départ pour votre propre intégration.
Pour le sondage outbound, l'appareil cible doit exécuter un réflecteur TWAMP afin que le geoProbe puisse mesurer le RTT. Exécutez l'application cible sur l'appareil mesuré :
doublezero-geoprobe-target
Pour le sondage inbound, l'appareil cible doit exécuter un logiciel qui envoie des messages signés à la sonde.
Sur l'appareil mesuré :
doublezero-geoprobe-target-sender \
-probe-ip <probe-ip> \
-probe-pk <probe-pubkey> \
-keypair <path-to-keypair.json>
-probe-ip : adresse IP du geoProbe (depuis probe list)
-probe-pk : clé publique du geoProbe (depuis probe list)
-keypair : chemin vers la paire de clés dont la clé publique a été enregistrée comme --target-pk à l'Étape 3
L'émetteur cible utilise un mécanisme à deux paires de sondes : il envoie deux sondes TWAMP pré-signées en succession rapide. La réponse de la sonde au second paquet inclut SinceLastRxNs — le temps entre l'envoi de la réponse 0 par la sonde et la réception de la sonde 1 — qui sert de RTT mesuré par la sonde. Cette approche par paires fournit une mesure précise du RTT même lorsque la cible ne peut pas effectuer d'horodatage précis au niveau du noyau.
Référence des commandes
doublezero geolocation user
| Sous-commande | Description |
|---|---|
create |
Créer un nouveau compte utilisateur de géolocalisation |
get |
Obtenir les détails d'un utilisateur spécifique |
list |
Lister tous les utilisateurs de géolocalisation |
delete |
Supprimer un utilisateur |
add-target |
Ajouter une cible à un utilisateur |
remove-target |
Supprimer une cible d'un utilisateur |
set-result-destination |
Définir un host:port alternatif pour la livraison des offsets |
update-payment |
Mettre à jour le statut de paiement (usage fondation) |
doublezero geolocation probe
| Sous-commande | Description |
|---|---|
create |
Enregistrer un nouveau geoProbe |
get |
Obtenir les détails d'une sonde spécifique |
list |
Lister toutes les sondes |
update |
Mettre à jour la configuration d'une sonde |
delete |
Supprimer une sonde |
add-parent |
Lier un DZD comme parent de la sonde |
remove-parent |
Supprimer un DZD parent |
Options globales
| Option | Description |
|---|---|
--env |
Environnement réseau : testnet, devnet, ou mainnet-beta |
--rpc-url |
Point de terminaison RPC DoubleZero personnalisé |
--keypair |
Chemin vers la paire de clés de signature (requis pour les opérations d'écriture) |