Gotcha! Holochain RSM

tags: holochain RSM dev usability
  • If you want simple string like hashes (Ahdad232-asdASf) on the client side of the UI, which is relevant to structs such as AgentPubKey, HeaderHash, and EntryHash, you will have to handle the conversions between the object like hashes that are given by default either in the UI, or in the WASM/DNA side. check out the acorn-hc RSM work-in-progress branch to see an example of how to handle that: https://github.com/h-be/acorn-hc/pull/101/commits/daa52863a2d107d2a4f08f804fcb3646719d6561#diff-4a9884160f6114382c30a81ec8eae4fd

    • in general the approach is to wrap any references in your data structures with an intermediary type, called WrappedAgentPubKey, which handles its own serialization and deserialization, instead of AgentPubKey's default
  • RSM crate fixt doesn't compile with latest rust (1.46), downgrade to 1.45.2 and then it should compile (watch issue)

  • Current limits seen in RSM:

    • When committing more than 116/118 entries in the same zome call, or also when doing 20 gets in the same
  • Turn on logs from the conductor with RUST_LOG=debug holochain. Available levels are error, warn, info, debug, trace

  • The new conductor-config.yml does not include the dnas. You can use https://www.npmjs.com/package/@holochain-open-dev/holochain-run-dna to replace hc run for now

  • If you're restarting the conductor, you may want to delete the database in disk, with rm -rf <DB_PATH>. You can see what database path you have configured by looking at your conductor-config.toml, default location in linux is $HOME/.config/holochain/conductor-config.toml. After that, the best way to reinitialize it is with holochain -i.

  • For mac OS catalina users, you may encounter problems (like this) in installing holochain and dna_util with this instruction specifically error in compiling rust_sodium_holochain_fork-sys-0.10.4

--- stderr 
thread 'main' panicked at 'Failed to run './configure':
No such file or directory (os error 2)',
/Users/tats/.cargo/registry/src/github.com-1ecc6299db9ec823/rust_sodium_holochain_fork-sys-0.10.4/build.rs:393:13

If you encounter this problem, then make this change in the build.rs of rust_sodium_holochain_fork-sys-0.10.4 (around L375) then you can run the cargo install for holochain and dna_util again.

// from this
let mut configure_cmd = Command::new("./configure");
// to this
let mut configure_cmd = Command::new(fs::canonicalize(Path::new(&source_dir).join("configure")).unwrap());

If you still encounter the same error after this fix, then install the libsodium from here and unpack the tar.gz (get the latest stable) and copy the configure executable file into the rust_sodium_holochain_fork-sys-0.10.4 directory then try installing again. It should work.

If you see this error:

  type: 'Error',
  data: {
    type: 'RibosomeError',
    data: 'Wasm error while working with Ribosome: CallError("RuntimeError: unknown error")'
  }

watch your entry definitions and if you're creating a entry you haven't listed there.
In case you use Path::from("smt").ensure() this will cause a commit to happen, and MAKE SURE that you have added Path::entry_def() into your entry_defs! call, such as
entry_defs![Path::entry_def()];

  • You can use this to have a dinamic string LinkTag
#[derive(Serialize, Deserialize, SerializedBytes)]
struct StringLinkTag(String);
pub fn link_tag(tag: &str) -> ExternResult<LinkTag> {
    let sb: SerializedBytes = StringLinkTag(tag.into()).try_into()?;
    Ok(LinkTag(sb.bytes().clone()))
}
  • When trying to pass a unix timestamp (like Date.now()) as a serialized input over msgpack (as a zome call), I found that the type that serialized and deserialized it best was an f64. This is relevant if you see the following error, if you are using an Integer type, like u32, or i32
{
  type: 'Error',
  data: {
    type: 'RibosomeError',
    data: 'Wasm error while working with Ribosome: Zome("failed to deserialize args: FromBytes(\\"invalid type: floating point `1601078013087`, expected u64\\")")'
  }
}

On Mac, and contributing to "core"

Select a repo