Lisk v0.4.0 — Release Announcement

The latest Lisk client v0.4.0 has been released, and is now available for download via our downloads server.

As part of the current work-in-progress “Mainchain Stablisation” milestone, recently outlined in the Lisk Development Roadmap, we are making huge efforts to overhaul the existing code base and test-suite. Lisk v0.4.0 is a major push into completing the milestone, and includes many bug fixes, efficiency, and stability improvements. All standby delegates and node operators are encourage to update as soon as possible.

To install or update to Lisk v0.4.0 please read our official documentation.

v0.4.0 Changelog

Backend — Accounts

  • Closed #197. Improving error messages when account does not have enough funds. Yielding sender address and account balance.
  • Closed #266. Changed behavior of POST /api/accounts/open and POST /api/accounts/generatePublicKey. New accounts are no longer written to mem_accounts. Added one-time migration to delete dormant accounts which have never received or sent funds.
  • Closed #266. Verifying public key type, length and format in Account.prototype.set and Account.prototype.merge.
  • Closed #266. Added virgin column to mem_accounts. Indicating whether an unconfirmed transaction sent from an account has been applied.
  • Closed #266. Added protect_mem_account database trigger. Making address, u_username, username, virgin, publicKey, and secondPublicKey columns immutable once written.
  • Closed #266. Added senderPublicKey exceptions to Transaction.prototype.verify.
  • Added missing address validation to GET /accounts?address=.
  • Fixed error on GET /api/delegates?orderBy=unknown:asc.
  • Fixed error on GET /api/delegates?limit=0.

Backend — Blocks

  • Closed #163. Adding default orderBy to /api/blocks (height:desc).
  • Merged #210. Block processing rewrite @fix.
  • Preventing data corruption of memory tables after reload or shutdown #213.
  • Closed #222. Fixing block reward calculation within first few blocks after milestone.
  • Closed #258. Detecting numericality of snapshot round. Allowing node app.js —snapshot=foobar to default to the highest round.
  • Closed #260. Removing infinite recursion in Loader.prototype.getNetwork.
  • Closed #276. Finishing snapshot within __private.applyBlock.
  • Closed #289. Prevent sync slowdown after receiving unconfirmed transactions.
  • Conditionally loading blocks from network; when there has been no block “receipts” over network transport, or when last receipt was over 120 seconds ago.
  • Added GET /api/loader/status/ping endpoint @34ro.
  • Added GET /api/blocks/getEpoch endpoint.
  • Added nethash and epoch properties to GET /api/blocks/getStatus.
  • Fixed orphan account check. Excluding mem_accounts with NULL blockId.
  • Fixed invalid type comparison on unapplied rounds.
  • Fixed reported block height when rebuilding blockchain.
  • Improved error logging with JSON dump of affected block.

Backend — Transactions

  • Closed #265. Fixing “Account not found” error when sending transactions to virgin account using POST /api/transactions.
  • Fixed #279. Removing erroneous unconfirmed transactions.
  • Fixed #279. Removing redundant double spend collection.
  • Fixed undefined is not a function error. After error thrown while verifying transaction bytes.
  • Added verification of transaction assets for all transaction types.
  • Improved error logging with JSON dump of affected transaction.
  • Improved logging of apply / undo of transactions at debug level.
  • Performing sender balance checks using bignum arithmetic.

Backend — Applications

  • Closed #269. Fixed crash on 404 error for POST /api/dapps/install.
  • Downgraded npm to latest LTS release 2.15.10.

Backend — Peers

  • Improving peers db efficiency #104. Sequencing peers updates.
  • Improving peers db efficiency #104. Replacing insert / update with single upsert.
  • Improving peers db efficiency #104. Chaining database queries when adding dapp peer.
  • Closed #147. Replacing request with popsicle. Fixing memory leak on large request bodies, e.g. loading blocks from peer.
  • Merged #227. Improved peer discovery using histogram cut selection of “good” peers @fix.
  • Closed #231. Implementing API rate limiter. Individually configurable for both /api and /peer. Disabled by default.
  • Added EHEADERS, ERESPONSE, ENETHASH peer error codes, extending:
  • Fixed timers in Loader.prototype.onPeerReady.
  • Only trigger nextLoadBlock if loaded and not already syncing.
  • Fixed halt to nextLoadUnconfirmedTransactions recursion when syncing.
  • Fixed halt to nextLoadSignatures recursion when syncing.
  • Checking nethash for all transport /peer requests.
  • Returning JSON response for POST /peer/blocks.
  • Returning success or error for GET /api/peers/get.
  • Added success property to GET /peer/transactions.
  • Ignoring already processed or confirmed transactions for POST /peer/transactions.
  • Added transactionId property to POST /peer/transactions.
  • Added success property to GET /peer/height.
  • Removing peers which return bad response code.
  • Removing peers with invalid request headers.
  • Removing peers with invalid nethash.
  • Improved logging of peer changes at debug level.
  • Increased default peer timeout to 5000 ms.
  • Fixed unwanted rejection of seed peers due to lack of os, version metadata.
  • Removed unnecessary peer loopback detection.
  • Validating peer headers using zschema only.

Backend — Refactoring

  • Closed #147. Dramatically improved CPU and memory efficiency.
  • Moved schema validations into separate modules, to eliminate unnecessary continous object creation.
  • Added unique ids to schema validations, to better utilize z-schema schema caching.
  • Nullifying any large objects identified by memory profiling at the earliest opportunity.
  • Decoupled transaction types from modules into separately addressed modules.
  • Defining functions on constructor prototype where possible.
  • Using async for control flow, to remove deep nesting of code.
  • Fully linted code base using jshint to a strict standard.
  • Created database indexes on memory tables.

Backend — Tests

  • Complete rewrite and abstraction of API tests, for cleaner tests.
  • Massively expanded API test coverage, resulting in many fixes.
  • Added initial unit test coverage, e.g. for block rewards.

Backend — Configuration

  • Removed unimplemented serveHttpAPI/Wallet options from config.json.
  • Added maxUpdatePeers option to config.json.
  • Added trustProxy setting to config.json.

Backend — Dependencies

  • Updated all dependencies to latest compatible versions.
  • Replaced underscore, util-extend with lodash.


  • Added Polish language support.
  • Fixating and updating dependency versions.
  • Fixing calls to null u_multisignatures/multisignatures.
  • Fixing call to undefined


  • Closed #44. Added timestamp to postgresql logs.
  • Added empty blockchain.db.gz to allow for starting the blockchain from 0.
  • Updating node/lisk-node to 0.12.16.

  • Implemented url flag for to allow remote snapshots to be used with rebuild.
  • Updated rebuild logic to allow for local backups to be reused and to specify file name.
  • Improved lisk startup to display current block height after start or status is issued.
  • Implemented new logic for interactive snapshotting.
  • Added progress bar when downloading snapshots.

  • Implemented for automated database backups.
  • Added snapshot.json for configuring backups.

  • Removed duplicated block height check already present in
  • Changed coldstart to use empty blockchain.db.gz.


  • Updated upgrade instructions to use automated upgrade.
  • Updated testnet installation instructions.

Please join our forum or chat if you have any further questions, or are interested in supporting the network by running a node.

For reference, you can always track our development progress via GitHub:

Kind regards,

Oliver Beddows