Hyperledger 本身不是一个单一的软件,而是一个开源的企业级区块链框架和工具集。 "Hyperledger 开 Python" 这个问题,具体指的是使用 Python 与 Hyperledger 下的某个特定项目进行交互。

Python 主要与以下两个 Hyperledger 项目紧密相关:
- Hyperledger Fabric: 这是最主流、应用最广泛的 Hyperledger 项目,Python 主要用于客户端应用程序,即与区块链网络交互的“前端”或“后台服务”。
- Hyperledger Besu: 这是一个以太坊兼容的客户端,主要用 Java 编写,虽然其核心是 Java,但你可以使用 Python 的 Web3.py 库来连接和操作一个 Besu 节点。
下面,我将重点介绍最常见和最实用的场景:使用 Python 开发 Hyperledger Fabric 应用程序。
核心场景:使用 Python 开发 Hyperledger Fabric 应用程序
在 Hyperledger Fabric 架构中,链码(Chaincode)是智能合约,通常用 Go、Java 或 Node.js 编写,而应用程序,则负责调用链码、查询账本、与用户交互等,这部分非常适合用 Python 来实现。
环境准备
在开始之前,你需要一个可以运行的 Hyperledger Fabric 网络,最简单的方式是使用官方提供的 first-network 示例。

步骤概览:
- 安装 Docker 和 Docker Compose: Fabric 网络通常在 Docker 容器中运行。
- 克隆 Fabric 示例: 从 GitHub 克隆官方仓库。
git clone https://github.com/hyperledger/fabric-samples.git cd fabric-samples
- 启动网络: 进入
first-network目录,按照README.md的指示启动一个包含两个组织、一个通道的测试网络。cd first-network ./byfn.sh up -c mychannel -s couchdb
这个命令会启动所有必要的容器,包括排序服务、Peer 节点和 CouchDB 数据库。
安装 Python SDK
Hyperledger 官方提供了 Python SDK,用于与 Fabric 网络进行通信。
pip install hyperledger-fabric-sdk-py
Python SDK 核心组件解析
Python SDK 通过一系列类来映射 Fabric 网络的实体和操作。

| Python SDK 类 | 对应的 Fabric 概念 | 作用 |
|---|---|---|
Chaincode |
链码 | 用于定义和部署你的智能合约逻辑。 |
Channel |
通道 | 代表一个特定的账本,应用程序通过通道与网络交互。 |
Peer |
对等节点 | 代表网络中的一个成员节点,用于查询和调用链码。 |
Orderer |
排序服务 | 负责对交易进行排序和打包成区块。 |
User |
用户/身份 | 代表一个通过 MSP 认证的实体(如管理员、客户端用户)。 |
Client |
客户端 | 代表你的应用程序本身,用于创建用户、创建通道等。 |
CryptoSuite |
密钥套件 | 处理数字签名、证书和密钥等加密操作。 |
编写一个简单的 Python 应用程序
下面是一个完整的 Python 应用程序示例,它将执行以下操作:
- 连接到已运行的 Fabric 网络。
- 使用管理员身份登录。
- 将一个已注册的用户(
user1)加载到客户端。 - 通过
user1的身份,向mychannel通道上的mycc链码发起交易(调用invoke函数)。 - 查询链码以验证交易结果。
前提条件:
- 确保
first-network已经成功启动。 - 你需要从
first-network目录中获取一些配置文件和证书,放到你的 Python 项目目录中,这些文件通常在crypto-config目录下。
项目结构:
python-fabric-app/
├── connection-profile.yaml # 从 first-network 中复制
├── crypto-config/ # 从 first-network 中复制整个目录
│ └── ...
└── main.py # 我们的 Python 应用程序
main.py 代码示例:
import asyncio
import time
from concurrent.futures import ALL_COMPLETED
from hyperledger.fabric import Gateway
from hyperledger.fabric.network import Network, Wallet
from hyperledger.fabric_ca.client import GatewayOptions
from hyperledger.fabric.transaction import Transaction
# --- 1. 定义路径 ---
# 从 first-network 目录复制过来的路径
# 请根据你的实际情况修改这些路径
CONNECTION_PROFILE_PATH = './connection-profile.yaml'
CRYPTO_CONFIG_PATH = './crypto-config'
# --- 2. 辅助函数:创建钱包 ---
def create_wallet():
"""加载用户身份到钱包中"""
wallet = Wallet()
# 将 Admin 的身份信息加载到钱包
# 注意:这里我们直接从文件加载,实际应用中可能需要更安全的身份管理方式
admin_cert_path = f"{CRYPTO_CONFIG_PATH}/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem"
admin_key_path = f"{CRYPTO_CONFIG_PATH}/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/key.pem"
with open(admin_cert_path, 'rb') as cert_file:
cert = cert_file.read()
with open(admin_key_path, 'rb') as key_file:
key = key_file.read()
wallet.put("admin", cert, key)
return wallet
# --- 3. 主函数 ---
async def main():
# 创建一个钱包实例
wallet = create_wallet()
# 设置连接选项
gateway_options = GatewayOptions(
wallet=wallet,
identity="admin", # 使用钱包中的哪个身份
user=wallet.get("admin") # 获取用户对象
)
# 创建 Gateway 实例,这是与 Fabric 网络交互的主要入口
async with Gateway() as gateway:
# 连接到网络,使用 connection-profile.yaml 文件
network = await gateway.connect_to_network(CONNECTION_PROFILE_PATH, gateway_options)
# 获取通道对象
channel = network.get_channel("mychannel")
# 获取链码对象
# chaincode_id, peer, transaction_id
chaincode = network.get_chaincode("mycc", "peer0.org1.example.com")
print("成功连接到 Fabric 网络。")
# --- 执行交易 ---
# 调用链码的 invoke 函数,进行 a 向 b 转账 10
print("正在发起交易: invoke a -> b 10")
try:
# 使用 submit_async 异步提交交易
transaction = await chaincode.submit_async(
"invoke",
["a", "b", "10"],
wait_for_event=True, # 等待交易被确认
timeout=30 # 超时时间
)
# 获取交易ID
tx_id = transaction.transaction_id
print(f"交易已提交,交易ID: {tx_id}")
# 等待交易被排序和验证
await transaction.is_valid()
print("交易已成功确认。")
except Exception as e:
print(f"交易失败: {e}")
return
# --- 查询交易 ---
# 查询 a 的余额
print("正在查询 a 的余额...")
try:
# 使用 query_async 异步查询
result = await chaincode.query_async("query", ["a"])
print(f"a 的余额是: {result.decode('utf-8')}")
except Exception as e:
print(f"查询失败: {e}")
# 关闭网络连接
gateway.close()
if __name__ == "__main__":
asyncio.run(main())
如何运行:
- 确保你的
first-network正在运行。 - 将上述代码保存为
main.py。 - 确保
connection-profile.yaml和crypto-config文件在正确的位置。 - 安装依赖:
pip install hyperledger-fabric-sdk-py - 运行脚本:
python main.py
预期输出:
成功连接到 Fabric 网络。
正在发起交易: invoke a -> b 10
交易已提交,交易ID: mychannel_tx_abcdef123456789...
交易已成功确认。
正在查询 a 的余额...
a 的余额是: 90
其他 Python 相关工具
除了官方 SDK,社区还有一些非常有用的工具可以帮助你更高效地开发 Fabric 应用。
Fabric-Samples 的 Python 版本
官方 fabric-samples 仓库中有一个 asset-transfer-basic 示例,它包含了 Node.js 和 Python 的客户端代码,这是一个绝佳的学习资源,因为它展示了如何在一个更完整的场景(资产转移)中使用 Python SDK。
你可以在这里找到它:fabric-samples/asset-transfer-basic/chaincode-python
Fabric-CA Client 的 Python 封装
Hyperledger Fabric-CA 是用于成员服务的组件,如果你需要用 Python 自动注册用户、创建证书,可以使用 fabric-ca-client 的 Python 封装。
pip install fabric-ca-client
这比手动处理证书文件要方便得多,适用于需要动态管理用户身份的场景。
总结与最佳实践
- 明确角色:Python 在 Hyperledger Fabric 中的主要角色是客户端应用程序,而不是链码,链码目前首选 Go 或 Node.js 以获得最佳性能。
- 善用官方示例:不要从零开始,直接研究
fabric-samples中的 Python 示例,它们能教你如何正确配置路径、加载身份和处理异步操作。 - 理解异步:Fabric SDK 的 Python 接口是异步的,使用
asyncio和await是标准做法,这对于处理网络 I/O 和提高性能至关重要。 - 身份管理是关键:正确地加载和管理用户身份(证书和私钥)是所有操作的基础。
Wallet类是你的好朋友。 - 错误处理:网络操作和交易都可能失败,务必使用
try...except块来捕获和处理可能发生的异常,例如超时、拒绝交易等。
希望这份详细的指南能帮助你顺利地在 Hyperledger 项目中开始使用 Python!
