proto_messages/ibc/core/commitment/v2/models
library
Classes
-
MerklePath
-
MerklePath is the path used to verify commitment proofs, which can be an
arbitrary structured object (defined by a commitment type).
ICS-23 verification supports membership proofs for nested merkle trees.
The ICS-24 standard provable keys MUST be stored in the lowest level tree with an optional prefix.
The IC24 provable tree may then be stored in a higher level tree(s) that hash up to the root hash
stored in the consensus state of the client.
Each element of the path represents the key of a merkle tree from the root to the leaf.
The elements of the path before the final element must be the path to the tree that contains
the ICS24 provable store. Thus, it should remain constant for all ICS24 proofs.
The final element of the path is the key of the leaf in the ICS24 provable store,
Thus IBC core will append the ICS24 path to the final element of the MerklePath
stored in the counterparty to create the full path to the leaf for proof verification.
Examples:
Cosmos SDK:
The Cosmos SDK commits to a multi-tree where each store is an IAVL tree and all store hashes
are hashed in a simple merkle tree to get the final root hash. Thus, the MerklePath in the counterparty
MerklePrefix has the following structure:
"ibc", ""
The core IBC handler will append the ICS24 path to the final element of the MerklePath
like so: "ibc", "{packetCommitmentPath}" which will then be used for final verification.
Ethereum:
The Ethereum client commits to a single Patricia merkle trie. The ICS24 provable store is managed
by the smart contract state. Each smart contract has a specific prefix reserved within the global trie.
Thus the MerklePath in the counterparty is the prefix to the smart contract state in the global trie.
Since there is only one tree in the commitment structure of ethereum the MerklePath in the counterparty
MerklePrefix has the following structure: "IBCCoreContractAddressStoragePrefix"
The core IBC handler will append the ICS24 path to the final element of the MerklePath
like so: "IBCCoreContractAddressStoragePrefix{packetCommitmentPath}" which will then be used for final
verification. Thus the MerklePath in the counterparty MerklePrefix is the nested key path from the root hash of the
consensus state down to the ICS24 provable store. The IBC handler retrieves the counterparty key path to the ICS24
provable store from the MerklePath and appends the ICS24 path to get the final key path to the value being verified
by the client against the root hash in the client's consensus state.