与节点互动有多种方式:CLI、gRPC或REST端点。
使用 CLI
您可以使用injectived CLI与节点互动。如果您在本地私有网络中与节点互动,请确保在使用CLI之前,节点在终端中已运行。 有关如何使用injectived的更多详细信息,请访问 使用 injectived
使用 gRPC
Protobuf生态系统开发了适用于不同用例的工具,包括从*.proto
文件生成各种语言的代码。这些工具使得客户端的构建变得非常简单。通常,客户端连接(即传输)可以非常容易地插拔和替换。让我们来探索一种流行的传输方法,gRPC。
由于代码生成库在很大程度上依赖于您自己的技术栈,我们将仅介绍两种替代方案:
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 程序中使用 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 发送交易需要一些额外的步骤:生成交易、签名交易,最后广播交易。
您可以在 相关文档中了解更多: 交易.。