{"content":{"title":"Sui GraphQL 使用","body":"Sui RPC 已经从 JSON-RPC 升级到 GraphQL，本篇文章介绍下如何使用此接口。\r\n\r\n## 1. 什么是 GraphQL\r\n\r\nGraphQL 官网对此介绍是：GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述，使得客户端能够准确地获得它需要的数据，而且没有任何冗余，也让 API 更容易地随着时间推移而演进，还能用于构建强大的开发者工具。\r\n\r\n更多 GraphQL 资料请访问[官方网站](https://graphql.org)。\r\n\r\n## 2. 类型对应关系\r\n\r\nSuiJSON 是对 JSON 格式的二次封装。为了在使用上更贴近调用合约的感觉，去掉了不需要的类型\r\n\r\nGraphQL 使用 JSON 作为输入输出的格式，而 Sui 使用 Move 语言开发智能合约，那么这两种语言格式存在一些差异，有以下类型对应关系：\r\n\r\n| Move 类型                                                    | JSON    |\r\n| ------------------------------------------------------------ | ------- |\r\n| u8, u32                                                      | Number  |\r\n| u64, u128, u256                                              | String  |\r\n| Bool                                                         | Boolean |\r\n| Vector`<u8>`, Address, ObjectID, TypeTag, Identifier, Unsigned integer (256 bit max) | String  |\r\n\r\n## 3.  如何使用 Sui-GraphQL\r\n\r\nGraphQL的语法详见官网，这里不赘述。[https://spec.graphql.cn](https://spec.graphql.cn/)\r\n\r\n这里以测试网接口为例，[Sui Testnet GraphQL](https://sui-testnet.mystenlabs.com/graphql)\r\n> [Sui Mainnet GraphQL](https://sui-mainnet.mystenlabs.com/graphql)\r\n\r\n### 3.1 查询交易\r\n\r\n```json\r\n{\r\n  transactionBlock(digest: \"GFUw4fvPR7jji8i3pHpwB2bjzQmWP3BBdGc9y4PEfX49\") {\r\n    gasInput {\r\n      gasSponsor {\r\n        address\r\n      }\r\n      gasPrice\r\n      gasBudget\r\n    }\r\n    effects {\r\n      status\r\n      timestamp\r\n      checkpoint {\r\n        sequenceNumber\r\n      }\r\n      epoch {\r\n        epochId\r\n        referenceGasPrice\r\n      }\r\n      events {\r\n        nodes {\r\n          sender {\r\n            address\r\n          }\r\n          timestamp\r\n          type {\r\n            repr\r\n          }\r\n          json\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n```json title=reply\r\n{\r\n  \"data\": {\r\n    \"transactionBlock\": {\r\n      \"gasInput\": {\r\n        \"gasSponsor\": {\r\n          \"address\": \"0x75856288b7609c28a9864711ff30134706050c522ec1d8ba9e40d1833aa16045\"\r\n        },\r\n        \"gasPrice\": \"1000\",\r\n        \"gasBudget\": \"4454800\"\r\n      },\r\n      \"effects\": {\r\n        \"status\": \"SUCCESS\",\r\n        \"timestamp\": \"2024-03-09T03:20:53.055Z\",\r\n        \"checkpoint\": {\r\n          \"sequenceNumber\": 26051103\r\n        },\r\n        \"epoch\": {\r\n          \"epochId\": 303,\r\n          \"referenceGasPrice\": \"1000\"\r\n        },\r\n        \"events\": {\r\n          \"nodes\": [\r\n            {\r\n              \"sender\": {\r\n                \"address\": \"0x75856288b7609c28a9864711ff30134706050c522ec1d8ba9e40d1833aa16045\"\r\n              },\r\n              \"timestamp\": \"2024-03-09T03:20:53.055Z\",\r\n              \"type\": {\r\n                \"repr\": \"0x17722610942c2c232781f6f233f6de0cc9332ccae174be368f6b250ee09d5157::mynft::MintNFT\"\r\n              },\r\n              \"json\": {\r\n                \"object_id\": \"0x8651a86be0724cf6fbd85ceca11f325bbc01f4b64d3c1cd52a753e1c6cb9e9a3\",\r\n                \"creator\": \"0x75856288b7609c28a9864711ff30134706050c522ec1d8ba9e40d1833aa16045\",\r\n                \"name\": \"inscriptiontek\"\r\n              }\r\n            }\r\n          ]\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n对应浏览器中的数据 ![query_tx](https://inscriptiontek.com/assets/images/query_tx-ca1c2490a283675bfbe31a7fe03fc1d4.png)\r\n\r\n其中事件部分 ![query_tx_event](https://inscriptiontek.com/assets/images/query_tx_event-6934dbe6aac90f77ecb2a3baefb3e0ca.png)\r\n\r\n### 3.2 查询余额\r\n\r\n包括自行发行的其他币种\r\n\r\n```json\r\n{\r\n  address(\r\n    address: \"0x75856288b7609c28a9864711ff30134706050c522ec1d8ba9e40d1833aa16045\"\r\n  ) {\r\n    balance(\r\n      type: \"0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN\"\r\n    ) {\r\n      coinObjectCount\r\n      totalBalance\r\n    }\r\n    balances {\r\n      nodes {\r\n        coinType {\r\n          repr\r\n        }\r\n        coinObjectCount\r\n        totalBalance\r\n      }\r\n      pageInfo {\r\n        endCursor\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n```json title=reply\r\n{\r\n  \"data\": {\r\n    \"address\": {\r\n      \"balance\": null,\r\n      \"balances\": {\r\n        \"nodes\": [\r\n          {\r\n            \"coinType\": {\r\n              \"repr\": \"0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI\"\r\n            },\r\n            \"coinObjectCount\": 1,\r\n            \"totalBalance\": \"104952877284\"\r\n          },\r\n          {\r\n            \"coinType\": {\r\n              \"repr\": \"0xd1a5b6d0dc963c61e1f0115865fc71f5a54d7ca0ab256c2500263a0ecdad8b60::coinA::COINA\"\r\n            },\r\n            \"coinObjectCount\": 3,\r\n            \"totalBalance\": \"100000000999999\"\r\n          }\r\n        ],\r\n        \"pageInfo\": {\r\n          \"endCursor\": \"eyJ0IjoiMHhkMWE1YjZkMGRjOTYzYzYxZTFmMDExNTg2NWZjNzFmNWE1NGQ3Y2EwYWIyNTZjMjUwMDI2M2EwZWNkYWQ4YjYwOjpjb2luQTo6Q09JTkEiLCJjIjoyNjgyOTQ3Mn0\"\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n对应浏览器中的数据![query_coin](https://inscriptiontek.com/assets/images/query_coin-fe2a0b2aa11ff95813948a93730fa4c6.png)\r\n\r\n### 3.3 查询动态字段\r\n\r\n```json\r\nquery ($id: SuiAddress!) {\r\n  owner(address: $id) {\r\n    dynamicFields {\r\n      nodes{\r\n        name{\r\n          ...Value\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nfragment Value on MoveValue {\r\n  type {\r\n    repr\r\n  }\r\n  json\r\n}\r\n```\r\n\r\n在`Variables`填入\r\n\r\n```bash\r\n{\r\n  \"id\": \"0xed399a480963dca70935f71f98216a75518ba90f81d75d1ffae44751fbc72171\"\r\n}\r\n```\r\n\r\n```json title=reply\r\n{\r\n  \"data\": {\r\n    \"owner\": {\r\n      \"dynamicFields\": {\r\n        \"nodes\": [\r\n          {\r\n            \"name\": {\r\n              \"type\": {\r\n                \"repr\": \"address\"\r\n              },\r\n              \"json\": \"0x017eba911b6e5a4faf9afa96983640a1eadbff4d395bf4a7a943bfef42f82299\"\r\n            }\r\n          },\r\n          {\r\n            \"name\": {\r\n              \"type\": {\r\n                \"repr\": \"address\"\r\n              },\r\n              \"json\": \"0xd86fd0045fcd02fb3dbd936fe902d5372c81cbb39c84d0c9f7ca8f4cb7cb471a\"\r\n            }\r\n          }\r\n        ]\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n对比区块浏览器中的数据\r\n\r\n![动态字段查询](https://inscriptiontek.com/assets/images/dy_fields-5c5c751a9a7ca320311318b0cdc42ef5.png)\r\n\r\n## 4. 参考\r\n\r\n更多使用样例参考[官方代码仓库](https://github.com/MystenLabs/sui/tree/releases/sui-graphql-rpc-v2024.1.0-release/crates/sui-graphql-rpc/examples)\r\n\r\n---\r\n\r\n> StarTrek 星航计划\r\nhttps://github.com/movefuns/SuiStartrek"},"author":{"user":"https://learnblockchain.cn/people/18893","address":null},"history":null,"timestamp":1710745620,"version":1}