March 30, 2022

By Byron Hambly and Stanley Bondi

Testnet Hard Fork Report

Dibbler Testnet Hard Forked at block #23000

Last week on Thursday the 24th of March, the planned hard fork on the Tari Testnet occurred at Block #23000 at 08:08:24 UTC.

Previously, network forking changes coincided with full resets of the Testnet. In preparation for Mainnet, the Tari development community released the changes as a required software upgrade. This means that base nodes running a version prior to v0.30.0 are unable to validate blocks created by upgraded miners, forking the network. Outputs and transactions from previous versions are still valid, so existing wallets should be unaffected by the change.

Let’s take a closer look at the breaking change.

Header hash method updated to use consensus encoding

Consensus Encoding is a well-defined specification appropriate for use in consensus critical serialization and encoding. The new ConsensusEncoding implementations in Tari are fairly simple and auditable, with byte-for-byte control of the encoding, and, importantly, have only one way to represent a given object as bytes. This means that the serialized bytes are appropriate for use in cryptographic primitives like hashes and signature challenges.

The previous method relied on the bincode library for the final byte encoding, which is not appropriate for consensus for a few reasons. Pull request #3820 updated the header hashing method to use ConsensusEncoding, which serves as a formal specification and reusable component for other implementations to use.


The hard fork rolled out relatively smoothly, since a majority of the network was running the upgraded software.

One issue was uncovered, where a base node might get stuck trying to sync from an un-upgraded node. Upon reaching the fork, the newer node would correctly not validate the old fork where the hash method changed, but incorrectly did not ban the older node. This was fixed in #3955 by banning the node that failed to use the new header hashing method where required.

Tari v0.30.1 Released

A new patch version of the Tari software is now available.

Bug Fixes

  • Launch the watch command on start (#3924)
  • Correct main path for wallet rpc client (#3934)
  • Tor identity private key needs to be serialized (#3946)
  • Ensure that identity sig is stored on startup (#3951)
  • Bug in block timing grpc method (#3926)
  • Fix Tor ID deserialization issue (#3950)
  • Ban peer if sending invalid prev_header (#3955)
  • Adds extra checks for sync stream termination (#3927)
  • Disable SAF auto requests (#3919)
  • Fix handling of creating faux transaction for recovered outputs (#3959)
  • Fix ffi import external utxo from faucet (#3956)


  • Add mmr check to reconstructed block and mempool validation for unique excess signature (#3930)
  • Add UTXO set size to base node metrics (#3932)
  • Listen to terminal events in the watch mode (#3931)
  • Script to produce coverage report for wallet (#3938)
  • Monitor and display warning for min ratio for TCPv4 nodes (#3953)
  • Gracefully handle recovering a duplicate output in LibWallet (#3903)


  • Add docstring to merge mining proxy (#3947)
  • Fix doctests (#3962)
  • Hide private values in debug and serialize (#3905)
  • Bump nanoid from 3.1.30 to 3.3.1 in /applications/tari_web_extension (#3937)
  • Make HashWriter API more ergonomic and similar to Digest (#3948)
  • Take out “TODO: remove” for message tag (#3954)
  • Bump ansi-regex in /applications/tari_explorer (#3967)
  • Improve ergonomics of error to RPC status (#3949)
  • Reinstate inputs_not_mallaeble test (#3935)
  • Add auto labeler for clippy (#3922)
  • Add create release to libwallet build (#3941)
  • Add docker image builds for launchpad (#3966)