← home

Every single tool in this list can be placed into two categories: model checkers and theorem provers. Model checkers do automated verification via exhaustive exploration of a state space, while theorem provers do verification by checking for unification (in other words, equality between two sides of an equation). Most tools stick to one side, but certain tools such as Tamarin, TLA, Fstar, and Isabelle can do both.

In general, the largest gap I personally identify in research reasoning about protocols and distributed systems is the challenge of inductively proving properties of interest across an arbitrary number of system nodes. This is easily the hardest thing to prove about any distributed system in my opinion. In special special cases where abstraction can be done smartly, such as in the case of the Tendermint Verification effort in Ivy, you can do this easily. But there does not exist a general framework to do so. This is future research and absolutely someone's (but probably not my) future PhD thesis.

Theorem Provers

Model Checkers

I loosely categorize model checkers into two categories: general model checkers and dolev-yao model checkers. Both have seen ample usage in protocol analysis. In general, model checkers are great at finding violations to claims; oftentimes, tools feature heuristics for more quickly navigating the search space to such violations. However, verification in this context generally requires exhaustive state space search, which can be extremely expensive (albeit, fully automatic). In order to ensure the state space is finite (such that verification is decidable with an automated algorithm), the expressability of models that model checkers can reason about is limited.

General Model Checkers

Temporal Logics

Dolev-Yao

In short, Dolev-Yao is a threat model for reasoning about cryptographic handshakes in the context of an attacker that controls the communication channels. Reasoning about protocols in this space is decidable, and is akin to model checking in cases where arbitrarily sized datatypes aren't used.

Refinement Types

Refinement types are an ergonomic way to reason about implementations, and they have seen use in verifying particularly cryptographic primitive properties.

SAT/SMT

Extremely general solvers should be employed when the system you're trying to model is finite, and yet what you're trying to express cannot be done in the framework of any existing tool. Modeling performance of distributed systems, for example, has made lots of use of SMT solvers. Also see: the SAT, SMT, and Model Checking competitions, which optimize for performance across various benchmarks.

Other Links

← home