# Changelog
All notable changes to Net::BitTorrent::DHT will probably be documented in this file.
## [v2.0.6] - 2026-02-04
### Added
- Added `node_id_rotation_interval` parameter to constructor (default: 2 hours).
- Added high-level `announce_infohash($ih, $port)` method which simplifies the multi-step `get_peers` and `announce_peer` process.
- Added `export_state()` and `import_state()` methods to facilitate DHT routing table persistence across sessions.
- Added `validate_node_id()` method to `Net::BitTorrent::DHT::Security` for BEP 42 compliance.
## [v2.0.5] - 2026-01-30
### Added
- New `routing_table_stats()` method to visualize bucketed routing table distribution.
- New `eg/full_search.pl` example demonstrating a complete iterative Kademlia search.
- New `eg/distributed_blob.pl` example demonstrating storing, changing, and then accessing a large file split into fragments across the public DHT.
- New `eg/bep44_remote_storage.pl` example for simple remote data persistence.
- Implemented robust Transaction ID (TID) management to correctly match responses to pending queries.
- Added support for the `cas` (Compare-and-Swap) field in BEP 44 `put` requests.
### Improved
- Clarified `find_peers()`, `scrape()`, and `sample()` behavior in documentation as single-step lookups.
- BEP 44 signature generation now strictly follows the alphabetical bencoded field order required by the spec.
### Fixed
- Fixed `node_id_bin` to default to a random 20-byte ID as per documentation.
- Fixed `_unpack_peers()` to correctly handle mixed IPv4/IPv6 peer lists and non-standard packed blobs.
- Fixed potential crashes in `get_peers`, `announce_peer`, `scrape_peers`, `get`, and `put` handlers by properly checking for existing storage objects.
- Fixed token misassignment in BEP 44 `put` operations by tracking queried targets via Transaction IDs.
- Fixed regressions in BEP 33 (Scrape) and BEP 51 (Sample) handling caused by the transition to dynamic TIDs.
## [v2.0.4] - 2026-01-28
### Added
- Support for the `external_ip_detected` event.
- Automatic `node_id` rotation when a new external IP is detected (requires BEP 42).
### Fixed
- Improved `node_id` rotation logic to update both IPv4 and IPv6 routing tables.
- Fixed a crash in `_check_external_ip` when receiving full compact addresses (including ports).
## [v2.0.3] - 2026-01-27
### Changed
- Expose readers for `want_v4` and `want_v6`.
## [v2.0.2] - 2026-01-27
### Fixed
- Peers that attempt to update mutable data with an invalid signature (BEP 44) are now automatically blacklisted and ignored for the duration of the session.
## [v2.0.1] - 2026-01-27
### Added
- Client Identification support (the 'v' key) via the `v` constructor parameter.
- Support for the 'ip' field in responses (BEP 5), allowing remote nodes to discover their external IP.
- Support for the 'want' key in queries (BEP 32) to return specific node families.
- BEP 51 exposure with new `find_peers()`, `scrape()`, and `sample()` methods.
### Changed
- The `sample_infohashes` feature (BEP 51) can now be toggled via the `bep51` parameter.
## [v2.0.0] - 2026-01-26
This is a total rewrite. I was breaking apart the Kademlia stuff into smaller pieces for a larger, non-BitTorrent related project so I spent a day on this...
### Added
- Pulled out of Net::BitTorrent::DHT for use in other DHTs.
- Supports...
- BEP05: Core DHT spec
- BEP32: IPv6
- BEP33: DHT scrape
- BEP42: Secure DHT
- BEP43: Readonly DHT node
- BEP44: Arbitrary mutable/immutable data storage in the DHT network (very nice)
- BEP51: Infohash indexing
## [v1.0.3] 2014-11-29
### Changed
- Declare Type::Standard dependency
## [v1.0.2] 2014-06-26
### Changed
- Serve as a standalone node by default
- Update to NB::Protocol v1.0.2 and above
## [v1.0.1] 2014-06-21
### Changed
- Generate local node id based on external IP (work in progress)
- Use a condvar in address resolver instead of forcing the event loop
## [v1.0.0] 2014-06-21
- original version (broken from unstable Net::BitTorrent dist)
[Unreleased]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.6...HEAD
[v2.0.6]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.5...v2.0.6
[v2.0.5]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.4...v2.0.5
[v2.0.4]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.3...v2.0.4
[v2.0.3]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.2...v2.0.3
[v2.0.2]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.1...v2.0.2
[v2.0.1]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v2.0.0...v2.0.1
[v2.0.0]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v1.0.3...v2.0.0
[v1.0.3]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v1.0.2...v1.0.3
[v1.0.2]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v1.0.1...v1.0.2
[v1.0.1]: https://github.com/sanko/Net-BitTorrent-DHT.pm/compare/v1.0.0...v1.0.1
[v1.0.0]: https://github.com/sanko/Net-BitTorrent-DHT.pm/releases/tag/v1.0.0