#metadata #substrate #version #runtimes #compare #change #comparing-diffing

substrate-differ

help comparing/diffing 2 version of Substrate metadata or 2 Runtimes

1 unstable release

0.13.0 Aug 4, 2021

#21 in #runtimes


Used in 2 crates (via subwasmlib)

MIT and GPL-3.0-or-later…

46KB
926 lines

Substrate Differ

Overview

This crate helps comparing/diffing 2 version of Substrate metadata or 2 Runtimes. A basic solution consists in serializing the metadata as a json string and comparing visually the ....16534 lines you will see. That is just not serioulsy doable.

Context

The Substrate metadata format is versioned. For a given version however, the content may change between runtime versions. Whether the metadata change or not is critical. Adding new modules or calls has usually a low impact. However, removing, modifying or reoredring modules and/or their content is critical to the various client APIs.

Comparison of diff methods

This crate offers 3 methods to compare metadata, they have benefits and drawbacks, as shown in the table below.

raw_differ partial_differ summary_differ Comments
comparing metadata metadata runtime
verbosity HIGH MEDIUM LOW How long is the output
accuracy HIGH LOW HIGH How well it describes changes
genericity HIGH NONE HIGH How good it works for past and future Metadata formats/version
detail level HIGH MEDIUM LOW How good we can spot where the differences come from
future proof YES NO YES

summary_differ

The summary_differ works on a very high level, it compares and show aggregated information such as the total size and whether the object are strictly identical or not. Here we are diffing runtimes.

The result looks similar to:

Running subwasm v0.8.0
  🅰️  File("runtime_a.wasm")
  🅱️  File("runtime_b.wasm")
  🅰️  1.916 MB (2,008,974 bytes)
  🅱️  2.795 MB (2,930,552 bytes)
Checking metadata versions:
  ✅ Both metadata versions are identical: V12
Checking core versions:
  ❌ The 2 core versions are different:
  🅰️  kusama-2030 (parity-kusama-0.tx5.au2)
  🅱️  kusama-9000 (parity-kusama-0.tx5.au2)
Checking runtime metadata:
  ❌  The metadata are different

This is a good option to confirm that the metadata between 2 runtimes did NOT change. Note that 2 runtimes may have different implementations leading to identical metadata.

If, like in the example above, the metadata are different, we will need the help of another method to know more about the differences.

raw_differ

Here we are diffing the metadata.

The raw_differ first serializes the metadata as a JSON string. It then checks all differences. This is a good way to see ALL the differences but can end up very verbose. This method will however greatly reduce the size of what needs to be checked in comparison to diffing the raw json yourself.

This method is rather robust for upcoming versions that are not known yet as the only requirement is to be able to seriliaze the metadata.

partial_differ

NOTE: Not implemented yet

Here we are diffing the metadata.

The partial_differ on the other hand will look for specific aspects between the 2 metadata. That makes the partial_differ more consive and easier to read and analyse. This method however, may not work without code changes for upcoming versions.

Dependencies

~21–29MB
~446K SLoC