We have a general understanding that both in DAGs and in Chains there are 2 kinds of states:
- Consensus state which is mutable, changing, and will differ over time
- DAG state which is immutable, agreed upon without needing to reach “consensus”.
The consensus state mostly contains things that relate to the UTXO Set, things that matter only from the PoV of the virtual.
The DAG state contains everything that is either from the PoV of a block, or absolute, examples are:
- The validity of a block or its header
- If it’s disqualified from chain or not.
- A UTXO between that block and one of its children/parents.
- The UTXO set of that block if it exists.
- Its merged set / selected parent / blue score etc.
- The acceptance data of the block.
An important note is that even though the DAG state is append only immutable, it can still be lazy evaluated, i.e. a block can have a “valid headers didn’t validate content” status(UTXOPendingVerification) that if needed might later change to a more complete status that also says if the content is valid or not (Valid/DisqualifiedFromChain).
So in these cases the DAG might not be immutable per-se but it’s still conceptually immutable, just lazy evaluated (if we would eager evaluate we will reach the exact same result).