version 0.9.20
--------------

- fix for IRC flood issue 93

NOTE: I will soon move the RELEASE-NOTES into the README

version 0.9.19
--------------

- move sleep outside semaphore (issue 88)

version 0.9.18
--------------

- last release of 2016.  Just a couple of minor tweaks to logging.

version 0.9.17
--------------

- have all the DBs use fsync on write; hopefully means DB won't corrupt in
  case of a kernel panic (issue 75)
- replace $DONATION_ADDRESS in banner file

version 0.9.16
--------------

- logging improvements, including throttling of abusive logs
- permit large RPC requests (issue 85)

version 0.9.15
--------------

- fix crash on reorg, issue #84

version 0.9.14
--------------

- don't start processing mempool until block processor has caught up.
  Print server settings when servers start, not at startup.

version 0.9.13
--------------

- fix to reduce verbosity of logging of deprioritised sessions.  Sessions
  are deprioritised if they are using high bandwidth, or if they are part
  of a group using high bandwidth.  Previously each delayed request scheduling
  would be logged, now only changes in the delay (up or down) are logged.

version 0.9.12
--------------

- enchancements to RPC and logging.  getinfo output has changed, a couple
  of fields renamed.
  issue 77: add PID to getinfo
  issue 78: start RPC immediately, don't wait for catch-up
  issue 79: show IPv6 address-port combinations properly in []
  issue 80: show DB and daemon heights in getinfo

version 0.9.11
--------------

- rework the fetch-and-process blocks loop.  This regains some of the
  sync efficiency we lost during 0.8.x and that was poorly hacked
  around earlier in 0.9.x.  Continuing to investigate where the rest
  went.
- logging of block processing times fixes #58
- moved the peer column to the end of the sessions RPC so that IPv6 addrs
  don't mess up the formatting

** Please don't run version 0.10.0, it will corrupt your DB.

version 0.9.10
--------------

- logging improvements
- fixed issue #76 (RPCError namespace)

version 0.9.9
-------------

- prioritize mempool processing of sent txs.  Closes issue 73.
- mempool tx processing needs to handle DBError exceptions.  Fixes issue 74.

version 0.9.8
-------------

- cleanup up mempool handling, notify of addresses only once when a new block
  comes in.  Fixes issue 70.

version 0.9.7
-------------

- history and UTXO requests are now processed by the executor, i.e.,
  properly asynchronously.  This was the last of the potential latency
  bottlenecks.

version 0.9.6
-------------

- fix it properly this time

version 0.9.5
-------------

- fix issue introduced in 0.9.4 with paused connections

version 0.9.4
-------------

- new env var MAX_SESSIONS, see docs/ENV-NOTES.  The default limit is
  1,000 sessions so raise this if you want to be able to take more.
- a couple of minor bug fixes relating to paused connections
- removed RPC calls numsessions and numpeers.  They're not very interesting
  and all that and more is in getinfo.

version 0.9.3
-------------

- unconfirmed flag indicating whether mempool txs have unconfirmed inputs
  was inverted

version 0.9.2
-------------

- fix mempool busy waiting

version 0.9.1
-------------

- fix another couple of issues introduced in 0.9.0

version 0.9.0a
--------------

- fix typo in 0.9.0

version 0.9.0
-------------

- complete rewrite of mempool code to have minimal latency and fix a
  couple of minor bugs.  When a new block is found, ideally this
  should be communicated to clients who addresses are affected with a
  single notification.  Previously this would happen with two
  notifications: one because the TX got in the block, and one because
  that TX was no longer in the mempool.  Fundamentally this a race
  condition that cannot be eliminated but its occurrence should be
  minimized.

version 0.8.12
--------------

- pause serving sessions whose send buffers are full (anti-DoS).  This
  is currently logged; let me know if it's too verbose
- various tweaks to request handling

version 0.8.11
--------------

- catch harmless socket exception
- show session count in groups RPC call

version 0.8.10
--------------

- fix socket bug in 0.8.9

version 0.8.9
-------------

- RPC groups and sessions calls improved
- issues fixed: #62, #68  (slow socket closing, IRC)

version 0.8.8
-------------

- put sessions in a priority queue to better prioritise serving.  Low-bandwidth
  sessions get served first
- new RPC command "groups" - shows information about session groups
- sessions output: session priority shown under Flags column; the lower the
  number the higher the priority.  txs column moved, new column reqs showns
  the number of outstanding requests for that connection (includes subrequests
  of batches)
- issued fixed: #67

version 0.8.7
-------------

- update systemd config (bauerj)
- temporary fix for initial sync times
- continued JSON code refactoring

version 0.8.6
-------------

- fix JSON bugs from 0.8.5
- fix issue #61 (valesi)

version 0.8.5
-------------

- rework of JSON layer to better handle batch requests.  This is
  preparatory work for improved DoS resistance.

I'm aware recent versions don't sync efficiently; please use 0.8.0 to sync
until I find time to fix it.

version 0.8.4
-------------

- remove invalidated histories from cache on new block

version 0.8.3
-------------

Minor tweaks to session logs:

- sessions output now shows flags.  All sessions are listed.  The
  session type column is gone, instead the first letter of RPC, SSL or
  TCP is the first flag letter.  A 'C' flag indicates the session is closing.
  An 'L' that it's being logged.
- don't attempt to forcefully stale sockets; they remain in C state until
  Python closes them (which can be a long time for some SSL sockets)
- don't consider all seeing eye connections as stale

version 0.8.2
-------------

- process new blocks in the asyncio executor; essentially a python thread.
  This should eliminate latency during block processing that caused sessions
  to be dropped.
- bandwith limit is restored incrementally to a session over the hour
  rather than in a lump when one hour has passed.  Also, only the
  limit is refunded each hour; previously the entire usage would be
  refunded.  So if the session uses 30MB bandwidth and your limit is
  10MB, it will take 3 hrs before the session is considered to have
  used none of its allotted bandwidth; previously it would happen after 1
  hour.

version 0.8.1
-------------

** NOTE: this version has a new Python package dependency: pylru

- fix for IRC encoding killing IRC connection
- add lru cache for history

version 0.8.0
------------

- stale connections are periodically closed.  See docs/ENV-NOTES for
  SESSION_TIMEOUT, default is 10 minutes.  Issue #56.
- each session gets its own ID which is used in the logs instead of its
  network address; the network address is still shown on initial connection.
  Issue #55.
- the session ID is also shown in the sessions list.  You can use this ID
  with the following new RPC commands which take a list of session ids:

     electrumx_rpc.py log
     electrumx_rpc.py disconnect

   The first will toggle logging of the sessions.  A logged sesssion
   prints every incoming request to the logs.
   The second will disconnect the sessions.
   Example:  "electrumx_rpc.py log 15 369"

version 0.7.20
--------------

- fix for errors during batch requests (issue #54)
- don't log errors on shutdown after giving sockets time to close

version 0.7.19
--------------

- revert mempool change of 0.7.18

version 0.7.18
--------------

- better IRC support for tor (valesi)
- issues: suppressed some uninteresting socket logging to fix #52
- mempool: fixed small memory leak

version 0.7.17
--------------

- upped read buffer limit to 1,000,000 bytes.

version 0.7.16
--------------

- fix bug introduced in 0.7.12 that hit during reorgs

version 0.7.15
--------------

The following meta variables in your banner file are now replaced in
addition to $VERSION described in the notes to 0.7.11.  If you type
getnetworkinfo in your daemon's debug console you will see what they
are based on:

- $DAEMON_VERSION is replaced with the daemon's version as a dot-separated
  string.  For example "0.12.1".
- $DAEMON_SUBVERSION is replaced with the daemon's user agent string.
  For example, "/BitcoinUnlimited:0.12.1(EB16; AD4)/".

version 0.7.14
--------------

Improved DoS protection:

- incoming network request buffers - which hold incomplete requests
  are limited to 150,000 bytes, which I believe is large for genuine
  clients.  I don't foresee a need to change this so it is hard-coded.
  If an incoming request (for example, text without a newline) exceeds
  this limit the connection is dropped and the event logged.
- RPC connections have high MAX_SEND and incoming buffer limits as these
  connections are assumed to be trusted.
- new environment variable BANDWIDTH_LIMIT.  See docs/ENV-NOTES.
- fixes: LOG_SESSIONS of 0.7.13 wasn't being properly interpreted.
  Tweak to rocksdb close() that should permit db reopening to work.

version 0.7.13
--------------

- the output of the RPC sessions and getinfo calls are now written to logs
  periodically by default.  See LOG_SESSIONS in docs/ENV-NOTES
- Litecoin update (santzi)

version 0.7.12
--------------

- minor bug fixes: 2 in JSON RPC, 1 in get_utxos (affected addresslistunspent)
- leveldb / rocksdb are opened with a different maximum open files limit,
  depending on whether the chain has been fully synced or not.  If synced
  you want the files for network sockets, if not synced for the DB engines.
  Once synced the DB will be reopened with the lower limit to free up the
  files for serving network connections
- various refactoring preparing for possible asynchronous block processing

version 0.7.11
--------------

- increased MAX_SEND default value to 1 million bytes so as to be able
  to serve large historical transactions of up to ~500K in size.  The
  MAX_SEND floor remains at 350,000 bytes so you can reduce it if you
  wish.  To serve any historical transaction for bitcoin youd should
  set this to around 2,000,100 bytes (one byte becomes 2 ASCII hex chars)
- issue #46: fix reorgs for coinbase-only blocks.  We would not distinguish
  undo information being empty from it not existing
- issue #47: IRC reconnects.  I don't get this issue so cannot be certain
  it is resolved
- $VERSION in your banner file is now replaced with your ElectrumX version
- more work to isolate the DB from the block processor, working towards the
  goal of asynchronous block updates

version 0.7.10
--------------

- replaced MAX_HIST environment variable with MAX_SEND, see docs/ENV-NOTES.
  Large requests are blocked and logged.  The logs should help you determine
  if the requests are genuine (perhaps requiring a higher MAX_SEND) or abuse.

version 0.7.9
-------------

- rewrite jsonrpc.py to also operate as a client.  Use this class
  for a robust electrumx_rpc.py.  Fixes issue #43

version 0.7.8
-------------

- hopefully fix failed assertion on reorgs, issue #44

version 0.7.7
-------------

- add MAX_HIST to throttle history requests; see docs/ENV-NOTES.  One
  provider of ElectrumX services was attacked by a loser requesting
  long histories; this environment variable allows you to limit what
  you attempt to serve.

version 0.7.6
-------------

- Fix IRC regression of 0.7.5 - would always connect to IRC by default

version 0.7.5
-------------

- refactoring of server manager and event handling.  One side effect
  is to fix a bug in 0.7.4 where after a reorg ElectrumX might create
  a second mempool and/or kick off more servers.  Your testing would
  be appreciated.  This is part of the refactoring necessary to
  process incoming blocks asynchronously so client connections are not
  left waiting for several seconds
- close connections on first bad JSON encoding.  Do not process buffered
  requests of a closing connection
- make IRC params a function of the coin (TheLazier) and supply them for
  Dash

version 0.7.4
-------------

- really fix reorgs, they still triggered an assertion.  If you hit a reorg
  I believe your DB is fine and all you need to do is restart with updated
  software
- introduced a new debug env var FORCE_REORG which I used to simulate a
  reorg and confirm they should work

version 0.7.3
-------------

- fix reorgs - broken since 0.6 I think

version 0.7.2
-------------

- don't log message decoding errors.  Cut off a connection after it has sent
  10 ill-formed requests.
- doc improvements (cluelessperson)
- RPC ports for Dash (TheLazier)

version 0.7.1
-------------

- fixes an unqualified use of RPCError

version 0.7
-----------

- daemon failover is now supported; see docs/ENV-NOTES.  As a result,
  DAEMON_URL must now be supplied and DAEMON_USERNAME, DAEMON_PASSWORD,
  DAEMON_HOST and DAEMON_PORT are no longer used.
- fixed a bug introduced in 0.6 series where some client header requests
  would fail
- fully asynchronous mempool handling; blocks can be processed and clients
  notified whilst the mempool is still being processed

version 0.6.3
-------------

- new environment variables MAX_SUBS and MAX_SESSION_SUBS.  Please read
  docs/ENV-NOTES - I encourage you to raise the default values.
- fixed import bug in 0.6.2 that prevented initial sync
- issues closed: #30.  Logs should be clean on shutdown now.

version 0.6.2
-------------

- handle daemon errors properly that result from client requests; pass the
  error onto the client
- start serving immediatley on catchup; don't wait for the mempool
- logging improvements, in particular logging software and DB versions
- issues closed: #29, #31, #32

version 0.6.1
-------------

- main focus was better logging - more concise and informative, particularly
  when caught up
- issues closed: #26, #27
- default reorg limit is now taken from the coin, with a high default for
  bitcoin testnet

version 0.6.0
-------------

- DB format has changed again.  This doesn't give a performance gain
  or reduction that I could measure, but is cleaner in that each table
  entry is now a singleton and not an array, which I much prefer as a
  cleaner solution.  It may enable other goodness in the future.
- Logging is much less noisy when serving clients.  In fact anything
  in your logs that isn't just status updates probably is a bug that I
  would like to know about.  Unfortunately clean shutdown whilst
  serving clients leads to massive log spew.  This is harmless and I
  believe because of my noob status with asyncio.  I intend to fix
  this in a nearby release.
- expensive client requests are intended to yield to other requests
  sufficiently frequently that there should be no noticeable delays or
  pauses under normal load from hog clients.
- Notifications to hog clients are now queued in sequence with their
  request responses.  They used to be sent immediately regardless of
  pending requests which seems less than ideal.
- some trivial improvements and fixes to local RPC query output

version 0.5.1
-------------

- 0.5 changed some cache defaults, only partially intentionally.  For
  some users, including me, the result was a regression (a 15hr HDD
  sync became a 20hr sync).  Another user reported their fastest sync
  yet (sub 10hr SSD sync).  What changed was memory accounting - all
  releases until 0.5 were not properly accounting for memory usage of
  unflushed transaction hashes.  In 0.5 they were accounted for in the
  UTXO cache, which resulted in much earlier flushes.  0.5.1 flushes
  the hashes at the same time as history so I now account for it
  towards the history cache limit.  To get a reasonable comparison
  with prior releases your HIST_MB environment variable should be
  bumped by about 15% from 0.4 and earlier values.  This will not
  result in greater memory consumption - the additional memory
  consumption was being ignored before but is now being included.
- 0.5.1 is the first release where Electrum client requests are queued
  on a per-session basis.  Previously they were in a global queue.
  This is the beginning of ensuring that expensive / DOS requests
  mostly affect that user's session and not those of other users.  The
  goal is that each session's requests run asynchronously parallel to
  every other sessions's requests.  The missing part of the puzzle is
  that Python's asyncio is co-operative, however at the moment
  ElectrumX does not yield during expensive requests.  I intend that a
  near upcoming release will ensure expensive requests yield the CPU
  at regular fine-grained intervals.  The intended result is that, to
  some extent, expensive requests mainly delay that and later requests
  from the same session, and have minimal impact on the legitimate
  requests of other sessions.  The extent to which this goal is
  achieved will only be verifiable in practice.
- more robust tracking and handling of asynchronous tasks.  I hope
  this will reduce asyncio's logging messages, some of which I'm
  becoming increasingly convinced I have no control over.  In
  particular I learned earlier releases were unintentionally limiting
  the universe of acceptable SSL protocols, and so I made them the
  default that had been intended.
- I added logging of expensive tasks, though I don't expect much real
  information from this
- various RPC improvements

version 0.5
-----------

- DB change: all UTXOs, including those that are not canonically paying to
  an address, are stored in the DB.  So an attempt to spend a UTXO not in
  the DB means corruption.  DB version bumped to 2; older versions will not
  work
- fixed issue #17: the genesis coinbase is not in the UTXO set

version 0.4.3
-------------

- fix exception introduced in 0.4.2

version 0.4.2
-------------

- split out JSON RPC protcol handling.  Now more robust and we should
  fully support JSON RPC 2.0 clients, including batch requests
  (Electrum client does not yet support these)
- refactored and cleaned up server handling
- improved DASH support (thelazier)

version 0.4.1
-------------

- tweak IRC version reporting so we appear in the Electrum client's
  network dialog box

version 0.4
-----------

- IRC connectivity.  See the notes for environment variables, etc.
- logging improvements

Version 0.3.2, 0.3.3
--------------------

- fixed silly bugs

Version 0.3.1
-------------

- fixes issue #9
- save DB version in DB; warn on DB open if incompatible format

Version 0.3
-----------

- Database format has changed; old DBs are incompatible.  They will
  not work and will probably die miserably as I'm not yet versioning
  them for helpful warnings (coming soon).
- The change in on-disk format makes UTXO flushes noticeably more
  efficient.  My gut feeling is it probably benefits HDDs more than
  SSDs, but I have no numbers to back that up other than that my HDD
  synced about 90 minutes (10%) faster.  Until the treacle hits at
  blocks 300k+ there will probably be little noticeable difference in
  sync time.

Version 0.2.3
-------------

- fixes issues #6, #11, #15
- the UTXO cache is now merged with BlockProcessor, where it properly belongs.
  cache.py no longer exists

Version 0.2.2.1
---------------

- fixes issues #12, #13
- only attempt to flush on asyncio.CancelledError to avoid spurious
  secondary errors

Version 0.2.2
-------------

- mostly refactoring: controller.py is gone; cache.py is half-gone.
  Split BlockProcessor into 3: DB, BlockProcessor and BlockServer.  DB
  handles stored DB and FS state; BlockProcessor handles pushing the
  chain forward and caching of updates, and BlockServer will
  additionally serve clients on catchup.  More to come.
- mempool: better logging; also yields during initial seeding
- issues fixed: #10

Version 0.2.1
-------------

- fix rocksdb and lmdb abstractions (bauerj)
- limit concurrent daemon requests
- improve script + coin abstractions
- faster tx and script parsing
- minor bug fixes

Version 0.2
-----------

- update sample run script, remove empty addresses from mempool

Version 0.1
------------

- added setup.py, experimental.  Because of this server_main.py renamed
  electrumx_server.py, and SERVER_MAIN environment variable was renamed
  to ELECTRUMX.  The sample run script was updated to match.
- improvements to logging of daemon connection issues
- removal of old reorg test code
- hopefully more accurate sync ETA

Version 0.07
------------

- fixed a bug introduced in 0.06 at the last minute

Version 0.06
------------

- mempool support.  ElectrumX maintains a representation of the daemon's
  mempool and serves unconfirmed transactions and balances to clients.

Version 0.05
------------

- fixed a bug in 0.04 that stopped ElectrumX serving once synced

Version 0.04
------------

- made the DB interface a little faster for LevelDB and RocksDB; this was
  a small regression in 0.03
- fixed a bug that prevented block reorgs from working
- implement and enable client connectivity.  This is not yet ready for
  public use for several reasons.  Local RPC, and remote TCP and SSL
  connections are all supported in the same way as Electrum-server.
  ElectrumX does not begin listening for incoming connections until it
  has caught up with the daemon's height.  Which ports it is listening
  on will appear in the logs when it starts listening.  The complete
  Electrum wire protocol is implemented, so it is possible to now use
  as a server for your own Electrum client.  Note that mempools are
  not yet handled so unconfirmed transactions will not be notified or
  appear; they will appear once they get in a block.  Also no
  responses are cached, so performance would likely degrade if used by
  many clients.  I welcome feedback on your experience using this.


Version 0.03
------------

- merged bauerj's abstracted DB engine contribution to make it easy to
  play with different backends.  In addition to LevelDB this adds
  support for RocksDB and LMDB.  We're interested in your comparitive
  performance experiences.


Version 0.02
------------

- fix bug where tx counts were incorrectly saved
- large clean-up and refactoring of code, breakout into new files
- several efficiency improvements
- initial implementation of chain reorg handling
- work on RPC and TCP server functionality.  Code committed but not
  functional, so currently disabled
- note that some of the enivronment variables have been renamed,
  see samples/scripts/NOTES for the list