Minimal Substrate node configured for smart contracts via pallet-contracts.
substrate-contracts-node
This repository contains Substrate's node-template configured to include Substrate's pallet-contracts ‒ a smart contract module.
_This repository contains a couple of modifications that make it unsuitable for a production deployment, but a great fit for development and testing:_
- The unstable features of the
pallet-contracts
runtime/Cargo.toml).
- The consensus algorithm has been switched to
manual-sealin
grandpa or aura.
* By default, either manual or instant seal does not result in block finalization unless the engine_finalizeBlock
RPC is executed. However, it is possible to configure the finalization of sealed blocks to occur after a certain
amount of time by setting the --finalize-delay-sec option to a specific value, which specifies the number of seconds
to delay before finalizing the blocks. The default value is 1 second.
./target/release/substrate-contracts-node --finalize-delay-sec 5
- _If no CLI arguments are passed the node is started in development mode
- A custom logging filter is applied by default that hides block production noise
- _With each start of the node process the chain starts from genesis ‒ so no
--base-path._
- For
pallet_contracts::Configwe increased the allowed contract sizes. This
CodeTooLarge when uploading contracts during development.
See the comment in runtime/src/lib.rs
for more details.
If you are looking for a node suitable for production see these configurations:
- Substrate Node Template
- Substrate Cumulus Parachain Template
- Contracts Parachain Configuration for Rococo
Installation
Download Binary
The easiest way is to download a binary release from our releases page and just execute ./substrate-contracts-node.
Build Locally
Follow the official installation steps to set up all Substrate prerequisites.
Afterwards you can install this node via
cargo install contracts-node
Usage
To run a local dev node execute
substrate-contracts-node
A new chain in temporary directory will be created each time the command is executed. This is the default for this node. If you want to persist chain state across runs you need to specify a directory with --base-path.
See our FAQ for more details: How do I print something to the console from the runtime?.
Connect with frontend
Once the node template is running locally, you can connect to it with frontends like Contracts UI or Polkadot-JS Apps and interact with your chain.
How to upgrade to new Polkadot release
We can have two types of releases:
- Internal release: This type of release does not involve releasing the crates on crates.io. It involves using Git
- Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml
- [ ] Check Substrate's
solochain-template,
- [ ] Apply each commit that happened in this
solochain-templatefolder since the last sync. - [ ] Check
parachain-template
- [ ] Check commits for
pallet-contracts
- [ ] (Crate release only) Execute
psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions.
X.X.X with the requested Polkadot release version.
- [ ] (Internal release only) Manually update the dependencies in Cargo.toml to the required Git SHA versions.
- [ ] Increment the minor version number in
Cargo.tomlandnode/Cargo.toml. - [ ] Execute
cargo run --release. If successful, it should produce blocks
Cargo.lock will be created.
- [ ] Create a PR with the changes, have it reviewed.
- [ ] (Crate release only) Upload crates to
crates.iousing the commands below, replacingXXwith your incremented
cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --execute
cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node --execute
Note: Before uploading, perform a dry run to ensure that it will be successful.
- [ ] Merge the release PR branch.
- [ ] Set the tag and run the following commands to push the tag. The tag must contain a message, otherwise the github action won't be able to create a release:
TAG="v0.XX.0"
git checkout main
git pull
git tag -a ${TAG} -m "${TAG}"
git push origin ${TAG}
- [ ] After tag is pushed CI creates a GitHub draft release.
polkadot-v1.8.0 branch."
and publish it.