Creating a DID-Linked Resource using cheqd Cosmos CLI

The purpose of this document is to outline how someone can create a Resource on the cheqd network using cheqd Cosmos CLI. The process that's followed is similar to what's described in the high-level Resource creation flow.

Pre-requisites

  1. Install the latest stable cheqd-node CLI, either as a standalone binary or Docker container image.

  2. Acquire test CHEQ tokens through our testnet faucet (if creating it on our testnet), or CHEQ tokens (if you plan on creating it on mainnet).

Creating a new Resource linked to a DID

1. Create a new DID + DIDDoc

Note: If you already have a DIDDoc and corresponding keys, you can skip this step.

To create a DIDDoc, you can follow the instructions to create a DID with cheqd Cosmos CLI.

Let's assume the DID for the DIDDoc is as follows:

did:cheqd:mainnet:6h7fjuw37gbf9ioty633bnd7thf65hs1

2. Create a UUID for the Resource

UUIDs are used to identify Resources. On Unix systems, the uuidgen tool can be used to generate a new UUID:

$ uuidgen
e7b662f8-d3f8-4a83-bd00-2cdcd6cc50ab

3. Prepare a file with Resource content

Resource content should be placed in a file and stored locally.

Command

cheqd-noded tx resource create [payload-file] [resource-data-file] [flags]

Understanding Resource Fees

The fee for a resource transaction changes depending on the file type being passed to the ledger. Currently there are three different variations on the fee:

JSON file

Within the payload file the amount should be specified as:

  • denom: ncheq

  • amount: 2500000000

This equates to 2.5 CHEQ.

Image file

Within the payload file the amount should be specified as:

  • denom: ncheq

  • amount: 10000000000

This equates to 10 CHEQ.

Default (any other) file

Within the payload file the amount should be specified as:

  • denom: ncheq

  • amount: 5000000000

This equates to 5 CHEQ.

Parameters

  • payload-file - file with JSON formatted payload. The format and structure can be found in example

  • resource-data-file - file which will be sent to the ledger as a data. Can be a picture or an image or whatever you want.

  • flags - additional parameters like, --gas or --from.

  • fees - the specific fee for the transaction, depending on the type of resource file defined here

Example input:

cheqd-noded tx resource create \
  --chain-id cheqd \
  --keyring-backend test \
  --output json \
  --fees 2500000000ncheq \
  --gas auto \
  --gas-adjustment 1.8 \
  --from base_account \
  [payload.json] [resource.json]

where payload.json is:

{
  "payload": {
    "data": null,
    "collectionId": "b0ca0b75-ca6a-4674-a261-45f6dd0c9c77",
    "id": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
    "name": "TestResource",
    "version": "1.0",
    "resourceType": "TestType",
    "alsoKnownAs": []
  },
  "signInputs": [
    {
      "verificationMethodId": "did:cheqd:testnet:b0ca0b75-ca6a-4674-a261-45f6dd0c9c77#key1",
      "privKey": "y4B5qis9BXUq/mODsrWtS3q5ejOk/okSIXlX1/a9HvuG3PgYmekfQmq3QhJ4JSzN/rkiGCQDNKoTXMmxuXDHbg=="
    }
  ]
}

After you execute the command, you will receive "code": 0" if the resource was successfully written to the ledger.

Otherwise, the raw_logs field in the response can help figure out why something went wrong. For example:

{
  "code": 1201,
  "data": "",
  "raw_log": "failed to execute message; message index: 0: id:cheqd:testnet:fcbarcelona: DID Doc not found"
}

4. Check that new Resource version was successfully written to the ledger

Finally, to check that the resource was successfully written, we can use the following query:

cheqd-noded query resource specific-resource \
    <collection-id> \
    <resource-id> \
    --node https://rpc.cheqd.network:443

Parameters

  • <collection-id>: The same unique identifier as that after the namespace of the corresponding DID created in step 1

  • <resource-id>: Unique ID of the resource within the collection of resources associated with the DIDDoc

Example input:

cheqd-noded query resource specific-resource \
    c82f2b02-bdab-4dd7-b833-3e143745d612 \
    3e6bd814-6851-4c8a-b114-c64f035ef590 \
    --node https://rpc.cheqd.net:443 --output json

Ouput:

{
  "resource": {
    "resource": {
      "data": "..."
    },
    "metadata": {
      "collectionId": "c82f2b02-bdab-4dd7-b833-3e143745d612",
      "id": "3e6bd814-6851-4c8a-b114-c64f035ef590",
      "name": "EventBrite Logo",
      "version": "",
      "resourceType": "image/png",
      "alsoKnownAs": [
        {
          "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/3e6bd814-6851-4c8a-b114-c64f035ef590",
          "description": "did-url"
        }
      ],
      "mediaType": "image/svg+xml",
      "created": "2022-11-17T10:35:23Z",
      "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
      "previousVersionId": "",
      "nextVersionId": ""
    }
  }
}

Notice that both previous_version_id and next_version_id are empty now cause there is only one resource in such collection c82f2b02-bdab-4dd7-b833-3e143745d612.

5. Additional queries to the ledger

There are also 2 annother commands for getting resource from ledger depending what the actual info is needed.

Get metadata

Here is the command which allows to get only metadata information without getting the whole resource. The format of call is:

cheqd-noded query resource metadata [collection-id] [resource-id] [flags]

Parameters collection-id and resource-id have the same meaning as before.

Example input:

cheqd-noded query resource metadata \
    c82f2b02-bdab-4dd7-b833-3e143745d612 \
    3e6bd814-6851-4c8a-b114-c64f035ef590 \
    --node https://rpc.cheqd.net:443 --output json

Output:

{
  "resource": {
    "collection_id": "c82f2b02-bdab-4dd7-b833-3e143745d612",
    "id": "3e6bd814-6851-4c8a-b114-c64f035ef590",
    "name": "EventBrite Logo",
    "version": "",
    "resource_type": "image/png",
    "also_known_as": [
      {
        "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/3e6bd814-6851-4c8a-b114-c64f035ef590",
        "description": "did-url"
      }
    ],
    "media_type": "image/svg+xml",
    "created": "2022-11-17T10:35:23Z",
    "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
    "previous_version_id": "",
    "next_version_id": ""
  }
}

Get collection of resources

For querying all the resources but only metadata there is a special command:

cheqd-noded query resource collection-metadata [collection-id] [flags]

As the main parameter it requires only collection-id.

Example input:

cheqd-noded query resource collection-metadata c82f2b02-bdab-4dd7-b833-3e143745d612  --node https://rpc.cheqd.net:443 --output json

Ouput:

{
  "resources": [
    {
      "collection_id": "c82f2b02-bdab-4dd7-b833-3e143745d612",
      "id": "3e6bd814-6851-4c8a-b114-c64f035ef590",
      "name": "EventBrite Logo",
      "version": "",
      "resource_type": "image/png",
      "also_known_as": [
        {
          "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/3e6bd814-6851-4c8a-b114-c64f035ef590",
          "description": "did-url"
        }
      ],
      "media_type": "image/svg+xml",
      "created": "2022-11-17T10:35:23Z",
      "checksum": "a95380f460e63ad939541a57aecbfd795fcd37c6d78ee86c885340e33a91b559",
      "previous_version_id": "",
      "next_version_id": ""
    },
    {
      "collection_id": "c82f2b02-bdab-4dd7-b833-3e143745d612",
      "id": "9447c669-0ba1-4989-bd10-a85cc298aace",
      "name": "Discord Logo",
      "version": "",
      "resource_type": "image/png",
      "also_known_as": [
        {
          "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/9447c669-0ba1-4989-bd10-a85cc298aace",
          "description": "did-url"
        }
      ],
      "media_type": "image/png",
      "created": "2022-11-17T10:35:51Z",
      "checksum": "b2939df5a48f422fc9d62f270c182f07b5fd5a7a334478ea73af4fdb5eb12d3b",
      "previous_version_id": "",
      "next_version_id": ""
    },
    {
      "collection_id": "c82f2b02-bdab-4dd7-b833-3e143745d612",
      "id": "ba4d1a8b-6395-4b96-8492-aaf2800d5727",
      "name": "Twitter Logo",
      "version": "",
      "resource_type": "image/png",
      "also_known_as": [
        {
          "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/ba4d1a8b-6395-4b96-8492-aaf2800d5727",
          "description": "did-url"
        }
      ],
      "media_type": "image/png",
      "created": "2022-11-17T10:36:26Z",
      "checksum": "aeb8f203a6a21cca668c5c8983dfe86b3cf95add102305da8208100595d69800",
      "previous_version_id": "",
      "next_version_id": ""
    },
    {
      "collection_id": "c82f2b02-bdab-4dd7-b833-3e143745d612",
      "id": "cb3f5f64-c138-4309-b9ea-8d658b0ae28e",
      "name": "IIW Event Logo",
      "version": "",
      "resource_type": "image/png",
      "also_known_as": [
        {
          "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/cb3f5f64-c138-4309-b9ea-8d658b0ae28e",
          "description": "did-url"
        }
      ],
      "media_type": "image/png",
      "created": "2022-11-17T10:36:37Z",
      "checksum": "d48e158b915eae31ba2db640bd4aac7f82179ee5ca0263a8fe99012d4b02cf48",
      "previous_version_id": "",
      "next_version_id": ""
    },
    {
      "collection_id": "c82f2b02-bdab-4dd7-b833-3e143745d612",
      "id": "e2651dd2-7ca7-44f1-9ba5-57a77747d9b4",
      "name": "GitHub Logo",
      "version": "",
      "resource_type": "image/png",
      "also_known_as": [
        {
          "uri": "did:cheqd:mainnet:c82f2b02-bdab-4dd7-b833-3e143745d612/resources/e2651dd2-7ca7-44f1-9ba5-57a77747d9b4",
          "description": "did-url"
        }
      ],
      "media_type": "image/png",
      "created": "2022-11-17T10:36:09Z",
      "checksum": "22ed95ff774cee8427c86b60288af4077b3b26424c758bec95a34aa8b7a88937",
      "previous_version_id": "",
      "next_version_id": ""
    }
  ],
  "pagination": null
}

Congratulations! You've successfully created a resource on cheqd ledger; hopefully, the first of many.

Last updated