跳转到主要内容
本指南全面概述了如何使用 Any 消息和查询在 CosmWasm 中与 Injective 的模块和查询进行交互。旧的 injective-cosmwasm 包依赖于 JSON 编码的消息,已不再维护,可能会过时。本指南重点介绍使用 protobuf 编码的 Any 消息和查询的推荐方法,这种方法更高效,并且符合现代 CosmWasm 标准。

CosmWasm 中的 Any 消息是什么?

在 CosmWasm 中,Any 消息是 CosmosMsg 枚举的一部分,允许你发送包装在链支持的 protobuf Any 类型中的消息。它们取代了已弃用的 Stargate 消息(在 stargate 功能标志下仍然可用),具有改进的命名和语法。Any 消息使用 cosmwasm_2_0 功能门控,这意味着它们需要运行 CosmWasm 2.0 的链,Injective 支持这一点。以下是 CosmosMsg 定义的片段:
type_url 指定 protobuf 消息类型,value 包含序列化的消息数据。

为什么使用这种方法?

injective-cosmwasm 包使用基于 JSON 的消息,效率较低,可能无法与未来的更新保持兼容。新的 Any 消息方法使用 protobuf 编码,提供更好的性能、类型安全性和与 CosmWasm 2.0+ 的兼容性。这现在是与 Injective 模块和查询交互的推荐方法。

发送消息

要发送消息,你需要创建一个 protobuf 消息,对其进行编码,并将其包装在 Any 消息中。以下是在 Injective 的 exchange 模块上创建现货市价单的示例。

示例:创建现货市价单

步骤:
  1. 使用订单详细信息构造 MsgCreateSpotMarketOrder protobuf 消息。
  2. 使用 prost::Message::encode 将其编码为字节。
  3. 使用正确的 type_url 将其包装在 AnyMsg 中。
  4. 将其作为 CosmosMsg::Any 返回。
这种方法可以通过使用适当的 protobuf 消息和 type_url 适用于其他模块(例如 auction、tokenfactory)。

执行查询

查询使用带有 InjectiveQueryWrapperQuerierWrapper 执行。你可以使用 injective_std 中的预构建查询器或发送原始查询。以下是涵盖不同模块的示例。

示例:查询现货市场(Exchange 模块)

步骤:
  1. deps.querier 创建 ExchangeQuerier
  2. 使用 market_id 调用 spot_market
  3. 将响应序列化为 JSON 并作为 Binary 返回。

示例:查询 Bank 参数(Bank 模块)

步骤:
  1. deps.querier 创建 BankQuerier
  2. 调用 params 获取 bank 模块参数。
  3. 序列化并返回结果。

使用其他模块

相同的原则适用于其他 Injective 模块,如 auction、insurance、oracle、permissions 和 tokenfactory,以及 Cosmos 原生模块。例如:
  • Auction 模块:使用 AuctionQuerier 进行查询或将 MsgBid 编码为 Any 消息。
  • Tokenfactory 模块:编码 MsgCreateDenom 或使用 TokenFactoryQuerier
有关特定消息类型和查询器,请参阅 injective_std
最后修改于 2026年3月30日