Injective | Documentation
InjectiveGithub
Injective | 中文文档
Injective | 中文文档
  • 关于 Injective
  • 快速入门
    • 钱包
      • 创建钱包
      • 账户
      • 质押
      • 治理
      • 拍卖
    • 代币标准
      • INJ 代币
      • Token Factory
      • CW20 标准
    • 交易
      • Gas 和 Fees
  • 指南
    • 创建钱包
    • 桥接
      • From Ethereum
      • Using Wormhole
      • Using IBC
      • From Solana
    • 发布代币
    • 发布市场
    • Denom 元数据
    • 获取INJ
  • 工具包
    • injectived
      • 安装 injectived
      • 使用 injectived
      • 指令
    • Injective TS SDK
    • Injective Go SDK
    • Injective Python SDK
    • Injective CW SDK
    • The Graph
  • 参考
  • 术语表
  • 开发者
    • 快速入门
      • 指南
        • 测试网提案
        • 转换地址
        • 计算
          • 最低价格刻度
          • 最低数量刻度
    • 交易所开发者
      • 构建 DEX
      • 预言机提供方
    • Cosmwasm 开发者
      • 您的首个智能合约
      • 指南
        • 本地开发
        • 主网开发
        • 给部署地址白名单
        • 创建您的 Swap 合约
        • 创建 UIs
      • CW20 适配器
      • Injective Test Tube
    • 模块
      • Injective
        • 拍卖(Auction)
          • State
          • 消息
          • EndBlock
          • 事件
          • 参数
        • 交易所(Exchange)
          • 衍生品市场概念
          • 现货市场概念
          • 二元期权市场概念
          • 其他概念
          • 状态
          • 状态转换
          • 消息
          • 提案
          • BeginBlock
          • EndBlock
          • 事件
          • 参数
          • MsgPrivilegedExecuteContract
        • 保险(Insurance)
          • 状态
          • 状态转换
          • 消息
          • EndBlock
          • 事件
          • 参数
          • 改进
        • OCR
          • 概念
          • 状态
          • 消息
          • 提案
          • BeginBlock
          • 钩子(Hooks)
          • 事件
          • 参数
        • 预言机(Oracle)
          • 状态
          • Keeper
          • 消息
          • 提案
          • 事件
          • 改进
        • Peggy
          • 定义
          • 工作流
          • 状态
          • 消息
          • 处罚
          • EndBlock
          • 事件
          • 参数
          • 中继语义
          • 改进
        • 权限(Permissions)
          • 概念
          • 状态
          • 状态转换
        • 代币工厂(TokenFactory)
          • 概念
          • 状态
          • 消息
          • 事件
          • 参数
        • WasmX
          • 概念
          • 数据
          • 提案
          • 消息
          • 参数
      • 核心
        • Auth
        • AuthZ
        • 银行(Bank)
        • 共识(Consensus)
        • 危机(Crisis)
        • 分发(Distribution)
        • 证据(Evidence)
        • 费用授权(Feegrant)
        • 治理(Gov)
        • 群组(Group)
        • 铸造(Mint)
        • NFT
        • 参数(Params)
        • 惩罚(Slashing)
        • 质押(Staking)
        • 升级(Upgrade)
        • Circuit
        • Genutils
    • dApps 开发文档
  • 节点
    • 快速入门
      • 和节点交互
      • 运行节点
        • 设置密钥环
        • 加入网络
        • Cosmovisor
        • 升级您的节点
    • 验证者
      • 主网
        • Peggo
        • 规范链升级
          • Upgrade to 10002-rc1
          • Upgrade to 10002-rc2
          • Upgrade to 10003-rc1
          • Upgrade to 10004-rc1
          • Upgrade to 10004-rc1-patch
          • Upgrade to 10005-rc1
          • Upgrade to 10006-rc1
          • Upgrade to 10007-rc1
          • Upgrade to 10008 - Camelot
          • Upgrade to 10009
          • Upgrade to v1.10
          • Upgrade to v1.11
          • Upgrade to v1.12.0 - Volan
          • Upgrade to v1.12.1
          • Upgrade to v1.13.0 - Altaris
          • Upgrade to v1.13.2
          • Upgrade to v1.13.3
          • Upgrade to v1.14.0
          • Upgrade to v1.14.1
      • 测试网
        • 测试网 Peggo
    • 公共端点
    • 高级端点
    • Injective 索引器设置
  • 交易员
    • 快速入门
    • 文档
    • API 参考
  • 常用链接
    • Injective 101
    • Injective Hub
    • Injective 浏览器
    • Chain API Reference
    • Indexer API Reference
    • 测试网水龙头
Powered by GitBook
On this page
  • 使用 CLI
  • 使用 gRPC
  • grpcurl
  • 编程方式
  • 使用 REST 端点
  • 跨域资源共享 (CORS)
  • 发送交易
Export as PDF
  1. 节点
  2. 快速入门

和节点交互

Previous快速入门Next运行节点

Last updated 2 months ago

与节点互动有多种方式:CLI、gRPC或REST端点。

使用 CLI

您可以使用injectived CLI与节点互动。如果您在本地私有网络中与节点互动,请确保在使用CLI之前,节点在终端中已运行。 有关如何使用injectived的更多详细信息,请访问 使用 injectived

使用 gRPC

Protobuf生态系统开发了适用于不同用例的工具,包括从*.proto文件生成各种语言的代码。这些工具使得客户端的构建变得非常简单。通常,客户端连接(即传输)可以非常容易地插拔和替换。让我们来探索一种流行的传输方法,gRPC。 由于代码生成库在很大程度上依赖于您自己的技术栈,我们将仅介绍两种替代方案:

  • grpcurl用于通用调试和测试。

  • 通过Go、Python或TS以编程方式实现。

grpcurl

类似于curl,但用于gRPC。它也可作为Go库使用,但我们将在此仅将其用作CLI命令进行调试和测试。请按照前述链接中的说明进行安装。

假设您有一个本地节点正在运行(无论是本地网络还是连接到实时网络),您可以运行以下命令来列出可用的Protobuf服务。您可以将localhost:9000替换为另一个节点的gRPC服务器端点,该端点在app.toml文件的grpc.address字段中配置:

grpcurl -plaintext localhost:9090 list

您应当会看到一个gRPC服务列表,例如cosmos.bank.v1beta1.Query。这被称为反射(reflection),它是一个Protobuf端点,返回所有可用端点的描述。每个端点代表一个不同的Protobuf服务,而每个服务又公开多个可供查询的RPC方法。

要获取某个服务的描述,您可以运行以下命令:

# Service we want to inspect
grpcurl \
    localhost:9090 \
    describe cosmos.bank.v1beta1.Query                  

您还可以执行RPC调用来查询节点信息:

grpcurl \
    -plaintext
    -d '{"address":"$MY_VALIDATOR"}' \
    localhost:9090 \
    cosmos.bank.v1beta1.Query/AllBalances

使用grpcurl查询历史状态。

您还可以通过向查询传递一些 gRPC 元数据来查询历史数据:x-cosmos-block-height 元数据应包含要查询的区块。使用与上述相同的 grpcurl 命令,如下所示:

grpcurl \
    -plaintext \
    -H "x-cosmos-block-height: 279256" \
    -d '{"address":"$MY_VALIDATOR"}' \
    localhost:9090 \
    cosmos.bank.v1beta1.Query/AllBalances

如果该区块的状态尚未被节点裁剪,此查询应返回非空响应。

编程方式

以下示例使用 Go 编写,但也可以使用 Python 和 TypeScript SDK 以编程方式与节点/Injective 交互。

以下代码片段展示了如何在 Go 程序中使用 gRPC 查询状态。其核心思路是创建 gRPC 连接,并使用 Protobuf 生成的客户端代码查询 gRPC 服务器。

import (
    "context"
    "fmt"

	"google.golang.org/grpc"

    sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/cosmos/cosmos-sdk/types/tx"
)

func queryState() error {
    myAddress, err := sdk.AccAddressFromBech32("inj...")
    if err != nil {
        return err
    }

    // Create a connection to the gRPC server.
    grpcConn := grpc.Dial(
        "127.0.0.1:9090", // your gRPC server address.
        grpc.WithInsecure(), // The SDK doesn't support any transport security mechanism.
    )
    defer grpcConn.Close()

    // This creates a gRPC client to query the x/bank service.
    bankClient := banktypes.NewQueryClient(grpcConn)
    bankRes, err := bankClient.Balance(
        context.Background(),
        &banktypes.QueryBalanceRequest{Address: myAddress, Denom: "inj"},
    )
    if err != nil {
        return err
    }

    fmt.Println(bankRes.GetBalance()) // Prints the account balance

    return nil
}

使用 Go 查询历史状态

通过在 gRPC 请求中添加区块高度元数据,可以查询历史区块。

import (
    "context"
    "fmt"

    "google.golang.org/grpc"
    "google.golang.org/grpc/metadata"

    grpctypes "github.com/cosmos/cosmos-sdk/types/grpc"
	"github.com/cosmos/cosmos-sdk/types/tx"
)

func queryState() error {
    // --snip--

    var header metadata.MD
    bankRes, err = bankClient.Balance(
        metadata.AppendToOutgoingContext(context.Background(), grpctypes.GRPCBlockHeightHeader, "12"), // Add metadata to request
        &banktypes.QueryBalanceRequest{Address: myAddress, Denom: denom},
        grpc.Header(&header), // Retrieve header from response
    )
    if err != nil {
        return err
    }
    blockHeight = header.Get(grpctypes.GRPCBlockHeightHeader)

    fmt.Println(blockHeight) // Prints the block height (12)

    return nil
}

使用 REST 端点

Cosmos SDK 中的所有 gRPC 服务都可通过 gRPC-Gateway 以 REST 方式进行查询,以提供更便利的访问方式。URL 路径的格式基于 Protobuf 服务方法的全限定名称,但可能会进行一定的调整,以使最终的 URL 更符合 REST 规范。例如,cosmos.bank.v1beta1.Query/AllBalances 方法的 REST 端点为:

GET /cosmos/bank/v1beta1/balances/{address}

请求参数以查询参数的形式传递。

以下示例假设您正在本地私有网络中使用 REST 端点与节点交互。您可以将域名更改为公共网络。

具体示例中,使用 curl 命令请求账户余额如下:

curl \
    -X GET \
    -H "Content-Type: application/json" \
    http://localhost:1317/cosmos/bank/v1beta1/balances/$MY_VALIDATOR

请确保将 localhost:1317 替换为您的节点 REST 端点,该端点在 api.address 配置字段下指定。

所有可用的 REST 端点列表可通过 Swagger 规范文件查看,访问地址为:http://localhost:1317/swagger请确保在 app.toml 文件中,将 api.swagger 字段设置为 true。

使用 REST 查询历史状态

通过使用 HTTP 头 x-cosmos-block-height 可以查询历史状态。例如,curl 命令如下所示:

curl \
    -X GET \
    -H "Content-Type: application/json" \
    -H "x-cosmos-block-height: 279256"
    http://localhost:1317/cosmos/bank/v1beta1/balances/$MY_VALIDATOR

假设该区块的状态尚未被节点裁剪,此查询应返回非空响应。

跨域资源共享 (CORS)

发送交易

使用 gRPC 和 REST 发送交易需要一些额外的步骤:生成交易、签名交易,最后广播交易。 您可以在 相关文档中了解更多: 交易.。

默认情况下,为了安全性,未启用。如果您希望在公共环境中使用 REST 服务器,建议您提供一个反向代理,可以使用 来实现。对于测试和开发目的,app.toml 文件中有一个 enabled-unsafe-cors 字段。

grpcurl
TypeScript 示例
Python 示例
CORS 策略
nginx