# RSM Migration Guide ###### tags: `holochain` `RSM` `usability` `comms` ## Data structures | Holochain-Redux | Holochain-RSM | Comment | | --- | --- | --- | | Headers contain the signature of the entry | Agents now sign the header and the (Header, Signature) pair is what gets distributed to the DHT | | | There is only one Header structure, link and CRUD entry go in a dedicated entry type | There are multiple Headers structures, in which link and CRUD information are stored | | | Entries and headers don't have a joint struct since they are not used together very often | An `Element` is defined as a `Header` alongside its `Entry` | The majority of HDK calls return `Elements` | ## Design | Holochain-Redux | Holochain-RSM | Comment | | --- | --- | --- | | Link definitions are static, can only contain type and tag string | Link definitions are dynamic, can contain any arbitrary structure || | You can only validate an agent with their public key and nickname | There is a new JoinProof entry that you can pass when installing a DNA to prove that you have permissions to join it | | | You have no way to retrieve all the headers committed by an agent | There will be a way to get all the activity for one agent (all their headers) | | ### CRUD | Holochain-Redux | Holochain-RSM | Comment | | --- | --- | --- | | An entry can be only updated once | An entry can be updated multiple times | In the future, redirect callbacks and update back-propagation may be introduced | | Update and delete receive an entry hash | Update and delete receive the hash of the header | This avoids update loops completely! | | If you delete an entry, that entry is dead forever (tombstone set) | If any header of an entry is not deleted, the entry is still alive | | | An agent can query their source chain by entry type names and give a start/end range | An agent can query their source chain by header types (system types or CRUD actions), app vs system entry types, give a start/end range, and include/exclude entry content | While a query can filter app entries from system entries, it can't currently filter on specific app entry types | ## Development | Holochain-Redux | Holochain-RSM | Comment | | --- | --- | --- | |`send/receive` JsonString messages | `call_remote` specifies which function you want to call || | Capabilities are statically defined besides the zome function | Capabilities can be dynamically granted or revoked for any function to any agent | | | Anchors are defined in a separate crate | Paths are a generalization of anchors pre-defined in core || | Validation callbacks are defined alongside the entries and links definitions | Validation callbacks are defined like any other zome function, with various degree of specificity | | | JsonString is used for input/output parameters, and entry content. Structs used in all these cases must implement `DefaultJson` | SerializedBytes is used for input/output parameters, and entry content. Structs used in all these cases must implement `SerializedBytes`. There can only be one input and one output parameter for zome functions | | | Instances are identified by an arbitrary string `instance_id` | Cells (instances) are identified by the pair [DNA_HASH, AGENT_PUB_KEY] || | All hashes and public keys are identified by the `Address` type | Each type of hash has a dedicated rust type (`EntryHash`, `HeaderHash`) | [holo_hash crate](https://github.com/holochain/holochain/tree/develop/crates/holo_hash) | | The only callbacks available are `ìnit`, `validate_agent` and the validation callbacks | There will be a lot of useful "hooks": `app_install`, `app_uninstall`, `post_commit`... | | | The instances running in the conductor are defined and maintained in the `conductor-config.toml` | The `conductor-config.toml` only contains initial environment settings, the cells are stored in a dynamic database || | Zome functions are not transactional: an initial commit can succeed and stay committed even if a following commit fails | All zome functions are transactional, the call fails and rolls back all state changes if anything fails inside that call | | | If `get_entry` fails in a validation rule, the validation rule fails altogether | If a `get` fails or returns `None`, holochain will pause the validation and retry again in the future | You can specify yourself that a dependency is missing in order to validate this entry in the validation callback | ### HDK calls | Holochain-Redux | Holochain-RSM | Comment | | --- | --- | --- | | `commit_entry` returns the entry hash | `create_entry` returns the header hash | | | `get_entry` returns only the Entry | `get` returns the latest `Element` (`Header` + `Entry`) || | `hdk::AGENT_ADDRESS` gets you the initial public key of the agent | `agent_info()` gets you both the initial and the latest public key for the agent || | `hdk::DNA_ADDRESS` gets you the hash of the DNA | `zome_info` gets you the DNA name and hash, and the zome name || | Update and get entry update and get the latest version of the entry | Update and get entry deal with the entry corresponding to the given hash | | | There are multiple variations of some zome calls: `get_entry`, `get_entry_result`, `get_entry_as_type`... | There are two variations of `get` (`get` and `get_details`) and `get_links` (`get_links` and `get_links_details`) | In RSM, the details calls retrieve all the information about the entry/link that is available in the DHT (for example, all its headers, CRUD status, etc.) while simple ones get you the latest header and the entry |