This milestone release includes a large number of bug fixes, changes and additions covering all aspects of the daemon. Notable improvements include:
* Faster and more reliable downloading and uploading of content resulting from substantial work done on the Distributed Hash Table algorithms and protocol.
* Faster blockchain synchronization (headers) by downloading them from Amazon S3 under certain conditions.
* Faster overall app startup due to better optimized SQL queries.
* Power users of the `lbrynet-cli` will benefit from many bug fixes to commonly used commands and improvements in sorting of output.
* Please review the full change log for more details on specific fixes, changes and additions.
* handling error from dht clients with old `ping` method
* blobs not being re-announced if no peers successfully stored, now failed announcements are re-queued
* issue where an `AuthAPIClient` (used by `lbrynet-cli`) would fail to update its session secret and keep making new auth sessions, with every other request failing
*`use_auth_http` in a config file being overridden by the default command line argument to `lbrynet-daemon`, now the command line value will only override the config file value if it is provided
*`lbrynet-cli` not automatically switching to the authenticated client if the server is detected to be using authentication. This resulted in `lbrynet-cli` failing to run when `lbrynet-daemon` was run with the `--http-auth` flag
* fixed error when using `claim_show` with `txid` and `nout` arguments
* fixed error when saving server list to conf file ([1209](https://github.com/lbryio/lbry/pull/1209))
### Changed
* if the `use_authentication` setting is configured, use authentication for all api methods instead of only those with the `auth_required` decorator
* regenerate api keys on startup if the using authentication
* support both positional and keyword args for api calls
*`blob_announce` to queue the blob announcement but not block on it
*`peer_list` to return a list of dictionaries instead of a list of lists, added peer node ids to the results
* predictable result sorting for `claim_list` and `claim_list_mine` ([1216](https://github.com/lbryio/lbry/pull/1216) and [1208](https://github.com/lbryio/lbry/pull/1208))
* increase the default `auto_re_reflect_interval` setting to a day and the default `concurrent_announcers` setting to 10
* download blockchain headers from s3 before starting the wallet when the local height is more than `s3_headers_depth` (a config setting) blocks behind ([1177](https://github.com/lbryio/lbry/pull/1177))
* check headers file integrity on startup, removing/truncating the file to force re-download when necessary
* support partial headers file download from S3 ([1189](https://github.com/lbryio/lbry/pull/1189))
* refactor `add_completed_blobs` on storage.py, simplifying into less queries ([1226](https://github.com/lbryio/lbry/pull/1226))
* full verification of streams only during database migration instead of every startup ([1195](https://github.com/lbryio/lbry/pull/1195))
* database batching functions for starting up the file manager
* added `single_announce` and `last_announced_time` columns to the `blob` table in sqlite
* track successful reflector uploads in sqlite to minimize how many streams are attempted by auto re-reflect ([1194](https://github.com/lbryio/lbry/pull/1194))
* pass the sd hash to reflector ClientFactory instead of looking it up from the database
* dht logging to be more verbose with errors and warnings
*`store` kademlia rpc method to block on the call finishing and to return storing peer information
* kademlia protocol to minimally delay writes to the UDP socket
* several internal dht functions to use inlineCallbacks
*`DHTHashAnnouncer` and `Node` manage functions to use `LoopingCall`s instead of scheduling with `callLater`.
* refactored `DHTHashAnnouncer` to no longer use locks, use a `DeferredSemaphore` to limit concurrent announcers
* decoupled `DiskBlobManager` from `DHTHashAnnouncer`, get blob hashes to announce from `SQLiteStorage`. The blob manager no longer announces blobs after they are completed, the hash announcer takes care of this now.
* changed the bucket splitting condition in the dht routing table to be more aggressive
* ping dht nodes who have stored to us periodically to determine whether we should include them as an active peer for the hash when we are queried. Nodes that are known to be not reachable by the node storing the record are no longer returned as peers by the storing node.
* changed dht bootstrap join process to better populate the routing table initially
* cache dht node tokens used during announcement to minimize the number of requests that are needed
* implement BEP0005 dht rules to classify nodes as good, bad, or unknown and for when to add them to the routing table (http://www.bittorrent.org/beps/bep_0005.html)
* refactored internal dht contact class to track failure counts/times, the time the contact last replied to us, and the time the node last requested something fom us ([1211](https://github.com/lbryio/lbry/pull/1211))
* refactored dht iterativeFind
* sort dht contacts returned by `findCloseNodes` in the routing table
*`reactor` and `callLater`, `listenUDP`, and `resolve` functions to be configurable (to allow easier testing)
* calls to get the current time to use `reactor.seconds` (to control callLater and LoopingCall timing in tests)
* temporarily disabled data price negotiation, treat all data as free
* disabled Cryptonator price feed
* use `treq` instead of `txrequests` ([1191](https://github.com/lbryio/lbry/pull/1191))
* updated `cryptography` version to 2.2.2
* removed `pycrypto` dependency, replacing all calls to `cryptography`
### Added
*`peer_ping` command
*`--sort` option in `file_list` ([1174](https://github.com/lbryio/lbry/pull/1174))
*`port` field to contacts returned by `routing_table_get`
* configurable `concurrent_announcers` and `s3_headers_depth` settings
* virtual kademlia network and mock udp transport for dht integration tests
* functional tests for bootstrapping the dht, announcing and expiring hashes, finding and pinging nodes, protocol version 0/1 backwards/forwards compatibility, and rejoining the network
* linux distro and desktop name added to analytics ([1218](https://github.com/lbryio/lbry/pull/1218))
* certifi module for Twisted SSL verification on Windows ([1213](https://github.com/lbryio/lbry/pull/1213))
* protocol version to dht requests and to the response from `findValue`
### Removed
*`announce_all` argument from `blob_announce`
* old `blob_announce_all` command
* unused `--wallet` argument to `lbrynet-daemon`, which used to be to support `PTCWallet`.
* download blockchain headers from s3 before starting the wallet when the local height is more than s3_headers_depth (a config setting) blocks behind (https://github.com/lbryio/lbry/pull/1177)
* infinite loop where reflector client keeps trying to send failing blobs, which may be failing because they are invalid and thus will never be successfully received
* docstring bugs for `stream_availability`, `channel_import`, and `blob_announce`
### Added
*`blob_reflect` command to send specific blobs to a reflector server
* unit test for docopt
### Removed
*`flags` decorator from server.py as short flags are no longer used when using api/cli methods
### Changed
* Bumped `lbryum` requirement to 3.2.1 [see changelog](https://github.com/lbryio/lbryum/blob/master/CHANGELOG.md#321---2018-03-28)
* Scripts to auto-generate documentation ([1128](https://github.com/lbryio/lbry/pull/1128))
* Now updating new channel also takes into consideration the original bid amount, so now channel could be updated for wallet balance + the original bid amount ([1137](https://github.com/lbryio/lbry/pull/1137))
* Forward-compatibility for upcoming DHT bencoding changes
* value error due to a race condition when saving to the claim cache (https://github.com/lbryio/lbry/issues/1013)
* being unable to re-download updated content (https://github.com/lbryio/lbry/issues/951)
* sending error messages for failed api requests
* file manager startup being slow when handling thousands of files
* handling decryption error for blobs encrypted with an invalid key
* handling stream with no data blob (https://github.com/lbryio/lbry/issues/905)
* fetching the external ip
*`blob_list` returning an error with --uri parameter and incorrectly returning `[]` for streams where blobs are known (https://github.com/lbryio/lbry/issues/895)
*`get` failing with a non-useful error message when given a uri for a channel claim
* exception checking in several wallet unit tests
* daemon not erring properly for non-numeric values being passed to the `bid` parameter for the `publish` method
*`publish` command to allow updating claims with a `bid` amount higher than the wallet balance, so long as the amount is less than the wallet balance plus the bid amount of the claim being updated (https://github.com/lbryio/lbry/issues/748)
* incorrect `blob_num` for the stream terminator blob, which would result in creating invalid streams. Such invalid streams are detected on startup and are automatically removed (https://github.com/lbryio/lbry/issues/1124)
### Deprecated
*`channel_list_mine`, replaced with `channel_list`
*`get_availability`, replaced with `stream_availability`
* config file format of `known_dht_nodes`, `lbryum_servers`, and `reflector_servers` to lists of `hostname:port` strings
* startup of `lbrynet-daemon` to block on the wallet being unlocked if it is encrypted
*`publish` to verify the claim schema before trying to make the claim and to return better error messages
*`channel_list_mine` to be instead named `channel_list`
*`channel_list` to include channels where the certificate info has been imported but the claim is not in the wallet
* file objects returned by `file_list` and `get` to contain `claim_name` field instead of `name`
*`name` filter parameter for `file_list`, `file_set_status`, `file_reflect`, and `file_delete` to be named `claim_name`
*`metadata` field in file objects returned by `file_list` and `get` to be a [Metadata object](https://github.com/lbryio/lbryschema/blob/master/lbryschema/proto/metadata.proto#L5)
* assumption for time it takes to announce single hash from 1 second to 5 seconds
* HTTP error codes for failed api requests, conform to http://www.jsonrpc.org/specification#error_object (previously http errors were set for jsonrpc errors)
* api requests resulting in errors to return less verbose tracebacks
* logging about streams to not include file names (only include sd hashes)
* wallet info exchange to re-use addresses, this was a significant source of address bloat in the wallet
* lbrynet to not manually save the wallet file and to let lbryum handle it
* internals to use reworked lbryum `payto` command
* dht `Node` class to re-attempt joining the network every 60 secs if no peers are known
* lbrynet database and file manager to separate the creation of lbry files (from downloading or publishing) from the handling of a stream. All files have a stream, but not all streams may have a file. (https://github.com/lbryio/lbry/issues/1020)
* manager classes to use new `SQLiteStorage` for database interaction. This class uses a single `lbrynet.sqlite` database file.
### Added
*`lbrynet-console`, a tool to run or connect to lbrynet-daemon and launch an interactive python console with the api functions built in.
*`--conf` CLI flag to specify an alternate config file
*`peer_port`, `disable_max_key_fee`, `auto_renew_claim_height_delta`, `blockchain_name`, and `lbryum_servers` to configurable settings
*`wallet_unlock` command (available during startup to unlock an encrypted wallet)
* support for wallet encryption via new commands `wallet_decrypt` and `wallet_encrypt`
*`channel_import`, `channel_export`, and `claim_renew` commands
*`blob_availability` and `stream_availability` commands for debugging download issues
* a new startup stage to indicate if the daemon is waiting for the `wallet_unlock` command.
*`abandon_info` dictionary (containing `claim_name`, `claim_id`, `address`, `amount`, `balance_delta` and `nout`) for claims, supports, and updates returned by `transaction_list`
*`permanent_url` string to `channel_list_mine`, `claim_list`, `claim_show`, `resolve` and `resolve_name` (see lbryio/lbryum#203)
*`is_mine` boolean to `channel_list` results
*`txid`, `nout`, `channel_claim_id`, `channel_claim_name`, `status`, `blobs_completed`, and `blobs_in_stream` fields to file objects returned by `file_list` and `get`
*`txid`, `nout`, `channel_claim_id`, and `channel_claim_name` filters for `file` commands (`file_list`, `file_set_status`, `file_reflect`, and `file_delete`)
* unit tests for `SQLiteStorage` and updated old tests for relevant changes (https://github.com/lbryio/lbry/issues/1088)
* Fixed slow startup for nodes with many lbry files
* Fixed setting the external ip on startup
* Fixed session startup not blocking on joining the dht
* Fixed several parsing bugs that prevented replacing dead dht contacts
* Fixed lbryid length validation
* Fixed an old print statement that polluted logs
* Fixed rpc id length for dht requests
### Changed
* Bumped `lbryschema` requirement to 0.0.13 [see changelog](https://github.com/lbryio/lbryschema/blob/master/CHANGELOG.md#0013---2017-10-25)
* Bumped `lbryum` requirement to 3.1.10 [see changelog](https://github.com/lbryio/lbryum/blob/master/CHANGELOG.md#3110---2017-10-25)
* Use the first port available for the peer and dht ports, starting with the provided values (defaults of 3333 and 4444). This allows multiple lbrynet instances in a LAN with UPnP.
* Detect a UPnP redirect that didn't get cleaned up on a previous run and use it
* Bumped jsonschema requirement to 2.6.0
* Refactor some assert statements to accommodate the PYTHONOPTIMIZE flag set for Android.
### Added
* Added `wallet_prefill_addresses` command, which distributes credits to multiple addresses