Examples

For the examples on this page, we assume you’ve installed the glitter sdk Python package.

Getting Started

We begin by creating an object of class GlitterClient:

from glitter_sdk import GlitterClient
url = 'http://127.0.0.1:26659'
glitter_client = GlitterClient(url)

Or use the default root url

from glitter_sdk import GlitterClient
glitter_client = GlitterClient()

Create Schema

schema_name="demo"
fields = [
    {
        "name": "user_id",
        "type": "string",
        "primary": "true",
        "index": {
            "type": "keyword"
        }
    },
    {
        "name": "user_name",
        "type": "string",
        "index": {
            "type": "text"
        }
    },
    {
        "name": "email_address",
        "type": "string",
        "index": {
            "type": "text",
            "index": "false"
        }
    }
]
res = glitter_client.db.create_schema(schema_name, fields)
print(res)

If the schema is created successfully, the return would be:

{
    "code": 0,
    "message": "ok",
    "tx": "B88CEA8172F0B8BD7EAC3021C1B347786F74EDCD9110A7525C61237CD91FCE73",
}

If the schema already exists, the return would be:

{
  "code": 500,
  "message": "schema already exist: schema_name=demo",
}

Show Schema

Get schema by name.

res = glitter_client.db.get_schema("demo")

if success:

{
    "code": 0,
    "message": "ok",
    "data": {
        "fields": [{
            "index": {
                "type": "keyword"
            },
            "name": "user_id",
            "primary": "true",
            "type": "string"
        }, {
            "index": {
                "type": "text"
            },
            "name": "user_name",
            "type": "string"
        }, {
            "index": {
                "index": "false"
            },
            "name": "email_address",
            "type": "string"
        }],
        "name": "demo",
        "type": "record"
    }
}

otherwise:

{
    "code": 505,
    "message": "SchemaNotExist",
}

List All Schemas

res = glitter_client.db.list_schema()
# return
{
    "code": 0,
    "message": "ok",
    "data": {
        "demo": {
            "fields": [{
                "index": {
                    "type": "keyword"
                },
                "name": "user_id",
                "primary": "true",
                "type": "string"
            }, {
                "index": {
                    "type": "text"
                },
                "name": "user_name",
                "type": "string"
            }, {
                "index": {
                    "index": "false"
                },
                "name": "email_address",
                "type": "string"
            }],
            "name": "demo",
            "type": "record"
        },
    }
}

Put Document to Glitter

Define a document and put it to Glitter Protocol. For example:

demo_doc = {
    "user_id": "123",
    "user_name": "Bob",
    "email_address": "Bob@gmail.com"
}
res = glitter_client.db.put_doc(schema_name, demo_doc)

If doc is put into Glitter Protocol successfully, the return would be:

{
  "code": 0,
  "message": "ok",
  "tx": "49429CDC575C0ED6D021FE9BEE1D44578AC7EDAD61A25EBBF0DE72746E0064F8",
}

Otherwise, the return may be like:

{
  "code": 500,
  "message": "RPC error -32603 - Internal error: tx already exists in cache",
}

Check Existence of Document

Query by primary key of the document, for example:digit_object_id.

schema_name = "demo"
user_id = "123"
res = glitter_client.db.get_docs(schema_name, [user_id])

We will have a document return as below:

{
    "code": 0,
    "message": "ok",
    "data": {
        "total": 1,
        "hits": {
            "123": {
                "_schema_name": "demo",
                "user_id": "123",
                "user_name": "Bob",
                "email_address": "Bob@gmail.com"
            }
        }
    }
}

Search in the Schema

This search is the standard query for performing a full-text search, including options for fuzzy matching.

query_word = "Bob"
query_field = ["user_name"]
res = glitter_client.db.search(schema_name, query_word, query_field)

The hit result like:

{
    "code": 0,
    "message": "ok",
    "data": {
        "search_time": 695,
        "index": "demo",
        "meta": {
            "page": {
                "current_page": 1,
                "total_pages": 1,
                "total_results": 1,
                "size": 10,
                "sorted_by": ""
            }
        },
        "items": [{
            "highlight": {
                "title": ["<span>Bob</span>"]
            },
            "data": {
                "_schema_name": "demo",
                "user_id": "123",
                "user_name": "Bob",
                "email_address": "Bob@gmail.com"
            }
        }],
        "facet": {}
    }
}

App Status

res = glitter_client.db.app_status()
# return
{
    "code": 0,
    "message": "ok",
    "data": {
        "schema_state": {
            "demo": {
                "count": 3,
                "last_update_time": "2022-04-04T08:00:27.617071816Z"
            }
        }
    }
}

Search Transaction

You can also search transaction by transaction height and transaction hash.

# Search by transaction hash.
res = glitter_client.chain.tx_search(query="tx.hash='ACB6696C22B601D544FE05C8899090B4C1E98EF87636AA07EBCD63548786B561'")
# Search by transaction height.
res = glitter_client.chain.tx_search(query="tx.height=460844")
# return
{
  "jsonrpc": "2.0",
  "id": -1,
  "result": {
    "txs": [
      {
        "hash": "ACB6696C22B601D544FE05C8899090B4C1E98EF87636AA07EBCD63548786B561",
        "height": "460844",
        "index": 0,
        "tx_result": {
          "code": 0,
          "data": null,
          "log": "",
          "info": "",
          "gas_wanted": "0",
          "gas_used": "0",
          "events": [
            {
              "type": "update_doc",
              "attributes": [
                {
                  "key": "dG9rZW4=",
                  "value": "bXlfdG9rZW4=",
                  "index": true
                }
              ]
            }
          ],
          "codespace": ""
        },
        "tx": "CghteV90b2tlbhrRBxIGbGliZ2VuGiA1MTczMjc1ZjAyOWE3ZjBiNzhiZGNhY2EzNGE2ZGFjYyKkB3sidGl0bGUiOiAiXHUwNDFjXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzXHUwNDNkXHUwNDMwXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzMFx1MDQzZFx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2RcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2FcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgKFBhcmlzaWFuYSBub21pbmEgYW5hdG9taWNhKSIsICJzZXJpZXMiOiBbIiJdLCAiYXV0aG9yIjogWyJcdTA0MWNcdTA0MzhcdTA0NDVcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDIxLlx1MDQyMS4gKFx1MDQ0MFx1MDQzNVx1MDQzNC4pIl0sICJwdWJsaXNoZXIiOiAiXHUwNDFjXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDNkXHUwNDMwIiwgImxhbmd1YWdlIjogWyJSdXNzaWFuIl0sICJtZDUiOiAiIiwgInRhZ3MiOiBbIlx1MDQxMVx1MDQzOFx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGIiLCAiXHUwNDEwXHUwNDNkXHUwNDMwXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDM4XHUwNDRmIiwgIlx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOCBcdTA0MzggXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMzXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDQwXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDM4Il0sICJpc3NuIjogIiIsICJpcGZzX2NpZCI6ICJiYWZ5a2J6YWNlZGptMjd5bWFwdDRqdDRoMnVlanJveWkydmw2cW4zcW9lMm9zcWUzamphN2E3bzZsbmtseSIsICJleHRlbnNpb24iOiAiZGp2dSJ9",
        "proof": {
          "root_hash": "711715C5DD2D929F5FA6128E73E63690C4CE876D92BE120040F379B50897E567",
          "data": "CghteV90b2tlbhrRBxIGbGliZ2VuGiA1MTczMjc1ZjAyOWE3ZjBiNzhiZGNhY2EzNGE2ZGFjYyKkB3sidGl0bGUiOiAiXHUwNDFjXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzXHUwNDNkXHUwNDMwXHUwNDQwXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQzMFx1MDQzZFx1MDQzMFx1MDQ0Mlx1MDQzZVx1MDQzY1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2RcdTA0M2VcdTA0M2NcdTA0MzVcdTA0M2RcdTA0M2FcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgKFBhcmlzaWFuYSBub21pbmEgYW5hdG9taWNhKSIsICJzZXJpZXMiOiBbIiJdLCAiYXV0aG9yIjogWyJcdTA0MWNcdTA0MzhcdTA0NDVcdTA0MzBcdTA0MzlcdTA0M2JcdTA0M2VcdTA0MzIgXHUwNDIxLlx1MDQyMS4gKFx1MDQ0MFx1MDQzNVx1MDQzNC4pIl0sICJwdWJsaXNoZXIiOiAiXHUwNDFjXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDNkXHUwNDMwIiwgImxhbmd1YWdlIjogWyJSdXNzaWFuIl0sICJtZDUiOiAiIiwgInRhZ3MiOiBbIlx1MDQxMVx1MDQzOFx1MDQzZVx1MDQzYlx1MDQzZVx1MDQzM1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0MzhcdTA0NDFcdTA0NDZcdTA0MzhcdTA0M2ZcdTA0M2JcdTA0MzhcdTA0M2RcdTA0NGIiLCAiXHUwNDEwXHUwNDNkXHUwNDMwXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDM4XHUwNDRmIiwgIlx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOCBcdTA0MzggXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMzXHUwNDNlXHUwNDMyXHUwNDNlXHUwNDQwXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDM4Il0sICJpc3NuIjogIiIsICJpcGZzX2NpZCI6ICJiYWZ5a2J6YWNlZGptMjd5bWFwdDRqdDRoMnVlanJveWkydmw2cW4zcW9lMm9zcWUzamphN2E3bzZsbmtseSIsICJleHRlbnNpb24iOiAiZGp2dSJ9",
          "proof": {
            "total": "1",
            "index": "0",
            "leaf_hash": "cRcVxd0tkp9fphKOc+Y2kMTOh22SvhIAQPN5tQiX5Wc=",
            "aunts": []
          }
        }
      }
    ],
    "total_count": "1"
  }
}

Search Block

You can search block by block_search or fetch the latest block.

res = glitter_client.chain.block()
# or
res = glitter_client.chain.block_search(query="block.height = 17835")
# return
{
     "jsonrpc": "2.0",
     "id": -1,
     "result": {
         "blocks": [{
             "block_id": {
                 "hash": "8E05ECB6E8D9A455C39786A841A494EF5F1A556DD69D7BFE8087D944C0D58E9F",
                 "parts": {
                     "total": 1,
                     "hash": "441EC5490877F1CB88BDF9E98B8A8D0F94AA50F51408616ED0895D2F68144F4E"
                 }
             },
             "block": {
                 "header": {
                     "version": {
                         "block": "11",
                         "app": "1"
                     },
                     "chain_id": "chain-86acvw",
                     "height": "17835",
                     "time": "2022-04-04T12:11:57.151540264Z",
                     "last_block_id": {
                         "hash": "A3DE887AC31ED3EC61E7F5546AD93A10C04FC5EF877C8482BC348BCA34F132E2",
                         "parts": {
                             "total": 1,
                             "hash": "6AA71359A2436CC468DA33F51240E542B191C886D179B2A13CC289011A22BAD6"
                         }
                     },
                     "last_commit_hash": "2CDE9E0FACFAC12823BE0AEE338126AFDEB9C104F6D7B0CA671D7073A034D5BE",
                     "data_hash": "BE70FDA4F06352C81AD76F06FCDE79B453BD1442982D89C801EA8220A7749F06",
                     "validators_hash": "BD3B1DAB2563D85FA57961054C2DB23BDDB08434DBA0DBB5523D357ABA062EDD",
                     "next_validators_hash": "BD3B1DAB2563D85FA57961054C2DB23BDDB08434DBA0DBB5523D357ABA062EDD",
                     "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
                     "app_hash": "",
                     "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
                     "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
                     "proposer_address": "F6749E28383C329AAEF0B2974EC9F6A8F37155E8"
                 },
                 "data": {
                     "txs": ["eyJ0eXBlIjoiZG9jIiwiY3JlYXRvciI6InRlc3RfYnJva3MiLCJib2R5Ijp7InNjaGVtYV9uYW1lIjoicnNzIiwiZG9jX2RhdGEiOnsiZmVlZF9saW5rIjoiaHR0cHM6Ly9jcnlwdG9uZXdtZWRpYS5wcmVzcyIsInRpdGxlIjoiSGVyZVx1MjAxOXMgV2hhdCBXaWxsIElnbml0ZSBhIEJpdGNvaW4gKEJUQykgRXJ1cHRpb24gdG8gJDU4LDAwMCwgQWNjb3JkaW5nIHRvIFRvcCBDcnlwdG8gU3RyYXRlZ2lzdCIsImRlc2NyaXB0aW9uIjoiQSBjbG9zZWx5IGZvbGxvd2VkIGNyeXB0byBhbmFseXN0IGFuZCB0cmFkZXIgaXMuLi5cdTAwM2NiciAvXHUwMDNlXG5cdTAwM2NiciAvXHUwMDNlXG5bWyBUaGlzIGlzIGEgY29udGVudCBzdW1tYXJ5IG9ubHkuIFZpc2l0IG15IHdlYnNpdGUgZm9yIGZ1bGwgbGlua3MsIG90aGVyIGNvbnRlbnQsIGFuZCBtb3JlISBdXSIsImxpbmsiOiJodHRwczovL2NyeXB0b25ld21lZGlhLnByZXNzL2hlcmVzLXdoYXQtd2lsbC1pZ25pdGUtYS1iaXRjb2luLWJ0Yy1lcnVwdGlvbi10by01ODAwMC1hY2NvcmRpbmctdG8tdG9wLWNyeXB0by1zdHJhdGVnaXN0LyIsInB1Ymxpc2hlZCI6Ik1vbiwgMDQgQXByIDIwMjIgMDQ6NTk6MzQgUERUIiwiYXV0aG9yIjoiQ3J5cHRvbWFuIiwibGFuZ3VhZ2UiOiJlbi1VUyIsInRhZ3MiOlsiQml0Y29pbiJdLCJjcmVhdGVfdGltZSI6MTY0OTA3NDMyNX19fQ=="]
                 },
                 "evidence": {
                     "evidence": []
                 },
                 "last_commit": {
                     "height": "17834",
                     "round": 0,
                     "block_id": {
                         "hash": "A3DE887AC31ED3EC61E7F5546AD93A10C04FC5EF877C8482BC348BCA34F132E2",
                         "parts": {
                             "total": 1,
                             "hash": "6AA71359A2436CC468DA33F51240E542B191C886D179B2A13CC289011A22BAD6"
                         }
                     },
                     "signatures": [{
                         "block_id_flag": 2,
                         "validator_address": "1E844C853F55F77595ABE651DE6FEADE989A88D9",
                         "timestamp": "2022-04-04T12:11:57.151532949Z",
                         "signature": "LcK3sjGldE98sA7o1QwXICulsy6R6IUxxXjSSxdh/70Qijko51Uyg9drYQhGwTl8YTO0hFPKo4wSMsf/xVd9BQ=="
                     }, {
                         "block_id_flag": 2,
                         "validator_address": "7638DD6EE1F076E3CD2C49B53042B5A9352918E7",
                         "timestamp": "2022-04-04T12:11:57.153424982Z",
                         "signature": "QqsXdm0X+fkxpfDfYWyDIBE/TsXiE+9GU8Cz/LWGPy5ySnaWzq/4DxtPIhsGfMZxQWlcs/+WVZSTo1tZXSp2AA=="
                     }, {
                         "block_id_flag": 2,
                         "validator_address": "83B53DAE8F1FD30763A1AB20E7C4E7710A56CA30",
                         "timestamp": "2022-04-04T12:11:57.15304431Z",
                         "signature": "0irGoWsRgJuWWkwThrrYzDf3k8x1wlKBIz0TJhvrLGURBzHTZZMqQFxmjsJJc3rCV2zVD9XCRXW2hXo4La+eDg=="
                     }, {
                         "block_id_flag": 2,
                         "validator_address": "ED4BAB4AFBBBBD3D843DEA30D37DEE023826503B",
                         "timestamp": "2022-04-04T12:11:57.151540264Z",
                         "signature": "9MSMVVGLFKIQiPlgJvuH4M0UIz2ggstSDnhfudtcgNfvxyn0A31fdxe6zpYH4H5iV05otTNJA9AD9zhhOCcrBQ=="
                     }, {
                         "block_id_flag": 2,
                         "validator_address": "F6749E28383C329AAEF0B2974EC9F6A8F37155E8",
                         "timestamp": "2022-04-04T12:11:57.153105208Z",
                         "signature": "cZp4fRJd+NjQ7UOtbN9duIbAO+nbW8DZvL8g8ONmpxfBe3mN8Mbf4/SAd8qoK+GmMph/uUdvO39EhuEeOVtVAA=="
                     }]
                 }
             }
         }],
         "total_count": "1"
     }
 }

Fetch Validator Status

Get validator set with a specific height.

res = glitter_client.admin.validators()
# return
{
  "jsonrpc": "2.0",
  "id": -1,
  "result": {
    "block_height": "468323",
    "validators": [
      {
        "address": "1F690E3E9C072133F3B897B358C0F2F127F16704",
        "pub_key": {
          "type": "tendermint/PubKeyEd25519",
          "value": "NLmuSxM3ajCX1qNyiwZVXwv16KfFa2I2TRXGuWaAt0w="
        },
        "voting_power": "1",
        "proposer_priority": "-2"
      },
      {
        "address": "7CE3A03CBCDD77187D9AFD0C242ED0AB910B6ACD",
        "pub_key": {
          "type": "tendermint/PubKeyEd25519",
          "value": "ijED7uyHJH4dc3uF7PJM1//b7L+EcAP8E0NOrk6aDdA="
        },
        "voting_power": "1",
        "proposer_priority": "-2"
      },
      {
        "address": "88839061A231E8A1C8285B67EF8BCBE97C3D94BF",
        "pub_key": {
          "type": "tendermint/PubKeyEd25519",
          "value": "tV6rC04s6/EQU6e7J/wFH+g/jSblGSnaDUhTHCHzBEI="
        },
        "voting_power": "1",
        "proposer_priority": "-2"
      },
      {
        "address": "8A380491EEC814F390C113E622258F5FA46B2765",
        "pub_key": {
          "type": "tendermint/PubKeyEd25519",
          "value": "fBqygqcjcMoYIyHHsWeWYnP9jUkY+6PZPmJRGzzJRX0="
        },
        "voting_power": "1",
        "proposer_priority": "3"
      },
      {
        "address": "E54A63CD67AA32386894EDE5839767F4CD6EC121",
        "pub_key": {
          "type": "tendermint/PubKeyEd25519",
          "value": "3yyODkAeja03IIz37bp2ufmSau8CQ5oqc2qrKxo3YlA="
        },
        "voting_power": "1",
        "proposer_priority": "3"
      }
    ],
    "count": "5",
    "total": "5"
  }
}

If no height is provided, it will fetch validator set which corresponds to the latest block.

res = glitter_client.admin.validators(height=100000)