From 8df5650a8a4c535cebb8497f9fb0af5b1a3572e7 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 12:14:00 +0000 Subject: [PATCH 01/13] GITBOOK-2: No subject --- SUMMARY.md | 1 + storage-providers/pdp.md | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 storage-providers/pdp.md diff --git a/SUMMARY.md b/SUMMARY.md index 4f3b99651..7ce89b99e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -80,6 +80,7 @@ * [Storage](storage-providers/skills/storage.md) * [Sales](storage-providers/skills/sales.md) * [Industry](storage-providers/skills/industry.md) +* [PDP](storage-providers/pdp.md) ## Nodes diff --git a/storage-providers/pdp.md b/storage-providers/pdp.md new file mode 100644 index 000000000..8760b9e84 --- /dev/null +++ b/storage-providers/pdp.md @@ -0,0 +1,2 @@ +# PDP + From 3b0754b8d32db7260b5b5815163e09afc34422f4 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 13:12:13 +0000 Subject: [PATCH 02/13] GITBOOK-3: No subject --- SUMMARY.md | 4 +- storage-providers/{pdp.md => pdp/README.md} | 0 .../pdp/installing-and-running-lotus.md | 107 ++++++++++++++++++ storage-providers/pdp/prerequisites.md | 69 +++++++++++ 4 files changed, 179 insertions(+), 1 deletion(-) rename storage-providers/{pdp.md => pdp/README.md} (100%) create mode 100644 storage-providers/pdp/installing-and-running-lotus.md create mode 100644 storage-providers/pdp/prerequisites.md diff --git a/SUMMARY.md b/SUMMARY.md index 7ce89b99e..31d92d221 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -80,7 +80,9 @@ * [Storage](storage-providers/skills/storage.md) * [Sales](storage-providers/skills/sales.md) * [Industry](storage-providers/skills/industry.md) -* [PDP](storage-providers/pdp.md) +* [PDP](storage-providers/pdp/README.md) + * [Prerequisites](storage-providers/pdp/prerequisites.md) + * [Installing and Running Lotus](storage-providers/pdp/installing-and-running-lotus.md) ## Nodes diff --git a/storage-providers/pdp.md b/storage-providers/pdp/README.md similarity index 100% rename from storage-providers/pdp.md rename to storage-providers/pdp/README.md diff --git a/storage-providers/pdp/installing-and-running-lotus.md b/storage-providers/pdp/installing-and-running-lotus.md new file mode 100644 index 000000000..21ca7e90b --- /dev/null +++ b/storage-providers/pdp/installing-and-running-lotus.md @@ -0,0 +1,107 @@ +--- +description: >- + Lotus is your gateway to the Filecoin network. It syncs the chain, manages + wallets, and is required for Curio to interact with your node. +--- + +# Installing and Running Lotus + +
Lotus Documentation
Filecoin Slack - #fil-lotus-help
+ +### Build Lotus Daemon + +Clone and check out Lotus: + +```sh +git clone https://github.com/filecoin-project/lotus.git +cd lotus +git checkout $(curl -s https://api.github.com/repos/filecoin-project/lotus/releases/latest | jq -r .tag_name) +``` + +#### **Build and Install for Mainnet** + +```sh +make clean lotus +sudo make install-daemon +lotus --version +``` + +#### **Build and Install for Calibration** + +```sh +make clean && make GOFLAGS="-tags=calibnet" lotus +sudo make install-daemon +lotus --version +``` + +{% hint style="success" %} +You should see something like: lotus version 1.32.2+mainnet+git.ff88d8269 +{% endhint %} + +*** + +### Import a Snapshot and Start the Daemon + +Download the Snapshot + +#### Mainnet: + +```sh +aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/mainnet/ +``` + +#### Calibration: + +```sh +aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/calibnet/ +``` + +#### Import and Start the Daemon + +```sh +lotus daemon --import-snapshot snapshot.car.zst --remove-existing-chain --halt-after-import +nohup lotus daemon > ~/lotus.log 2>&1 & +``` + +#### **Monitor Sync Progress** + +```sh +lotus sync wait +``` + +#### To monitor continuously: + +```sh +lotus sync wait --watch +``` + +#### **Monitor Logs** + +```sh +tail -f ~/lotus.log +``` + +*** + +### Create Wallets + +You’ll need to create **two BLS wallets**: + +* One for **owner**: used to fund sector pledges and submit proofs +* One for **worker**: used to publish and manage storage deals + +```sh +lotus wallet new bls # Create owner wallet +lotus wallet new bls # Create worker wallet +lotus wallet list # List all created wallets +``` + +Make sure to send a small amount of FIL to each wallet - we recommend 1 FIL per wallet to ensure the creation of your Storage Provider in Curio. + +{% hint style="info" %} +Both wallets will be used during Curio initialisation. +{% endhint %} + +{% hint style="danger" %} +[Back up](https://lotus.filecoin.io/lotus/manage/manage-fil/#exporting-and-importing-addresses) your wallet keys securely before continuing. Losing them will result in permanent loss of access to funds. +{% endhint %} diff --git a/storage-providers/pdp/prerequisites.md b/storage-providers/pdp/prerequisites.md new file mode 100644 index 000000000..69c0930bb --- /dev/null +++ b/storage-providers/pdp/prerequisites.md @@ -0,0 +1,69 @@ +--- +description: >- + This guide walks you through setting up a PDP-enabled Filecoin Storage + Provider using Lotus, YugabyteDB, and Curio +--- + +# Prerequisites + +{% hint style="info" %} +⚠️ Note: This guide is written specifically for Ubuntu 22.04. If you are using a different Linux distribution, refer to the relevant documentation for package installation and compatibility. +{% endhint %} + +Before starting, make sure you have a user with **sudo privileges**. This section prepares your system for the PDP stack. + +### System Package Installation + +```sh +sudo apt update && sudo apt upgrade -y && sudo apt install -y \ +mesa-opencl-icd ocl-icd-opencl-dev gcc git jq pkg-config curl clang \ +build-essential hwloc libhwloc-dev libarchive-dev wget ntp python-is-python3 aria2 +``` + +*** + +### Install Go + +```sh +sudo rm -rf /usr/local/go +wget https://go.dev/dl/go1.23.7.linux-amd64.tar.gz +sudo tar -C /usr/local -xzf go1.23.7.linux-amd64.tar.gz +echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc +source ~/.bashrc +go version +``` + +{% hint style="success" %} +You should see something like: go version go1.23.7 linux/amd64 +{% endhint %} + +*** + +### Install Rust + +```sh +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +{% hint style="info" %} +When prompted, choose the option 1) Proceed with standard installation (default — just press Enter). +{% endhint %} + +```sh +source $HOME/.cargo/env +rustc --version +``` + +{% hint style="success" %} +You should see something like: rustc 1.86.0 (05f9846f8 2025-03-31) +{% endhint %} + +*** + +### Add Go and Rust to Secure Sudo Path + +```sh +sudo tee /etc/sudoers.d/dev-paths < Date: Tue, 29 Apr 2025 15:47:29 +0000 Subject: [PATCH 03/13] GITBOOK-4: No subject --- .gitbook/assets/Filecoin.svg.png | Bin 0 -> 46817 bytes .gitbook/assets/lotus-logo-big.png | Bin 0 -> 39615 bytes .gitbook/assets/yugabyte.svg | 18 +++++ SUMMARY.md | 3 +- ...ning-lotus.md => install-and-run-lotus.md} | 6 +- .../pdp/install-and-run-yugabytedb.md | 71 ++++++++++++++++++ 6 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 .gitbook/assets/Filecoin.svg.png create mode 100644 .gitbook/assets/lotus-logo-big.png create mode 100644 .gitbook/assets/yugabyte.svg rename storage-providers/pdp/{installing-and-running-lotus.md => install-and-run-lotus.md} (78%) create mode 100644 storage-providers/pdp/install-and-run-yugabytedb.md diff --git a/.gitbook/assets/Filecoin.svg.png b/.gitbook/assets/Filecoin.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..556b1da4242b6018067b30ecb463cc7166a08180 GIT binary patch literal 46817 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 MTG*N2G4;IkKgEHbh5!Hn literal 0 HcmV?d00001 diff --git a/.gitbook/assets/lotus-logo-big.png b/.gitbook/assets/lotus-logo-big.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c4dc51d546115a1f413e4b02906077736bb57e GIT binary patch literal 39615 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 + + + + + + + + + \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md index 31d92d221..8038e3837 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -82,7 +82,8 @@ * [Industry](storage-providers/skills/industry.md) * [PDP](storage-providers/pdp/README.md) * [Prerequisites](storage-providers/pdp/prerequisites.md) - * [Installing and Running Lotus](storage-providers/pdp/installing-and-running-lotus.md) + * [Install & Run Lotus](storage-providers/pdp/install-and-run-lotus.md) + * [Install & Run YugabyteDB](storage-providers/pdp/install-and-run-yugabytedb.md) ## Nodes diff --git a/storage-providers/pdp/installing-and-running-lotus.md b/storage-providers/pdp/install-and-run-lotus.md similarity index 78% rename from storage-providers/pdp/installing-and-running-lotus.md rename to storage-providers/pdp/install-and-run-lotus.md index 21ca7e90b..2c5f0a896 100644 --- a/storage-providers/pdp/installing-and-running-lotus.md +++ b/storage-providers/pdp/install-and-run-lotus.md @@ -4,9 +4,9 @@ description: >- wallets, and is required for Curio to interact with your node. --- -# Installing and Running Lotus +# Install & Run Lotus -
Lotus Documentation
Filecoin Slack - #fil-lotus-help
+
Lotus Documentationlotus-logo-big.png
Filecoin Slack - #fil-lotus-helpFilecoin.svg.png
### Build Lotus Daemon @@ -69,7 +69,7 @@ nohup lotus daemon > ~/lotus.log 2>&1 & lotus sync wait ``` -#### To monitor continuously: +To monitor continuously: ```sh lotus sync wait --watch diff --git a/storage-providers/pdp/install-and-run-yugabytedb.md b/storage-providers/pdp/install-and-run-yugabytedb.md new file mode 100644 index 000000000..e86c76a1b --- /dev/null +++ b/storage-providers/pdp/install-and-run-yugabytedb.md @@ -0,0 +1,71 @@ +# Install & Run YugabyteDB + +
Yugabyte Documentationyugabyte.svg
Filecoin Slaxk - #fil-curio-helpFilecoin.svg.png
Yugabyte Slackyugabyte.svg
+ +### Set ulimit configuration + +{% hint style="info" %} + Before starting Yugabyte, you must increase the default ulimit values to ensure system limits do not interfere with the database. +{% endhint %} + +To do this: + +#### **Persist new limits across reboots** + +Add these lines to `/etc/security/limits.conf`: + +```sh +echo "$(whoami) soft nofile 1048576" | sudo tee -a /etc/security/limits.conf +echo "$(whoami) hard nofile 1048576" | sudo tee -a /etc/security/limits.conf +This ensures the increased limits are automatically applied to future sessions. +``` + +#### **Apply limit immediately (for current shell only)** + +```sh +ulimit -n 1048576 +Verify: +ulimit -n +``` + +{% hint style="success" %} +This should output 1048576. +{% endhint %} + +### Install Yugabyte + +```sh +wget https://software.yugabyte.com/releases/2.25.1.0/yugabyte-2.25.1.0-b381-linux-x86_64.tar.gz +tar xvfz yugabyte-2.25.1.0-b381-linux-x86_64.tar.gz +cd yugabyte-2.25.1.0 +./bin/post_install.sh +``` + +### Start the DB + +```sh +./bin/yugabyted start \ + --advertise_address 127.0.0.1 \ + --master_flags rpc_bind_addresses=127.0.0.1 \ + --tserver_flags rpc_bind_addresses=127.0.0.1 +``` + +{% hint style="danger" %} + If you encounter locale-related errors when starting Yugabyte for the first time, run: +{% endhint %} + +```sh +sudo locale-gen en_US.UTF-8 +``` + +{% hint style="success" %} +Visit [http://127.0.0.1:15433](http://127.0.0.1:15433) to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy. +{% endhint %} + +{% hint style="info" %} +You can also check your Yugabyte cluster details directly in the CLI with: +{% endhint %} + +```sh +./bin/yugabyted status +``` From dbc580c1f4b152bd44f5bbc7c3e2b82c3bcd02b7 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 16:07:54 +0000 Subject: [PATCH 04/13] GITBOOK-5: No subject --- .gitbook/assets/Curio_placeholder.webp | Bin 0 -> 18328 bytes SUMMARY.md | 1 + .../pdp/install-and-run-curio.md | 197 ++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 .gitbook/assets/Curio_placeholder.webp create mode 100644 storage-providers/pdp/install-and-run-curio.md diff --git a/.gitbook/assets/Curio_placeholder.webp b/.gitbook/assets/Curio_placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..a0cd37b6fded633ebec09c478d5e2b4360cbd0ff GIT binary patch literal 18328 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 literal 0 HcmV?d00001 diff --git a/SUMMARY.md b/SUMMARY.md index 8038e3837..fc5e21830 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -84,6 +84,7 @@ * [Prerequisites](storage-providers/pdp/prerequisites.md) * [Install & Run Lotus](storage-providers/pdp/install-and-run-lotus.md) * [Install & Run YugabyteDB](storage-providers/pdp/install-and-run-yugabytedb.md) + * [Install & Run Curio](storage-providers/pdp/install-and-run-curio.md) ## Nodes diff --git a/storage-providers/pdp/install-and-run-curio.md b/storage-providers/pdp/install-and-run-curio.md new file mode 100644 index 000000000..1690595ff --- /dev/null +++ b/storage-providers/pdp/install-and-run-curio.md @@ -0,0 +1,197 @@ +--- +description: >- + Curio is the core PDP client that coordinates sealing, interacts with Lotus + and submits PDP proofs. +--- + +# Install & Run Curio + +
Curio DocumentationCurio_placeholder.webp
Filecoin Slack - #fil-curio-helpFilecoin.svg.png
+ +### System Configuration + +Before you proceed with the installation, you should increase the UDP buffer size: + +```sh +sudo sysctl -w net.core.rmem_max=2097152 +sudo sysctl -w net.core.rmem_default=2097152 +``` + +To make this change persistent across reboots: + +```sh +echo 'net.core.rmem_max=2097152' | sudo tee -a /etc/sysctl.conf +echo 'net.core.rmem_default=2097152' | sudo tee -a /etc/sysctl.conf +``` + +### Build Curio + +Clone the repository and switch to the PDP branch: + +```sh +git clone https://github.com/filecoin-project/curio.git +cd curio +git checkout feat/pdp +``` + +{% hint style="info" %} +Curio is compiled for a specific Filecoin network at build time. Choose the appropriate build command below. +{% endhint %} + +```sh +# For Filecoin Mainnet: +make clean build + +# For Calibration Testnet: +make clean calibnet +``` + +{% hint style="success" %} +This step will take a few minutes to complete. +{% endhint %} + +### Install and Verify Curio + +Run the following to install the compiled binary: + +```sh +sudo make install +``` + +This will place curio in `/usr/local/bin` + +Verify the installation: + +```shell +curio --version +``` + +Expected output: + +```sh +# Example output for Mainnet: +curio version 1.24.4+mainnet+git_f954c0a_2025-04-06T15:46:32-04:00 + +# Example output for Calibration: +curio version 1.24.4+calibnet+git_f954c0a_2025-04-06T15:46:32-04:00 +``` + +*** + +### Guided Setup + +Curio provides a utility to help you set up a new miner interactively. Run the following command: + +```sh +curio guided-setup +``` + +{% stepper %} +{% step %} +#### **Select "Create a new miner"** + +Use the arrow keys to navigate the guided setup menu and select "Create a new miner". +{% endstep %} + +{% step %} +#### Enter Your YugabyteDB Connection Details + + +{% endstep %} +{% endstepper %} + +#### 1️⃣ Select "Create a new miner" + +Use the arrow keys to navigate the guided setup menu and select "Create a new miner". + +#### 2️⃣ Enter Your YugabyteDB Connection Details + +If you used the default installation steps from this guide, the following values should work: + +* Host: 127.0.0.1 +* Port: 5433 +* Username: yugabyte +* Password: yugabyte +* Database: yugabyte + +You can verify these settings by running the following command from the Yugabyte directory: + +./bin/yugabyted status + +After selecting "Continue to connect and update schema", Curio will automatically create the required tables and schema in the database. + +#### 3️⃣ Set Wallet Addresses + +For this step, use the two BLS wallets you created earlier with Lotus: + +* Use wallet 1 for the Owner Address +* Use wallet 2 for the Worker Address +* Use wallet 1 again for the Sender Address + +These addresses must match the Lotus wallets created earlier. + +| 💡 You can display your Lotus wallets at any time by running: | +| ------------------------------------------------------------- | + +\ + + +lotus wallet list + +#### 4️⃣ Choose Sector Size + +Choose sector size: + +* 64 GiB + +| 💡 Selecting a sector size is required during the Curio guided setup, but PDP itself doesn’t use sectors. Proof set sizes in PDP are arbitrary and fully flexible. | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + +#### 5️⃣ Create Miner Actor + +Review the information to ensure all inputs are correct. Then select "Continue to verify the addresses and create a new miner actor" to proceed. + +| ⏱️ This step may take a few minutes to complete as Curio pushes the message and waits for it to land on-chain. | +| -------------------------------------------------------------------------------------------------------------- | + +Once the actor is created, Curio will: + +* Register your miner ID + +| 💡 If the guided setup fails after creating the miner actor, run the following command to complete the installation: | +| -------------------------------------------------------------------------------------------------------------------- | + +\ + + +curio config new-cluster \ + +#### 6️⃣ Telemetry (Optional) + +You’ll be asked whether to share anonymised or signed telemetry with the Curio team to help improve the software. + +Select your preference and continue. + +#### 7️⃣ Save Database Configuration + +At the final step of the guided setup, you’ll be prompted to choose where to save your database configuration file. + +Use the arrow keys to select a location. A common default is: + +/home/your-username/curio.env + +Once selected, setup will complete, and the miner configuration will be stored. + +#### 8️⃣ Launch the Curio Web GUI + +To explore the Curio interface visually, start the GUI layer: + +curio run --layers=gui + +Then, open your browser and go to: + +http://127.0.0.1:4701 + +This will launch the Curio web GUI locally. + +\ From 0aed191fb334cc88343f3bb3010cdf76bf6b251e Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 16:09:07 +0000 Subject: [PATCH 05/13] GITBOOK-6: No subject From 19ba6a6bf8e71e00dff4ceff7e48042219832f27 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 16:19:15 +0000 Subject: [PATCH 06/13] GITBOOK-7: No subject --- .../pdp/install-and-run-curio.md | 82 +++++++++---------- 1 file changed, 38 insertions(+), 44 deletions(-) diff --git a/storage-providers/pdp/install-and-run-curio.md b/storage-providers/pdp/install-and-run-curio.md index 1690595ff..04522d3f7 100644 --- a/storage-providers/pdp/install-and-run-curio.md +++ b/storage-providers/pdp/install-and-run-curio.md @@ -86,85 +86,75 @@ Curio provides a utility to help you set up a new miner interactively. Run the f curio guided-setup ``` -{% stepper %} -{% step %} -#### **Select "Create a new miner"** - -Use the arrow keys to navigate the guided setup menu and select "Create a new miner". -{% endstep %} - -{% step %} -#### Enter Your YugabyteDB Connection Details - - -{% endstep %} -{% endstepper %} - #### 1️⃣ Select "Create a new miner" -Use the arrow keys to navigate the guided setup menu and select "Create a new miner". +Use the arrow keys to navigate the guided setup menu and select "**Create a new miner**". #### 2️⃣ Enter Your YugabyteDB Connection Details If you used the default installation steps from this guide, the following values should work: -* Host: 127.0.0.1 -* Port: 5433 -* Username: yugabyte -* Password: yugabyte -* Database: yugabyte +* Host: `127.0.0.1` +* Port: `5433` +* Username: `yugabyte` +* Password: `yugabyte` +* Database: `yugabyte` You can verify these settings by running the following command from the Yugabyte directory: +```sh ./bin/yugabyted status +``` -After selecting "Continue to connect and update schema", Curio will automatically create the required tables and schema in the database. +After selecting "**Continue to connect and update schema**", Curio will automatically create the required tables and schema in the database. #### 3️⃣ Set Wallet Addresses For this step, use the two BLS wallets you created earlier with Lotus: -* Use wallet 1 for the Owner Address -* Use wallet 2 for the Worker Address -* Use wallet 1 again for the Sender Address +* Use **wallet 1** for the **Owner Address** +* Use **wallet 2** for the **Worker Address** +* Use **wallet 1** again for the **Sender Address** These addresses must match the Lotus wallets created earlier. -| 💡 You can display your Lotus wallets at any time by running: | -| ------------------------------------------------------------- | - -\ - +{% hint style="info" %} +You can display your Lotus wallets at any time by running: +{% endhint %} +```sh lotus wallet list +``` #### 4️⃣ Choose Sector Size Choose sector size: -* 64 GiB +* `64 GiB` -| 💡 Selecting a sector size is required during the Curio guided setup, but PDP itself doesn’t use sectors. Proof set sizes in PDP are arbitrary and fully flexible. | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +{% hint style="info" %} +💡 Selecting a sector size is required during the Curio guided setup, but **PDP itself doesn’t use sectors**. Proof set sizes in PDP are **arbitrary and fully flexible.** +{% endhint %} #### 5️⃣ Create Miner Actor -Review the information to ensure all inputs are correct. Then select "Continue to verify the addresses and create a new miner actor" to proceed. +Review the information to ensure all inputs are correct. Then select "**Continue to verify the addresses and create a new miner actor**" to proceed. -| ⏱️ This step may take a few minutes to complete as Curio pushes the message and waits for it to land on-chain. | -| -------------------------------------------------------------------------------------------------------------- | +{% hint style="info" %} +This step may take a few minutes to complete as Curio pushes the message and waits for it to land on-chain. +{% endhint %} Once the actor is created, Curio will: -* Register your miner ID - -| 💡 If the guided setup fails after creating the miner actor, run the following command to complete the installation: | -| -------------------------------------------------------------------------------------------------------------------- | - -\ +* `Register your miner ID` +{% hint style="info" %} +If the guided setup fails after creating the miner actor, run the following command to complete the installation: +{% endhint %} -curio config new-cluster \ +```sh +curio config new-cluster +``` #### 6️⃣ Telemetry (Optional) @@ -178,7 +168,9 @@ At the final step of the guided setup, you’ll be prompted to choose where to s Use the arrow keys to select a location. A common default is: +```sh /home/your-username/curio.env +``` Once selected, setup will complete, and the miner configuration will be stored. @@ -186,12 +178,14 @@ Once selected, setup will complete, and the miner configuration will be stored. To explore the Curio interface visually, start the GUI layer: +```sh curio run --layers=gui +``` Then, open your browser and go to: +```sh http://127.0.0.1:4701 +``` This will launch the Curio web GUI locally. - -\ From 403d29110fd80f6d6d73f60973eff7becec5a7cf Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 17:04:06 +0000 Subject: [PATCH 07/13] GITBOOK-8: No subject --- SUMMARY.md | 1 + storage-providers/pdp/enable-pdp.md | 202 ++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 storage-providers/pdp/enable-pdp.md diff --git a/SUMMARY.md b/SUMMARY.md index fc5e21830..adb016479 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -85,6 +85,7 @@ * [Install & Run Lotus](storage-providers/pdp/install-and-run-lotus.md) * [Install & Run YugabyteDB](storage-providers/pdp/install-and-run-yugabytedb.md) * [Install & Run Curio](storage-providers/pdp/install-and-run-curio.md) + * [Enable PDP](storage-providers/pdp/enable-pdp.md) ## Nodes diff --git a/storage-providers/pdp/enable-pdp.md b/storage-providers/pdp/enable-pdp.md new file mode 100644 index 000000000..cd23d01dd --- /dev/null +++ b/storage-providers/pdp/enable-pdp.md @@ -0,0 +1,202 @@ +--- +description: >- + This section enables Proof of Data Possession (PDP) for a Storage Provider + node using Curio. These steps guide you through running a standalone PDP + service using Curio and pdptool. +--- + +# Enable PDP + +
PDP DocumentationCurio_placeholder.webp
Filecoin Slack - #fil-pdpFilecoin.svg.png
Filecoin Wallet - MetaMask SetupFilecoin.svg.png
+ +### Attach Storage Locations + +With Curio running with the GUI layer: + +```sh +curio run --layers=gui +``` + +Run the following commands in your Curio CLI to attach storage paths: + +```sh +curio cli storage attach --init --seal /fast-storage/path +curio cli storage attach --init --store /long-term-storage/path +``` + +{% hint style="info" %} +Your fast-storage path should point to high-performance storage media such as NVMe or SSD +{% endhint %} + +*** + +### Add a PDP Configuration Layer + +Browse to the Configurations page of the Curio GUI. + +Create a new layer named pdp. Enable and set to `true` the following under Subsystems: + +{% hint style="info" %} +You may find it helpful to search for the setting names in your browser. +{% endhint %} + +* ✅ `EnableParkPiece` +* ✅ `EnablePDP` +* ✅ `EnableCommP` +* ✅ `EnableMoveStorage` + +In the HTTP section: + +* ✅ Enable: `true` +* 🌐 DomainName: `your domain (e.g., pdp.mydomain.com)` +* 📡 ListenAddress: `0.0.0.0:443` + +{% hint style="info" %} + You must point your domain’s A record to your server’s public IP address for Let’s Encrypt to issue a certificate. +{% endhint %} + +*** + +### Set Up PDP Service Keys + +Build the pdptool: + +```sh +cd curio/cmd/pdptool +go build . +``` + +Generate a service secret: + +```sh +./pdptool create-service-secret +``` + +```sh +# Example output: + +-----BEGIN PUBLIC KEY----- +LxP9MzVmHdC7KwYBvNAo1jXuIRfGXqQyo2JzE4Uctn0a5eFZbs6Wlvq3dKYgphTD +XAqRsm38LPt2iVcGb9MruZJxEkBhO71wDdNyaFMoXpCJnUqRAezvKlfbIg== +-----END PUBLIC KEY----- +``` + +Browse to the **PDP** page of the Curio GUI and in the **Services** section: + +* Select **Add PDP Service** +* Input a **Service Name** of your choice (e.g. `pdp-service`) +* Copy the previously generated public key into the **Public Key** field. +* Select **Add Service** + +*** + +### Import your Filecoin Wallet Private Key: + +{% hint style="info" %} +There are several ways to obtain private keys for Ethereum addresses. For this guide, we will use a new delegated Filecoin wallet address. +{% endhint %} + +Create a new delegated wallet: + +```sh +lotus wallet new delegated +``` + +```sh +# Example output: + +t410fuo4dghaeiqzokiqnxruzdr6e3cjktnxprrc56bi +``` + +{% hint style="info" %} +You can display your Lotus wallets at any time by running: +{% endhint %} + +```sh +lotus wallet list +``` + +Export & convert your new delegated wallet address private key: + +```sh +lotus wallet export | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32 +``` + +```sh +# Example output: + +d4c2e3f9a716bb0e47fa91b2cf4a29870be3c5982fd6eafed71e8ac3f9c0b12 +``` + +Browse to the **PDP** page of the Curio GUI and in the **Owner Address** section: + +* Select **Import Key** +* Copy the previously generated private wallet key into the **Private Key (Hex)** field. +* Select **Import Key** + +{% hint style="success" %} +Your 0x wallet address - the delegated Ethereum address derived from your Filecoin Metamask private key - will be added to the **Owner Address** section of the Curio PDP page. +{% endhint %} + +Make sure to send a small amount of FIL to your 0x wallet - we recommend 5 FIL to ensure uninterrupted PDP operation during initial setup and testing. + +{% hint style="danger" %} +Important: Secure your private key material. Don’t expose or store it in plain text without protection. +{% endhint %} + +*** + +### Restart and Verify + +Restart Curio with both layers: + +```sh +curio run --layers=gui,pdp +``` + +{% hint style="warning" %} + If you encounter errors binding to port 443 when starting Curio with the pdp configuration layer, run: +{% endhint %} + +```sh +sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/curio +``` + +Test the PDP service: + +```sh +./pdptool ping --service-url https://your-domain.com --service-name +``` + +{% hint style="success" %} +Use the service name specified in the **Service Name** field when you added your public **PDP Service** key - e.g. `pdp-service` +{% endhint %} + +Expected output: + +```sh +Ping successful: Service is reachable and JWT token is valid. +``` + +{% hint style="info" %} +Note: The first ping often fails. Try again after a short delay. +{% endhint %} + +*** + +### 🎉 You’re Ready! + +You’ve successfully launched a PDP-enabled Filecoin Storage Provider stack. Your system is now: + +* ✅ Syncing with the Filecoin network via Lotus +* ✅ Recording deal and sector metadata in YugabyteDB +* ✅ Operating Curio to manage sealing and coordination +* ✅ Submitting Proof of Data Possession to verify storage integrity + +*** + +### 🔜 Next Steps + +* 🚙 Take PDP for a test drive with the [Getting Started with PDP for Storage Clients](https://docs.google.com/document/d/1MTPVZVqNqB8symaiSe-FmBSqd4byl76q5rZ54vrOp9E/edit?tab=t.0#heading=h.7oxcvntk0n0d) guide +* 🧭 Monitor logs and metrics +* 💬 Join the community - Filecoin Slack - [#fil-pdp](https://filecoinproject.slack.com/archives/C0717TGU7V2) From c2f103fb5a6addc060cbe8bfe2599202c41082c0 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 17:32:14 +0000 Subject: [PATCH 08/13] GITBOOK-9: No subject --- SUMMARY.md | 1 + storage-providers/pdp/enable-pdp.md | 2 +- .../pdp/install-and-run-lotus.md | 2 +- .../pdp/install-and-run-yugabytedb.md | 16 +- storage-providers/pdp/prerequisites.md | 6 +- storage-providers/pdp/use-pdp.md | 239 ++++++++++++++++++ 6 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 storage-providers/pdp/use-pdp.md diff --git a/SUMMARY.md b/SUMMARY.md index adb016479..6b7d2a021 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -86,6 +86,7 @@ * [Install & Run YugabyteDB](storage-providers/pdp/install-and-run-yugabytedb.md) * [Install & Run Curio](storage-providers/pdp/install-and-run-curio.md) * [Enable PDP](storage-providers/pdp/enable-pdp.md) + * [Use PDP](storage-providers/pdp/use-pdp.md) ## Nodes diff --git a/storage-providers/pdp/enable-pdp.md b/storage-providers/pdp/enable-pdp.md index cd23d01dd..a26d2762c 100644 --- a/storage-providers/pdp/enable-pdp.md +++ b/storage-providers/pdp/enable-pdp.md @@ -197,6 +197,6 @@ You’ve successfully launched a PDP-enabled Filecoin Storage Provider stack. Yo ### 🔜 Next Steps -* 🚙 Take PDP for a test drive with the [Getting Started with PDP for Storage Clients](https://docs.google.com/document/d/1MTPVZVqNqB8symaiSe-FmBSqd4byl76q5rZ54vrOp9E/edit?tab=t.0#heading=h.7oxcvntk0n0d) guide +* 🚙 Take PDP for a test drive with the [Use PDP](use-pdp.md) guide * 🧭 Monitor logs and metrics * 💬 Join the community - Filecoin Slack - [#fil-pdp](https://filecoinproject.slack.com/archives/C0717TGU7V2) diff --git a/storage-providers/pdp/install-and-run-lotus.md b/storage-providers/pdp/install-and-run-lotus.md index 2c5f0a896..dfaf4f584 100644 --- a/storage-providers/pdp/install-and-run-lotus.md +++ b/storage-providers/pdp/install-and-run-lotus.md @@ -35,7 +35,7 @@ lotus --version ``` {% hint style="success" %} -You should see something like: lotus version 1.32.2+mainnet+git.ff88d8269 +You should see something like: `lotus version 1.32.2+mainnet+git.ff88d8269` {% endhint %} *** diff --git a/storage-providers/pdp/install-and-run-yugabytedb.md b/storage-providers/pdp/install-and-run-yugabytedb.md index e86c76a1b..2619d1da3 100644 --- a/storage-providers/pdp/install-and-run-yugabytedb.md +++ b/storage-providers/pdp/install-and-run-yugabytedb.md @@ -5,7 +5,7 @@ ### Set ulimit configuration {% hint style="info" %} - Before starting Yugabyte, you must increase the default ulimit values to ensure system limits do not interfere with the database. + Before starting Yugabyte, you must increase the default `ulimit` values to ensure system limits do not interfere with the database. {% endhint %} To do this: @@ -17,19 +17,19 @@ Add these lines to `/etc/security/limits.conf`: ```sh echo "$(whoami) soft nofile 1048576" | sudo tee -a /etc/security/limits.conf echo "$(whoami) hard nofile 1048576" | sudo tee -a /etc/security/limits.conf -This ensures the increased limits are automatically applied to future sessions. ``` +This ensures the increased limits are automatically applied to future sessions. + #### **Apply limit immediately (for current shell only)** -```sh -ulimit -n 1048576 -Verify: -ulimit -n -``` +
ulimit -n 1048576
+# Verify:
+ulimit -n
+
{% hint style="success" %} -This should output 1048576. +This should output `1048576`. {% endhint %} ### Install Yugabyte diff --git a/storage-providers/pdp/prerequisites.md b/storage-providers/pdp/prerequisites.md index 69c0930bb..acd63a0be 100644 --- a/storage-providers/pdp/prerequisites.md +++ b/storage-providers/pdp/prerequisites.md @@ -7,7 +7,7 @@ description: >- # Prerequisites {% hint style="info" %} -⚠️ Note: This guide is written specifically for Ubuntu 22.04. If you are using a different Linux distribution, refer to the relevant documentation for package installation and compatibility. +This guide is written specifically for Ubuntu 22.04. If you are using a different Linux distribution, refer to the relevant documentation for package installation and compatibility. {% endhint %} Before starting, make sure you have a user with **sudo privileges**. This section prepares your system for the PDP stack. @@ -34,7 +34,7 @@ go version ``` {% hint style="success" %} -You should see something like: go version go1.23.7 linux/amd64 +You should see something like: `go version go1.23.7 linux/amd64` {% endhint %} *** @@ -55,7 +55,7 @@ rustc --version ``` {% hint style="success" %} -You should see something like: rustc 1.86.0 (05f9846f8 2025-03-31) +You should see something like: `rustc 1.86.0 (05f9846f8 2025-03-31)` {% endhint %} *** diff --git a/storage-providers/pdp/use-pdp.md b/storage-providers/pdp/use-pdp.md new file mode 100644 index 000000000..71d988291 --- /dev/null +++ b/storage-providers/pdp/use-pdp.md @@ -0,0 +1,239 @@ +--- +description: >- + This guide walks you through using the PDP client tool (pdptool) to interact + with a Filecoin Storage Provider running the Proof of Data Possession (PDP) + service. +--- + +# Use PDP + +PDP ensures that your data is verifiably stored by a Filecoin Storage Provider using cryptographic proofs without needing to retrieve the file itself. + +### Prerequisites + +Before beginning, ensure: + +* You have access to a terminal with internet connectivity +* Your system has pdptool installed (bundled with Curio) + +### If pdptool is not installed: + +* **Option 1**: Clone Curio and build pdptool: + +```sh +git clone +https://github.com/filecoin-project/curio.git + +cd curio +cd cmd/pdptool +go build . +``` + +* **Option 2**: Install the [Docker version ](https://github.com/LesnyRumcajs/pdp)of pdptool - Provided by our friends at [ChainSafe](https://chainsafe.io/) + +*** + +### Authenticate Your Client (JWT Token) + +You first need to authenticate your pdptool with a PDP-enabled Storage Provider + +Generate a service secret: + +```sh +./pdptool create-service-secret +``` + +```sh +# Example output: + +-----BEGIN PUBLIC KEY----- +LxP9MzVmHdC7KwYBvNAo1jXuIRfGXqQyo2JzE4Uctn0a5eFZbs6Wlvq3dKYgphTD +XAqRsm38LPt2iVcGb9MruZJxEkBhO71wDdNyaFMoXpCJnUqRAezvKlfbIg== +-----END PUBLIC KEY----- +``` + +{% hint style="success" %} +Reach out in the [#fil-pdp](https://filecoinproject.slack.com/archives/C0717TGU7V2) channel in Filecoin Slack to register your public key with a PDP-enabled Storage Provider +{% endhint %} + +*** + +### Connect to a PDP Service + +Start by pinging the PDP service to confirm availability: + +```sh +./pdptool ping --service-url https://yablu.net --service-name pdp-service +``` + +{% hint style="success" %} +You should see something like: +{% endhint %} + +```sh +Ping successful: Service is reachable and JWT token is valid. +``` + +*** + +### Create a Proof Set + +Start by creating an empty proof set. This step must happen **before** uploading files: + +```sh +./pdptool create-proof-set \ + --service-url https://yablu.net \ + --service-name pdp-service \ + --recordkeeper 0x6170dE2b09b404776197485F3dc6c968Ef948505 +``` + +```sh +# Example output: + +Proof set creation initiated successfully. +Location: /pdp/proof-sets/created/0xf91617ef532748efb5a51e64391112e5328fbd9a5b9ac20e5127981cea0012a5 +Response: +``` + +Use the `0x` transaction hash from the previous output to monitor proof set creation status: + +```sh +./pdptool get-proof-set-create-status \ + --service-url https://yablu.net \ + --service-name pdp-service \ + --tx-hash 0xf91617ef532748efb5a51e64391112e5328fbd9a5b9ac20e5127981cea0012a5 +``` + +{% hint style="success" %} +You should see something like: +{% endhint %} + +```sh +Proof Set Creation Status: +Transaction Hash: 0xf91617ef532748efb5a51e64391112e5328fbd9a5b9ac20e5127981cea0012a5 +Transaction Status: confirmed +Transaction Successful: true +Proofset Created: true +ProofSet ID: 43 +``` + +{% hint style="info" %} +The proof set creation process can take a few seconds to complete +{% endhint %} + +*** + +### Upload Files to the Storage Provider + +Once your proof set is ready, you can begin uploading files: + +```sh +./pdptool upload-file --service-url https://yablu.net --service-name pdp-service /path/to/file.ext +``` + +{% hint style="success" %} +Example output: +{% endhint %} + +```sh +0: pieceSize: 65536 +baga6ea4seaqhsevhssmv3j7jjavm4gzdckpjrvbwhhvn73sgibob5bdvtzoqkli:baga6ea4seaqhsevhssmv3j7jjavm4gzdckpjrvbwhhvn73sgibob5bdvtzoqkli +``` + +*** + +### 🌳 Add File Roots to Proof Set + +After uploading each file, extract its CID and add it to your proof set: + +```sh +./pdptool add-roots \ + --service-url https://yablu.net \ + --service-name pdp-service \ + --proof-set-id \ + --root ++... +``` + +Example using the information returned in the previous steps: + +```sh +./pdptool add-roots \ + --service-url https://yablu.net \ + --service-name pdp-service \ + --proof-set-id 43 \ + --root baga6ea4seaqhsevhssmv3j7jjavm4gzdckpjrvbwhhvn73sgibob5bdvtzoqkli:baga6ea4seaqhsevhssmv3j7jjavm4gzdckpjrvbwhhvn73sgibob5bdvtzoqkli +``` + +{% hint style="info" %} +In the above example, `--proof-set-id` came from the [Create Proof Set](use-pdp.md#create-a-proof-set) step, and `--root` from the [Upload Files to the Storage Provider](use-pdp.md#upload-files-to-the-storage-provider) step. +{% endhint %} + +{% hint style="success" %} +Example output: +{% endhint %} + +```sh +Roots added to proof set ID 43 successfully. +Response: +``` + +*** + +### View a Piece or Proof Set + +You can retrieve a proof set or inspect a file root directly: + +```sh +./pdptool get-proof-set \ + --service-url https://yablu.net \ + --service-name pdp-service 43 +``` + +{% hint style="success" %} +Example output: +{% endhint %} + +```sh +Proof Set ID: 43 +Next Challenge Epoch: 2577608 +Roots: + - Root ID: 0 + Root CID: baga6ea4seaqhsevhssmv3j7jjavm4gzdckpjrvbwhhvn73sgibob5bdvtzoqkli + Subroot CID: baga6ea4seaqhsevhssmv3j7jjavm4gzdckpjrvbwhhvn73sgibob5bdvtzoqkli + Subroot Offset: 0 +``` + +*** + +### Retrieve From a Proof Set + +Download a file using an ordered chunks list: + +```sh +./pdptool download-file \ + --service-url https://yablu.net \ + --chunk-file chunks.list \ + --output-file file.ext +``` + +{% hint style="info" %} +💡In the above example, `–chunk-file` and `–output-file` flags were defined in the [Upload Files to the Storage Provider step](use-pdp.md#upload-files-to-the-storage-provider) +{% endhint %} + +*** + +### You’re Done! + +You’ve now: + +✅ Connected to a PDP-enabled storage provider\ +✅ Created a proof set\ +✅ Uploaded files and added file roots\ +✅ Verified availability and proof status + +🧭 Next: Track your proof sets in the PDP Explorer + +* [Calibration PDP Explorer](https://calibration.pdp-explorer.eng.filoz.org) +* [Mainnet PDP Explorer](https://pdp-explorer.eng.filoz.org) + +💬 Questions? Join the conversation on Filecoin Slack: [#fil-pdp](https://filecoinproject.slack.com/archives/C0717TGU7V2) From c39547d396b6e6afd8ef165de8c8fd45957d6548 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 17:43:02 +0000 Subject: [PATCH 09/13] GITBOOK-10: No subject --- storage-providers/pdp/install-and-run-yugabytedb.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/storage-providers/pdp/install-and-run-yugabytedb.md b/storage-providers/pdp/install-and-run-yugabytedb.md index 2619d1da3..014f3963a 100644 --- a/storage-providers/pdp/install-and-run-yugabytedb.md +++ b/storage-providers/pdp/install-and-run-yugabytedb.md @@ -23,10 +23,11 @@ This ensures the increased limits are automatically applied to future sessions. #### **Apply limit immediately (for current shell only)** -
ulimit -n 1048576
-# Verify:
-ulimit -n
-
+```sh +ulimit -n 1048576 +# Verify: +ulimit -n +``` {% hint style="success" %} This should output `1048576`. From 9254925033a2b46929acea98bb780c7136e1ab11 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Tue, 29 Apr 2025 17:43:56 +0000 Subject: [PATCH 10/13] GITBOOK-11: No subject --- storage-providers/pdp/install-and-run-yugabytedb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-providers/pdp/install-and-run-yugabytedb.md b/storage-providers/pdp/install-and-run-yugabytedb.md index 014f3963a..77b3827f9 100644 --- a/storage-providers/pdp/install-and-run-yugabytedb.md +++ b/storage-providers/pdp/install-and-run-yugabytedb.md @@ -25,7 +25,7 @@ This ensures the increased limits are automatically applied to future sessions. ```sh ulimit -n 1048576 -# Verify: +# Verify limit change: ulimit -n ``` From 854f7847cf7d55e8df342d567c71536589344089 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Wed, 30 Apr 2025 18:49:27 +0100 Subject: [PATCH 11/13] Update install-and-run-yugabytedb.md Remove local links --- storage-providers/pdp/install-and-run-yugabytedb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-providers/pdp/install-and-run-yugabytedb.md b/storage-providers/pdp/install-and-run-yugabytedb.md index 77b3827f9..b6fe97f20 100644 --- a/storage-providers/pdp/install-and-run-yugabytedb.md +++ b/storage-providers/pdp/install-and-run-yugabytedb.md @@ -60,7 +60,7 @@ sudo locale-gen en_US.UTF-8 ``` {% hint style="success" %} -Visit [http://127.0.0.1:15433](http://127.0.0.1:15433) to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy. +Visit http://127.0.0.1:15433 to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy. {% endhint %} {% hint style="info" %} From 8548d7820b09674880309826c0a4d947bbfbd436 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Wed, 30 Apr 2025 18:52:20 +0100 Subject: [PATCH 12/13] Update install-and-run-yugabytedb.md --- storage-providers/pdp/install-and-run-yugabytedb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage-providers/pdp/install-and-run-yugabytedb.md b/storage-providers/pdp/install-and-run-yugabytedb.md index b6fe97f20..857537eb5 100644 --- a/storage-providers/pdp/install-and-run-yugabytedb.md +++ b/storage-providers/pdp/install-and-run-yugabytedb.md @@ -60,7 +60,7 @@ sudo locale-gen en_US.UTF-8 ``` {% hint style="success" %} -Visit http://127.0.0.1:15433 to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy. +Visit `127.0.0.1:15433` to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy. {% endhint %} {% hint style="info" %} From cfa7bbb7ed0d1f1b3a4c7d26059999cce6c875a4 Mon Sep 17 00:00:00 2001 From: TippyFlits Date: Wed, 30 Apr 2025 17:57:37 +0000 Subject: [PATCH 13/13] GITBOOK-12: No subject --- builder-cookbook/dapps/decentralized-database.md | 8 +++----- builder-cookbook/data-storage/retrieve-data.md | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/builder-cookbook/dapps/decentralized-database.md b/builder-cookbook/dapps/decentralized-database.md index afdc50574..101d6e08c 100644 --- a/builder-cookbook/dapps/decentralized-database.md +++ b/builder-cookbook/dapps/decentralized-database.md @@ -26,7 +26,7 @@ Let's take storage deal aggregator/RaaS as an example to demonstrate how to inte When uploading data via aggregator/RaaS providers to the Filecoin network, you can choose to store its metadata in Tableland tables instead of storing it in the chain state. This metadata can then be easily accessed from the Tableland database and utilized directly within your application. -If you require sample datasets to use, you can use the [Filecoin Dataset Explorer](https://dataset-explorer.vercel.app/). +If you require sample datasets to use, you can use the [Filecoin Dataset Explorer](https://datasets.filecoin.io/). As an example, let's design the deal aggregator table as follows. However, you can certainly add more columns to this table to include additional information, such as RaaS registration. @@ -129,7 +129,7 @@ function complete( } ``` -4. **Query aggregation records** +4. **Query aggregation records** By using the Tableland SDK, you can easily query the aggregation or RaaS status of all the data stored with the aggregator using SQL statements. For instance, you can retrieve all records associated with a specific CID by executing a SELECT statement. @@ -143,6 +143,4 @@ console.log(results); To learn how to write different select statements using Tableland SDK, you can refer to [here](https://docs.tableland.xyz/sdk/database/prepared-statements). - - -[Was this page helpful?](https://airtable.com/apppq4inOe4gmSSlk/pagoZHC2i1iqgphgl/form?prefill\_Page+URL=https://docs.filecoin.io/builder-cookbook/dapps/decentralized-database) +[Was this page helpful?](https://airtable.com/apppq4inOe4gmSSlk/pagoZHC2i1iqgphgl/form?prefill_Page+URL=https://docs.filecoin.io/builder-cookbook/dapps/decentralized-database) diff --git a/builder-cookbook/data-storage/retrieve-data.md b/builder-cookbook/data-storage/retrieve-data.md index 22d1b596a..36b165d64 100644 --- a/builder-cookbook/data-storage/retrieve-data.md +++ b/builder-cookbook/data-storage/retrieve-data.md @@ -123,8 +123,8 @@ const options = { *** -For quick retrieval of existing datasets with the methods above, check out the [Filecoin Dataset Explorer](https://dataset-explorer.vercel.app/). +For quick retrieval of existing datasets with the methods above, check out the [Filecoin Dataset Explorer](https://datasets.filecoin.io/). *** -[Was this page helpful?](https://airtable.com/apppq4inOe4gmSSlk/pagoZHC2i1iqgphgl/form?prefill\_Page+URL=https://docs.filecoin.io/builder-cookbook/data-storage/retrieve-data) +[Was this page helpful?](https://airtable.com/apppq4inOe4gmSSlk/pagoZHC2i1iqgphgl/form?prefill_Page+URL=https://docs.filecoin.io/builder-cookbook/data-storage/retrieve-data)