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)