Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

substrate-contracts-node

Open in GitHub Codespaces

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 are enabled by default (see the runtime/Cargo.toml).
  • The consensus algorithm has been switched to manual-seal in #42. Hereby blocks are authored immediately at every transaction, so there is none of the typical six seconds block time associated with 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 by default.
  • A custom logging filter is applied by default that hides block production noise and prints the contracts debug buffer to the console.
  • With each start of the node process the chain starts from genesis ‒ so no chain state is retained, all contracts will be lost! If you want to retain chain state you have to supply a --base-path.
  • For pallet_contracts::Config we increased the allowed contract sizes. This avoids running into 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:

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 references in the Cargo.toml dependencies. We utilize this type of release for faster iteration when we don't want to wait for the substrate crates to be released.

  • Crate release: This is the preferable type of release, which involves specifying crate versions in the Cargo.toml dependencies and releasing the crates on crates.io..

  • Check Substrate's solochain-template, for new commits between the new polkadot release branch and the one this repository is currently synced with. The current branch is mentioned in the last release.
  • Apply each commit that happened in this solochain-template folder since the last sync.
  • Check parachain-template and apply each commit that has occurred in its folder since the last sync.
  • Check commits for pallet-contracts since the last time someone synchronized this repository with Substrate in order to not miss any important changes.
  • (Crate release only) Execute psvm -p ./Cargo.toml -v X.X.X, to update the dependencies to the required versions. Replace 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.toml and node/Cargo.toml.
  • Execute cargo run --release. If successful, it should produce blocks and a new, up to date, Cargo.lock will be created.
  • Create a PR with the changes, have it reviewed.
  • (Crate release only) Upload crates to crates.io using the commands below, replacing XX with your incremented version number: cargo release 0.XX.0 -v --no-tag --no-push -p contracts-node-runtime -p contracts-parachain-runtime --executecargo 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. This draft release will contain a binary for Linux and Mac and appear under Releases. Add a description in the style of "Synchronized with polkadot-v1.8.0 branch." and publish it.

About

Minimal Substrate node configured for smart contracts via pallet-contracts.

Topics

Resources

Security policy

Stars

135 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages