All notable changes to this project will be documented in this file.
- CLI upgrade required: the new
InterfaceV3onchain account format addsflex_algo_node_segments(RFC-18). CLI versions prior to this release cannot deserialize device accounts written by the new program. Operators must upgrade the CLI before or alongside the program upgrade.
- CLI
- Extend
doublezero resource verifyto checkMulticastPublisherBlockagainst multicast publisher users'dz_ipallocations; legacydz_ips that fall outside the block's range are ignored so pre-existing users allocated before this extension existed do not produce false discrepancies - Fix
doublezero resource verifyto report missingTunnelIdsresource extensions for all devices, including those without any users; previously the discrepancy was suppressed when a device had no users, hiding unallocated extensions
- Extend
- Client
- Filter devices by type-specific capacity during auto-selection so clients are not provisioned onto devices that have reached their unicast, multicast publisher, or multicast subscriber limits
- Collector
- fallback to any probe if anchor probes aren't available
- Smartcontract
- Fix multicast group allowlist add/remove for AccessPasses created with
allow_multiple_ip=true; the processors were rejecting requests with a real client IP because the stored IP is always0.0.0.0for these passes (#3551) - SDK now auto-detects the correct AccessPass PDA (static or dynamic) for allowlist operations based on whether an
allow_multiple_ippass exists
- Fix multicast group allowlist add/remove for AccessPasses created with
- Sentinel
- Make the multicast publisher worker's
--client-filterflag repeatable so multiple validator client names can be matched in one run (OR semantics), matching the admin CLI behavior
- Make the multicast publisher worker's
v0.18.0 - 2026-04-17
- Device Health Oracle
- Add
interface_countersactivation criterion to device-health-oracle to verify devices have recent interface counter data in ClickHouse before activation - Add
controller_successactivation criterion to device-health-oracle to verify devices have consistent controller call coverage over a configurable burn-in period by querying ClickHouse
- Add
- Telemetry
- Add
GET /device-link/agent-versionsendpoint to data-api andagent-versionssubcommand to data-cli, exposing per-device telemetry agent version and commit from onchainDeviceLatencySamplesHeader
- Add
- Smartcontract
- Allow
SubscribeMulticastGroupfor users inPendingstatus so thatCreateSubscribeUsercan be followed by additional subscribe calls before the activator runs (#3521) - Add optional
ownerfield toUpdateMulticastGroupinstruction, allowing foundation members to reassign ownership of a multicast group (#3527) - Rename
SubscribeMulticastGroupinstruction variant toUpdateMulticastGroupRolesand rename associated processor functions, args struct, and SDK command to use "roles" terminology, clarifying they manage publisher/subscriber roles rather than just subscriptions
- Allow
- Geolocation
- Add optional result destination to
GeolocationUserso LocationOffsets can be sent to an alternate endpoint instead of the target IP; supports both IP and domain destinations (e.g.,185.199.108.1:9000orresults.example.com:9000); includesSetResultDestinationonchain instruction, CLIuser set-result-destinationcommand, and Go SDK deserialization (backwards-compatible with existing accounts)
- Add optional result destination to
- CLI
- Add
--ownerflag tomulticast group update, accepting a pubkey orme(#3527) - Polish terminal output of
connectanddisconnect: fix emoji semantics, normalize message phrasing across IBRL and multicast code paths, resolve tenant to human-readable code on connect (errors if tenant not found), and fix progress bar not clearing before output indisconnect(#3529)
- Add
- Client
- Reduce default probing interval to 5m from 30s since DZDs don't generally move.
- Dependencies
- Bump vulnerable packages across Rust, Go, and Python to address Dependabot security alerts (14 packages fixed)
- DevContainer
- Add optional
DZ_WORKTREES_DIRmount exposing a host worktrees directory at/workspaces/worktreesinside the container; useful whendocker exec-ing into the persistent dev container to work on git worktrees outside the repo. Defaults to/tmp/worktrees(empty, harmless) when unset
- Add optional
v0.17.0 - 2026-04-10
- Activator
- Fix duplicate tunnel underlay pairs after restart by registering
device.public_ipas in-use for legacy users with unsettunnel_endpointduring allocation reload
- Fix duplicate tunnel underlay pairs after restart by registering
- Client
- Rank devices and tunnel endpoints by minimum observed latency (
min_latency_ns) instead of average when selecting a connection target, preferring paths with the best achievable round-trip time
- Rank devices and tunnel endpoints by minimum observed latency (
- Tools
- Add
IsRetryableFuncfield toRetryOptionsfor configurable retry criteria in the Solana JSON-RPC client; add"rate limited"string match and RPC code-32429to the default implementation
- Add
- Telemetry
- Add optional TLS support to state-ingest server via
--tls-cert-fileand--tls-key-fileflags; when set, the server listens on both HTTP (:8080) and HTTPS (:8443) simultaneously - Remove
--additional-child-probesCLI flag from telemetry-agent; child geoprobe discovery now relies entirely on the onchain Geolocation program - Add BGP status submitter: on each tick, reads BGP socket state from the device namespace, maps each activated user to their tunnel peer IP, and submits
SetUserBGPStatusonchain; supports a configurable down grace period and periodic keepalive refresh; enabled via--bgp-status-enablewith--bgp-status-interval,--bgp-status-refresh-interval, and--bgp-status-down-grace-periodflags - Bound
CachingFetcherRPC calls with an explicit 30s timeout;context.WithoutCanceldrops the parent deadline as well as cancellation, so without this a hung Solana RPC would block all singleflight waiters indefinitely
- Add optional TLS support to state-ingest server via
- Monitor
- Add ClickHouse as a telemetry backend for the global monitor alongside existing InfluxDB
- E2E tests
- Add
TestE2E_GeoprobeIcmpTargetsverifying end-to-end ICMP outbound offset delivery via onchainoutbound-icmptargets - Refactor geoprobe E2E tests to use testcontainers entrypoints and onchain target discovery
- Add
TestE2E_UserBGPStatusverifying that the telemetry BGP status submitter correctly reports onchain status transitions as clients connect and establish BGP sessions
- Add
- Monitor
- Add ClickHouse as a telemetry backend for the global monitor alongside existing InfluxDB
- SDK
- Deserialize
agent_versionandagent_commitfrom device latency samples in Go, TypeScript, and Python SDKs - Add
BGPStatustype (Unknown/Up/Down) andSetUserBGPStatusexecutor instruction to the Go serviceability SDK
- Deserialize
- Sentinel
- Improve
find-validator-multicast-publishersandcreate-validator-multicast-publisherswith multi-value--clientfilter,--ipfilter, nearest-device selection, dynamic capacity re-evaluation, and a fix for multicast publisher owner being set to the sentinel payer instead of the validator's owner
- Improve
- Smartcontract
- Add
agent_version([u8; 16]) andagent_commit([u8; 8]) fields toDeviceLatencySamplesHeader, carved from the existing reserved region; accept both fields in theInitializeDeviceLatencySamplesinstruction via incremental deserialization (fully backward compatible) - Implement
SetUserBGPStatusprocessor: validates metrics publisher authorization, updatesbgp_status,last_bgp_reported_at, andlast_bgp_up_atfields on the user account - Add human-readable error messages for serviceability program errors in the Go SDK, including program log extraction for enhanced debugging
user getno longer fails when no Access Pass exists; it prints a warning to stderr and continues, showing an empty access pass field- Replace manual account validation assertions with
validate_program_account!macro across serviceability processor files, adding consistentdata_is_emptychecks and fixing a missingis_writablevalidation inResumeLink(#3436) - Extend
validate_program_account!migration to remaining user and multicastgroup allowlist processors (set_bgp_status,delete,closeaccount, publisher/subscriberadd/remove) - Add
OutboundIcmptarget type (= 2) to the geolocation onchain program, enabling ICMP-based probing as an alternative to TWAMP for outbound geolocation targets - Allow pending users with subs to be deleted
- Add
doublezero link topology {create,delete,clear,backfill,list}subcommands for managing flex-algo topologies;topology clearauto-discovers tagged links when--linksis omitted - Add
TopologyInfoonchain account for IS-IS flex-algo link classification: auto-assigned TE admin-group bit (1–62), derived flex-algo number (128 + bit), and constraint type (include-any/include-all); capped at 62 topologies viaAdminGroupBitsresource extension - Add
link_topologies: Vec<Pubkey>(capped at 8) andlink_flags: u32(bit 0 = unicast-drained) to theLinkaccount - Add
include_topologiesto theTenantaccount for topology-filtered routing opt-in - Enforce UNICAST-DEFAULT topology existence as a precondition for link activation
- Extend
link getandlink listto display topology assignments and drain status; add--link-topology <name>filter tolink listand--link-topology(comma-separated topology names) /--unicast-drainedflags tolink update; usedefaultas the value to clear all topology assignments - Extend
tenant getandtenant listto display included topologies; add--include-topologies(comma-separated topology names) flag totenant update; usedefaultto clear
- Add
- Onchain programs
- Add
tunnel_endpointfield to theUpdateUserinstruction (UserUpdateArgs), allowing the activator to overwrite a user's tunnel endpoint onchain; field is optional and backward compatible via incremental deserialization
- Add
- Telemetry
- Device telemetry agent now posts
agent_versionandagent_commitin theDeviceLatencySamplesHeaderwhen initializing new sample accounts, enabling version attribution of onchain telemetry data - Add optional TLS support to state-ingest server via
--tls-cert-fileand--tls-key-fileflags; when set, the server listens on both HTTP (:8080) and HTTPS (:8443) simultaneously - Remove
--additional-child-probesCLI flag from telemetry-agent; child geoprobe discovery now relies entirely on the onchain Geolocation program - Add BGP status submitter: on each tick, reads BGP socket state from the device namespace, maps each activated user to their tunnel peer IP, and submits
SetUserBGPStatusonchain; supports a configurable down grace period and periodic keepalive refresh; enabled via--bgp-status-enablewith--bgp-status-interval,--bgp-status-refresh-interval, and--bgp-status-down-grace-periodflags
- Device telemetry agent now posts
- Tools
- Add
IsRetryableFuncfield toRetryOptionsfor configurable retry criteria in the Solana JSON-RPC client; add"rate limited"string match and RPC code-32429to the default implementation - Add
doublezero-admin migrate flex-algo [--dry-run]command to backfill link topology assignments and VPNv4 loopback flex-algo node segments across all existing devices and links
- Add
- Geolocation
- Standardize CLI flag naming: probe mutation commands use
--probe(was--code) accepting pubkey or code; rename--signing-keypair→--signing-pubkeyand--target-pk→--target-signing-pubkey; add--json-compacttogetcommands - geoprobe-target can now store LocationOffset messages in ClickHouse
- Add ICMP pinger to geoprobe-agent for measuring outbound ICMP targets with interleaved batch send/receive, integrated into the existing measurement cycle alongside TWAMP
- Remove
--additional-parent,--additional-targets,--additional-icmp-targets, and--allowed-pubkeysCLI flags from geoprobe-agent; all configuration now comes from onchain state via parent and target discovery - Add
MinCachefor tracking minimum-RTT measurements with best/backup promotion over a rolling TTL window, used by both geoprobe-target and geoprobe-target-sender to suppress redundant output and surface only new-best events
- Standardize CLI flag naming: probe mutation commands use
v0.16.0 - 2026-04-03
- Smartcontract
- Require that the access pass provided to
SubscribeMulticastGroupbelongs to the payer; foundation allowlist members may use any access pass. - Add Index account for onchain key uniqueness enforcement and O(1) key-to-pubkey lookup, with standalone CreateIndex/DeleteIndex instructions for migration backfill
- Set minimum client version to 0.10.0
- Enforce 9000-byte MTU on links and non-CYOA/non-DIA device interfaces; CYOA/DIA interfaces must be 1500. Onchain validation now returns
InvalidMtu(error 46) for non-conforming values. - Add
OutboundIcmptarget type (= 2) to the geolocation onchain program, enabling ICMP-based probing as an alternative to TWAMP for outbound geolocation targets
- Require that the access pass provided to
- CLI
- Allow incremental multicast group addition without disconnecting
- Reset SIGPIPE to SIG_DFL at the start of main() in all 3 CLI binaries (doublezero, doublezero-geolocation, doublezero-admin) so the process exits silently like standard CLI tools
- Support
--type outbound-icmpin geolocationuser add-target,remove-target, andgetcommands - Add sentinel admin commands to find and create multicast publishers for IBRL validators
- handle non-user owned disconnects gracefully
- Add user's multicast pub/sub groups if applicable to
status
- Sentinel
- Add multicast publisher worker with Solana RPC-based validator discovery
- Add e2e tests for multicast publisher worker with validator-metadata-service mock
- SDK
- Add Go SDK for shred subscription program with read-only account deserialization (epoch state, seat assignments, pricing, settlement, validator client rewards), PDA derivation helpers, RPC fetchers, compatibility tests, and a fetch example CLI
- Add
GeoLocationTargetTypeOutboundIcmpto Go geolocation SDK with deserialization and round-trip test support
- Device Health Oracle
- Update link.health and device.health to
ready-for-serviceandready-for-userswhen they are not already in that state
- Update link.health and device.health to
- Tools
- Add
twamp-debugdiagnostic tool for testing kernel timestamping support on switches; sends real TWAMP probes to verify which SO_TIMESTAMPING modes (RX/TX software/hardware/sched) actually deliver timestamps, and reports RTT statistics comparing userspace vs kernel timestamp sources
- Add
- E2E Tests
- Switch backward compatibility test to install versioned CLI binaries from GitHub releases instead of Cloudsmith apt repos; version enumeration now uses the GitHub API directly from Go rather than querying apt-cache inside the container
- Client
- Add
doublezero_connection_infoPrometheus metric exposing connection metadata (user_type, network, current_device, metro, tunnel_name, tunnel_src, tunnel_dst) (#3201) - Add
doublezero_connection_rtt_nanosecondsanddoublezero_connection_loss_percentagePrometheus metrics reporting RTT and packet loss to the current connected device
- Add
v0.15.0 - 2026-03-27
- Client
- Funder
- Top up contributor owner keys alongside device metrics publishers, multicast group owners, and the internet latency collector
- Smartcontract
- Fix multicast publisher/subscriber device counter divergence:
multicast_publishers_countnever decremented andmulticast_subscribers_countover-decremented on user disconnect because the decrement logic checked!publishers.is_empty(), which is always false at delete time. Add a durabletunnel_flagsfield to theUserstruct with aCreatedAsPublisherbit, set at activation, and use it in the delete and closeaccount instructions. - Allow foundation allowlist members and the sentinel to create multicast users with a custom
ownervia a newownerfield onCreateSubscribeUser, enabling user creation on behalf of another identity's access pass
- Fix multicast publisher/subscriber device counter divergence:
- CLI
- Add
--ownerflag todoublezero user create-subscribefor specifying a custom user owner (foundation/sentinel only)
- Add
v0.14.0 - 2026-03-24
- Controller
- Log an error when duplicate tunnel-id assignments are detected on the same device during state cache update, instead of silently overwriting
- Onchain Programs
- Serviceability: update device interface IPs when
tunnel_netis changed viaUpdateLink, matching the existingActivateLinkbehavior (#3365) - Serviceability:
AcceptLinksupports combined accept+activate viause_onchain_allocationflag, gated onOnChainAllocationfeature flag (#3369) - Serviceability: add
feed_authoritytoRemoveMulticastGroupSubAllowlistauth check, matchingAddMulticastGroupSubAllowlist
- Serviceability: update device interface IPs when
- Client
- Get client IP from the daemon in the disconnect command, matching the connect command's behavior, to avoid IP mismatches behind NAT
- Onchain Programs
- Add
target_update_countfield to GeoProbe account, incremented onAddTargetandRemoveTarget; usesBorshDeserializeIncrementalso existing accounts default to 0 (non-breaking)
- Add
- SDK
- Add
TargetUpdateCountfield to Go GeoProbe struct with backward-compatible deserialization
- Add
- Telemetry
- Skip expensive
GetGeolocationUsersRPC scan in geoprobe-agent when the probe'starget_update_countis unchanged, with a forced full refresh every ~5 minutes as safety net - Add Prometheus metrics to geoprobe-agent: build info, error counters by type, discovery/measurement cycle durations, offset send/receive/reject counters, and discovered target/parent gauges; exposed via optional
--metrics-enableflag
- Skip expensive
v0.13.0 - 2026-03-20
- Activator
- Reserve device allocations (loopback IPs and segment routing IDs) for devices in Drained, DeviceProvisioning, and LinkProvisioning states at startup, preventing collisions with new device allocations
- Reserve user allocations (tunnel_net, tunnel_id, dz_ip, publisher IPs, tunnel endpoints) for users in Updating and OutOfCredits states at startup, preventing collisions with new user allocations
- Fix duplicate tunnel_net/tunnel_id allocation by reserving addresses for links in HardDrained, SoftDrained, and Provisioning states during startup initialization
- Onchain Programs
- Allow foundation to remove targets from GeolocationUser accounts via the
RemoveTargetinstruction, unblocking foundation-initiated user deletion when targets still exist - Serviceability: fix
SubscribeMulticastGroupderiving the AccessPass PDA frompayer_account.keyinstead ofuser.owner, which causeduser deleteto fail with "Invalid AccessPass PDA" when a foundation allowlist key signed and the user had active multicast subscriptions - feat(smartcontract): add tunnel_net/tunnel_id reallocation to UpdateLink (#3326)
- Allow foundation to remove targets from GeolocationUser accounts via the
- Client
- Fix
v2/statusreturning emptycurrent_deviceandmetrofor multicast subscribers by adding aclientIP + UserTypefallback in status enrichment when DzIp and tunnel_dst matching both fail - Set tunnel interface administratively down before deleting during teardown, so external applications with sockets bound to the tunnel's overlay IP receive errors before the interface is removed
- Fix
- CLI
- Include feed authority in
global-config authority getoutput - Add
geolocation usersubcommands to manage GeolocationUser accounts and targets:create,delete,get,list,add-target,remove-target, andupdate-payment-status
- Include feed authority in
- Monitor
- Fix slack user reporting
- SDK
- Add GeolocationUser types, Borsh deserialization, PDA derivation, and read-only client methods (
GetGeolocationUserByCode,GetGeolocationUsers) to the Go geolocation SDK
- Add GeolocationUser types, Borsh deserialization, PDA derivation, and read-only client methods (
- Telemetry
- Add onchain target discovery to the geoProbe agent: polls GeolocationUser accounts at 60s intervals, filters for activated+paid users, dynamically updates outbound probe targets and inbound signed TWAMP authorized keys
- Fix geoProbe parent discovery incorrectly adding parent authority keys to the signed TWAMP reflector allowlist; parent DZDs use the unsigned reflector
- Controller
- Retry transient Solana RPC failures when fetching onchain serviceability accounts so controller polls are more resilient to short-lived provider resets
v0.12.0 - 2026-03-16
- Onchain Programs
- Add
GeolocationUseraccount state to the geolocation program with owner, billing config (flat-per-epoch), payment/user status, and a target list supporting outbound (IP + port) and inbound (pubkey) geolocation targets - Add GeolocationUser CRUD instruction processors (create, update, delete) with owner authorization and target-empty guard on delete
- Add GeolocationUser target management (AddTarget, RemoveTarget) with duplicate/not-found guards, public IP validation, MAX_TARGETS limit, and GeoProbe reference count tracking
- Add foundation-only UpdatePaymentStatus instruction to set payment status and last deduction epoch on GeolocationUser billing config
- Add
- Client
- Demote passive-mode liveness session-down log messages from Info to Debug to reduce log noise when no dataplane action is taken
- Telemetry
- Add
Version(uint8) andTargetIP([4]byte) fields to LocationOffset wire format (v1, 174 bytes), with version validation on unmarshal to enable safe future format evolution
- Add
- Tools
- Update TWAMP signed packet parser byte offsets and
OffsetInfostruct for LocationOffset v1 layout
- Update TWAMP signed packet parser byte offsets and
- Onchain Programs
- Serviceability: allow reservation authority to create, update, and close access passes, with ownership restriction preventing modification of passes created by other authorities
- Serviceability: fix multicast user creation failing when access-pass has a
tenant_allowlist; tenant enforcement only applies to unicast connections since multicast users are not tenant-scoped - Serviceability: rename
reservation_authority_pktofeed_authority_pkin GlobalState and renameRESERVATIONpermission flag toFEED_AUTHORITY - Serviceability: remove
ReserveConnection,CloseReservation,CreateReservedSubscribeUser,DeleteReservedSubscribeUserinstructions andReservationaccount type
- E2E Tests
- Fix
TestE2E_UserLimitsnot asserting command failure: the; echo EXIT_CODE=$?pattern caused the shell to always exit 0 regardless of thedoublezeroexit code, makingerralways nil; replace withrequire.Errorassertions so the test fails if a limit-exceeded connect unexpectedly succeeds - Fix intermittent flake in
TestE2E_MultiClientIBRL_RouteLiveness: add explicit route convergence checks after each unblock before starting the next block/unblock cycle, ensuring the liveness subsystem and BGP have fully settled - Add geoprobe E2E test (
TestE2E_GeoprobeDiscovery) that exercises the full geolocation flow: deploy geolocation program, create probe onchain, start geoprobe-agent container, and verify the telemetry-agent discovers and measures the probe via TWAMP - Add geoprobe Docker image, geolocation program build/deploy support, and manager geolocation CLI configuration to the E2E devnet infrastructure
- Extend geoprobe E2E test with outbound offset forwarding (agent → target with signature chain verification) and inbound signed TWAMP probing (target-sender → agent with DZD offset embedding); build geoprobe-target and geoprobe-target-sender binaries into the geoprobe Docker image
- Fix
- Telemetry
- Add onchain parent DZD discovery to geoprobe-agent: periodically queries the Geolocation program for this probe's parent devices and resolves their metrics publisher keys from Serviceability, replacing the need for static
--parent-dzdCLI flags. Static parents from CLI are merged with onchain parents, with onchain taking precedence for duplicate keys. - Optimize inbound probe-measured RTT accuracy: pre-sign both TWAMP probes before network I/O so probe 1 fires immediately after reply 0 with no signing delay, measure Tx-to-Rx interval (reply 0 Tx → probe 1 Rx) instead of Rx-to-Rx to exclude processing overhead on both sides, use kernel
SO_TIMESTAMPNSreceive timestamps on the reflector, and add a 15ms busy-poll window on the sender to avoid scheduler wakeup latency - Optimize outbound probe RTT accuracy: send a staggered warmup probe on a separate socket 2ms before the measurement probe to wake the reflector's thread, then take the min RTT of both
- Add onchain parent DZD discovery to geoprobe-agent: periodically queries the Geolocation program for this probe's parent devices and resolves their metrics publisher keys from Serviceability, replacing the need for static
v0.11.0 - 2026-03-12
- Onchain Programs
- Serviceability: split per-device multicast user tracking into separate subscriber and publisher counters (
multicast_subscribers_count/max_multicast_subscribersandmulticast_publishers_count/max_multicast_publishers); publisher and subscriber limits are now enforced independently
- Serviceability: split per-device multicast user tracking into separate subscriber and publisher counters (
- Controller
- Downgrade transient ClickHouse write errors from ERROR to WARN, escalating to ERROR only after 3 consecutive flush failures to reduce alert noise (#3220)
- Telemetry
- Detect and replace unresponsive RIPE Atlas source probes that stop returning ping results, with a 24-hour TTL on the unresponsive probe blacklist so probes are retried after expiry
- Compare source probe IDs (not just location codes) during measurement reconciliation so that probe replacements trigger measurement recreation
- Fix race condition in internet-latency-collector where export and management goroutines independently loaded/saved the same state file, causing newly created RIPE Atlas measurement metadata to be overwritten and measurements to be stuck in a create-destroy-create loop (#3195)
- Add wheresitup job backlog observability:
pending_jobsPrometheus gauge,in_progress_count/pending_jobsin export summary logs, and API response duration histogram (#3203) - Change geoprobe-agent and geoprobe-target default TWAMP reflector port from 862 to 8925 to avoid DZD ACL blocks, use per-probe TWAMP port instead of hardcoded constant, and update
--additional-child-probes/--additional-targetsformat tohostorhost:offset_port:twamp_port(two-fieldhost:portrejected as ambiguous)
- Activator
- Fix tunnel ID leak in user activation: eagerly-allocated tunnel_id, tunnel_net, and dz_ip were not rolled back when the activation transaction failed, causing ghost IDs to accumulate and eventually exhaust the controller's tunnel slot range
- Suppress noisy program log output from race conditions caused by dual event processing (websocket + snapshot poll). The SDK's new
execute_transaction_quietreturns aSimulationErrorwith program logs; the activator verifies suspected races by re-fetching user state before deciding whether to print logs (#3197)
- CLI
- Add
doublezero-geolocationCLI for managing geolocation program entities: GeoProbe CRUD (create, get, list, update, delete), parent device management (add/remove), program config initialization, and geolocation-specific config get/set - Add
--multicast-publishers-countand--multicast-subscribers-countflags todevice updatefor foundation-gated count correction; rename--max-multicast-usersto--max-multicast-subscribersand add--max-multicast-publishers - Add
doublezero-admin device migrate-multicast-counts [--dry-run]to correct stalemulticast_subscribers_count/multicast_publishers_counton existing deployments where all multicast users were previously counted as subscribers; supports dry-run preview and continues past per-device failures - Add
doublezero-admin device migrate-unicast-counts [--dry-run]to correct staleunicast_users_counton all devices; same behaviour as the multicast counts command
- Add
- SDK
- Add read-only Go SDK for
doublezero-geolocationprogram with state deserialization, PDA derivation, and RPC client for querying geoprobe configuration - Add
GetGeoProbeKeysto geolocation SDK for lightweight account key fetching using DataSlice to minimize RPC bandwidth - Add Rust SDK instruction builders for GeolocationUser management: CRUD (create, update, delete), target management (add, remove), payment status updates, and read queries (get by code/pubkey, list all)
- Add read-only Go SDK for
- Telemetry
- Add onchain GeoProbe discovery to the telemetry agent: periodically queries the Geolocation program for child probes parented to the local device, replacing the need for
--additional-child-probesCLI flag - Embed LocationOffsets from parent DZDs in signed TWAMP replies so inbound probes carry geolocation context, and make signed TWAMP replies more like LocationOffsets to couple with a new double-probe system for inbound probing.
- Add onchain GeoProbe discovery to the telemetry agent: periodically queries the Geolocation program for child probes parented to the local device, replacing the need for
- Client
- Fix mainnet-beta Cloudsmith package containing the testnet binary by giving the mainnet-beta Rust build a separate
CARGO_TARGET_DIRto prevent GoReleaser artifact collision - Increase default onchain fetch timeout from 20s to 60s to improve resilience on high-latency RPC paths; add
-reconciler-fetch-timeoutflag to allow operators to override - Add prometheus metrics for onchain RPC fetches: fetch duration histogram, result counter (success/error with stale cache/error with no cache), and stale cache age gauge
- Increase default route liveness probe interval (TxMin/RxMin) from 300ms to 1s and raise MaxTxCeil from 1s to 3s to preserve backoff headroom
- Throttle O(n) per-service scheduler queue length metric from every event to once per 10s to fix excessive CPU usage on nodes with many liveness sessions
- Fix mainnet-beta Cloudsmith package containing the testnet binary by giving the mainnet-beta Rust build a separate
- Smartcontract
- Serviceability: add foundation-only
unicast_users_count,multicast_subscribers_count, andmulticast_publishers_countfields toUpdateDeviceinstruction for direct count correction, with corresponding--unicast-users-count,--multicast-subscribers-count, and--multicast-publishers-countCLI flags - Serviceability: fix
validate_account_codeforcing lowercase on all entity types — restrict lowercase normalization to device and link codes only, preserving original case for locations, exchanges, contributors, and other entities - feat(smartcontract): atomic onchain allocation for CreateDevice (#3216)
- Serviceability: RequestBanUser instruction supports atomic deallocate when OnchainAllocation feature is enabled
- Serviceability: DeviceInterfaceUpdate instruction supports onchain allocation of node_segment_idx
- Serviceability: fix
validate_account_codeforcing lowercase on all entity types — restrict lowercase normalization to device and link codes only, preserving original case for locations, exchanges, contributors, and other entities - feat(smartcontract): atomic onchain allocation for CreateDevice (#3216)
- Serviceability: CreateDeviceInterface instruction supports atomic create+allocate+activate when OnchainAllocation feature is enabled
- Serviceability: DeleteDeviceInterface instruction supports atomic deallocate+remove when OnchainAllocation feature is enabled
- Serviceability: redesign reservations from per-IP accounts to per-(device, owner) reservation blocks with a configurable seat count, and integrate with user creation so creating a user can consume a reserved seat (#3224)
- Serviceability: add foundation-only
- CLI
- Add
access-pass user-balancescommand to show per-payer SOL balance, required amount (rent + gas reserve), and missing amount, with filters (--user-payer,--min-balance,--max-balance,--min-missing,--max-missing), sorting, and--top N - Add
access-pass fundcommand to top up underfunded user payers, with--dry-run,--force(skip confirmation),--min-balance, and a pre-transfer sender balance check; required balance floor includes a gas-fee reserve (50 × 5,000 lamports) and the wallet rent-exempt minimum to prevent on-chain transfer failures - Fix
access-pass fundandaccess-pass user-balancesslot counting to track remaining slots per(payer, client_ip)pair, preventing a connected user on IP_B from consuming open slots for IP_A; also fix required balance formula to always addwallet_rent_minon top ofneeds_rentrather than taking the max - Add
--user-payerfilter touser listcommand - Serviceability: onchain activation - atomic close for DeleteDevice (#3188)
- Fix
access-pass user-balancesandaccess-pass fundunderestimating the required wallet balance: the wallet's own rent-exempt minimum was used as a floor rather than being added, causingmissing: 0to be reported even when provisioning would fail with insufficient funds (#3213)
- Add
- Onchain Programs
- Serviceability: DeleteUser instruction supports atomic deallocate+closeaccount when OnchainAllocation feature is enabled
- Serviceability: CreateLink instruction supports atomic create+allocate+activate when OnchainAllocation feature is enabled
- Serviceability: DeleteLink instruction supports atomic deallocate+closeaccount when OnchainAllocation feature is enabled
- Serviceability: CreateMulticastGroup instruction supports atomic create+allocate+activate when OnchainAllocation feature is enabled
- Serviceability: DeleteMulticastGroup instruction supports atomic deallocate+closeaccount when OnchainAllocation feature is enabled
- Serviceability: CreateSubscribeUser instruction supports atomic create+allocate+activate when OnchainAllocation feature is enabled
- Serviceability: MulitcastGroupUpdate instruction supports atomic ip allocation when OnchainAllocation feature is enabled
- Serviceability: UpdateUser instruction supports atomic allocate+deallocate when OnchainAllocation feature is enabled
v0.10.0 - 2026-03-04
- CLI
doublezero resource verifycommand will now suggest creating resources or create them with --fix- Print an explicit message when the tenant is resolved implicitly from the configuration file (
Using tenant '...' from configuration file.) or from the Access Pass allowlist (Using tenant '...' from Access Pass.) - All
getcommands now display output as a formatted table and support a--jsonflag for machine-readable output - Remove
solana-multicast-publisherandsolana-multicast-subscriberfromaccess-pass settype options (multicast roles use the tenant field on aprepaidpass instead); make--solana-validatoroptional forsolana-rpctype getcommands now expose all onchain account fields:user getaddstunnel_id,tunnel_endpoint, andvalidator_pubkey;device getaddsreserved_seats;link getaddstunnel_id;multicastgroup getaddstenant,publisher_count, andsubscriber_count;tenant getaddspayment_status,billing,administrators, andtoken_account;exchange getaddsdevice1_pkanddevice2_pk
- SDK
- Fix multicast group deserialization in
smartcontract/sdk/goto correctly read publisher and subscriber counts and align status enum with onchain definition
- Fix multicast group deserialization in
- Smartcontract
- Serviceability: add
Reservationaccount andReserveConnection/CloseReservationinstructions for pre-reserving connection seats on devices, withreserved_seatsfactored into capacity checks on both reservation and user creation - Allow sentinel authority to add/remove multicast publisher and subscriber allowlist entries
- Serviceability: add
- SDK
- Add Rust SDK for geolocation program with
GeoClient, GeoProbe CRUD operations (create, get, list, update, delete, add/remove parent device), and ProgramConfig management (init, get, update) - Add
geo_program_idtoNetworkConfigfor geolocation program discovery
- Add Rust SDK for geolocation program with
- Telemetry
- Add
geoprobe-target-senderCLI tool for sending signed TWAMP probes to a GeoProbe and verifying signed replies (RFC16 inbound probing flow) - Add Signed TWAMP reflector to geoprobe-agent with configurable listen port and allowed-pubkeys allowlist
- Fix global monitor crash when IBRL and multicast users share the same client IP but are on different devices, by preferring non-multicast users in client IP lookups to match status device selection
- Add
- Client
- Add onchain reconciler to daemon — automatically provisions/removes tunnels by polling onchain User state, replacing CLI-driven provisioning and the
doublezerod.jsonstate file (RFC-17) - Add
doublezero enable/doublezero disableCLI commands to toggle the reconciler at runtime
- Add onchain reconciler to daemon — automatically provisions/removes tunnels by polling onchain User state, replacing CLI-driven provisioning and the
- E2E tests
- Publish
TestQA_AllDevices_UnicastConnectivityresults to ClickHouse (qa_alldevices_resultsandqa_alldevices_metadatatables) in addition to InfluxDB; configured viaCLICKHOUSE_ADDRenv var, skipped gracefully when not set
- Publish
- Onchain Programs
- Serviceability: CreateUser instruction supports atomic create+allocate+activate when OnchainAllocation feature is enabled
v0.9.0 - 2026-02-27
- CLI:
--bandwidthis now a required argument fordoublezero device interface createanddoublezero device interface update; callers that previously omitted it (relying on the default of0) must now explicitly pass a value with a unit (e.g.--bandwidth 10Gbps)
- Tools
- Add signed TWAMP sender and reflector with Ed25519 authentication and per-pubkey rate-limited signature verification
- Activator
- Adds a stateless mode for when onchain allocation is enabled. This prevents activator/onchain from becoming out-of-sync.
--onchain-allocationcli flag replaced with feature flag from GlobalState onchain
- SDK
- Add retry with exponential backoff (3 retries, 500ms–5s) to all read-only RPC calls in
DZClient, improving resilience to transient RPC timeouts
- Add retry with exponential backoff (3 retries, 500ms–5s) to all read-only RPC calls in
- CLI
- Fix
doublezero statusshowing "Current Device" and "Metro" as N/A for multicast subscribers when the tunnel destination is auser_tunnel_endpointloopback interface IP rather than the device'spublic_ip - Remove redundant
connect ibrlunit tests that were duplicates of hybrid-device equivalents doublezero global-config feature-flagscommands added- Fix multicast subscriber tunnel source resolution for NAT environments — resolve local interface IP instead of using public IP
- Added multicast filters to access-pass list, enabling filtering by publisher/subscriber role and identifying access passes not authorized for a specific multicast group.
- Device interface
--bandwidthand--cirflags now accept Kbps, Mbps, or Gbps units;interface listdisplays those values as human-readable strings - Add duplicate IP check to prevent a user from assigning the same IP more than once
- Fix
- Client
- Fix BGP
OnClosedeleting routes from all peers instead of only the closing peer, preventing multicast teardown from nuking unicast routes - Skip route deletion on
OnCloseforNoInstallpeers (multicast) since they never install kernel routes - Reject BGP martian addresses (CGNAT, multicast, reserved, benchmarking, etc.) as client IP during
connect
- Fix BGP
- Controller
- detect duplicate (UnderlaySrcIP, UnderlayDstIP) pairs for tunnels and only render the first to the device config and write a log error for the second
- allow MTU to be configurable
- Onchain Programs
- Serviceability: skip field validation for users in
Deletingstatus to prevent accounts from getting stuck during cleanup when validation rules change - Serviceability: require foundation_allowlist privileges to update node_segment_idx on a device interface
- Serviceability: add feature flags support
- Serviceability: expand
is_globalto reject all BGP martian address ranges (CGNAT 100.64/10, IETF 192.0.0/24, benchmarking 198.18/15, multicast 224/4, reserved 240/4, 0/8) - Serviceability: allow update and deletion of interfaces even when sibling interfaces have invalid CYOA configuration
- Geolocation: add
doublezero-geolocationprogram scaffolding and GeoProbe account type and related instructions as per rfcs/rfc16-geolocation-verification.md
- Serviceability: skip field validation for users in
- SDK
- SetFeatureFlagCommand added to manage on-chain feature flags for conditional behavior rollouts
- Dependencies
- Upgrade Solana SDK workspace dependencies from 2.2.7 to 2.3.x (
solana-sdk,solana-client,solana-program-test, and others)
- Upgrade Solana SDK workspace dependencies from 2.2.7 to 2.3.x (
- Internet telemetry
- Reduce RIPE Atlas sampling interval from 6 minutes to 10 minutes to work around service limit of 100_000 samples per day
- E2E
- e2e: add multi-tenant access control negative tests (#3081)
v0.8.11 - 2026-02-27
- N/A
- Client
- Fix BGP
OnClosedeleting routes from all peers instead of only the closing peer, preventing multicast teardown from nuking unicast routes
- Fix BGP
v0.8.10 – 2026-02-19
- N/A
- Activator
- removes accesspass monitor task (that expires access passes)
- Monitor
- Add Prometheus metrics for multicast publisher block utilization (
doublezero_multicast_publisher_block_total_ips,doublezero_multicast_publisher_block_allocated_ips,doublezero_multicast_publisher_block_utilization_percent) — enables Grafana alerting on IP pool exhaustion thresholds - Include tenant name in the Slack notification table when new users are activated
- Add Prometheus metrics for multicast publisher block utilization (
- SDK (Go)
- Add
GetMulticastPublisherBlockResourceExtension()method to serviceability client for fetching the global multicast publisher IP allocation bitmap - Fix LinkDesiredStatus discriminants (hard-drained=6, soft-drained=7)
- Add
- Onchain Programs
- Upgrade programs from system_instruction to solana_system_interface
- Refactor user creation to validate all limits (max_users, max_multicast_users, max_unicast_users) before incrementing counters — improves efficiency by avoiding wasted work on validation failures and follows fail-fast best practice
- Serviceability:
UnlinkDeviceInterfacenow only allowsActivatedorPendinginterfaces; when an associated link account is provided for anActivatedinterface, the link must be inDeletingstatus - Links and devices can no longer be deleted from
Activatedstatus — must be drained first; deletion is rejected withInvalidStatus - Contributors, locations, multicast groups, and users can now be deleted from any operational status (not just
Activated); onlyDeleting/Updatingstates are blocked - SDK:
UnlinkDeviceInterfaceCommandautomatically discovers and passes associated link accounts - Serviceability: allow contributors to update prefixes when for IBRL when no users are allocated
- CLI
doublezero statusnow shows aTenantcolumn (betweenUser TypeandCurrent Device) with the tenant code associated with the user; empty when no tenant is assigned
- Client
- Fix tunnel overlay address scope to prevent kernel from selecting link-local /31 as source for routed traffic
- Serviceability: close orphaned blocks when dz_prefixes shrink
- Serviceability: require ip-net for CYOA interfaces
- E2E / QA Tests
- Fix QA unicast test flake caused by RPC 429 rate limiting during concurrent user deletion — treat transient RPC errors as non-fatal in the deletion polling loop
- Backward compatibility test: use
--statusinstead of--desired-statusfor drain commands; fix version ranges (link drain compatible since v0.7.2, device drain since v0.8.1) - Add daily devnet QA test for device provisioning lifecycle (RFC12) — deletes/recreates device and links, restarts daemons with new pubkey via Ansible
- Remove devnet/testnet environment filter from
TestQA_MulticastPublisherMultipleGroups— test now runs against all environments
v0.8.9 – 2026-02-16
- N/A
- Activator
- Fail to start if any global config network blocks (
device_tunnel_block,user_tunnel_block,multicastgroup_block,multicast_publisher_block) are unset (0.0.0.0/0) - Fix multicast publisher dz_ip leak in offchain deallocation — IPs from the global publisher pool were never freed on user deletion because the check required non-empty publishers, which the smartcontract already clears before allowing deletion
- Fail to start if any global config network blocks (
- Client
- Fix heartbeat sender not restarting after disconnect due to poisoned done channel
- Onchain Programs
- bugfix(serviceability): contributors can now update their interfaces, CYOA interfaces saved on create, physical interfaces remain after unlink (#2993)
- Device controller
- Reject users with BGP martian DZ IPs (RFC 1918, loopback, multicast, link-local, documentation nets, shared address space, reserved) to prevent invalid addresses from being advertised via BGP or permitted in device ACLs
- Claude
- chore: update CLAUDE.md (#2999)
- e2e
- e2e: Add network contributor e2e flow tests (#2997)
v0.8.8 – 2026-02-13
- None for this release
- Activator
- Assign multicast publisher IPs from global pool in serviceability GlobalConfig instead of per-device blocks
- Client
- Add multicast publisher heartbeat sender — sends periodic UDP packets to each multicast group to keep PIM (S,G) mroute state alive on devices
- Fix panic in heartbeat sender when concurrent teardown requests race on close
- E2E tests
- Add daily devnet QA test for device provisioning lifecycle (RFC12) — deletes/recreates device and links, restarts daemons with new pubkey via Ansible
- Serviceability: prevent creating or activating links on interfaces with CYOA or DIA assignments, and prevent setting CYOA/DIA on interfaces that are already linked
- CLI: add early validation in
link wan-createandlink dzx-createto reject interfaces with CYOA or DIA assignments
v0.8.7 – 2026-02-10
- None for this release
- SDK
- Added Tenant to all sdks
- E2E tests
- Added multi-tenancy deletion test coverage
- Telemetry
- Add
doublezero-geoprobe-agent, intermediary probe server for RFC16 - Adds support for per-tenant metro routing policy
- Add
--geoprobe-pubkeyflag todoublezero-geoprobe-agentfor device identity LocationOffsetstruct now includesSenderPubkeyto distinguish individual devices that share the same signing authority
- Add
- Cli
- Automatic detection of the authorized tenant is added.
- The
delete tenantcommand allows cascading deletion of users and access passes.
- Telemetry
- extend device telemetry agent to measure RTT to child geoProbes via TWAMP, generate signed LocationOffset structures, and deliver them via UDP as per rfcs/rfc16-geolocation-verification.md
- geoprobe-target: example target listener for geolocation verification with TWAMP reflector, UDP offset receiver, signature chain verification, distance calculation logging, and DoS protections (5-reference depth limit and per-source-IP rate limiting) (#2901)
- Onchain programs
- feat(serviceability): add TenantBillingConfig and epoch tracking to UpdatePaymentStatus (#2922)
- feat(smartcontract): add payment_status, token_account fields and UpdatePaymentStatus instruction (#2880)
- fix(smartcontract): correctly ser/deser ops_manager_pk (#2887)
- Serviceability: add metro_routing and route_liveness boolean fields to Tenant for routing configuration
- Serviceability: add Tenant account type with immutable code-based PDA derivation, VRF ID, administrator management, and reference counting for safe deletion
- Serviceability: add TenantAddAdministrator and TenantRemoveAdministrator instructions for foundation-managed administrator lists
- Serviceability: extend UserUpdate instruction to support tenant_pk field updates with automatic reference count management on old and new tenants (backward compatible with old format)
- Serviceability: extend UserCloseAccount instruction to decrement tenant reference count when closing user with assigned tenant
- Serviceability: add reference count validation in DeleteMulticastGroup to prevent deletion when active publishers or subscribers exist
- Serviceability: fix multicast group closeaccount to use InvalidStatus error and remove redundant publisher/subscriber count check
- Serviceability: add tenant_allowlist field to AccessPass to restrict which tenants can use specific access passes (backward compatible with existing accounts)
- Serviceability: bypass validation for link delete (#2934)
- Serviceability: add per-device unicast and multicast user limits with separate counters and configurable max values (RFC-14)
- Fix link device & link updates
- SDK
- Add metro_routing and route_liveness fields to CreateTenantCommand and UpdateTenantCommand
- Add CreateTenant, UpdateTenant (vrf_id only), DeleteTenant, GetTenant, and ListTenant commands with support for code or pubkey lookup
- Add AddAdministratorTenant and RemoveAdministratorTenant commands for tenant administrator management
- UpdateUserCommand extended with tenant_pk field and automatic tenant account resolution for reference counting
- SetAccessPassCommand extended with tenant field to specify allowed tenant for access pass
- TypeScript SDK updated with tenantAllowlist field in AccessPass interface and deserialization
- CLI
- Fix
multicastgroup updatecommand to properly parse human-readable bandwidth values (e.g., "1Gbps", "100Mbps") in--max-bandwidthflag - Add --metro-route and --route-aliveness flags to tenant create and update commands
- Add tenant subcommands (create, update, delete, get, list, add-administrator, remove-administrator) to doublezero and doublezero-admin CLIs
- Support simultaneous publisher and subscriber multicast via
--publishand--subscribeflags - Add
--max-unicast-usersand--max-multicast-usersflags todevice updatecommand - Add filtering options and desired_status & metrics_publisher_pk field to device and link list commands
- Added activation check for existing users before subscribing to new groups (#2782)
- access-pass set: add --tenant argument to specify tenant code for access pass restriction (converts to tenant PDA onchain)
- tenant list: improve output formatting with table support and JSON serialization options (--json, --json-compact)
- default tenant support added to config
- Fix
- SDK
- Add read-only Go SDK (
revdist) for the revenue distribution Solana program, with typed deserialization of all onchain accounts and Rust-generated fixture tests for cross-language compatibility - Add
revdist-clitool for inspecting onchain revenue distribution state - Add Python and TypeScript SDKs for serviceability, telemetry, and revdist programs with typed deserialization, RPC clients, PDA derivation, enum string types, and cross-language fixture tests
- Add shared
borsh-incrementallibrary (Go, Python, TypeScript) for cursor-based Borsh deserialization with backward-compatible trailing field defaults - Add npm and PyPI publish workflows for serviceability and telemetry SDKs
- DeleteUserCommand updated to wait for activator to process multicast user unsubscribe before deleting the user
- Add read-only Go SDK (
- Device controller
- Record successful GetConfig gRPC calls to ClickHouse for device telemetry tracking
- Multi-tenancy vrf support added
- Skip isis and pim config for CYOA/DIA tagged interfaces
- Onchain programs
- Enforce that
CloseAccessPassonly closes AccessPass accounts whenconnection_count == 0, preventing closure while active connections are present.
- Enforce that
- Monitor
- Add sol-balance watcher to track SOL balances for configured accounts and export Prometheus metrics for alerting
- Client
- Support simultaneous publisher and subscriber multicast in the daemon
- Telemetry
- Add consecutive-loss-based sender eviction to the telemetry collector so broken TWAMP senders are recreated quickly instead of persisting until TTL expiry (
--max-consecutive-sender-losses, default 30)
- Add consecutive-loss-based sender eviction to the telemetry collector so broken TWAMP senders are recreated quickly instead of persisting until TTL expiry (
- E2E tests
- e2e: add multi-tenancy VRF isolation test (#2891)
- Add backward compatibility test that validates older CLI versions against the current onchain program by cloning live state from testnet and mainnet-beta
- QA multicast tests: add diagnostic dumps on failure (status, routes, latency, multicast reports, onchain user/device state), cleanup stale test groups at test start, and fix disconnect blocking on stuck daemon status
v0.8.6 – 2026-02-04
- None for this release
- CLI
- Remove log noise on resolve route
doublezero resource verifycommand added to verify onchain resources- Enhance delete multicast group command to cascade into deleting AP entry (#2754)
- Onchain programs
- Removed device and user allowlist functionality, updating the global state, initialization flow, tests, and processors accordingly, and cleaning up unused account checks.
- Serviceability: require DeactivateMulticastGroup to only close multicast group accounts when both
publisher_countandsubscriber_countare zero, preventing deletion of groups that still have active publishers or subscribers. - Deprecated the user suspend status, as it is no longer used.
- Serviceability: enforce that CloseAccountUser instructions verify the target user has no multicast publishers or subscribers (both
publishersandsubscribersare empty) before closing, and add regression coverage for this behavior. - Enhance access pass functionality with new Solana-specific types
- fix default desired status
- Telemetry
- Fix goroutine leak in TWAMP sender —
cleanUpReceivedgoroutines now exit onClose()instead of living until process shutdown
- Fix goroutine leak in TWAMP sender —
- Client
- Cache network interface index/name lookups in liveness UDP service to fix high CPU usage caused by per-packet RTM_GETLINK netlink dumps
- Add observability to BGP handleUpdate: log withdrawal/NLRI counts per batch and track processing duration via
doublezero_bgp_handle_update_duration_secondshistogram
- E2E tests
v0.8.5 – 2026-02-02
- None for this release
- Smartcontract
- fix(smartcontract): reserve first IP of DzPrefixBlock for device (#2753)
- Client
- Fix race in bgp status handling on peer deletion
v0.8.4 – 2026-01-28
- None for this release
- Telemetry
- Force IPv4-only connections for gNMI tunnel client and fix TLS credential handling
- Client
- Support simultaneous unicast and multicast tunnels in doublezerod
- Support publishing and subscribing to multiple multicast groups simultaneously
- CLI
- Support publishing and subscribing a user to multiple multicast groups via
--groupflag - Remove single tunnel constraint
- Support publishing and subscribing a user to multiple multicast groups via
- SDK
- Go SDK can now perform batch writes to device.health and link.health as per rfc12
- Activator
- fix(activator): add on-chain allocation support for users (#2744)
- On-chain allocation enabled
- Smartcontract
- feat(smartcontract): add use_onchain_deallocation flag to MulticastGroup (#2748)
- CLI
- Remove restriction for a single tunnel per user; now a user can have a unicast and multicast tunnel concurrently (but can only be a publisher or a subscriber) (2728)
v0.8.3 – 2026-01-22
- Data
- Add indexer that syncs serviceability and telemetry data to ClickHouse and Neo4J
- None for this release
- CLI
- Remove log noise on resolve route
- Add
global-config qa-allowlistcommands to manage QA identity allowlist to bypass status and max_users checks in QA - Add "-skip-capacity-check" flag to bypass status and max_users checks in QA to test devices that are still being provisioned
- Remove "unknown" status from doublezero status command and implement "failed" and "unreachable" statuses
- Client
- Enable route liveness passive-mode by default
- Add
make installmake target. To build and deploy from source, users can now runcd client && make build && make installto install the doublezero and doublezerod binaries and the doublezerod systemd unit.
- Onchain programs
- Serviceability: remove validation check for interface delete (#2707)
- Serviceability: interface-cyoa only on physical interfaces, don't require interfaces to be tagged, add same validation logic to update interface (#2700)
- Enforce Activated status check before suspending contributor, exchange, location, and multicastgroup accounts
- Removed device and user allowlist functionality, updating the global state, initialization flow, tests, and processors accordingly, and cleaning up unused account checks.
- Serviceability: require DeactivateMulticastGroup to only close multicast group accounts when both
publisher_countandsubscriber_countare zero, preventing deletion of groups that still have active publishers or subscribers. - Deprecated the user suspend status, as it is no longer used.
- Serviceability: enforce that CloseAccountUser instructions verify the target user has no multicast publishers or subscribers (both
publishersandsubscribersare empty) before closing, and add regression coverage for this behavior. - Removed device and user allowlist functionality, updating the global state, initialization flow, tests, and processors accordingly, and cleaning up unused account checks.
- SetGlobalConfig, ActivateDevice, UpdateDevice and CloseAccountDevice instructions updated to manage resource accounts.
- Add option for Contributor B to reject a link created by Contributor A just as Contributor A can cancel its own created link
- Telemetry
- Add gNMI tunnel client for state collection
- Activator
- fix(activator): ip_to_index fn honors ip range #2658
- E2E tests
- Add influxdb, prometheus, and device-health-oracle containers
- Add interface lifecycle tests (#2700)
- Only fail QA alldevices test run if device status is "Activated" and max users > 0
- SDK
- Commands for setting global config, activating devices, updating devices, and closing device accounts now manage resource accounts.
- Serviceability: return error when GetProgramAccounts returns empty result instead of silently returning empty data
- Smartcontract
- feat(smartcontract): RFC 11 activation for User entity
- feat(smartcontract): RFC 11 add on-chain resource allocation for Link
- Device Health Oracle
- Add new device-health-oracle component. See rfcs/rfc12-network-provisioning.md for details.
- Calculate burn-in timestamp based from slot numbers (current minus 200_000 slots for provisioning, current minus 5_000 slots for maintenance)
- CI
- Add separate apt repo for doublezero-testnet
v0.8.2 – 2025-01-13
- None for this release
- Client
- Always delegate RouteAdd regardless of noUninstall flag
- Telemetry
- Include solana vote pubkey in global monitor metrics
- Run telemetry agent on pending and drained links
v0.8.1 – 2025-01-12
- Onchain programs
- Serviceability: enforce that ActivateLink and CloseAccountLink instructions verify the provided side A/Z device accounts match the link's stored
side_a_pkandside_z_pkbefore proceeding.
- Serviceability: enforce that ActivateLink and CloseAccountLink instructions verify the provided side A/Z device accounts match the link's stored
- CLI
- Update contributor, device, exchange, link, location, and multicast group commands to ignore case when matching codes
- ActivateMulticastGroup now supports on-chain IP allocation from ResourceExtension bitmap (RFC 11).
- IP address lookup responses that do not contain a valid IPv4 address (such as upstream timeout messages) are now treated as retryable errors instead of being parsed as IPs.
doublezero resourcecommands added for managing ResourceExtension accounts.- Added health_oracle to the smart contract global configuration to manage and authorize health-related operations.
- Added --ip-net support to create to match the existing behavior in update.
- Use DZ IP for user lookup during status command instead of client IP
- Onchain programs
- Fix CreateMulticastGroup to use incremented globalstate.account_index for PDA derivation instead of client-provided index, to ensure the contract is the authoritative source for account indices
- Add on-chain validation to reject CloseAccountDevice when device has active references (reference_count > 0)
- Allow contributor owner to update ops manager key
- Add new arguments on create interface cli command
- Serviceability: enforce that resume instructions for locations, exchanges, contributors, devices, links, and users only succeed when the account status is
Suspended, returningInvalidStatusotherwise, and add tests to cover the new behavior. - RequestBanUser: only allow requests when user.status is Activated or Suspended; otherwise return InvalidStatus
- Serviceability: require device interfaces to be in
Pendingstatus before they can be rejected, and add tests to cover the new status check - Add ResourceExtension to track IP/ID allocations. Foundation instructions added to create/allocate/deallocate.
- ResourceExtension optimization using first_free_index for searching bitmaps
- Added the INSTRUCTION_GUIDELINES document defining the standard for instruction creation.
- Enforce best practices for instruction implementation across onchain programs
- Add missing system program account owner checks in multiple instructions
- Refactor codebase for improved maintainability and future development
- Introduced health management for Devices and Links, adding explicit health states, authorized health updates, and related state, processor, and test enhancements.
- Require that BanUser can only be executed when the target user's status is PendingBan, enforcing the expected user ban workflow (request-ban -> ban).
- Introduce desired status to Link and Devices
- Introduced health management for Devices and Links, adding explicit health states, authorized health updates, and related state, processor, and test enhancements.
- Restrict DeleteDeviceInterface to interfaces in Activated or Unlinked status; attempting to delete interfaces in other statuses now fails with InvalidStatus.
- Updated validation to allow public IP prefixes for CYOA/DIA, removing the restriction imposed by type-based checks.
- Transit devices can now be provisioned without a public IP, aligning the requirements with their actual networking model and avoiding unnecessary configuration constraints.
- Enforce that ActivateDeviceInterface only activates interfaces in Pending or Unlinked status, returning InvalidStatus for all other interface states
- Introduce desired status to Link and Devices
- Internet Latency Telemetry
- Fixed a bug that prevented unresponsive ripeatlas probes from being replaced
- Fixed a bug that caused ripeatlas samples to be dropped when they were delayed to the next collection cycle
- Link & device Latency Telemetry
- Telemetry data can now be received while entities are in provisioning and draining states.
- Device controller
- Add histogram metric for GetConfig request duration
- Add gRPC middleware for prometheus metrics
- Add device status label to controller_grpc_getconfig_requests_total metric
- Add logic to shutdown user BGP, IBGP sessions, MSDP neighbors, and ISIS when device.status is drained
- Device agents
- Increase default controller request timeout in config agent
- Initial state collect in telemetry agent
- Client
- Route liveness treats peers that advertise passive mode as selectively passive; does not manage their routes directly.
- Route liveness runs in passive mode for IBRL with allocated IP, if global passive mode is enabled.
- Advertise peer client version with route liveness control packets.
- Add
doublezero_bgp_routes_installedgauge metric for number of installed BGP routes - Add route liveness gauges for in-memory maps
- Route liveness sets set of routes configured as excluded to
AdminDown. - Add histogram metric for BGP session establishment duration
- For IBRL with allocated IP mode, resolve tunnel source IP from routing table via resolve-route API endpoint instead of using client IP to support clients behind NAT
- Configure MTU down to 1476 on client tunnel in case path MTU discovery is not working
- Increase route liveness max backoff duration
- Global monitor
- Initial implementation
- Release
- Publish a Docker image for core components.
- Telemetry
- Refactor flow enricher
- Add metrics to flow enricher
- Add serviceability data fetching to flow enricher
- Add flow-ingest service
- Add annotation of flow records with serviceability data
- Add pcap input and json ouput to flow enricher
- Initial state-ingest service with client SDK
- Collect BGP socket state from devices
- CI
- Cancel existing e2e test runs on the push of new commits
- RFCs
- RFC - Network Provisioning
- RFC-11: Onchain Activation (#2302)
- Monitor
- Add link status to device-telemetry metrics to enable Grafana alerts to filter out links that are not in activated status
- Add validation for 2Z oracle swapRate to ensure it is an unsigned integer, with warning logs and metrics for malformed values
- E2E tests
- Add GetLatency call to qaagent
- The QA alldevices test now considers device location and connects hosts to nearby devices
- QA agent and tests now support doublezero connect ibrl's --allocate-addr flag
- The QA alldevices test now publishes success/failure metrics to InfluxDB in support of rfc12
- Onchain programs
- Fix CreateMulticastGroup to use incremented globalstate.account_index for PDA derivation instead of client-provided index, to ensure the contract is the authoritative source for account indices
- ReactivateMulticastGroup now enforces that the multicast group status must be Suspended before reactivation, returning InvalidStatus otherwise; negative-path regression tests were added.
v0.8.0 – 2025-12-02
- None for this release
- RFCs
- RFC-10: Version Compatibility Windows
- CLI
- IP address lookups via ifconfig.me are retried up to 3 times to minimize transient network errors.
- Added global
--no-version-warningflag to thedoublezeroclient and now emit version warnings to STDERR instead of STDOUT to improve scriptability and logging. - Add the ability to update a Device’s location, managing the reference counters accordingly.
- Added support in the link update command to set a link’s status to soft_drained or hard_drained.
- Added support for specifying
device_typeat creation, updating it via device update, and displaying it in list/detail outputs. - Add support for updating
contributor.ops_manager_key. - Add migrate command to upgrade legacy user accounts from index-based PDAs to the new IP + connection-type scheme.
- Enhance
access-pass listwith client-IP and user-payer filters - Support added to load keypair from stdin
- Client
- Add route liveness fault-injection simulation tests.
- Updated the
interface listcommand to display all interfaces when no device is specified.
- Funder
- Fund multicast group owners
- Onchain programs
- Serviceability Program: Updated the device update command to allow modifying a device’s location.
- Added new
soft-drainedandhard-drainedlink status values to serviceability to support traffic offloading as defined in RFC9. - Fix ProgramConfig resize during global state initialization.
- Standardized the
device_typeenum toEdge,Transit, andHybrid, added validation rules, and defaulted existing devices toHybridfor backward compatibility. - Add
contributor.ops_manager_keyfor authorizing incident management operations. - User Account: Replace global-index PDA generation with deterministic IP + connection-type seeds, eliminating user-creation race conditions.
- Enable on-chain storage of InterfaceV2, allowing devices to register updated interface metadata
- Serviceability: validate that a device's public IP doesn't clash with its dz_prefixes
- QA
- Traceroute when packet loss is detected
- Tools
- Add
solana-tpu-quic-pingtool for testing Solana TPU-QUIC connections with stats emitted periodically
- Add
- Device controller
- Handle new link.status values (soft-drained and hard-drained) as per RFC9
- Monitor
- Export links data to InfluxDB
- Activator
- Uses asynchronous coroutines instead of blocking operations and threads.
v0.7.1 – 2025-11-18
- None for this release
- RFCs
- RFC9 Link Draining
- Client
- Switch to 64 byte latency probes instead of 32 bytes
- Route liveness admin-down signalling and ignore stale remote-down messages
- Added an on-chain minimum supported CLI version to allow multiple CLI versions to operate simultaneously.
- Smart contract
- Delay V2 Interface Activation Until All Clients Support V2 Reading
- Device controller
- Now accepts the config agent's version in the grpc GetConfig call and includes it as a label in the controller_grpc_getconfig_requests_total metric
- Device Agent
- Now sends its version to the controller in the grpc GetConfig call
v0.7.0 – 2025-11-14
- Smart contract
- Introduces CYOA and DIA as new possible interface types
- Onchain programs
- Check if
accesspass.owneris equal to system program (malbeclabs/doublezero#2088)
- Check if
- CLI
- Added support for specifying the interface type during interface creation and modification, introducing CYOA and DIA as new possible interface types.
- Improve error message when connecting to a device that is at capacity or has max_users=0. Users now receive "Device is not accepting more users (at capacity or max_users=0)" instead of the confusing "Device not found" error when explicitly specifying an ineligible device.
- Add
link latencycommand to display latency statistics from the telemetry program. Supports filtering by percentile (p50, p90, p95, p99, mean, min, max, stddev, all), querying by link code or all links, and filtering by epoch. Resolves: #1942 - Added
--contributor | -cfilter todevice list,interface list, andlink listcommands. (#1274) - Validate AccessPass before client connection (#1356)
- Client
- Add initial route liveness probing, initially disabled for rollout
- Add route liveness prometheus metrics
v0.6.11 – 2025-11-13
- None for this release
- Note that the changes from this release have been bundled into 0.7.0
v0.6.10 – 2025-11-05
- None for this release
- CI
- Add automated compatibility tests in CI to validate all actual testnet and mainnet state against the current codebase, ensuring backward compatibility across protocol versions.
- Add
--delay-override-msoption todoublezero link update - Add ability to configure excluded routes
- Device controller
- Remove the deprecated -enable-interfaces-and-peers flag
- Use link.delay_override to set isis metric when in valid range. This provides a simple workflow for contributors to temporarily change a link's delay value without overwriting the existing value.
- Onchain programs
- serviceability: add delay_override_ns field to link
v0.6.9 – 2025-10-24
- None for this release
- Onchain programs
- serviceability: add auto-assignment and validation for exchange.bgp_community
- serviceability: prevent device interface name duplication
- Update serviceability and telemetry program instruction args to use the
BorshDeserializeIncrementalderive macro incremental, backward-compatible, deserialization of structs. - Add explicit signer checks for payer accounts across various processors to improve security and ensure correct transaction authorization.
- CLI
- Removed
--bgp-communityoption fromdoublezero exchange createsince these values are now assigned automatically - Add
--next-bgp-communityoption todoublezero global-config setso authorized users can control which bgp_community will be assigned next
- Removed
- Tools
- TWAMP: Verify that the sequence number and timestamp of the received packet matches those of the sent packet
- Uping: Add minimal ICMP echo library for user-space liveness probing over doublezero interfaces, even when certain routes are not in the the kernel routing table.
- Device controller
- Deprecate the -enable-interfaces-and-peers flag. The controller now always renders interfaces and peers
- Intra-exchange routing policy, which uses the onchain exchange.bgp_community value to route traffic between users in the local exchange over the internet
- Monitor
- Add metrics that detect when duplicate or out-of-range exchange.bgp_community values exist in serviceability
v0.6.8 – 2025-10-17
- Multicast group change: Regeneration of all multicast group allowlists required, as allowlists are now stored within each Access Pass instead of at the multicast group level.
- Onchain programs
- Serviceability: enforce that ActivateLink and CloseAccountLink instructions verify the provided side A/Z device accounts match the link's stored
side_a_pkandside_z_pkbefore proceeding.
- Serviceability: enforce that ActivateLink and CloseAccountLink instructions verify the provided side A/Z device accounts match the link's stored
- CLI
- Added a wait in the
disconnectcommand to ensure the account is fully closed before returning, preventing failures during rapid disconnect/reconnect sequences. - Display multicast group memberships (publisher/subscriber) in AccessPass listings to improve visibility.
- Allow AccessPass creation without 'client_ip'
- Add 'allow_multiple_ip' argument to support AccessPass connections from multiple IPs
- Include validator pubkey in
exportoutput - Rename exchange.loc_id to exchange.bgp_community
statuscommand now shows connected and lowest latency DZD
- Added a wait in the
- Activator
- Reduce logging noise when processing snapshot events
- Wrap main select handler in loop to avoid shutdown on branch error
- Onchain programs
- Remove user-level allowlist management from CLI and admin interfaces; manage multicast group allowlists through AccessPass.
- Add Validate trait for core types (AccessPass, Contributor, Interface, etc.) and enforce runtime checks before account operations.
- Fix: resize AccessPass account before serialization to prevent errors; standardized use of resize_account_if_needed across processors.
- Enable AccessPass with 'client_ip=0.0.0.0' to dynamically learn the user’s IP on first connection
- Enable AccessPass to support connections from multiple IPs (allowlist compatibility)
- Rename exchange.loc_id to exchange.bgp_community, and change it from u32 to u16
- Internet telemetry
- Add circuit label to metrics; create a new metric for missing circuit samples
- Create a new metric that tracks how long it takes collector tasks to run
- Submit partitions of samples in parallel
- Include circuit label on submitter error metric
- Monitor
- Reduce logging noise in 2z oracle watcher
- Include response body on 2z oracle errors
- Collect contributors and exchanges into InfluxDB
- Device controller
- When a device is missing required loopback interfaces, provide detailed errors to agent instead of " not found". Also, log these conditions as warnings instead of errors, and don't emit "unknown pubkey requested" error metrics for these conditions
- Add device info as labels to
controller_grpc_getconfig_requests_totalmetric
- Device agents
- Submit device-link telemetry partitions in parallel
- CLI
- Allow AccessPass creation without 'client_ip'
- Add 'allow_multiple_ip' argument to support AccessPass connections from multiple IPs
- Rename exchange.loc_id to exchange.bgp_community
- Onchain programs
- Enable AccessPass with 'client_ip=0.0.0.0' to dynamically learn the user’s IP on first connection
- Enable AccessPass to support connections from multiple IPs (allowlist compatibility)
- Rename exchange.loc_id to exchange.bgp_community, and change it from u32 to u16
- Telemetry data API
- Filter by contributor and link type
- SDK/Go
- String serialization for exchanges status
- Exclude empty tags from influx serialization
v0.6.6 – 2025-09-26
- None for this release
- Monitor
- Update 2Z oracle to emit response code metrics on errors too
- Activator
- A mitigation was added to handle situations where blockchain updates are missed by the Activator due to timeouts on the websocket. This mitigation processes pending accounts on a 1-minute timer interval.
- CLI
- Connect command updated to provide better user experience with regard to activator websocket timeouts (see above).
v0.6.5 – 2025-09-25
- None for this release
- CLI
- Connect now waits for doublezerod to get all latencies
- Latency command sorts unreachable to bottom
- Device controller
- Update device template to set default BGP timers and admin distance
- Update device template so all "default interface TunnelXXX" commands for user tunnels come before any other user tunnel config
- Activator
- Fix access pass check status accounts list
- Onchain programs
- Implemented strict validation to ensure that only AccessPass accounts owned by the program and of the correct type can be closed.
- Fix Access Pass set Instruction.
- Switched to using
account_closehelper for closing accounts instead of resizing and serializing. - Make interface name comparison case insensitive
- Onchain monitor
- Check for unlinked interfaces in a link
- Emit user events
- Add watcher for 2Z/SOL swap oracle
v0.6.4 – 2025-09-10
- None for this release
- Onchain programs
- Fix bug preventing re-opening of AccessPass after closure
- sc/svc: guard against empty account data
- Device controller
- Support server dual listening on TLS and non-TLS ports
- Device and Internet Latency Telemetry
- Create one ripeatlas measurement per exchange instead of per exchange pair to avoid concurrent measurement limit
v0.6.3 – 2025-09-08
- None for this release
- Onchain programs
- Expand DoubleZeroError with granular variants (invalid IPs, ASN, MTU, VLAN, etc.) and derive PartialEq for easier testing.
- Rename Config account type to GlobalConfig for clarity and consistency.
- Fix bug in user update that caused DZ IP to be 0.0.0.0
- Add more descriptive error logging
- Telemetry program: embed serviceability program ID via build feature instead of env variable
- Activator
- Support for interface IP reclamation
- Devices are now initialized with max_users = 0 by default.
- Devices with max_users = 0 cannot accept user connections until updated.
- Onchain monitor
- Emit metric for telemetry account not found in device and internet telemetry watchers
- Emit metric with serviceability program onchain version
- Delete telemetry counter metrics if circuit was deleted
- Telemetry
- Fix dashboard API to handle partitioned query with no samples
- Add summary view with committed RTT and jitter, compared to measured values
- Device agents
- Remove log of keypair path on telemetry agent start up
- Drop device telemetry samples if submission attempts exhausted and buffer is at capacity
- Device controller
- Each environment can now have a different device BGP Autonomous System Number (ASN) per environment. (This is the remote ASN from the client's perspective.)
- Add flag for enabling pprof for runtime profiling
- E2E tests
- Updated unit tests and e2e tests to validate the new initialization and activation flow.
- Contributor Operations
- Contributors must explicitly run device update to set a valid max_users and activate a Device.
v0.6.2 – 2025-09-02
- None for this release
- Onchain programs
- Fix: Serviceability now correctly enforces device.max_users
- Fix: Restored the
validator_pubkeyfield from AccessPass. This field had been removed in the previous version but is required by Sentinel. - Fix: Skip client version check in
statuscommand to prevent version errors during automated state checks. - New instructions were added to support device interface create/update/delete that prevents a race condition that could cause some updates to be lost when changes were made in quick succession.
- Add deserialization vector with capacity + 1 to avoid
memory allocation failed, out of memoryerror
- CLI
- Added filtering options to
access-pass listanduser listCLI commands. - New filters include access pass type (
prepaidorsolana-validator) and Solana identity public key. - Updated command arguments and logic, with tests adjusted to cover new options.
- Contributors: Interface creation no longer takes an "interface type (physical/loopback)" argument. The type is now inferred from the interface name.
- Added filtering options to
- Device controller
- Use serviceability onchain delay for link metrics
v0.6.0 – 2025-08-28
- Onchain programs
- Implement access pass management commands and global state authority updates
- Update access pass PDA function to include payer parameter
- Onchain programs
- Introducing new link instruction processor acceptance criteria
- Add support for custom deserializers and add for pubkey fields
- Move serialization and network_v4 to program-common
- Refactor account type assertions in processors and state modules in serviceability program
- Add validator identity to
SolanaValidatortype AccessPass.
- User client
- Add access pass management commands to CLI
- Restructuring device and global config CLI commands for better authority and interface management
- Enhance the handling and display of access pass epoch information in the CLI
- Configure CLI network settings with shorthand network code. Usage:
doublezero config set --env <testnet|mainnet-beta> - Configure
doublezerodnetwork settings with shorthand network code. Usagedoublezerod --env <testnet|mainnet-beta> - Add associated AccessPass to user commands.
- Activator
- Introduce new user monitoring thread in activator for access pass functionality
- Remove validator verification via gossip. This functionality is migrated to AccessPass.
- Device controller
- Implement user tunnel ACLs in device agent configuration
- Add "mpls icmp ttl-exceeded tunneling" config statement so intermediate hops in the doublezero network respond to traceroutes.
- Set protocol timers for ibgp and isis to improve to speed up network re-convergence
- Add TLS support to gRPC server
- Onchain monitor
- Initial implementation and component release
- Monitor onchain device telemetry metrics
- Monitor onchain internet latency metrics
- E2E tests
- Simplify fixtures with loop rollups
- Add user ban workflow test
- Deflake user reconnect race and device interface assigned IP race
- Add single device stress test
- Adjust user validation commands to use the new AccessPass column.
- CLI
- Refactor: Updated
SetAccessPassCliCommand(doublezero access-pass set) to use--epochsinstead of--last_access_epoch, with sensible default values. - AccessPass now requires passing the validator identity for the
SolanaValidatortype.
- Refactor: Updated
- Device Agents
- Periodically recreate telemetry agent sender instances in case of interface reconfiguration.
- Telemetry
- Optimize onchain data dashboard API responses with field filtering
- Optimize onchain data data CLI execution with parallel queries
- Dashboard API support for circuit set partitioning using query parameters
v0.5.3 – 2025-08-19
- CLI & UX Improvements
- Improve sorting of device, exchange, link, location, and user displays
- New installation package for the admin CLI for contributors based on controller/doublezero-admin
- Do not allow users to connect to a device with zero available tunnel slots remaining
- Improve handling of interface names for
doublezero device interfacecommands
- Serviceability Model Improvements
- funder: configure recipients as flag
- sdk/rs: add record program handling
- config: use ledger RPC LB endpoint
- Validate account codes and replace whitespace
- config: add ability to override DZ ledger RPC url; update URLs
- Remove old CloseAccount instruction from both the smart contract and SDK client code
- Network Controller Improvements
- Increase user tunnel slots per device from 64 to 128
- Add flag controlling whether interfaces and peers are rendered to assist with testnet migration
- Device and Internet Latency Telemetry
- Internet latency samples in data CLI and dashboard API
- internet-latency-collector, telemetry data api/cli: collect internet latency between exchanges, not locations
- internet-latency-collector: add ripeatlas credit metric
- End-to-End Tooling
- New doublezero QA agent improves quality by thoroughly testing the software stack end-to-end in each doublezero environment (devnet, testnet, mainnet-beta) after each release.
v0.5.0 – 2025-08-11
- CLI & UX Improvements
doublezero connectnow waits for the user account to be visible onchain.doublezero device interfacecommands. Interface names get normalized.- General improved consistency
- Easy switching between devnet and testnet using the
--envflag
- Device Latency Telemetry
- Data CLI and API use epoch from ledger
- Backpressure support to avoid continual buffer growth in error conditions
- Link pubkey used for circuit uniqueness
- Internet Latency Telemetry
- Adds the environement (devnet/testnet/mainnet-beta) to the ripeatlas measurement description.
- Now funded by the funder
- Serviceability Model Improvements
- Device extended to add DZD metadata (including Interfaces)
- DZX Link types added (clearly distinguished from WAN links)
- Removed foundation allowlist check, streamlining
linkworkflow - Validate that
link.account_typehas typeAccountType::Link
- Network Controller Improvements
- doublezero-controller now manages more of the DZD configuration, including:
- DNS servers
- NTP servers
- DZ WAN interfaces
- Necessary loopback interfaces
- BGP neighbor configuration
- MSDP configuration
- doublezero-activator now assigns IP addresses for use by the controller to give to DZD wan interfaces as well as loopbacks.
- doublezero-controller now manages more of the DZD configuration, including:
v0.4.0 – 2025-08-04
This release adds contributor ownership, reference counting, and improved CLI outputs for devices and links. It introduces internet latency telemetry, with support for collection, Prometheus metrics, and writing samples to the ledger. Device telemetry now uses ledger epochs for network-wide consistency.
- Serviceability Model Improvements
- Contributor creation includes an
ownerfield; device/link registration enforces contributor consistency - Contributor field shown in CLI
listandgetcommands for devices and links reference_countadded to contributors, devices, locations, and exchanges- New fields added to
DeviceandLink, including aninterfacesarray forDevice - Go SDK updated to support new DZD metadata account layouts
- Contributor creation includes an
- CLI & UX Improvements
- Provisioning (
connect,decommission) UX improved: clearer feedback, better spinners, and more accurate status messages doublezero latencyoutput includes device code alongside pubkeydoublezero deviceanddoublezero linkcommands updated to show new metadata fields- Added
doublezero device interfacesubcommands for managing interfaces keygencommand now supports--outfile(-o) flag to generate keys directly to a file
- Provisioning (
- Device Latency Telemetry
- Agent now uses ledger epoch instead of wallclock-based epoching
- Account layout updated to move
epochafter discriminator for efficient filtering
- Internet Latency Telemetry
- Internet latency collectors write samples to the ledger using epoch-based partitioning
- Telemetry program supports ingesting external control-plane latency samples
- Prometheus metrics expose collector operation, failure rates, and credit balances
- Go SDK support for initializing and submitting latency samples
- End-to-End Tooling
- Multicast monitor utility added for provisioning validation
- Multi-client e2e tests cover IBRL with and without IP allocation
v0.3.0 - 2025-07-28
This release introduces network contributor registration, device interface management, and the initial telemetry system for link latency. Prometheus metrics were added to the activator and client for observability. Provisioning flows now enforce contributor presence and IP uniqueness per user.
- Contributor Support
- Added CLI support for contributor management via
doublezero contributor - Used to register network contributors in the DoubleZero system
- Added CLI support for contributor management via
- Device Interface Management
- Added device interface CRUD commands for managing interfaces on a device
- Interface metadata will be used by the controller to generate device configuration
- Link Telemetry System
- Introduced TWAMP-based telemetry agent and onchain program for measuring RTT and packet loss between devices
- Lays the foundation for performance-based rewards for bandwidth contributors
- Prometheus Metrics
- Activator and client now export Prometheus metrics (build info, BGP session status)
- Provisioning & Decommissioning
- Enforced one tunnel per user per IP address
- Contributor field now required when creating devices and links
- Activator
- Improved metrics and error handling
- Added graceful shutdown and signal handling
- Client
- Added
-jsonoutput flag forstatusandlatencycommands
- Added