Skip to content

Latest commit

 

History

History
121 lines (85 loc) · 4.21 KB

Structure.adoc

File metadata and controls

121 lines (85 loc) · 4.21 KB

Structure

1. Overview

Substrate is split into multiple levels with increasing opinion and decreasing flexibility:

  • primitives

  • client

  • FRAME (formerly srml)

Putting all these components together we have:

  • Integration Tests

  • Node

  • Node template

  • Subkey

1.1. Runtime

  • found in: /primitives

  • crates prefix: sp-

  • constraints:

    • must be [no_std]

    • crates may not (dev-)depend on crates in other subfolders of this repo

In the lowest level, Substrate defines primitives, interfaces and traits to implement any on-chain Substrate transition system and its interactions with the outside world. This is the lowest level of abstraction and opinion that everything else builds upon.

1.2. Client

  • found in: /client

  • crates prefix: substrate-

  • constraints:

    • crates may not (dev-)depend on any frame--crates

In the client you can find a set of crates to construct the outer substrate-node, implementing outer runtime interfaces, thus it depends on runtime. It provides the outer building blocks like transaction queue, networking layer, database backend, full* and light-client support.

1.3. FRAME (formerly srml)

  • found in: /frame

  • crates prefix: frame- and pallet-

  • constraints:

    • all crates that go on chain must be [no_std]

    • must not (dev-)depend on anything in /client

FRAME is a set of modules that implement specific transition functions and features one might want to have in their runtime.

Pallets are individual modules within FRAME. These are containers that host domain-specific logic. They have the pallet- prefix. For example, pallet-staking contains logic for staking tokens.

There are a few crates with the frame- prefix. These do not contain domain-specific logic. Rather, they are the main FRAME support infrastructure. These are:

  • Executive

  • Metadata

  • Support

  • System

  • Utility

1.4. Integration Tests

  • found in: /test

  • crates prefix: substrate-test

  • constraints:

    • only helpers may be published

    • purely testing crates must be publish = false

All tests that have to pull (dev)-dependencies out of their subtree and would thus break the dependency rules are considered integration tests and should be stored in here. Only helper-crates in here shall be published, everything else is expected to be non-publish.

1.5. Binaries and template

  • found in: /bin

We also provide some binaries pulling from the components creating full applications.

1.5.1. Node

  • found in: /bin/node

The default (testing) application pulling together our recommended setup of substrate-client with a wasm-contracts-supporting frame-runtime. The node pulls it all together, constructs the (upgradable) runtime, and wires up the client around it. You can find an example client, which includes a full wasm-contracts chain in node. This is also what is being built and run if you do cargo run.

1.5.2. Node Template

  • found in: /bin/node-template

We also provide a template to get you started building your own node.

1.5.3. Utils

  • found in: /bin/utils

    • subkey Subkey is a client library to generate keys and sign transactions to send to a substrate node.

    • chain-spec-builder The chain spec builder builds a chain specification that includes a Substrate runtime compiled as WASM. To ensure proper functioning of the included runtime compile (or run) the chain spec builder binary in --release mode.

2. Internal Dependency Tree

+---------------+       +----------------+
|               |       |                |
|    runtime    +<------+   frame        |
|               |       |                |
+------+-----+--+       +-------------+--+
       ^     ^                        ^
       |     +----------------+       |
       |                      |       |
+------+--------+             |       |
|               |             |       |
|   client      |          +--+-------+--------+
|               +<---------+                   |
+---------------+          |                   |
                           |   test  /bin/*    |
                           |                   |
                           |                   |
                           +-------------------+