Editing Configuration Step By Step - TrackingChains/TrackingChain GitHub Wiki

The program configuration can be divided into several categories:

Ink Smart Contract

NB: Seed Database provider the already configuration that used already deployed smartcontract, so this section can be skipped as it is not needed. However, it is useful if you want to deploy a new smart contract or use chains that are not present by default. To do this, it is also necessary to generate the Substrate client for the chain, also following this guide, so you can skip to next section.

First, you need to deploy the smart contract and proceed with its configuration by following the steps below:

  1. Guide Ink SmartContract Follow this guide to deploy the smart contract.
  2. Guide Seed Database Next, follow this guide for database seeding.
  3. Guide Run Services Finally, run this guide to start the services.

Once these steps are completed, the smart contract will be deployed and configured to be used by all desired Accounts. Also, you will get the configuration values, such as BasicWeight, ByteWeight, RefTime and ProofSize, which will be needed for the next step of Seed Database (the scripts are already configured correctly, so you won't need this data unless you are entering a new smartcontract/chain).

Triage API e Create Database

Recommended environment:
To simplify the installation and configuration, I recommend installing the Microsoft Sql Server via docker (in the guide exposed with port 5533), while all the other services (Api, WebApplication and Workers) will be on the usual Ubuntu machine. This is because each installation of the service is selfcontained and therefore does not require particular installations or versions of libraries, just run the executable provided on the github repository.

Install Sql Server

Currently, the default Microsoft SQL Server provider is used, but you can use any of the supported databases in this list. You can install a SQL Server via Docker using the following commands:

docker pull mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourStrong@Passw0rd" -p 5533:1433 --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2022-latest

Install Triage API Service

The "Triage API" service plays a fundamental role in the management of automatic migrations, including the creation of the database in the initial start-up phase and any changes to the structure in the event of application updates. This process happens automatically every time you start the "Triage API". Below, we see how to configure and launch this service.

  1. Download the "Triage API" service from releases page on GitHub. Make sure you download the latest version, but always check if there are any new released versions.
  2. The guide below is based on a Unix operating system, but the same steps can be followed on Windows and Mac.
  3. After downloading the package, the file to get is triage-api-v0.2.0-alpha-linuxselfcontained.tar.gz. This package has been chosen as "selfcontained", so you won't need to install the .NET runtime on the machine where the service will run.

If you're using Windows or Mac, make sure you adapt the commands according to your operating system. You can use a file extraction tool such as 7-Zip or your system's built-in compression software to extract the contents of the triage-api-v0.2.0-alpha-linuxselfcontained.tar.gz archive.

mkdir TrackingChain
cd TrackingChain
wget https://github.com/TrackingChains/TrackingChain/releases/download/v0.2.0-alpha/triage-api-v0.2.0-alpha-linuxselfcontained.tar.gz  
tar xzvf triage-api-v0.2.0-alpha-linuxselfcontained.tar.gz  
cd triage-api-v0.2.0-alpha-linuxselfcontained

Once the package has been extracted, you should end up with a number of files and folders, including the "Triage API" service executable and the appsettings.json configuration file.

  1. Open and edit the appsettings.json file with the correct configuration for your database:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Data Source=; Initial Catalog=;Trusted_Connection=True;",
    "UseMigrationScript": true
  }
  1. To create a database called "TrackingChain" and configure your SQL server reachable at address localhost on port 5533, you will need to make the following changes:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Server=localhost,5533;Database=TrackingChain;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;",
    "UseMigrationScript": true
  }

For more information about ConnectionStrings you can consult https://www.connectionstrings.com/sql-server/

  1. Launch the "Triage API":
./Triage.API

Triage_01_Executed_Migration

The photo shows that the service has been launched and has performed the Migrate Db, creating the database during the first start.

Next, proceed with Data Seed to get a ready-to-go setup for onchain data ingestion.

Seed Database

To install your favorite SQL client, you can choose from this list: SQL Tools Overview. For Windows users, it is highly recommended to use SQL Server Management Studio (SSMS).

In the configuration below, we use several chains:

Below is a configuration that allows you to use chains

  • Contract Rococo
  • Shibuya Substrate
  • Shibuya EVM
  • Moonbase EVM

Provided accounts are already stocked with enough gas to perform all test transactions. However, the private keys are still missing, which will need to be replaced with the specific private keys listed on this other page to ensure security.

-- Astar Test EVM
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('4F8E591B-6A9C-486E-AB2B-2B42ABBF5B23','https://shibuya.blastapi.io/c8707e18-84fe-4b15-9665-a2897c0687df', 'https://shibuya.blastapi.io/c8707e18-84fe-4b15-9665-a2897c0687df', 'Astar Test EVM One', '4907f53615b76294a1238fbc9a9cd3d140beb9730b42085dc4c63e550a75357e')
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('5F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', 'https://shibuya.blastapi.io/7a2921d5-7c0c-411d-b687-4ba57cfbff25', 'https://shibuya.blastapi.io/7a2921d5-7c0c-411d-b687-4ba57cfbff25', 'Astar Test EVM Two', '7f73040cc57fbcaa07ce6234cc6c153b982c9c73b5c9983aff0b108f99e6988d')
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('6F8E591B-6A9C-486E-AB2B-2B42ABBF5B23','https://shibuya.blastapi.io/c8707e18-84fe-4b15-9665-a2897c0687df', 'https://shibuya.blastapi.io/c8707e18-84fe-4b15-9665-a2897c0687df', 'Astar Test EVM Three', '21ff508926baa340d88a9157eeb03e969a676630951fa79e0d26a7a4a8288f68')
-- Moonbeam Test EVM
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23','https://moonbase-alpha.blastapi.io/11cd5d86-565d-4b84-9cac-84cd08511215', 'https://moonbase-alpha.blastapi.io/11cd5d86-565d-4b84-9cac-84cd08511215', 'Moonbeam Test EVM One', 'f60b7f53ae9593503174f55f5e236170d26c75e5a9beaf60c479b49563256a18')
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('9F8E591B-6A9C-486E-AB2B-2B42ABBF5B23','https://moonbase-alpha.blastapi.io/4e06bea6-56f2-40e0-a400-2e95f07a87e9', 'https://moonbase-alpha.blastapi.io/4e06bea6-56f2-40e0-a400-2e95f07a87e9', 'Moonbeam Test EVM Two', '7f4e1faf35cdbb5331fc52ed605ca3e9a341f65651c5be85651915be780b5c8f')
-- Astar Test Ink
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('1F8E591B-6A9C-486E-AB2B-2B42ABBF5B23','wss://shibuya.blastapi.io/c8707e18-84fe-4b15-9665-a2897c0687df', 'https://shibuya.api.subscan.io|c5b981ec4efa4ad69a39578e81f1d583', 'Astar Test Ink', '0x4874841a4694f021ea71a08f5bedd26e6e5f3ecc3240d41d72dad937d20a9d14')
-- Contract Rococo Test Ink
insert into [Accounts] (Id, ChainWriterAddress, ChainWatcherAddress, Name, PrivateKey) values
('2F8E591B-6A9C-486E-AB2B-2B42ABBF5B23','wss://rococo-contracts-rpc.polkadot.io', '', 'Rococo Test Ink','0xe6191a72d53e2825ff5d379187c9b67f38241e9d70308603c759eaef6336b075')

-- SmartContract
insert into [SmartContract] (Address, ChainNumberId, ChainType, Currency, ExtraInfo, Name) values
('0xa0532A56179Eb1677D33709db82de6b5880f23c6', 81, 0, 'SBY', '{"WaitingSecondsForWatcherTx":90}', 'Shibuya Test Net EVM')
insert into [SmartContract] (Address, ChainNumberId, ChainType, Currency, ExtraInfo, Name) values
('0x55D64aB19C01e135b86429D9367DfCEE3EF615a3', 1287, 0, 'DEV', '{"WaitingSecondsForWatcherTx":90}', 'Moonbase Test Net')
insert into [SmartContract] (Address, ChainNumberId, ChainType, Currency, ExtraInfo, Name) values
('XqLt7FSZrn8nffSGkRYWZKn4JCWZBvHNH3sTRnQL4qDr2Dp', 101, 1, 'SBY', '{"InsertTrackSelectorValue":"0x1ba63d86","ProofSize":125952,"RefTime":4793859072,"BasicWeight":49000000000,"ByteWeight":1000000000,"SupportedClient":0,"WaitingSecondsForWatcherTx":90}', 'Shibuya Test Net INK')
insert into [SmartContract] (Address, ChainNumberId, ChainType, Currency, ExtraInfo, Name) values
('5C557tarfZcHfxAeCLd67wNjuQCiuvaJr23Qd56kPjUxn382', 9420, 1, 'ROC', '{"InsertTrackSelectorValue":"0x1ba63d86","ProofSize":125952,"RefTime":4793859072,"BasicWeight":6682666644,"ByteWeight":333333,"SupportedClient":1,"WaitingSecondsForWatcherTx":90}', 'Contract Rococo Test Net INK')

-- Profile
insert into [ProfileGroups] (Id, AggregationCode, Authority, Category, Name, SmartContractId, Priority) values
('8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', NULL, NULL, 'Shibuya EVM', 'EVM Solidity Shibuya', 1, 0)
insert into [ProfileGroups] (Id, AggregationCode, Authority, Category, Name, SmartContractId, Priority) values
('DB909755-29D0-4AA4-8815-C77232743991', NULL, NULL, 'Moonbase EVM', 'EVM Solidity Moonbase', 2, 0)
insert into [ProfileGroups] (Id, AggregationCode, Authority, Category, Name, SmartContractId, Priority) values
('71D944E7-CC29-4CA2-9B4D-78A07A503A52', NULL, NULL, 'Shibuya Ink', 'Substrate Ink Shibuya', 3, 0)
insert into [ProfileGroups] (Id, AggregationCode, Authority, Category, Name, SmartContractId, Priority) values
('51D944E7-CC29-4CA2-9B4D-78A07A503A52', NULL, NULL, 'Rococo Ink', 'Substrate Ink Contract Rococo', 4, 0)


-- Profile Shibuya EVM
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('4F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', '8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', 0)
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('5F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', '8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', 0)
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('6F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', '8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', 0)

-- Profile Moonbase EVM
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', 'DB909755-29D0-4AA4-8815-C77232743991', 0)
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('9F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', 'DB909755-29D0-4AA4-8815-C77232743991', 0)

-- Profile Shibuya Ink
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('1F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', '71D944E7-CC29-4CA2-9B4D-78A07A503A52', 0)

-- Contract Rococo Ink
insert into [AccountProfileGroup] (AccountId, ProfileGroupId, Priority) values
('2F8E591B-6A9C-486E-AB2B-2B42ABBF5B23', '51D944E7-CC29-4CA2-9B4D-78A07A503A52', 0)

Note that in the rows relating to the Smart Contract table, a JSON object is present in the "ExtraInfo" column.

{
  "InsertTrackSelectorValue": "0x1ba63d86",
  "ProofSize": 125952,
  "RefTime": 4793859072,
  "BasicWeight": 14000000000,
  "ByteWeight": 1000000000,
  "SupportedClient": 0,
  "WaitingSecondsForWatcherTx": 90
}

Here are the values extracted during the deployment of the Ink smart contracts, i.e. ProofSize, RefTime, BasicWeight, ByteWeight in this case you won't have to do anything because correct values have already been entered.

Also, if you have correctly replaced the missing private keys with the ones specified in the dedicated page, allora siete pronti per procedere alla fase di lancio degli altri servizi.

Starting services

Run Aggregator Pool Worker Service

  1. Download the "Aggregator Pool Worker" service from releases page on GitHub. Make sure you download the latest version, but always check if there are any new released versions.
  2. The guide below is based on a Unix operating system, but the same steps can be followed on Windows and Mac.
  3. After downloading the package, the file to get is aggregator-pool-worker-v0.2.0-alpha-linuxselfcontained.tar.gz. This package has been chosen as "selfcontained", so you won't need to install the .NET runtime on the machine where the service will run.
mkdir TrackingChain
cd TrackingChain
wget https://github.com/TrackingChains/TrackingChain/releases/download/v0.2.0-alpha/aggregator-pool-worker-v0.2.0-alpha-linuxselfcontained.tar.gz
tar xzvf aggregator-pool-worker-v0.2.0-alpha-linuxselfcontained.tar.gz
cd aggregator-pool-worker-v0.2.0-alpha-linuxselfcontained

Once the package has been extracted, you should end up with a number of files and folders, including the "AggregatorPool.Worker" service executable and the appsettings.json configuration file.

  1. Open and edit the appsettings.json file with the correct configuration for your database:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Data Source=; Initial Catalog=;Trusted_Connection=True;",
    "UseMigrationScript": true
  }
  1. To create a database called "TrackingChain" and configure your SQL server reachable at address localhost on port 5533, you will need to make the following changes:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Server=localhost,5533;Database=TrackingChain;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;",
    "UseMigrationScript": true
  }

For more information about ConnectionStrings you can consult https://www.connectionstrings.com/sql-server/

  1. Launch the "Aggregator Pool":
./AggregatorPool.Worker

AggregatorPool_01_Start

Run Transaction Generator Worker Service

  1. Download the "Transaction Generator Worker" service from the releases page on GitHub. Make sure you download the latest version, but always check if there are any new released versions.
  2. The guide below is based on a Unix operating system, but the same steps can be followed on Windows and Mac.
  3. After downloading the package, the file to get is transaction-generator-worker-v0.2.0-alpha-linuxselfcontained.tar.gz. This package has been chosen as "selfcontained", so you won't need to install the .NET runtime on the machine where the service will run.
mkdir TrackingChain
cd TrackingChain
wget https://github.com/TrackingChains/TrackingChain/releases/download/v0.2.0-alpha/transaction-generator-worker-v0.2.0-alpha-linuxselfcontained.tar.gz
tar xzvf transaction-generator-worker-v0.2.0-alpha-linuxselfcontained.tar.gz
cd transaction-generator-worker-v0.2.0-alpha-linuxselfcontained

Once the package has been extracted, you should get a number of files and folders, including the "TransactionGenerator.Worker" service executable and the appsettings.json configuration file.

  1. Open and edit the appsettings.json file with the correct configuration for your database:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Data Source=; Initial Catalog=;Trusted_Connection=True;"
  }
  1. To create a database called "TrackingChain" and configure your SQL server reachable at address localhost on port 5533, you will need to make the following changes, and the Dequeuer::Accounts section has also been added:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Server=localhost,5533;Database=TrackingChain;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;"
  },
  "Dequeuer": {
    "Accounts": [
      "1F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "2F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "4F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "5F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "6F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "9F8E591B-6A9C-486E-AB2B-2B42ABBF5B23"
    ]
  }

Dequeuer::Accounts is an array containing the GUIDs of the accounts configured in the Accounts sql table. This way the service will know that it has to start an instance for each account found. This configuration is necessary to ensure that multiple workers can be started, each with a different account configuration, to avoid excessive overhead on a single machine. The key requirement is that each account has only one unique instance of the process to avoid potential concurrency issues between accounts with the same GUID.

  1. Lanciare il "Transaction Generator":
./TransactionGenerator.Worker

Generator_01_Start

Run Transaction Watcher Worker Service

  1. Download the "Watcher Worker" service from the releases page on GitHub. Make sure you download the latest version, but always check if there are any new released versions.
  2. The guide below is based on a Unix operating system, but the same steps can be followed on Windows and Mac.
  3. After downloading the package, the file to get is transaction-watcher-worker-v0.2.0-alpha-linuxselfcontained.tar.gz. This package has been chosen as "selfcontained", so you won't need to install the .NET runtime on the machine where the service will run.
mkdir TrackingChain
cd TrackingChain
wget https://github.com/TrackingChains/TrackingChain/releases/download/v0.2.0-alpha/transaction-watcher-worker-v0.2.0-alpha-linuxselfcontained.tar.gz
tar xzvf transaction-watcher-worker-v0.2.0-alpha-linuxselfcontained.tar.gz
cd transaction-watcher-worker-v0.2.0-alpha-linuxselfcontained

Once the package has been extracted, you should get a number of files and folders, including the "TransactionWatcher.Worker" service executable and the appsettings.json configuration file.

  1. Open and edit the appsettings.json file with the correct configuration for your database:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Data Source=; Initial Catalog=;Trusted_Connection=True;"
  }
  1. To create a database called "TrackingChain" and configure your SQL server reachable at address localhost on port 5533, you will need to make the following changes, and the Dequeuer::Accounts section has also been added:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Server=localhost,5533;Database=TrackingChain;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;"
  },
  "Checker": {
    "Accounts": [
      "1F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "2F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "4F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "5F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "6F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "8F8E591B-6A9C-486E-AB2B-2B42ABBF5B23",
      "9F8E591B-6A9C-486E-AB2B-2B42ABBF5B23"
    ]
  }

Checker::Accounts is an array that contains the GUIDs of the accounts configured in the SQL table Account. This way, the service will know that it needs to start an instance for each account found. This configuration is necessary to ensure that multiple workers can be launched, each with a different account configuration, to avoid excessive overload on a single machine. The fundamental requirement is that each account has a unique and exclusive instance of the process to prevent potential concurrency issues among accounts with the same GUID.

  1. Lanciare il "Transaction Watcher":
./TransactionWatcher.Worker

WatcherStart

Requirement Subscan

The watcher will use the Subscan service to be able to check the status of the transaction performed by the generator Worker, in the configuration file provided there is already an account used for the use of subscan. In the cases of the rococo chain which is not available on Subscan, all transactions once executed will be considered frozen, without any verification of the positive or negative outcome returned by the smart contract (any improvements in this phase are foreseen in the future improvements section and are not are included in these first milestones). For EVM chains instead there is no need for any scanner and the RPC node will be used to directly obtain the result of the transaction

Run Web Application

  1. Download the "Web Application" service from releases page on GitHub. Make sure you download the latest version, but always check if there are any new released versions.
  2. The guide below is based on a Unix operating system, but the same steps can be followed on Windows and Mac.
  3. After downloading the package, the file to get is web-application-v0.2.0-alpha-linuxselfcontained.tar.gz. This package has been chosen as "selfcontained", so you won't need to install the .NET runtime on the machine where the service will run.
mkdir TrackingChain
cd TrackingChain
wget https://github.com/TrackingChains/TrackingChain/releases/download/v0.2.0-alpha/web-application-v0.2.0-alpha-linuxselfcontained.tar.gz
tar xzvf web-application-v0.2.0-alpha-linuxselfcontained.tar.gz
cd web-application-v0.2.0-alpha-linuxselfcontained

Once the package has been extracted, you should end up with a number of files and folders, including the "WebApplication" service executable and the appsettings.json configuration file.

  1. Open and edit the appsettings.json file with the correct configuration for your database:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Data Source=; Initial Catalog=;Trusted_Connection=True;",
    "UseMigrationScript": false
  }
  1. To create a database called "TrackingChain" and configure your SQL server reachable at address localhost on port 5533, you will need to make the following changes:
"Database": {
    "DbType": "system.data.sqlclient",
    "ConnectionString": "Server=localhost,5533;Database=TrackingChain;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;",
    "UseMigrationScript": false
  }

For more information about ConnectionStrings you can consult https://www.connectionstrings.com/sql-server/

  1. Launch the "Triage WebApplication":
./WebApplication --urls http://0.0.0.0:12345

WebApplication_01

WebApplication_02

Send TrackingChain requests

Send request on chain Rococo

If all services have been launched successfully, the Triage API will be listening on the HTTP port http://localhost:5000/ (as shown in the installation photo of the Triage API service). Now, you can send requests using cURL (or the HTTP request generation tool of your preference).

curl -X 'POST' \
  'http://localhost:5000/TrackingEntry/Product' \
  -H 'accept: text/plain' \
  -H 'Content-Type: application/json' \
  -d '{
  "code": "CAMICIA",
  "data": "{colore: \"blu\"}",
  "category": "Rococo Ink"
}'
  • Code: is the product code that needs to be tracked (maximum length 32 bytes).
  • Data: is the value associated with the tracked product.
  • Category: is the category to which the Tracking will be associated, necessary to determine which smart contract profile to link the transaction (and therefore decide on which chain it should end up).

Send request on chain Shibuya Ink

curl -X 'POST' \
  'http://localhost:5000/TrackingEntry/Product' \
  -H 'accept: text/plain' \
  -H 'Content-Type: application/json' \
  -d '{
  "code": "CAMICIA",
  "data": "{colore: \"blu\"}",
  "category": "Shibuya Ink"
}'
  • Category: Note that only the value has changed as a smart contract found on Shibuya Ink has been associated with this category

Insights

Transactions are designed to be executed in series in case of duplicate CODEs, ensuring the chronological order of Tracking. However, for different CODEs, parallel insertion is used for scalability. That's why multiple Dequeuer::Accounts have been configured in the generator's settings.

Swagger

Instead of executing cURL commands, it is possible to use the graphical interface provided by Swagger, which is accessible at http://localhost:5000/.

Triage_Swagger_Insert NB: In the example photo the service ran at the address http://localhost:7230

Demo Step by Step

You can see how to insert data onchain and verify all steps HERE