Here is one thing we like to formally verify on software: ๐๐๐๐๐๐๐๐
๐๐๐๐๐๐๐๐๐๐๐๐๐.
What? This is about demonstrating that for any inputs, the new release of a system will behave exactly the same as the previous one (i.e., the same replies, same data stored in the database, etc.).
Of course, depending on the case, there may be a list of exceptions, such as endpoints that have been changed or newly available features.
Why? It is often very challenging to obtain an unambiguous specification of what a system is intended to do. Very often, apart from documents that give the general idea, the most precise answer is "it is supposed to do what it already does."
In that sense, when we verify a new release of a product, we check that it does not break any existing user workflow that was possible with the current version.
It also enables more aggressive optimizations, as even if the code becomes difficult to track, we are sure not to introduce any bugs.
How? Generally, this verification is relatively straightforward, as most of the code remains unchanged once the software matures. Theorem provers are very good at checking equalities for parts that are identical and at highlighting all the points of difference.
For these, we have to do the actual verification work, but we are sure not to miss any change.
If the data model changes, we also need to write morphisms (aka migrations) to state that the code behaves the same, up to the data model changes.
=> If you are interested in ensuring the security of your blockchain system, talk to us! ๐ข