June 26, 2020

By Cayle Sharrock

Tari Base node v0.4.2 release notes

🎉🎉🎉 Tari Base Node v0.4.2 is available for download now 🍾🍾🍾

This release has some breaking peer-to-peer changes, so you are strongly encouraged to upgrade as soon as possible so that your node’s performance stays in tip-top shape.

Older nodes (from v0.2.4 and up) will still synchronise the block chain, but they won’t understand the new block propagation improvements and so will always be lagging behind their peers.

Now let’s lift the hood and peer at some of the highlights:

Block propagation improvements

As of v0.4.2 nodes propagate a block hash (33 bytes) instead of the full block. This will significantly reduce network bandwidth usage for block propagation (For math nerds, full block messages drop from 𝒪(n²) to 𝒪(n)). If every node is propagating to 10 peers on average, that’s roughly a 90% bandwidth reduction.

On receipt of a block hash a node checks if it has the block. If so, it simply ignores the message. Otherwise, it requests the full block from the peer that sent the hash.

Resolve peer DNS addresses with Tor if it is available

This is a privacy enhancing change that applies to nodes running in TCP mode with Tor support. Previously, connecting to a peer’s DNS address would use the system’s DNS resolution and that can be exploited to de-anonymise users.

New emoji set support 😀👍🏽🤣!

v0.4.2 brings the new emoji set into the base node CLI. This will resolve any issues you have copying and pasting emoji ids from Aurora v0.2.0 and up into the node CLI.

There’s more detail on the emoji set changes in a previous dev update.

gRPC support for base nodes

The base nodes now support gRPC. This will allow us to decouple the wallet and base node executables. To see the gRPC interface in action, you can peruse the Block Explorer Source Code, which makes heavy use of gRPC.

Initial Mempool sync

On startup, a node will now try and sync its mempool with a peer. Previously, mempools only filled up organically via transaction propagation. This is fine for most nodes, but if you’re a miner, you really want to know about existing transactions when you start up so that you can mine full blocks.

get-block now has a format specifier

get-block adds a format specifier which allows the user to print blocks in text or json format. The latter is useful in testing.


>> get-block 1 text // OR get-block 1

----------------- Block -----------------
--- Header ---
Version: 1
Block height: 1
Previous block hash:
Timestamp: Sun, 26 Apr 2020 07:15:47 +0000
Merkle roots:
Range proofs:
Total offset:
Nonce: 11608557920783722845
Proof of work:
Mining algorithm: Blake, Target difficulty: 60000000
Total accumulated difficulty:
Monero=1, Blake=2
Pow data:

---  Body  ---
--- Transaction Kernels ---
Kernel 0:
Fee: 0 µT
Lock height: 0
Excess: 9cef94920fefc544e181c296150acad6171f141ef2c68a1eb290a009d0e22909
Excess signature:
Meta_info: None
Linked_kernel: None

--- Inputs (0) ---
--- Outputs (1) ---
[OutputFeatures { flags: COINBASE_OUTPUT, maturity: 61 }] Proof:

>> get-block 1 JSON

  "header": {
    "version": 1,
    "height": 1,
    "prev_hash": "4a5af9e5dd60c2ab012ef8d75a465c6864b0e59c258f3ea76ea45ae93a332fac",
    "timestamp": 1587885347,
    "output_mr": "2d15a802253ee980a841130cae89dd4b1536a8ab4b9f218337bb097936df48c9",
    "range_proof_mr": "d6122998802c2f47de31a21e5912656f4b9744d88584c680e2412f588e4fca18",
    "kernel_mr": "a455d1c3574c7283eeef45905897b8013edd36121ab4a00c6589ed58218013f4",
    "total_kernel_offset": "0000000000000000000000000000000000000000000000000000000000000000",
    "nonce": 11608557920783722845,
    "pow": {
      "accumulated_monero_difficulty": 1,
      "accumulated_blake_difficulty": 2,
      "target_difficulty": 60000000,
      "pow_algo": "Blake",
      "pow_data": []
  "body": {
    "sorted": true,
    "inputs": [],
    "outputs": [
        "features": {
          "flags": {
            "bits": 1
          "maturity": 61
        "commitment": "68367c184428a77feadfc2c64caab4ca3997ab18bdcea12250ac174fa8018329",
        "proof": "f0be62d27d39d09a9f528..<SNIP>..a0901399805"
    "kernels": [
        "features": {
          "bits": 1
        "fee": 0,
        "lock_height": 0,
        "meta_info": null,
        "linked_kernel": null,
        "excess": "9cef94920fefc544e181c296150acad6171f141ef2c68a1eb290a009d0e22909",
        "excess_sig": {
          "public_nonce": "0842cd1d3ed1171c880157f2316df8ca0ed84cd6628259b3548d368ca4f79313",
          "signature": "fe4bd3b639a47dd24aa4408ee4fbfc02ec0a17558dde15b2d392a82a56697503"

And lots more

The full release notes are on GitHub.