# Gateway API Storage Provider Walkthrough ## 0 - Prerequisites Use the credentials from a *dummy organisation* (ID: 77): ```bash= export KEY="-6H7FHYo4aX5-dYMVF82x2_rzO1cXIB5URc24dPwMls" export SECRET="cnhNgI77IMVeyenhZnPylcD_XKO72piWzzT68psVKJA" export TOKEN=`curl -s -d grant_type=client_credentials -d client_id=$KEY -d client_secret=$SECRET -d scope=write -X POST https://babelfish.data-container.net/oauth/token | jq -r '.access_token'` ``` * current org: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/organization/current` * current user: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/user/current` * available collections: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/collection/list` ## 1 - Simple: store within Babelfish *Note:* use the existing "Demo Collection" (ID: 99) * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/collection/99` To write an object, the following steps must be performed: 1. create an object ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Create-Object-metadata)) ```bash= echo '{"name":"test - simple", "collection-id": 99}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/object/ ``` new object-id: 752 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/752` 2. write payload ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Write-Object-object-itself)): ```bash= echo '{"I":"am the payload"}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X PUT https://babelfish.data-container.net/object/752/write ``` read the data: * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/752/read` ## 2 - AWS: store at Amazon *Note:* this storage provider uses an Amazon account from OwnYourData to store data in the AWS cloud; configuration for the AWS storage provider backend is provided when starting the Gateway API in the following environment variables: `AWS_S3_KEY`, `AWS_S3_SECRET` To write an object the following steps must be performed: 1. create a collection that configures the AWS storage provider ```bash= echo '{"name":"AWS Storage Provider", "storage":{"type": "AWS", "service-id": 340}}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/collection ``` new collection-id: 756 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/collection/756` 2. create an object ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Create-Object-metadata)) ```bash= echo '{"name":"test - AWS", "collection-id": 756}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/object/ ``` new object-id: 757 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/757` 3. write payload ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Write-Object-object-itself)): ```bash= echo '{"payload":"stored on AWS"}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X PUT https://babelfish.data-container.net/object/757/write ``` inspect: * read data: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/757/read` * meta data on AWS: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/757/read/meta` * show in AWS: login to https://aws.amazon.com -> S3 -> Bucket "ontochain" -> check DRI matches meta data / show payload ## 3 - Bellecour: store at Amazon & Bellecour *Note:* this section demonstrates writing data off-chain into the AWS cloud and additionally metadata on-chain on the Bellecour network To write an object the following steps must be performed: 1. create a collection that configures the AWS and Bellecour storage provider ```bash= echo '{"name":"AWS & Bellecour Storage Providers", "storage":{"type": "AWS", "service-id": 340}, "dlt":{"type": "Bellecour", "service-id": 341}}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/collection ``` new collection-id: 768 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/collection/768` 2. create an object ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Create-Object-metadata)) ```bash= echo '{"name":"test - AWS+Bellecour", "collection-id": 768}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/object ``` new object-id: 769 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/769` 3. write payload ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Write-Object-object-itself)): *this command takes a few seconds to execute because the response waits for the confirmation from the [smart contract executed on Bellecour](https://blockscout-bellecour.iex.ec/address/0xF31A125fb44E0c2dca45c2665F272e9fc09f92AE/transactions#address-tabs)* ```bash= echo '{"payload":"stored on AWS and Bellecour"}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X PUT https://babelfish.data-container.net/object/769/write ``` inspect: * read data: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/769/read` * meta data on AWS and Bellecour: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/769/read/meta` * show in AWS: login to https://aws.amazon.com -> S3 -> Bucket "ontochain" -> check DRI matches meta data / show payload * show in Bellecour: https://blockscout-bellecour.iex.ec/tx/0xa2f08541447fe11ec3519ede5ea7fe98826e786f4bfd1c2e3b8b1a202cc1a2ca * payload DRI must match *Raw Input* shown in UTF-8 ## 4 - Convex: store in Semantic Container & Convex *Note:* in the final storage provider demo data will be stored off-chain in a dedicated [Semantic Container](https://www.ownyourdata.eu/semcon) and on-chain on the [Convex network](https://convex.world/) To write an object the following steps must be performed: 1. provide relevant credentials for the current user to access Convex: ```bash= echo '{"name":"admin", "meta":{"dlt":[ {"type": "Convex", "account":"48", "seed":"7e4f674420a17067115cb26490351510cd25f0467795b725628e66d72d27ad4b" } ]} }' | \ curl -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d @- -X PUT https://babelfish.data-container.net/user/89 ``` inspect: * show user wallet: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/user/89/wallet` * show account on Convex: https://convex.world/testnet/account/48 * attach to account: https://convex.world/testnet/wallet 2. create a collection that configures the location of the Semantic Container and the Convex storage provider: ```bash= echo '{"name":"SemCon and Convex Storage Providers", "storage":{"type": "Semantic Container", "service-id": 339, "url": "https://storage-oc3.data-container.net"}, "dlt":{"type": "Convex", "service-id": 342}}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/collection ``` new collection-id: 771 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/collection/771` 3. create an object ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Create-Object-metadata)) ```bash= echo '{"name":"test - SemCon+Convex", "collection-id": 771}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X POST https://babelfish.data-container.net/object ``` new object-id: 775 * `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/775` 4. write payload ([link](https://hackmd.io/faNBTCUcSRyQsLOf_Jhdag?view#Write-Object-object-itself)): ```bash= echo '{"payload":"stored on SemCon and Convex"}' | \ curl -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @- -X PUT https://babelfish.data-container.net/object/775/write ``` inspect: * read data: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/775/read` * meta data: `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/775/read/meta` * show in SemCon: https://storage-oc3.data-container.net/api/data?id=5 * or with content-based address: https://storage-oc3.data-container.net/api/data?dri=zQmWFwzCtMTkk1tc3UtRbZ51qGLhB6JeKuJmuL8f7BjpD7w * validate hash value on Convex: * open Convex Sandbox: https://convex.world/sandbox * be sure to attach to account: https://convex.world/testnet/wallet - account: 48 - seed: `7e4f674420a17067115cb26490351510cd25f0467795b725628e66d72d27ad4b` * run the following command in the sandbox `(get n/documents 32)` * the number after `documents` is the `convex-sequence` in the `dlt-repsonse` * the `storage-hash` in the `dlt-repsonse` needs to be equal to the hash stored in Convex * the storage-hash can be calculated manually by creating a string with payload-id and payload-hash from `curl -H "Authorization: Bearer $TOKEN" https://babelfish.data-container.net/object/775` * use e.g., SHA256 Online: https://emn178.github.io/online-tools/sha256.html * calculate hash from `id:776,dri:zQmSaGcHgKoeJx678YUScjU1jAa43bXhHSgLtQoEzvuWWAY` ## Conclusion In conclusion, selecting the appropriate storage provider for a Gateway API significantly influences the system's behaviour, reliability, and overall performance. This tutorial aimed to illuminate the available options, while also shedding light on various storage providers. Ultimately, a well-chosen storage provider will provide a solid foundation for your Gateway API, facilitating seamless data management and optimized operations.