Expand description

Learn about how to add custom host functions to the node.

§Custom Host Functions

Host functions are functions that the wasm instance can use to communicate with the node. Learn more about this in crate::reference_docs::wasm_meta_protocol.

§Finding Host Functions

To declare a set of functions as host functions, you need to use the #[runtime_interface] (sp_runtime_interface) attribute macro. The most notable set of host functions are those that allow the runtime to access the chain state, namely sp_io::storage. Some other notable host functions are also defined in sp_io.

§Adding New Host Functions

Adding a new host function is a big commitment and should be done with care. Namely, the nodes in the network need to support all host functions forever in order to be able to sync historical blocks.

Adding host functions is only possible when you are using a node-template, so that you have access to the boilerplate of building your node.

A group of host functions can always be grouped to gether as a tuple:

#[cfg(feature = "std")]
pub type SubstrateHostFunctions = (
	storage::HostFunctions,
	default_child_storage::HostFunctions,
	misc::HostFunctions,
	wasm_tracing::HostFunctions,
	offchain::HostFunctions,
	crypto::HostFunctions,
	hashing::HostFunctions,
	allocator::HostFunctions,
	panic_handler::HostFunctions,
	logging::HostFunctions,
	crate::trie::HostFunctions,
	offchain_index::HostFunctions,
	transaction_index::HostFunctions,
);

The host functions are attached to the node side’s sc_executor::WasmExecutor. For example in the minimal template, the setup looks as follows:

pub(crate) type FullClient =
	sc_service::TFullClient<Block, RuntimeApi, WasmExecutor<HostFunctions>>;