{
  "schema_version": "sg_data_download_metadata.v1",
  "id": "sg-node-software",
  "name": "Node software on reachable nodes",
  "description": "Every peer in KIT’s network snapshot, by the software it announces.",
  "page": "https://satoshigazette.org/data/network/nodes",
  "dictionary": "https://satoshigazette.org/data/dictionary#sg-node-software",
  "version": "1.1.0",
  "latest": {
    "date": "2026-09-30T12:13:29Z",
    "block_height": null
  },
  "snapshot": "KIT snapshot of 30 Sep 2026",
  "licence": {
    "name": "CC BY 4.0",
    "title": "Creative Commons Attribution 4.0 International",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "covers": "Satoshi Gazette’s compilation, selection and annotations in the files offered for download.",
    "upstream": "Upstream records keep their own terms, stated per dataset. The Gazette’s articles stay under copyright."
  },
  "cite": "Satoshi Gazette Data Desk, Node software on reachable nodes (sg-node-software), version 1.1.0, data through 30 Sep 2026. https://satoshigazette.org/data/downloads/sg-node-software.json",
  "sources": [
    {
      "label": "KIT network monitor data",
      "url": "https://www.dsn.kastel.kit.edu/bitcoin/data.html"
    },
    {
      "label": "Dataset, doi:10.5281/zenodo.14627525",
      "url": "https://doi.org/10.5281/zenodo.14627525"
    }
  ],
  "source_terms": "KIT’s snapshots are licensed CC BY 4.0; cited as Neudecker, Till; Grundmann, Matthias; Hartenstein, Hannes. Bitcoin Peer-To-Peer Network Monitoring. Zenodo. doi:10.5281/zenodo.14627525. The desk reduces per-peer records to daily counts and republishes no per-peer data.",
  "files": {
    "json": {
      "url": "https://satoshigazette.org/data/downloads/sg-node-software.json",
      "media_type": "application/json",
      "bytes": 10074,
      "sha256": "101b3a0812424abf62b67c4ea29ab56bc7a60f6355378a1fe67b18c7c3efc53b"
    },
    "csv": {
      "url": "https://satoshigazette.org/data/downloads/sg-node-software.csv",
      "media_type": "text/csv",
      "bytes": 1636,
      "sha256": "5e3edc8bc92eea4031e4390d2aa514f65cd3b66c4bde3adaa6ea211dfcbc93b2",
      "row_is": "One row per KIT snapshot day recorded. Core peers by release line vary by day and are in the JSON only.",
      "columns": [
        {
          "name": "day",
          "note": "The snapshot’s UTC date."
        },
        {
          "name": "snapshot",
          "note": "KIT’s name for the snapshot file, its time in UTC."
        },
        {
          "name": "snapshot_at",
          "note": "The same time as an ISO 8601 timestamp."
        },
        {
          "name": "clock_offset_minutes",
          "note": "Minutes KIT’s lastConnect clock ran ahead of UTC, derived from the file."
        },
        {
          "name": "lifecycle_as_of",
          "note": "The day of the Core lifecycle table the row was classified with."
        },
        {
          "name": "sha256",
          "note": "sha256 of KIT’s snapshot file as served."
        },
        {
          "name": "possible_cap",
          "note": "true when the snapshot held exactly 9,000 peers, which may be a cap on KIT’s file."
        },
        {
          "name": "connected_nodes",
          "note": "All connected peers: peers counted."
        },
        {
          "name": "connected_ipv4",
          "note": "All connected peers: reached over IPv4."
        },
        {
          "name": "connected_ipv6",
          "note": "All connected peers: reached over IPv6."
        },
        {
          "name": "connected_ip_unknown",
          "note": "All connected peers: IP version not recorded."
        },
        {
          "name": "connected_core",
          "note": "All connected peers: user agent sorted as core by the rules in the JSON."
        },
        {
          "name": "connected_knots",
          "note": "All connected peers: user agent sorted as knots by the rules in the JSON."
        },
        {
          "name": "connected_btcd",
          "note": "All connected peers: user agent sorted as btcd by the rules in the JSON."
        },
        {
          "name": "connected_other",
          "note": "All connected peers: user agent sorted as other by the rules in the JSON."
        },
        {
          "name": "connected_unknown",
          "note": "All connected peers: user agent sorted as unknown by the rules in the JSON."
        },
        {
          "name": "connected_core_maintained",
          "note": "All connected peers: Core peers on a release line that was maintained on the snapshot day."
        },
        {
          "name": "connected_core_end_of_life",
          "note": "All connected peers: Core peers on a release line that was end of life on the snapshot day."
        },
        {
          "name": "connected_core_unreleased",
          "note": "All connected peers: Core peers on a release line not yet released on the snapshot day, or on an x.99 development build."
        },
        {
          "name": "connected_core_not_listed",
          "note": "All connected peers: Core peers on a release line the life cycle table does not carry, or announcing a version that does not parse."
        },
        {
          "name": "opened_24h_nodes",
          "note": "Peers whose connection began within 24 hours: peers counted."
        },
        {
          "name": "opened_24h_ipv4",
          "note": "Peers whose connection began within 24 hours: reached over IPv4."
        },
        {
          "name": "opened_24h_ipv6",
          "note": "Peers whose connection began within 24 hours: reached over IPv6."
        },
        {
          "name": "opened_24h_ip_unknown",
          "note": "Peers whose connection began within 24 hours: IP version not recorded."
        },
        {
          "name": "opened_24h_core",
          "note": "Peers whose connection began within 24 hours: user agent sorted as core by the rules in the JSON."
        },
        {
          "name": "opened_24h_knots",
          "note": "Peers whose connection began within 24 hours: user agent sorted as knots by the rules in the JSON."
        },
        {
          "name": "opened_24h_btcd",
          "note": "Peers whose connection began within 24 hours: user agent sorted as btcd by the rules in the JSON."
        },
        {
          "name": "opened_24h_other",
          "note": "Peers whose connection began within 24 hours: user agent sorted as other by the rules in the JSON."
        },
        {
          "name": "opened_24h_unknown",
          "note": "Peers whose connection began within 24 hours: user agent sorted as unknown by the rules in the JSON."
        },
        {
          "name": "opened_24h_core_maintained",
          "note": "Peers whose connection began within 24 hours: Core peers on a release line that was maintained on the snapshot day."
        },
        {
          "name": "opened_24h_core_end_of_life",
          "note": "Peers whose connection began within 24 hours: Core peers on a release line that was end of life on the snapshot day."
        },
        {
          "name": "opened_24h_core_unreleased",
          "note": "Peers whose connection began within 24 hours: Core peers on a release line not yet released on the snapshot day, or on an x.99 development build."
        },
        {
          "name": "opened_24h_core_not_listed",
          "note": "Peers whose connection began within 24 hours: Core peers on a release line the life cycle table does not carry, or announcing a version that does not parse."
        },
        {
          "name": "flags_connected_blake2b_only",
          "note": "All connected peers announcing the BLAKE2b flag only; empty when the split was not counted."
        },
        {
          "name": "flags_connected_reduced_data_only",
          "note": "All connected peers announcing the reduced-data flag only; empty when the split was not counted."
        },
        {
          "name": "flags_connected_both",
          "note": "All connected peers announcing both flags; empty when the split was not counted."
        },
        {
          "name": "flags_connected_neither",
          "note": "All connected peers announcing neither flag; empty when the split was not counted."
        },
        {
          "name": "flags_connected_unknown",
          "note": "All connected peers whose services number was missing or unreadable: unknown, never neither; empty when the split was not counted."
        },
        {
          "name": "flags_knots_blake2b_only",
          "note": "Knots peers announcing the BLAKE2b flag only; empty when the split was not counted."
        },
        {
          "name": "flags_knots_reduced_data_only",
          "note": "Knots peers announcing the reduced-data flag only; empty when the split was not counted."
        },
        {
          "name": "flags_knots_both",
          "note": "Knots peers announcing both flags; empty when the split was not counted."
        },
        {
          "name": "flags_knots_neither",
          "note": "Knots peers announcing neither flag; empty when the split was not counted."
        },
        {
          "name": "flags_knots_unknown",
          "note": "Knots peers whose services number was missing or unreadable: unknown, never neither; empty when the split was not counted."
        }
      ]
    }
  },
  "csv_absent": null,
  "notes": [
    "Derived from KIT’s snapshots, licensed CC BY 4.0, which asks for its own attribution: Neudecker, Till; Grundmann, Matthias; Hartenstein, Hannes. Bitcoin Peer-To-Peer Network Monitoring. Zenodo. doi:10.5281/zenodo.14627525."
  ]
}
