Build using no_std#

This guide shows how to enable no_std for your rust smart contract, potentially reducing the size of the resulting Wasm module by several kilobytes.

Preparation#

Compiling concordium-std without the std feature requires using the rust nightly toolchain, which can be installed using rustup:

$rustup toolchain install nightly

Then add the wasm32 target by using

$rustup +nightly target add wasm32-unknown-unknown

Setting up the module for no_std#

The concordium-std library exposes a std feature, which enables the use of the rust standard library. This feature is enabled by default.

To disable it, one must simply disable default features for the concordium-std in the dependencies of your module. You can update your Cargo.toml file by using:

[dependencies]
concordium-std = { version = "10.0", default-features = false }

Note

To compile your smart contracts, a memory allocator is used. concordium-std version <6.0.0 hard-coded the use of the wee_alloc allocator. In concordium-std version in the range of >=6.0.0 and <10.0.0, wee_alloc is a feature and needs to be explicitly enabled. In concordium-std version >=10.0.0, bump_alloc is a feature and needs to be explicitly enabled. When std feature is enabled, the allocator provided by the Rust standard library is used by default but when the wee_alloc/bump_alloc feature is enabled in addition, bump_alloc ( or wee_alloc) is used instead.

You can enable the std feature and the wee_alloc feature in concordium-std version in the range of >=6.0.0 and <10.0.0 by using:

[dependencies]
concordium-std = {version = "6.0", features = ["wee_alloc"]}

You can enable the std feature and the bump_alloc feature in concordium-std version >=10.0.0 by using:

[dependencies]
concordium-std = {version = "10.0", features = ["bump_alloc"]}

Alternatively, if you want to test with and without wee_alloc/bump_alloc enabled add a wee_alloc/bump_alloc feature to the smart contract crate as follows:

[features]
default = ["std", "bump_alloc"]
std = ["concordium-std/std"]
bump_alloc = ["concordium-std/bump_alloc"]

The above code blocks will use the bump_alloc allocator and not the allocator provided by the Rust standard library when compiled with the default features as follows:

$cargo concordium build

When no_std is used either wee_alloc/bump_alloc must be enabled, or another global allocator must be set in the smart contract. You can add the wee_alloc/bump_alloc feature by using e.g.:

[features]
bump_alloc = ["concordium-std/bump_alloc"]

To be able to toggle between with and without std, also add a std to your own module, which enables the std feature of concordium-std:

[features]
std = ["concordium-std/std"]

This is the setup of the smart contract examples, where std for each smart contract module is enabled by default.

Building the module#

In order to use the nightly toolchain, add +nightly right after cargo:

$cargo +nightly concordium build

If you want to disable the default features of your own smart contract module, you can pass extra arguments for cargo:

$cargo +nightly concordium build -- --no-default-features --features bump_alloc

Note

The above command works with concordium-std version >=10.0.0, because the bump_alloc feature needs to be explicitly enabled.

If you use concordium-std version in the range of >=6.0.0 and <10.0.0 use the following instead:

$cargo +nightly concordium build -- --no-default-features --features wee_alloc

If you use concordium-std version <6.0.0 use the following instead:

$cargo +nightly concordium build -- --no-default-features
Was this article helpful?
Legal information