We keep the top-level commitment clean by committing to sub-structures.
control_key_commitment = Hash(
"LIVRE_CTRL_KEY_V1" ||
key_scheme_id || // e.g. ed25519, secp256k1, MPC profile, etc.
public_key_bytes ||
key_metadata_root // optional Merkle root of extra key metadata
)
recovery_key_commitment = Hash(
"LIVRE_RECOVERY_V1" ||
recovery_scheme_id || // e.g. social, hardware, MPC, etc.
recovery_data_root // Merkle root of scheme config
)
attributes_root is the Merkle root of attribute leaves inside the Vault:
attributes_root = MerkleRoot([
leaf(attribute_1),
leaf(attribute_2),
...
])
Each leaf(attribute_i) is a commitment to the attribute descriptor + value
(you already started this in Descriptors & Attributes).
policies_root is the Merkle root of policy leaves, describing: