# SDK 支持

除了基于命令行的客户端之外，超级账本 Fabric 历史上还提供过多种语言的 SDK，包括 Node.js、Python、Java、Go 等。但对新项目来说，更重要的是区分**历史 SDK**与**当前推荐路径**。

这些客户端能力允许用户和应用跟 Fabric 网络进行交互，但现代应用开发的推荐主路径已经转向 **Fabric Gateway**。因此，本节后半部分提到的传统 SDK 应更多理解为**历史项目或兼容性参考**，而不是新项目的默认选型。

**特别说明**：自 Fabric v2.4+ 起，Fabric Gateway 成为推荐的应用开发方式，它提供了更简洁的 API，简化了交易构造和背书收集的过程。建议新项目优先使用 Fabric Gateway API 而非传统的 SDK 接口。

## Fabric Gateway（推荐）

自 Fabric v2.4 起，**Fabric Gateway** 成为应用开发的首选方式。Gateway 将交易提案构造、背书收集和提交等复杂逻辑从客户端移至 Peer 节点内部，开发者只需连接到一个可信的 Gateway Peer 即可完成所有操作。

Gateway API 支持 Go、Node.js 和 Java 三种语言，源码仓库地址在 github.com/hyperledger/fabric-gateway。

以下是使用 Go 语言 Gateway API 提交交易的简化示例：

```go
package main

import (
	"crypto/x509"
	"fmt"
	"os"

	"github.com/hyperledger/fabric-gateway/pkg/client"
	"github.com/hyperledger/fabric-gateway/pkg/identity"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

func main() {
	// 1. 加载 TLS 证书，建立 gRPC 连接到 Gateway Peer
	certPEM, _ := os.ReadFile("path/to/tls-ca-cert.pem")
	certPool := x509.NewCertPool()
	certPool.AppendCertsFromPEM(certPEM)
	tlsCreds := credentials.NewClientTLSFromCert(certPool, "peer0.org1.example.com")

	clientConnection, _ := grpc.NewClient("peer0.org1.example.com:7051",
		grpc.WithTransportCredentials(tlsCreds))
	defer clientConnection.Close()

	// 2. 创建客户端身份（从 MSP 证书和私钥）
	clientCert, _ := os.ReadFile("path/to/client-cert.pem")
	clientID, _ := identity.NewX509Identity("Org1MSP", identity.CertificateToPEM(clientCert))
	// ... 此处省略私钥加载和 Sign 函数创建

	// 3. 创建 Gateway 连接
	gw, _ := client.Connect(clientID, client.WithSign(sign),
		client.WithClientConnection(clientConnection))
	defer gw.Close()

	// 4. 获取网络和合约引用
	network := gw.GetNetwork("mychannel")
	contract := network.GetContract("mychaincode")

	// 5. 提交交易（自动完成背书、排序、提交）
	result, _ := contract.SubmitTransaction("CreateAsset", "asset1", "blue", "10")
	fmt.Printf("Transaction result: %s\n", string(result))

	// 6. 查询账本（仅背书，不提交）
	result, _ = contract.EvaluateTransaction("ReadAsset", "asset1")
	fmt.Printf("Query result: %s\n", string(result))
}
```

*注：以上为简化示例，省略了错误处理和私钥加载逻辑。完整可运行的样例参见* [*fabric-samples/asset-transfer-basic*](https://github.com/hyperledger/fabric-samples/tree/main/asset-transfer-basic/application-gateway-go)*。*

相比传统 SDK，Fabric Gateway 的优势在于：客户端逻辑大幅简化（无需手动管理背书策略和节点发现）、自动重试机制、更好的错误处理，以及显著减少的网络往返次数。

## 历史 Node.js SDK（兼容性参考）

作为早期创建的 SDK 项目之一，Node.js SDK 曾支持对 Fabric 链码的主要操作以及访问 Fabric CA 服务。但在现代 Fabric 版本中，它更适合作为历史参考；新开发建议优先选择 Fabric Gateway。

源码仓库地址在 github.com/hyperledger/fabric-sdk-node。

源码的 test/integration/e2e 目录下包括了大量应用的示例代码，可供参考。

## 历史 Python SDK（历史项目）

Python 实现的 SDK 是早期项目，当前更多适合作为历史资料参考；如果是新的生产项目，不应把它当作官方推荐主线。

源码仓库地址在 github.com/hyperledger/fabric-sdk-py。

源码的 test/integration 目录下包括了大量应用的示例代码，可供参考。

## 历史 Java SDK（兼容性参考）

Java SDK 曾支持对 Fabric 中链码的主要操作以及访问 Fabric CA 服务，但现代 Java 应用开发同样更推荐 Fabric Gateway。

源码仓库地址在 github.com/hyperledger/fabric-sdk-java。

## 历史 Go SDK（已被 Gateway 路线取代）

Go SDK 也属于较早期的客户端路线。对新项目而言，更稳妥的建议仍然是优先使用 Fabric Gateway，而不是把传统 Go SDK 视为首选方案。

源码仓库地址在 github.com/hyperledger/fabric-sdk-go。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/blockchain_guide/10_fabric_op/sdk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
