- install
rustup
Note: You should be running >= version 1.52.1
of the rustc compiler, you can see that version with this command and should see similar output:
$ rustup --version
rustup 1.24.2 (755e2b07e 2021-05-12)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.52.1 (9bc8c42bb 2021-05-09)`
cargo doc --open
- generate documentation and open it in a web browser
cargo build
- compile the project
cargo run --example example
- run the default executable for the current project
cargo test
- run the tests
- tree
- show the dependency tree. Allows searching for specific packages
- install:
cargo install cargo-tree
- invoke:
cargo tree
- clippy
- search the codebase for a large number of lints and bad patterns
- install:
rustup component add clippy
- invoke:
cargo clippy
- expand
- expand macros and procedural macros. Show the code generated by the preprocessor
- useful for debugging
#[macros]
andmacros!()
- install:
cargo install cargo-expand
- invoke
cargo expand path::to::module
The on-chain portions of nomad are written in Solidity. The rust portions are exclusively off-chain. Later, there may be on-chain rust for Near/Solana/ Polkadot.
Nomad will be managed by a number of small off-chain programs ("agents"). Each of these will have a specific role. We want these roles to be simple, and easily described. Each of these agents will connect to a home chain and any number of replicas. They need to be configured with chain connection details and have access to a reliable node for each chain.
Some agent sketches:
updater
- Needs only a connection to the home chain
- Signs upate attestations and submits them to the home chain
watcher
- Observe the home chain
- Observe as many replicas as possible
- Cache updates
- Check for fraud
- Submit fraud to the home chain
- if configured, issue emergency stop transactions
relayer
- Relays signed updates from the home to the replica
processor
- retrieve leaves from home chain
- observe >=1 replica
- generate proofs for the messages
- submit messages and proofs to the replica for processing
- config option: gas params
For Ethereum and Celo connections we use ethers-rs. Please see the docs here.
We use the tokio async runtime environment. Please see the docs here.
nomad-core
- contains implementations of core primitives
- this includes
- traits (interfaces) for the on-chain contracts
- model implementations of the contracts in rust
- merkle tree implementations (for provers)
nomad-base
- contains shared utilities for building off-chain agents
- this includes
- trait implementations for different chains
- shared configuration file formats
- basic setup for an off-chain agent
chains/nomad-ethereum
- interfaces to the ethereum contracts
agents
- each of the off-chain agents implemented thus far
cargo new $AGENT_NAME
- add the new directory name to the workspace
Cargo.toml
- add dependencies to the new directory's
Cargo.toml
- copy most of the dependencies from
nomad-base
- copy most of the dependencies from
- create a new module in
src/$AGENT_NAME.rs
- add a new struct
- implement
nomad_base::NomadAgent
for your struct - your
run
function is the business logic of your agent
- create a new settings module
src/settings.rs
- reuse the
Settings
objects fromnomad_base::settings
- make sure to read the docs :)
- add your own new settings
- reuse the
- in
$AGENT_NAME/src/main.rs
- add
mod _____
declarations for your agent and settings modules - create
main
andsetup
functions - follow the pattern in
nomad-base/src/main.rs
- add
- make a
config
folder and a toml file- Make sure to include your own settings from above