Expand description

This module allows for inspection and instrumentation, i.e. modifying the module to alter it’s structure or behavior, of a wasm module.

Instrumentation

In ideal world, there would be no instrumentation. However, in the real world the execution engines we use are somewhat limited in their APIs or abilities.

To give you some examples:

We need to reset the globals because when we execute the Substrate Runtime, we do not drop and create the instance anew, instead we restore some selected parts of the state.

  • stack depth metering can be performed via instrumentation or deferred to the engine and say be added directly in machine code. Implementing this in machine code is rather cumbersome so instrumentation looks like a good solution.

    Stack depth metering is needed to make a wasm blob execution deterministic, which in turn is needed by the Parachain Validation Function in Polkadot.

Inspection

Inspection of a wasm module may be needed to extract some useful information, such as to extract data segment snapshot, which is helpful for quickly restoring the initial state of instances. Inspection can be also useful to prove that a wasm module possesses some properties, such as, is free of any floating point operations, which is a useful step towards making instances produced from such a module deterministic.

Structs

  • This is a snapshot of data segments specialzied for a particular instantiation.
  • A set of exposed mutable globals.
  • A snapshot of a global variables values. This snapshot can be later used for restoring the values to the preserved state.
  • A bunch of information collected from a WebAssembly module.

Traits

  • An adapter for a wasm module instance that is focused on getting and setting globals.