diff --git a/.devcontainer.json b/.devcontainer.json new file mode 100644 index 0000000000..6fdce8a6a3 --- /dev/null +++ b/.devcontainer.json @@ -0,0 +1,3 @@ +{ + "image": "ghcr.io/zombiezen/codespaces-nix" +} diff --git a/.gitignore b/.gitignore index 5c94a8e1f5..e485e9ccab 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ apps/splitwell/src/test/resources/splitwell-bundle*.tar.gz **/SingletonCookie __pycache__/ docs/src/deployment/observability/metrics_reference.rst +docs/build/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8586929734..73be022083 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -173,3 +173,5 @@ We publish docs from each commit from `main` to https://hyperledger-labs.github.io/splice/. This can often be useful to answer support requests with a docs link even if those docs are still very recent. + +Refer to [docs/README.md](docs/README.md) for details on how to contribute to the documentation. diff --git a/docs/.gitignore b/docs/.gitignore index c83e3e18d7..f3fe999fbd 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,2 +1,4 @@ src/app_dev/api -html/ \ No newline at end of file +html/ +venv/ +build/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000..38040493e4 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,37 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXAUTOBUILD = sphinx-autobuild +SOURCEDIR = src +BUILDDIR = build + +# Put all phony targets here so that file names with the same name as phony targets +# will not confuse make. +.PHONY: help html livehtml clean + +# Default target: show help. +help: + @echo "Please use \`make ' where is one of" + @echo " html to build the HTML documentation" + @echo " livehtml to automatically rebuild and preview the site on changes" + @echo " clean to remove all build files" + +# Build the HTML documentation +html: + @echo "Building HTML documentation..." + $(SPHINXBUILD) -b html $(SOURCEDIR) $(BUILDDIR)/html $(SPHINXOPTS) + @echo "Build finished. Open $(BUILDDIR)/html/index.html to view." + +# Run the live-reloading server for previewing +livehtml: + @echo "Starting live-reloading server..." + @echo "Your browser should open automatically. Press Ctrl+C to stop." + $(SPHINXAUTOBUILD) $(SOURCEDIR) $(BUILDDIR)/html $(SPHINXOPTS) + +# Remove all generated build files +clean: + @echo "Cleaning build directory..." + rm -rf $(BUILDDIR)/* \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 600387845f..981c6e13cb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,10 @@ # Docs -Documentation for all CC functionality. +Developer Documentation for all Splice functionalities. + +## Contributing to the Splice docs + +In order to setup your development environment, please see the [Development README](../DEVELOPMENT.md). ## Development Builds @@ -19,3 +23,19 @@ or other changes that are not picked up by `sphinx-autobuild`. ### Changes When making a change, rebuild the documentation using `sbt docs/bundle`. + +## Simplified build + +For non developers who would rather not [setup a full developer environmnet](../DEVELOPMENT.md), you can preview a version of the doc by: + +- Installing the requirements for the doc only: + +```bash +./install-docs-requirements.sh +``` + +- Building the docs locally: + +```bash +make livehtml +``` diff --git a/docs/build-sphinx-docs.sh b/docs/build-sphinx-docs.sh new file mode 100755 index 0000000000..8dcc78d8a5 --- /dev/null +++ b/docs/build-sphinx-docs.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -eou pipefail + +root_dir=$(cd "$(dirname $0)"; cd ..; pwd -P) +input_dir="${root_dir}/docs/src" +preview_dir="${root_dir}/docs/preview" +config_dir="${root_dir}/docs/src" + +# Let's remove the dir to be 100% sure there are no stale files +# The build is relatively small and we can afford it +rm -Rf $preview_dir + +sphinx-build -M html $input_dir $preview_dir --fresh-env --conf-dir $config_dir --fail-on-warning + +# Make the generated files read-only +find $preview_dir -type f -follow -exec chmod 0444 {} + + +if [[ $# -gt 0 && "$1" == "--with-preview" ]]; then + python -m http.server -d ./doc/preview/html +fi + + +##### +# install +##### +# brew install pyenv +# pyenv install 3.10.13 +# cd /Users/simonletort/Documents/GitHub/splice +# pyenv local 3.10.13 +# pyenv virtualenv 3.10.13 splice-docs +# pyenv local splice-docs +# pip install sphinx sphinx-autobuild pyyaml +# which python +# python --version diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000000..3b33caa108 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,27 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'Sphinx' +copyright = '2025, Ethan Cohen' +author = 'Ethan Cohen' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000000..688e22cb32 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,17 @@ +.. Sphinx documentation master file, created by + sphinx-quickstart on Tue Jun 17 14:38:50 2025. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Sphinx documentation +==================== + +Add your content using ``reStructuredText`` syntax. See the +`reStructuredText `_ +documentation for details. + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + diff --git a/docs/install-docs-requirements.sh b/docs/install-docs-requirements.sh new file mode 100755 index 0000000000..cef77fe3f1 --- /dev/null +++ b/docs/install-docs-requirements.sh @@ -0,0 +1,75 @@ +#!/bin/zsh + +# Script to install requirements for building Sphinx docs locally + +set -e +# Check for Xcode Command Line Tools +if ! xcode-select -p &>/dev/null; then + echo "Xcode Command Line Tools not found. Installing..." + xcode-select --install + echo "Check for the install xcode dialog box. Please complete the Xcode Command Line Tools installation, then re-run this script." + exit 1 +fi + +# Check for Homebrew and install if missing +if ! command -v brew &>/dev/null; then + echo "Homebrew not found. Installing Homebrew..." + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + # Add Homebrew to PATH for current session + if [[ -d "/opt/homebrew/bin" ]]; then + export PATH="/opt/homebrew/bin:$PATH" + elif [[ -d "/usr/local/bin" ]]; then + export PATH="/usr/local/bin:$PATH" + fi +fi + +# Check for pyenv and install if missing +if ! command -v pyenv &>/dev/null; then + echo "pyenv not found. Installing with Homebrew..." + if ! command -v brew &>/dev/null; then + echo "Homebrew is required to install pyenv. Please install Homebrew first." + exit 1 + fi + brew install pyenv +fi + +# Ensure desired Python version is installed via pyenv +PYTHON_VERSION="3.11.9" +if ! pyenv versions --bare | grep -qx "$PYTHON_VERSION"; then + echo "Installing Python $PYTHON_VERSION with pyenv..." + pyenv install "$PYTHON_VERSION" +fi + +# Create virtual environment using pyenv if not exists +if [ ! -d "venv" ]; then + pyenv shell "$PYTHON_VERSION" + python -m venv venv-splice-docs + echo "Created virtual environment in ./venv using pyenv Python $PYTHON_VERSION" +fi + +# Activate virtual environment +source venv/bin/activate + +# Upgrade pip +pip install --upgrade pip + +# Install additional requirements if requirements.txt exists +echo "Installing build requirements..." +if [ -f "requirements.txt" ]; then + pip install -r requirements.txt +fi + +# Check for direnv and install if missing +if ! command -v direnv &>/dev/null; then + echo "direnv not found. Installing with Homebrew..." + if ! command -v brew &>/dev/null; then + echo "Homebrew is required to install direnv. Please install Homebrew first." + exit 1 + fi + brew install direnv +fi + +export SPLICE_ROOT="${PWD}" + +echo "Sphinx documentation build requirements installed." +# echo "To activate the virtual environment, run: source venv/bin/activate" diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000000..32bb24529f --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000000..ad7c2c48ea --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,7 @@ +pyyaml +sphinx +sphinx_rtd_theme +sphinx-copybutton +sphinx_reredirects +sphinxcontrib-openapi +sphinx-autobuild diff --git a/docs/src/Overview.rst b/docs/src/Overview.rst new file mode 100644 index 0000000000..a7576d21d3 --- /dev/null +++ b/docs/src/Overview.rst @@ -0,0 +1,118 @@ +.. + Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +.. + SPDX-License-Identifier: Apache-2.0 + +Overview +======== + +Below is a high-level summary of the key concepts and technology relevant to operating a Validator. This summary focuses on what matters for validator operation, the benefits from the token economics, and the underlying technology. + +Role of a Validator +----------------------------- + +* **Definition & Function:** +A Validator in the Global Synchronizer ecosystem primary roles are to: + * **Validate transactions:** Process and validate both Canton application transactions (built using Daml) and Canton Coin transfers. + * **Record activity:** Create “activity records” (for example, for coin usage and uptime) that later form the basis for minting rewards. + * **Facilitate network connectivity:** Serve as an endpoint for users (via their participant nodes) connecting to the decentralized Global Synchronizer (the infrastructure layer that orders and delivers messages among nodes). + * **Coordinate upgrades and migrations:** Automates adoption of Daml model upgrades as required by the operators of the Global Synchronizer, and supports major version upgrades of the underlying Canton protocol. + +* **Operational context:** +Validators work within the broader Canton Network—a “network of networks” where each node stores only the data it needs (thanks to Daml’s privacy model) and synchronizes with other Validators (and non-Validator Participant nodes) via synchronizers. Validators typically connect to one or more of these synchronizers (which might be run as centralized or decentralized services) to receive and confirm encrypted messages. + +Validator Operation & Underlying Technology +----------------------------- + +* **Daml Ledger Model & Privacy:** The system is built on the Daml smart contract language and ledger model. + * **Hierarchical Transactions:** Transactions are composed of sub-transactions. Only the parties to the sub-transactions (and therefore the validators serving them) are authorized to see the relevant nodes of each transaction tree. + * **Privacy by Design:** Validators only process the data relevant to their hosted users, preserving privacy while still participating in a global, virtual ledger. + +* **Synchronizers and Message Ordering:** + * Validators connect to synchronizers (aka Canton Service Providers, CSPs) to get a total order of encrypted messages. + * The Global Synchronizer (deployed by a set of independent Super Validators) is a decentralized instance of a Canton synchronizer. It uses a Byzantine Fault Tolerant (BFT) consensus protocol to sequence transactions, ensuring that all validators receive a consistent ordering for any part of the ledger they see. + +* **Confirmation Protocol and Message Ordering:** + * When a transaction is initiated, it is structured into a tree, where each node in the tree represents a subtransaction in the overall atomic transaction. This means the transaction is “chopped” into pieces based on Daml’s privacy rules + * Each validator receives only the portion of the transaction tree that the parties hosted on that Validator will verify. + * A two-step confirmation process (a two-phase atomic commit with rollback) is used to both lock the involved contracts and ensure that all required parties have confirmed the transaction before it is finalized. + +* **Resource and Traffic Management:** + * Validators must manage bandwidth and storage usage since each transaction synchronized on the Global Synchronizer, e.g. Canton Coin transfers is associated with resource usage fees (e.g., base transfer fees, coin locking fees, holding fees, and traffic fees). + * To create new traffic balances (expressed in megabytes), Validators burn Canton Coin and send proof of the burn to Super Validators, who then update the traffic balance for the Validator. This ensures that transaction sequencing and message delivery remain efficient. + +Token Economics & Minting Incentives +------------------------------ + +* **Burnt-Mint Equilibrium:** + * **Fee Burninng:** Users pay fees (denominated in USD but paid by burning Canton Coin) when they initiate Canton Coin transfers or when they create a traffic balance. Instead of paying these fees to a central authority, the coins are burned—i.e., removed from circulation. + * **Minting Rewards:** Validators (as well as Super Validators and application providers) can mint new Canton Coins in return for their “utility” contributions: + * **Infrastructure Operation:** Super Validators operating synchronizer nodes earn minting rights by contributing to the synchronization service. + * **Application Services:** Application providers can earn rewards any time they facilitate a transaction. + * **Coin Usage:** When a user’s transfer (or coin burning) takes place via a Validator’s node, that Validator earns “minting rights” proportional to the fees (activity record weight) generated. + * **Liveness Incentives:** Validators are rewarded for uptime and for being ready to serve transaction traffic. If a Validator does not use all its minting allowance via direct activity, a portion is allocated as a “liveness” bonus. + * **Dynamic Equilibrium:** The system is designed so that, over the long term, the total amount of coins burned (which reflects actual network utility) roughly balances the coins minted (subject to a predetermined maximum allowed minting curve). When usage is high, more coins are burned, tending to increase the token’s conversion rate; when usage is lower, supply increases until balance is restored. + +* **Minting Curve and Allocation:** + * The minting curve specifies both the total number of Canton Coins that can be minted in each period (round) and the split among stakeholder groups. + * **Distribution Split:** The total mintable supply is shared between infrastructure providers (validators and super validators) and application providers. Early on, Super Validators (who operate both synchronization and validator services) earn a higher share; over time, the application provider and validator pools grow relative to the super validator pool. + * **Caps and Featured Applications:** + * There are limits (“caps”) on how much a Validator or App can mint per unit of “activity record weight.” + * These measures are in place to prevent gaming the system. + * Some applications can be “featured” by a vote of Super Validators, which raises minting caps for their associated activity. +* **Fee Structure Details:** + * **Transfer Fees:** + * A small percentage fee is applied to transfers (with regressive tiers so that higher-value transactions incur lower percentage fees). + * **Resource Usage Fee:** + * These fees cover the cost of network resources and include a base fee per output coin, coin locking fees, holding fees (to incentivize merging coins), and synchronizer traffic fees. + * **Fee conversion:** + * The conversion between USD-denominated fees and Canton Coin is updated every minting cycle, with the conversion rate determined on-chain by Super Validators. + +Benefits and Practical Considerations for Node Operators +----------------------------- + +* **Direct Financial Incentives:** + * As a Validator operator, you earn Canton Coins by processing transactions. Your rewards come from + * Minting for facilitating coin transfers (coin usage minting). + * Liveness rewards for uptime and responsiveness. + * As an Application Provider, you earn Canton Coins by processing transactions using the Global Synchronizer. Over time, minting by Application Providers approaches 50% of the total Canton Coin supply. + * Over time, as the network usage increases (and fees burned increase), the validator’s ability to mint more coins may provide a competitive economic incentive. + +* **Scalability and Efficiency:** + * Validators process only the subset of the ledger relevant to their hosted users. This horizontal scalability means that your node can operate efficiently without having to store or validate every transaction on the network. + * The use of multiple synchronizers (and the ability to connect to one or more centralized or decentralized synchronizers) reduces network bottlenecks and allows you to choose the infrastructure that best meets your latency, throughput, and trust requirements. + +* **Operational Flexibility:** + * Validators can operate either as independent node operators (hosting their own participant node) or as part of a broader infrastructure offering. + * The system’s architecture and fee structure offer optionality: you may choose to prepay network traffic using Canton Coin or negotiate arrangements (for example, with third-party service providers) that suit your operational profile. + +In Summary +----------------------------- + +A Validator is not just a passive participant; it is an active contributor to both the integrity and the economic dynamics of the Canton Network. By: + +* **Validating transactions** in a privacy-first, Daml-based ledger, +* **Connecting to and synchronizing with decentralized synchronizers** using BFT protocols, +* **Recording activity and facilitating fee burns** that underlie the Burn-Mint Equilibrium mechanism, +* And **earning new coins based on actual network utility and uptime,** + +You, as a node operator, play a central role in maintaining network consistency, security, and scalability while also benefiting from the token economics designed to reward real-world utility. + +This synthesis should give you a clear overview of the technology stack and economic incentives tied to operating a Validator. If you need more details on any particular mechanism (such as fee calculations, activity record structure, or minting rounds), the following white papers provides further technical specifications: + +* `Canton Network `_ +* `Canton Coin `_ + + + + + + + +.. todo:: add overview of the deployment docs explaining + + - difference between SV and validator nodes + - docker compose vs. helm based deployments + - available networks and releases and their difference + + Consider inlining these into the SV and validator node docs diff --git a/docs/src/conf.py b/docs/src/conf.py index a1eeebc8b6..5c09e9d68e 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -130,54 +130,54 @@ def make_id(string): obj = yaml.safe_load(f) daml_sdk_version = obj["sdk-version"] -with open(os.path.join(os.getenv("CANTON"), "SUBDIR")) as f: - canton_subdir = f.readline() - -version = os.getenv("VERSION") -if not version: - print("Environment variable VERSION must be set") - sys.exit(1) -chart_version = version - -if re.match(r"^[0-9]+.[0-9]+.[0-9]+$", version): - # For releases, we download artifacts from GitHub Releases - download_url = f"https://github.com/digital-asset/decentralized-canton-sync/releases/download/v{version}" - helm_repo_prefix = os.getenv("OCI_RELEASE_HELM_REGISTRY") - docker_repo_prefix = os.getenv("RELEASE_DOCKER_REGISTRY") -else: - # For snapshots, we download artifacts through the gcs proxy on the cluster - download_url = "/cn-release-bundles" - helm_repo_prefix = os.getenv("OCI_DEV_HELM_REGISTRY") - docker_repo_prefix = os.getenv("DEV_DOCKER_REGISTRY") +# with open(os.path.join(os.getenv("CANTON"), "SUBDIR")) as f: +# canton_subdir = f.readline() + +# version = os.getenv("VERSION") +# if not version: +# print("Environment variable VERSION must be set") +# sys.exit(1) +# chart_version = version + +# if re.match(r"^[0-9]+.[0-9]+.[0-9]+$", version): +# # For releases, we download artifacts from GitHub Releases +# download_url = f"https://github.com/digital-asset/decentralized-canton-sync/releases/download/v{version}" +# helm_repo_prefix = os.getenv("OCI_RELEASE_HELM_REGISTRY") +# docker_repo_prefix = os.getenv("RELEASE_DOCKER_REGISTRY") +# else: +# # For snapshots, we download artifacts through the gcs proxy on the cluster +# download_url = "/cn-release-bundles" +# helm_repo_prefix = os.getenv("OCI_DEV_HELM_REGISTRY") +# docker_repo_prefix = os.getenv("DEV_DOCKER_REGISTRY") # Sphinx does not allow something like ``|version|`` # so instead we define a replacement that includes the formatting. -rst_prolog = f""" -.. role:: raw-html(raw) - :format: html - -.. |splice_cluster| replace:: :raw-html:`unknown_cluster` - -.. |da_hostname| replace:: :raw-html:`unknown_cluster.global.canton.network.digitalasset.com` -.. |gsf_sv_url| replace:: :raw-html:`https://sv.sv-1.unknown_cluster.global.canton.network.sync.global` -.. |generic_sv_url| replace:: :raw-html:`https://sv.sv-1.unknown_cluster.global.canton.network.YOUR_SV_SPONSOR` -.. |gsf_scan_url| replace:: :raw-html:`https://scan.sv-1.unknown_cluster.global.canton.network.sync.global` -.. |generic_scan_url| replace:: :raw-html:`https://scan.sv-1.unknown_cluster.global.canton.network.YOUR_SV_SPONSOR` -.. |gsf_sequencer_url| replace:: :raw-html:`https://sequencer-MIGRATION_ID.sv-1.unknown_cluster.global.canton.network.sync.global` - -.. |version_literal| replace:: ``{version}`` -.. |chart_version_literal| replace:: ``{chart_version}`` -.. |canton_version| replace:: {canton_version} -.. |canton_subdir| replace:: {canton_subdir} -.. |daml_sdk_tooling_version| replace:: {daml_sdk_tooling_version} -.. |daml_sdk_version| replace:: {daml_sdk_version} - -.. |chart_version_set| replace:: ``export CHART_VERSION={chart_version}`` -.. |image_tag_set| replace:: ``export IMAGE_TAG={version}`` - -.. |bundle_download_link| replace:: :raw-html:`Download Bundle` -.. |openapi_download_link| replace:: :raw-html:`Download OpenAPI specs` - -.. |helm_repo_prefix| replace:: {helm_repo_prefix} -.. |docker_repo_prefix| replace:: {docker_repo_prefix} -""" +# rst_prolog = f""" +# .. role:: raw-html(raw) +# :format: html + +# .. |splice_cluster| replace:: :raw-html:`unknown_cluster` + +# .. |da_hostname| replace:: :raw-html:`unknown_cluster.global.canton.network.digitalasset.com` +# .. |gsf_sv_url| replace:: :raw-html:`https://sv.sv-1.unknown_cluster.global.canton.network.sync.global` +# .. |generic_sv_url| replace:: :raw-html:`https://sv.sv-1.unknown_cluster.global.canton.network.YOUR_SV_SPONSOR` +# .. |gsf_scan_url| replace:: :raw-html:`https://scan.sv-1.unknown_cluster.global.canton.network.sync.global` +# .. |generic_scan_url| replace:: :raw-html:`https://scan.sv-1.unknown_cluster.global.canton.network.YOUR_SV_SPONSOR` +# .. |gsf_sequencer_url| replace:: :raw-html:`https://sequencer-MIGRATION_ID.sv-1.unknown_cluster.global.canton.network.sync.global` + +# .. |version_literal| replace:: ``{version}`` +# .. |chart_version_literal| replace:: ``{chart_version}`` +# .. |canton_version| replace:: {canton_version} +# .. |canton_subdir| replace:: {canton_subdir} +# .. |daml_sdk_tooling_version| replace:: {daml_sdk_tooling_version} +# .. |daml_sdk_version| replace:: {daml_sdk_version} + +# .. |chart_version_set| replace:: ``export CHART_VERSION={chart_version}`` +# .. |image_tag_set| replace:: ``export IMAGE_TAG={version}`` + +# .. |bundle_download_link| replace:: :raw-html:`Download Bundle` +# .. |openapi_download_link| replace:: :raw-html:`Download OpenAPI specs` + +# .. |helm_repo_prefix| replace:: {helm_repo_prefix} +# .. |docker_repo_prefix| replace:: {docker_repo_prefix} +# """ diff --git a/docs/src/deployment.rst b/docs/src/deployment.rst deleted file mode 100644 index 9c8837875b..0000000000 --- a/docs/src/deployment.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. - Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -.. - SPDX-License-Identifier: Apache-2.0 - -Overview -======== - -.. todo:: add overview of the deployment docs explaining - - - difference between SV and validator nodes - - docker compose vs. helm based deployments - - available networks and releases and their difference - - Consider inlining these into the SV and validator node docs diff --git a/docs/src/faq.rst b/docs/src/faq.rst index 5a62ac8f5c..ef2ddcc181 100644 --- a/docs/src/faq.rst +++ b/docs/src/faq.rst @@ -8,6 +8,18 @@ FAQ === +Contributing +++++++++++++++++ + +.. glossary:: + + How can I contribute to the project? + + The project welcomes contributions! Please see the + `contribution guidelines `_ + for instructions on how to get started. + + Super Validators ++++++++++++++++ @@ -36,4 +48,4 @@ Validators .. image:: images/transaction_history.png :width: 700 - :alt: Transaction history showing a validator reward transaction. \ No newline at end of file + :alt: Transaction history showing a validator reward transaction. diff --git a/docs/src/index.rst b/docs/src/index.rst index 6acee7bc69..076ea75028 100644 --- a/docs/src/index.rst +++ b/docs/src/index.rst @@ -22,11 +22,16 @@ Global Synchronizer for the Canton Network .. todo:: Add the usual "Edit on GitHub" link to the top of the page +.. toctree:: + :maxdepth: 2 + :caption: Overview + + overview.rst + .. toctree:: :maxdepth: 2 :caption: Deployment and Operations - deployment.rst validator_operator/index.rst sv_operator/index.rst deployment/index.rst