The first response seems right, but I would define this property in the database, not in the application.
I would store this state using the full contract details as primary key, with signatures joined against that particular state. A hash or a surrogate key could be used if the contract state is particularly large.
That way you represent exactly what contract the parties have signed against, and if the contract changes the join condition is false.
If you do that, the desired property is easily proven in the relational model.