借助Quicknode Injective endpoint,您可以通过 REST 或gRPC 与Injective 进行交互。REST API 通过 HTTP 提供 JSON 数据,便于使用标准 Web 工具查询余额、交易及其他链上数据。gRPC 通过 HTTP/2 使用 Protocol Buffers,提供更快速、强类型的请求,并支持实时数据的流式传输。 若需快速且易于理解的集成,请使用 REST;gRPC 您需要大规模的高性能后端服务gRPC ,请使用gRPC 。
Injective gRPC需要身份验证
为确保安全访问gRPC用户必须进行身份验证。在使用任何方法之前,必须完成此身份验证过程。Quicknode 由两个关键组件组成: endpoint 以及相应的 token. 用户需要在调用任何方法之前,使用这两个组件配置一个带有身份验证凭据的gRPC 。
Injective gRPC 的身份验证gRPC 以下两种方式处理:
- 基本身份验证
- x-token 身份验证
在本文档中,我们将把 getClientWithBasicAuth 或 getClientWithXToken 用于演示如何处理这些不同身份验证机制的函数。
基本身份验证
该 getClientWithBasicAuth 该函数演示了如何使用基本身份验证(Basic Authentication)来处理身份验证,该方法会将凭据编码为 base64。以下是该函数的代码实现: getClientWithBasicAuth 功能以及 basicAuth RPC 凭据的实现:
import (
"上下文"
"crypto/tls"
"encoding/base64"
"fmt"
"google.golang.grpc"
"google.golang.grpc"
)
func getClientWithBasicAuth(endpoint, token string) (*grpc.ClientConn, error) {
target := endpoint + ".injective-mainnet.quiknode.pro:9090" // for TLS connections
conn, err := grpc.Dial(target,
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
grpc.WithPerRPCCredentials(basicAuth{
username: endpoint,
password: token,
}),
)
if err != nil {
return nil, fmt.Errorf("Unable to dial endpoint %w", err)
}
return conn, nil
}
// basicAuth implements the credentials.PerRPCCredentials interface to support basic authentication for grpc requests.
type basicAuth struct {
username string
password string
}
func (b basicAuth) GetRequestMetadata(ctx context.Context, in ...string) (map[string]string, error) {
auth := b.username + ":" + b.password
enc := base64.StdEncoding.EncodeToString([]byte(auth))
return map[string]string{"authorization": "Basic " + enc}, nil
}
func (basicAuth) RequireTransportSecurity() bool {
return false
}
该 getClientWithBasicAuth 该函数会使用必要的安全选项配置一个gRPC ,并连接到endpoint 9090. 它将endpoint 和令牌作为输入参数,并返回一个gRPC 连接,您可以使用该连接进行经过身份验证的 API 调用。
conn, err := getClientWithBasicAuth("ENDPOINT_NAME", "TOKEN")
if err != nil {
log.Fatalf("err: %v", err)
}
defer conn.Close()
x-token 身份验证
该 getClientWithXToken 该函数演示了如何使用 x-token 进行身份验证。此方法会将令牌附加到每个请求的 x-token 头中。
import (
"上下文"
"crypto/tls"
"fmt"
"google.golang.grpc"
"google.golang.grpc"
)
func getClientWithXToken(endpoint, token string) (*grpc.ClientConn, error) {
target := endpoint + ".injective-mainnet.quiknode.pro:9090" // for TLS connections
conn, err := grpc.Dial(target,
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
grpc.WithPerRPCCredentials(auth{
token: token,
}),
)
if err != nil {
return nil, fmt.Errorf("Unable to dial endpoint %w", err)
}
return conn, nil
}
// auth implements the credentials.PerRPCCredentials interface to support x-token authentication for grpc requests.
type auth struct {
token string
}
func (a *auth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
return map[string]string{
"x-token": a.token,
}, nil
}
func (auth) RequireTransportSecurity() bool {
return false
}
该方法的配置gRPC 与基本身份验证示例类似,但会将身份验证令牌附加到 x-token 头中。以下是使用此函数进行 API 调用的方法:
conn, err := getClientWithXToken("ENDPOINT_NAME", "TOKEN")
if err != nil {
log.Fatalf("err: %v", err)
}
defer conn.Close()