From f21b46e224106dfac21b1181fc3f33a94c383008 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Tue, 20 Jan 2026 08:44:35 -0300 Subject: [PATCH 1/3] Update fundamentals/certification-system --- docs/cli/Guides/tgwui.md | 6 +- docs/fundamentals/certification.md | 60 ++++++++++++++---- .../certification-system-architecture.png | Bin 21355 -> 32041 bytes src/theme/Layout/index.js | 12 ++++ 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md index e12f58ef..87602534 100644 --- a/docs/cli/Guides/tgwui.md +++ b/docs/cli/Guides/tgwui.md @@ -231,4 +231,8 @@ The most important statuses (see the [full list](/fundamentals/orders#compute-or - **Processing**: The compute is executing the order inside a TEE. Your model is either already available or will be available soon. - **In Queue**: The order is waiting for the compute to become available. This status appears only if the compute is overloaded with orders. If this status persists for a few minutes, place a new main order the same tunnel order and engine configuration but another compute offer. - **Done**: The order is completed successfully and the model's UI is no longer available. -- **Error**: The order completed with an error. [Download the order results](/cli/commands/orders/download-result) to get more information about the error. \ No newline at end of file +- **Error**: The order completed with an error. [Download the order results](/cli/commands/orders/download-result) to get more information about the error. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/fundamentals/certification.md b/docs/fundamentals/certification.md index a943c6b5..0dfd2161 100644 --- a/docs/fundamentals/certification.md +++ b/docs/fundamentals/certification.md @@ -5,37 +5,67 @@ slug: "/certification" sidebar_position: 6 --- -Super Protocol uses a certification system for signing data, verifying signatures, and ensuring applications operate within a trusted confidential computing environment. Verified data is published on the blockchain on behalf of confidential containers, allowing anyone to validate application integrity and ensure confidentiality. End users only interact with issued certificates and verify signatures, while the complexities of Remote Attestation are seamlessly managed in the background. +The Super Protocol Certification System is a hierarchical infrastructure for managing trust in confidential computing environments. The main purpose of the system is to create a valid chain of X.509 certificates for any applications running in Trusted Execution Environments (TEEs). The Certification System itself also operates within TEEs, ensuring the entire chain is rooted in hardware-based trust. -All the system components are open-source, ensuring transparency and verifiability. +The Certification System performs remote attestation under the hood, but exposes a familiar X.509-style certificate chain on the surface. This allows any verifier (a user, an auditor, or an automated service) to validate that: + +- The execution took place within a TEE. +- The certificate chain leading to the workload is valid and trusted. + +The Certification System can function as an independent, standalone service. In this capacity, it could serve external companies and users who need to establish certificate chains for their own confidential computing applications. + +Note that the system is not responsible for validating what an application does internally. Its primary role is to issue certificates to trusted confidential environments, forming a cryptographically verifiable trust chain. + +All system components are planned to be open-sourced, improving transparency and verifiability. ## Architecture -The backbone of the system is a hierarchical structure of Certification Authorities operating inside Trusted Execution Environments (TEE)—Intel SGX enclaves. +The Certification System is organized as a hierarchy of Certification Authorities (CAs) that establishes trust for TEEs through a standard certificate chain. Every CA operates within a TEE—Intel SGX enclave.

-The Root Certification Authority (*Root CA*) is located at the highest hierarchical level. At the start, Root CA generates a self-signed certificate, embedding the SGX attestation quote. +The chain consists of three levels: + +- Root CA is the top-level certificate authority that establishes the trust anchor for the entire system. At the start, it generates a self-signed certificate, embedding the SGX attestation quote. +- SubRoot CAs are intermediate certificate authorities. They submit their quotes and public keys to the Root CA and request certificates. The Root CA verifies these incoming requests and then issues and signs certificates for the SubRoot CAs. Once a SubRoot CA is certified by the Root CA, it can certify any TEE-backed environment that proves it is actually confidential. +- End certificates are issued to specific workloads, entire Confidential Virtual Machines (CVMs) running in TEEs, and in some other cases. These certificates are not CAs and cannot be used to sign or issue other certificates. + +Each level in the hierarchy receives its certificate from the level above, creating a chain of trust that ultimately traces back to the Root CA. + +## Trusted Loader -SubRoot Certification Authorities (*SubRoot CAs*) are located at the next hierarchical level. These submit their quotes and public keys to the Root CA and request certificates. The Root CA verifies these incoming requests and then issues and signs certificates for the SubRoot CAs. +Trusted Loader is a special service that prepares and launches the workload associated with an order inside a CVM running in a TEE. It runs in a privileged position within the execution environment, allowing it to access the underlying attestation capabilities of the platform. Workloads themselves do not have such access. -The SubRoot CAs, in turn, issue and sign certificates for orders by request. +Trusted Loader also: + +- Collects hashes of the workload and its components. +- Verifies workload integrity before execution starts. +- Requests end certificates. + +All end certificates are requested and received by Trusted Loader. Other components do not interact directly with Certificate Authorities. Trusted Loader may request certificates in several cases: + +- At startup. The certificate confirms that the confidential environment is correctly configured and that the attestation challenge (TDX, SEV-SNP, etc.) matches expectations. +- When generating session keys. The certificate is included in the session key structures used during execution. +- When forming a TEE Confirmation Block (TCB). The certificate is embedded into TCB, which also includes system information and measurements. +- When deploying an order. An order-specific certificate is issued and delivered, along with cryptographic keys, to the order's execution environment. ## Order certificates -The issuing of order certificates involves Trusted Loader—a software mechanism developed by Super Protocol to load and run applications within a TEE. Trusted Loader operates inside the Confidential VM that executes the order. This Confidential VM may be deployed within a CPU-based or CPU/GPU-augmented TEE using technologies such as Intel TDX, AMD SEV-SNP, NVIDIA Confidential Computing, or others, making the system TEE-agnostic. +Trusted Loader requests a dedicated order-specific certificate when an order is prepared for execution. This certificate includes order-specific data, such as the hash of workload information. -To receive an order certificate, the Trusted Loader sends a request to a SubRoot CA providing the quote and a public key. The SubRoot CA verifies the quote, issues the order certificate, and signs it with the provided public key. +Trusted Loader places the order certificate as a file into the order's execution environment. There, it can be used by the order itself to prove that it was launched within a confidential environment. + +Note that the Certification System does not determine whether a CVM is correct or compromised. If a CVM runs in a confidential environment, it can obtain certificates. However, differences in hashes are visible in the certificate chain and can be detected by any verifying party. ### Order validation -Orders in Super Protocol are created with necessary input data. This execution environment is referred to as *Workload Info*. +Orders in Super Protocol are created with a workload description known as *Workload Info*. -The Workload Info includes an array called `runtimeInfo[]` with metadata about solutions and datasets used in the order. Each such order component has an entry in this array, which includes: +Workload Info includes an array called `runtimeInfo`. It contains information about solutions and data associated with the order. Each such order component has an entry in this array, which includes: -- Type +- Type (solution or data) - Hash - Size - Signature key hash (optional) @@ -43,9 +73,13 @@ The Workload Info includes an array called `runtimeInfo[]` with metadata about < The hash of the Workload Info is included in the order certificate. -Trusted Loader generates and publishes a report in the blockchain, allowing anyone to validate the order. This order report includes: +Before order execution begins, Trusted Loader checks the integrity of the full workload composition (solutions, data, and configuration). The order proceeds only if this verification succeeds. + +Trusted Loader also generates and publishes a report to the blockchain, allowing any verifier to validate the order. The report includes: - The public components of all the certificates in the chain - Workload Info: - Order creation date - - The `runtimeInfo[]` array \ No newline at end of file + - The `runtimeInfo` array + +The immutable nature of blockchain prevents any further alterations to the report once it is published. The report enables verifiers to confirm what exactly was launched and that the certificate corresponds to that specific workload. \ No newline at end of file diff --git a/docs/fundamentals/images/certification-system-architecture.png b/docs/fundamentals/images/certification-system-architecture.png index 4e4ffd05e8c23033e6afe295ca45eb89e086da79..32eead65e8ccb9caaf859d1bdda830911c72f48a 100644 GIT binary patch literal 32041 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 Da>mi+ literal 21355 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

;3YYtIyUi>@wL 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 diff --git a/src/theme/Layout/index.js b/src/theme/Layout/index.js index eeac7d18..980964c8 100644 --- a/src/theme/Layout/index.js +++ b/src/theme/Layout/index.js @@ -87,9 +87,21 @@ export default function Layout(props) { ᐧ A tunnel client hosts a web server; it remains hidden behind the tunnel server and protected from external threats. + + TEE Confirmation Block (TCB) contains a unique device ID, equipment benchmark results,
various hashes, device signature, and a certificate chain for signature verification.

+ + Trusted Loader generates and publishes TCB on the blockchain every 24 hours. +
+ + // Stabs and abbreviations + Confidential Virtual Machine + + + Trusted Loader + ); } \ No newline at end of file From dfc58bd0ede1c187c1320d3e91772ac9f9f85672 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Fri, 30 Jan 2026 08:49:15 -0300 Subject: [PATCH 2/3] Rename cli/quick-guide to deploy-app. Add Python example --- .../Guides/deploy-app/deploy-app-example.md | 175 ++++++++++++++++++ .../{quick-guide.md => deploy-app/index.md} | 26 ++- docs/cli/Guides/tgwui.md | 14 +- docs/cli/Guides/unsloth.md | 4 +- docs/cli/Guides/vllm.md | 2 +- docs/fundamentals/certification.md | 6 +- docs/guides/index.md | 12 +- docusaurus.config.js | 8 +- static/files/usd_to_crypto.py | 45 +++++ 9 files changed, 254 insertions(+), 38 deletions(-) create mode 100644 docs/cli/Guides/deploy-app/deploy-app-example.md rename docs/cli/Guides/{quick-guide.md => deploy-app/index.md} (82%) create mode 100644 static/files/usd_to_crypto.py diff --git a/docs/cli/Guides/deploy-app/deploy-app-example.md b/docs/cli/Guides/deploy-app/deploy-app-example.md new file mode 100644 index 00000000..60d596e0 --- /dev/null +++ b/docs/cli/Guides/deploy-app/deploy-app-example.md @@ -0,0 +1,175 @@ +--- +id: "deploy-app-example" +title: "Example: Python script" +slug: "/guides/deploy-app/example" +sidebar_position: 1 +--- + +This guide serves as an example to the more general [deployment guide](/cli/guides/deploy-app) and shows how to deploy a Python script on Super Protocol without modifying its code. + +The [simple script](/files/usd_to_crypto.py) used here as an example calculates how much Bitcoin (BTC) and Ether (ETH) can be bought for given amount in US dollars: + +1. Reads the input amount from `input.txt` located in the same directory. +2. Fetches current prices of BTC and ETH using CoinGecko API. +3. Calculates how much BTC and ETH can be bought for this amount of USD. +4. Creates `result.txt` in the same directory and writes the result to it. + +In this deployment, the script will be the solution, and `input.txt` will be the data. + +## Prerequisites + +- Docker +- [SPCTL](/cli) + +### 0. Prepare the files + +Create a local directory `usd_to_crypto`. Download the [example script](/files/usd_to_crypto.py) and rename it to `usd_to_crypto.py`. + +Create a new file `input.txt` to serve as the data input, and add a number—USD amount, for example, `100000`. + +Copy SPCTL and its `config.json` into this directory. + +### 1. Prepare the solution + +Keep in mind that file locations inside a CVM will differ from a local run: + +- Data (`input.txt`) must be found in one of the `/sp/inputs/input-xxxx` directories. +- `result.txt` must be placed into `/sp/output` to be available to download once the execution is finished. + +1.1. Create an new file named `entrypoint.sh` and add the following code: + +```sh title="entrypoint.sh" +#!/bin/sh +set -eu + +# Fixed CVM paths (overridable if needed) +: "${INPUTS_DIR:=/sp/inputs}" +: "${OUTPUT_DIR:=/sp/output}" +: "${SCRIPT_PATH:=/usr/local/bin/usd_to_crypto.py}" + +mkdir -p "${OUTPUT_DIR}" +cd "${OUTPUT_DIR}" + +# Resolve input file +INPUT_FILE="$(find "${INPUTS_DIR}" -mindepth 2 -maxdepth 3 -type f -name 'input.txt' 2>/dev/null | sort | head -n 1 || true)" + +# Make the script's expected input file available in CWD (/sp/output) +rm -f input.txt || true +if [ -n "${INPUT_FILE}" ] && [ -f "${INPUT_FILE}" ]; then + cp -f "${INPUT_FILE}" input.txt +else + # If missing, create an empty file so the Python script emits a clean error + : > input.txt +fi + +# Run the Python script; it reads ./input.txt and writes ./result.txt here (/sp/output) +exec python3 "${SCRIPT_PATH}" +``` + +Create an new file named `Dockerfile` and add the following code: + +```dockerfile title="Dockerfile" +FROM ubuntu:22.04 + +# Non-interactive tzdata install +ENV DEBIAN_FRONTEND=noninteractive + +# System deps +RUN apt-get update && apt-get install -y \ + python3 \ + python3-pip \ + ca-certificates \ + curl \ + jq \ + openssl \ + tzdata \ + sed \ + grep \ + coreutils \ + && rm -rf /var/lib/apt/lists/* + +# Python deps +RUN pip3 install --no-cache-dir requests + +# Put the scripts where your environment expects executables +COPY usd_to_crypto.py /usr/local/bin/usd_to_crypto.py +RUN chmod +x /usr/local/bin/usd_to_crypto.py + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +# Set /sp as workdir (doesn't matter in this case; entrypoint.sh uses /sp/output as workdir) +WORKDIR /sp + +# Set entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +``` + +1.2. Build a Docker image: + +```shell +docker build -t usd_to_crypto . +``` + +1.3. Save and archive the image: + +```shell +docker save usd_to_crypto:latest | gzip > usd_to_crypto.tar.gz +``` + +1.4. Upload the archive: + +```shell +./spctl files upload usd_to_crypto.tar.gz \ + --filename usd_to_crypto.tar.gz \ + --output usd_to_crypto.resource.json +``` + +### 2. Prepare data + +2.1. Archive the file: + +```shell +tar -czvf input.tar.gz ./input.txt +``` + +2.2. Upload the archive: + +```shell +./spctl files upload ./input.tar.gz \ +--filename input.tar.gz \ +--output input.resource.json +``` + +### 3. Deploy + +Place an order: + +```shell +./spctl workflows create \ +--tee 7 \ +--solution ./usd_to_crypto.resource.json \ +--data ./input.resource.json +``` + +Find the order ID in the output, for example: + +``` +Workflow was created, TEE order id: ["275510"] +``` + +### 4. Download the result + +Replace `275510` with your order ID: + +```shell +./spctl orders download-result 275510 +``` + +If there is no result for your order yet, wait a couple of minutes and try again. + +Find `output/result.txt` inside the downloaded archive `result.tar.gz`. + +## Support + +If you have any issues or questions, contact Super Protocol on [Discord](https://discord.gg/superprotocol) or via the [contact form](https://superprotocol.zendesk.com/hc/en-us/requests/new). \ No newline at end of file diff --git a/docs/cli/Guides/quick-guide.md b/docs/cli/Guides/deploy-app/index.md similarity index 82% rename from docs/cli/Guides/quick-guide.md rename to docs/cli/Guides/deploy-app/index.md index 89d14492..205961f8 100644 --- a/docs/cli/Guides/quick-guide.md +++ b/docs/cli/Guides/deploy-app/index.md @@ -1,7 +1,7 @@ --- -id: "quick-guide" +id: "deploy-app" title: "Deploy Your App" -slug: "/guides/quick-guide" +slug: "/guides/deploy-app" sidebar_position: 2 --- @@ -18,13 +18,13 @@ This quick guide provides instructions on deploying your own TEE: -| **Location** | **Purpose** | **Access** | +|

**Location**
| **Purpose** |
**Access**
| | :- | :- | :- | -| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
etc. | Possible data locations | Read-only | -| `/sp/output` | Output directory for results | Write; read own files | +| `/sp/inputs/input-0001`
`/sp/inputs/input-0002`
... | Possible data locations | Read-only | +| `/sp/output` | Output directory for results | Read and write | | `/sp/certs` | Contains the order certificate, private key, and workloadInfo | Read-only | -So, your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. +When you provide multiple data inputs, they are placed in separate directories inside the CVM: the first in `/sp/inputs/input-0001`, the second in `/sp/inputs/input-0002`, and so on. Your solution must find the data in `/sp/inputs` and write the results to `/sp/output`. :::important @@ -32,7 +32,9 @@ Always use absolute paths, such as `/sp/...`. ::: -You can find several Dockerfile examples in the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions) GitHub repository. +Check the [example](/cli/guides/deploy-app/example) at the end of this guide. + +More Dockerfile examples can be found in the [Super-Protocol/solutions](https://github.com/Super-Protocol/solutions) GitHub repository. ### 1.2. Build a Docker image @@ -124,17 +126,11 @@ Place an order using the [`workflows create`](/cli/commands/workflows/create) co --data ./more-data.resource.json ``` -:::note - -When you provide multiple data inputs, they are placed in separate directories inside the CVM: the first in `/sp/inputs/input-0001`, the second in `/sp/inputs/input-0002`, and so on. - -::: - Find the order ID in the output. ## 4. Download the result -Wait a few minutes and [check the order status](/cli/commands/orders/get): +Wait a few minutes and check the order status: ```shell ./spctl orders get @@ -146,7 +142,7 @@ For example: ./spctl orders get 256587 ``` -If the status is `Done`, the order is ready, and you can [download the order result](/cli/commands/orders/download-result): +If the status is `Done` or `Error`, you can [download the order result](/cli/commands/orders/download-result): ```shell ./spctl orders download-result diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md index 87602534..0885d659 100644 --- a/docs/cli/Guides/tgwui.md +++ b/docs/cli/Guides/tgwui.md @@ -12,7 +12,7 @@ This guide provides step-by-step instructions for uploading and deploying an AI ## Prerequisites -- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- [SPCTL](/cli/) - BNB and SPPI tokens (opBNB) to pay for transactions and orders ## 1. Prepare @@ -91,19 +91,20 @@ Replace `` with the tunnel order ID from the previous step. ./spctl orders download-result ``` -3.5. Extract the downloaded `result.tar.gz`, open `output/result.json`, and find the domain address. For example: +3.5. Extract the downloaded `result.tar.gz`, open `output/result.json`, and find the domain. For example: ```json title="result.json" "domain":"pret-tons-wade.superprotocol.io" ``` -Your model's web UI will be available at this address. +Your model's web UI will be available at this URL. ## 4. Prepare engine configuration files 4.1. Open the SPCTL's `config.json` and find the `workflow.resultEncryption.key` property that contains the key used for decrypting workflow results; for example: `NapSrwQRz2tL9ZftJbi6DATpCDn0BRImpSStU9xZT/s=`. -4.2. +4.2. Create configuration files: + Create a file named `engine-configuration-tgwui.json` and paste the following: @@ -184,10 +185,10 @@ Save and close the file. ## 5. Deploy the model -5.1. +5.1. Create the main order to deploy your uploaded model: + - Create the main order to deploy your uploaded model: ```shell ./spctl workflows create --tee --solution 25 --solution-configuration ./engine-configuration-tgwui.json --data ./model.resource.json @@ -198,7 +199,6 @@ Save and close the file. Note that `--solution 25` refers to [Text Generation Web UI with GPU support](https://marketplace.superprotocol.com/marketplace/models?offer=offerId%3D25). If you need the CPU version, use `--solution 26` instead. - Create the main order to deploy your uploaded model: ```shell ./spctl workflows create --tee --solution 27 --solution-configuration ./engine-configuration-comfyui.json --data ./model.resource.json diff --git a/docs/cli/Guides/unsloth.md b/docs/cli/Guides/unsloth.md index 24b46110..70ae7f67 100644 --- a/docs/cli/Guides/unsloth.md +++ b/docs/cli/Guides/unsloth.md @@ -7,11 +7,11 @@ sidebar_position: 5 This guide provides step-by-step instructions for fine-tuning an AI model using the Super Protocol packaging of [Unsloth](https://unsloth.ai/), an open-source framework for LLM fine-tuning and reinforcement learning. -The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](https://docs.develop.superprotocol.com/cli/guides/multi-party-collab) scenarios. +The solution allows you to run fine-tuning within Super Protocol's Trusted Execution Environment (TEE). This provides enhanced security and privacy and enables a range of [confidential collaboration](/cli/guides/multi-party-collab) scenarios. ## Prerequisites -- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- [SPCTL](/cli/) - Git - BNB and SPPI tokens (opBNB) to pay for transactions and orders diff --git a/docs/cli/Guides/vllm.md b/docs/cli/Guides/vllm.md index a833a22d..d701a650 100644 --- a/docs/cli/Guides/vllm.md +++ b/docs/cli/Guides/vllm.md @@ -9,7 +9,7 @@ This guide provides step-by-step instructions for running an AI model inference ## Prerequisites -- [SPCTL](https://docs.develop.superprotocol.com/cli/) +- [SPCTL](/cli/) - Git - BNB and SPPI tokens (opBNB) to pay for transactions and orders diff --git a/docs/fundamentals/certification.md b/docs/fundamentals/certification.md index 0dfd2161..4ef4e184 100644 --- a/docs/fundamentals/certification.md +++ b/docs/fundamentals/certification.md @@ -28,7 +28,7 @@ The Certification System is organized as a hierarchy of Confidential Virtual Machines (CVMs) running in TEEs, and in some other cases. These certificates are not CAs and cannot be used to sign or issue other certificates. @@ -36,7 +36,7 @@ Each level in the hierarchy receives its certificate from the level above, creat ## Trusted Loader -Trusted Loader is a special service that prepares and launches the workload associated with an order inside a CVM running in a TEE. It runs in a privileged position within the execution environment, allowing it to access the underlying attestation capabilities of the platform. Workloads themselves do not have such access. +Trusted Loader is a special service that prepares and launches the workload associated with an order inside a CVM running in a TEE. Loader occupies a privileged position within the execution environment, enabling it to access the platform's underlying attestation capabilities. Workloads themselves do not have such access. Trusted Loader also: @@ -63,7 +63,7 @@ Note that the Certification System does not determine whether a CVM is correct o Orders in Super Protocol are created with a workload description known as *Workload Info*. -Workload Info includes an array called `runtimeInfo`. It contains information about solutions and data associated with the order. Each such order component has an entry in this array, which includes: +Workload Info includes an array called `runtimeInfo` that contains information about solutions and data associated with the order. Each data and solution component of the order has an entry in this array, which includes: - Type (solution or data) - Hash diff --git a/docs/guides/index.md b/docs/guides/index.md index 31dab108..26693316 100644 --- a/docs/guides/index.md +++ b/docs/guides/index.md @@ -18,12 +18,12 @@ sidebar_position: 0 ## CLI -|
**Guide**
|
**Description**
| -| :- | :- | -| [Configure SPCTL](/cli) | How to set up SPCTL—a Super Protocol CLI tool. | -| [Configure Provider Tools](/cli/guides/provider-tools) | How to set up Provider Tools—a Super Protocol CLI utility for registering providers and creating offers. | -| [Quick Deployment Guide](/cli/guides/quick-guide) | Quick instructions on deploying a solution and data on Super Protocol. | -| [Confidential Collaboration](/cli/guides/multi-party-collab) | A scenario of confidential collaboration on Super Protocol. | +|
**Guide**
|
**Description**
| +| :- | :- | +| [Configure SPCTL](/cli) | How to set up SPCTL—a Super Protocol CLI tool. | +| [Configure Provider Tools](/cli/guides/provider-tools) | How to set up Provider Tools—a Super Protocol CLI utility for registering providers and creating offers. | +| [Quick Deployment Guide](/cli/guides/deploy-app) | Quick instructions on deploying a solution and data on Super Protocol. | +| [Confidential Collaboration](/cli/guides/multi-party-collab) | A scenario of confidential collaboration on Super Protocol. | ### Solutions diff --git a/docusaurus.config.js b/docusaurus.config.js index c3a86fd7..db773ef3 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -42,10 +42,10 @@ const config = { from: "/hackathon", to: "/hackathon/about", }, - /*{ - from: "/colab", - to: "/colab/jupyter", - },*/ + { + from: "/cli/guides/quick-guide", + to: "/cli/guides/deploy-app", + }, ], }, ], diff --git a/static/files/usd_to_crypto.py b/static/files/usd_to_crypto.py new file mode 100644 index 00000000..88da57e5 --- /dev/null +++ b/static/files/usd_to_crypto.py @@ -0,0 +1,45 @@ +import requests +import sys + +def main(): + input_file = "input.txt" + output_file = "result.txt" + + try: + # Read the input amount + with open(input_file, "r") as f: + content = f.read().strip() + if not content: + raise ValueError("Input file is empty") + + try: + usd_amount = float(content) + except ValueError: + raise ValueError("Input is not a valid number") + + # Fetch BTC and ETH prices from CoinGecko + url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd" + response = requests.get(url, timeout=10) + if response.status_code != 200: + raise RuntimeError(f"API request failed with status code {response.status_code}") + + data = response.json() + btc_price = data["bitcoin"]["usd"] + eth_price = data["ethereum"]["usd"] + + # Calculate how much BTC and ETH can be bought + btc_amount = usd_amount / btc_price + eth_amount = usd_amount / eth_price + + # Write results to output file, rounded to 6 decimals + with open(output_file, "w") as f: + f.write(f"BTC: {btc_amount:.6f}\n") + f.write(f"ETH: {eth_amount:.6f}\n") + + except Exception as e: + # Write the error message to the result file + with open(output_file, "w") as f: + f.write(f"Error: {str(e)}\n") + +if __name__ == "__main__": + main() From ea0801b561605b77510b50f8d0d44ace773bd715 Mon Sep 17 00:00:00 2001 From: k3dz0r Date: Thu, 5 Feb 2026 13:12:18 -0300 Subject: [PATCH 3/3] Minor fixes --- docs/cli/Guides/deploy-app/deploy-app-example.md | 4 ++-- docs/cli/Guides/tgwui.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/cli/Guides/deploy-app/deploy-app-example.md b/docs/cli/Guides/deploy-app/deploy-app-example.md index 60d596e0..762949db 100644 --- a/docs/cli/Guides/deploy-app/deploy-app-example.md +++ b/docs/cli/Guides/deploy-app/deploy-app-example.md @@ -36,7 +36,7 @@ Keep in mind that file locations inside a CVM will differ from a local run: - Data (`input.txt`) must be found in one of the `/sp/inputs/input-xxxx` directories. - `result.txt` must be placed into `/sp/output` to be available to download once the execution is finished. -1.1. Create an new file named `entrypoint.sh` and add the following code: +1.1. Create a new file named `entrypoint.sh` and add the following code: ```sh title="entrypoint.sh" #!/bin/sh @@ -66,7 +66,7 @@ fi exec python3 "${SCRIPT_PATH}" ``` -Create an new file named `Dockerfile` and add the following code: +Create a new file named `Dockerfile` and add the following code: ```dockerfile title="Dockerfile" FROM ubuntu:22.04 diff --git a/docs/cli/Guides/tgwui.md b/docs/cli/Guides/tgwui.md index 0885d659..66ac340a 100644 --- a/docs/cli/Guides/tgwui.md +++ b/docs/cli/Guides/tgwui.md @@ -151,7 +151,7 @@ Your model's web UI will be available at this URL. } ```
- + Create a file named `engine-configuration-comfyui.json` and paste the following: ```json title="engine-configuration-comfyui.json" @@ -198,7 +198,7 @@ Save and close the file. Note that `--solution 25` refers to [Text Generation Web UI with GPU support](https://marketplace.superprotocol.com/marketplace/models?offer=offerId%3D25). If you need the CPU version, use `--solution 26` instead. - + ```shell ./spctl workflows create --tee --solution 27 --solution-configuration ./engine-configuration-comfyui.json --data ./model.resource.json