Reducing a contract's size
Advice & examples
This page is made for developers familiar with lower-level concepts who wish to reduce their contract size significantly, perhaps at the expense of code readability.
Some common scenarios where this approach may be helpful:
- contracts intended to be tied to one's account management
- contracts deployed using a factory
- future advancements similar to the EVM on NEAR
There have been a few items that may add unwanted bytes to a contract's size when compiled. Some of these may be more easily swapped for other approaches while others require more internal knowledge about system calls.
Small wins
Using flags
When compiling a contract make sure to pass flag -C link-arg=-s
to the rust compiler:
RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release
Here is the parameters we use for the most examples in Cargo.toml
:
[profile.release]
codegen-units = 1
opt-level = "s"
lto = true
debug = false
panic = "abort"
overflow-checks = true
You may want to experiment with using opt-level = "z"
instead of opt-level = "s"
to see if generates a smaller binary. See more details on this in The Cargo Book Profiles section. You may also reference this Shrinking .wasm Size resource.