菜单

客户端接口

相关源文件

客户端接口是外部应用程序与 Fuel Core 节点交互的主要网关。它围绕全面的 GraphQL API 构建,为查询区块链数据、提交交易和监控系统状态提供统一的接口。该接口包括服务器端 GraphQL API 实现和适用于 Rust 应用程序的 FuelClient SDK。

GraphQL API 在 /v1/graphql (HTTP) 和 /v1/graphql-sub (WebSocket 订阅) 公开,为所有区块链操作提供查询、变更和实时订阅。

有关节点间网络通信的信息,请参阅网络

GraphQL API 概述

Fuel Core 提供了全面的 GraphQL API,作为客户端应用程序的主要接口。此 API 允许客户端执行以下操作:

  • 查询链上数据(区块、交易、余额)
  • 提交和跟踪交易
  • 实时监控交易状态变化
  • 执行交易预演
  • 组装具有正确输入和输出的交易

GraphQL API 通过 HTTP/HTTPS(用于查询和变更)和 WebSocket(用于订阅)分别在 /v1/graphql/v1/graphql-sub 端点公开。

客户端接口架构概述

来源

GraphQL 模式结构

GraphQL 模式在 schema.sdl 中定义,并在多个解析器模块中实现。该模式遵循标准的 GraphQL 约定,包含根 QueryMutationSubscription 类型。

GraphQL 模式类型系统

查询操作

Query 类型提供对区块链数据的只读访问

操作描述实现
transaction(id: TransactionId!)获取单个交易TxQuery
transactions(first, after, last, before)分页交易TxQuery
block(id: BlockId, height: U32)按 ID 或高度获取区块BlockQuery
balance(owner: Address!, assetId: AssetId!)获取账户余额BalanceQuery
coins(filter: CoinFilterInput!)获取账户的 UTXOCoinQuery
dryRun(txs: [HexString!]!)模拟交易执行TxQuery
assembleTx(...)自动组装交易输入TxQuery
chain()获取链元数据ChainQuery

变更操作

Mutation 类型支持状态更改操作

操作描述实现
submit(tx: HexString!)提交交易至交易池TxMutation
produceBlocks(blocksToProduce: U32!)手动生成区块BlockMutation

订阅操作

Subscription 类型提供实时数据流

操作描述实现
statusChange(id: TransactionId!)交易状态更新TxStatusSubscription
submitAndAwait(tx: HexString!)提交并等待完成TxStatusSubscription

来源

FuelClient SDK

FuelClient 结构体提供了一个 Rust 接口,用于与 GraphQL API 交互,处理 HTTP/WebSocket 连接、请求序列化和响应解析。

FuelClient 架构

客户端初始化

客户端支持多种初始化方法

核心 API 方法

方法GraphQL 操作返回类型
health()health 查询布尔值
submit(tx)submit 变更TransactionId
dry_run(txs)dryRun 查询Vec<TransactionExecutionStatus>
transaction(id)transaction 查询Option<Transaction>
chain_info()chain 查询ChainInfo
balance(owner, asset_id)balance 查询余额
assemble_tx(...)assembleTx 查询AssembleTransactionResult
estimate_predicates(tx)estimatePredicates 查询Transaction

一致性管理

ConsistencyPolicy 确保查询针对一致的区块链状态执行

用途

订阅支持

为了实现实时更新,客户端通过 Server-Sent Events 支持 GraphQL 订阅

来源

交易流程

客户端接口的主要功能之一是处理交易提交和状态跟踪。让我们来审视一下交易流程

交易提交和状态流程

交易状态类型

TransactionStatus 联合类型表示交易所有可能的状态

交易状态机

状态类型模式定义描述
SubmittedStatus第 329-331 行交易已进入交易池
SuccessStatus第 372-382 行在区块中成功执行
FailureStatus第 370-382 行执行失败并附带原因
SqueezedOutStatus第 301-304 行从交易池中移除,未执行
PreconfirmationSuccessStatus第 912-920 行预演验证通过
PreconfirmationFailureStatus第 901-910 行预演验证失败

状态实现

来源

高级特性

交易预演

API 允许客户端对交易执行“预演”,而无需将其提交到区块链

在 SDK 中

交易组装

API 可以根据高级要求自动组装具有正确输入和输出的交易

在 SDK 中

此功能通过自动处理硬币选择和费用计算来简化客户端交易构建。

实时交易状态更新

API 通过 GraphQL 订阅支持实时交易状态更新

在 SDK 中

来源

实现架构

客户端接口使用端口和适配器六边形架构,以将 GraphQL API 与核心服务解耦

端口和适配器架构

关键端口特性

端口目的关键方法
TxPoolPort交易池操作transaction()insert()latest_pool_stats()
BlockProducerPort区块执行和预演dry_run_txs()storage_read_replay()
TxStatusManager交易状态跟踪status()tx_update_subscribe()
OnChainDatabase共识数据访问transaction()block()latest_height()
OffChainDatabase索引数据访问tx_status()balance()owned_coins_ids()

这种架构支持依赖注入、可测试性以及 GraphQL 层与业务逻辑之间的清晰分离。

来源

存储集成

GraphQL API 通过具有专用存储层的双数据库架构访问数据

数据库层架构

存储层职责

数据类型关键表
链上共识关键数据FuelBlocksTransactionsCoinsMessagesContractsRawCode
链下索引和派生数据TransactionStatusesOwnedCoinsCoinBalancesOwnedTransactions

数据库操作

链上操作

链下操作

这种分离确保了高效查询,同时维护了共识完整性。

来源

错误处理

客户端接口在多个层级实现了全面的错误处理

错误流架构

错误类型

FuelClient SDK 错误

模式转换错误

错误传播模式

  1. 存储错误 → 作为包含上下文的 async_graphql::Error 传播
  2. 交易验证 → 作为包含原因的 TransactionStatus::Failure 返回
  3. 网络错误 → 包装在 client::Error::Other
  4. 序列化错误 → 转换为 ConversionError 变体

交易错误详情

失败的交易包含全面的错误信息

这种分层方法确保错误得到正确分类并包含足够的上下文信息以进行调试。

来源

结论

客户端接口为应用程序与 Fuel Core 节点交互提供了全面而灵活的方式。通过其 GraphQL API 和 FuelClient SDK,它处理了客户端与节点交互的所有方面,从数据查询到交易提交和状态跟踪。

模块化架构以及清晰定义的端口和适配器确保了关注点的明确分离,使系统易于维护和扩展。