杰瑞科技汇

Hyperledger Fabric如何用Python开发智能合约?

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

Hyperledger Fabric如何用Python开发智能合约?-图1
(图片来源网络,侵删)

Python 主要与以下两个 Hyperledger 项目紧密相关:

  1. Hyperledger Fabric: 这是最主流、应用最广泛的 Hyperledger 项目,Python 主要用于客户端应用程序,即与区块链网络交互的“前端”或“后台服务”。
  2. 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 示例。

Hyperledger Fabric如何用Python开发智能合约?-图2
(图片来源网络,侵删)

步骤概览:

  1. 安装 Docker 和 Docker Compose: Fabric 网络通常在 Docker 容器中运行。
  2. 克隆 Fabric 示例: 从 GitHub 克隆官方仓库。
    git clone https://github.com/hyperledger/fabric-samples.git
    cd fabric-samples
  3. 启动网络: 进入 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 网络的实体和操作。

Hyperledger Fabric如何用Python开发智能合约?-图3
(图片来源网络,侵删)
Python SDK 类 对应的 Fabric 概念 作用
Chaincode 链码 用于定义和部署你的智能合约逻辑。
Channel 通道 代表一个特定的账本,应用程序通过通道与网络交互。
Peer 对等节点 代表网络中的一个成员节点,用于查询和调用链码。
Orderer 排序服务 负责对交易进行排序和打包成区块。
User 用户/身份 代表一个通过 MSP 认证的实体(如管理员、客户端用户)。
Client 客户端 代表你的应用程序本身,用于创建用户、创建通道等。
CryptoSuite 密钥套件 处理数字签名、证书和密钥等加密操作。

编写一个简单的 Python 应用程序

下面是一个完整的 Python 应用程序示例,它将执行以下操作:

  1. 连接到已运行的 Fabric 网络。
  2. 使用管理员身份登录。
  3. 将一个已注册的用户(user1)加载到客户端。
  4. 通过 user1 的身份,向 mychannel 通道上的 mycc 链码发起交易(调用 invoke 函数)。
  5. 查询链码以验证交易结果。

前提条件:

  • 确保 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())

如何运行:

  1. 确保你的 first-network 正在运行。
  2. 将上述代码保存为 main.py
  3. 确保 connection-profile.yamlcrypto-config 文件在正确的位置。
  4. 安装依赖:pip install hyperledger-fabric-sdk-py
  5. 运行脚本: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

这比手动处理证书文件要方便得多,适用于需要动态管理用户身份的场景。


总结与最佳实践

  1. 明确角色:Python 在 Hyperledger Fabric 中的主要角色是客户端应用程序,而不是链码,链码目前首选 Go 或 Node.js 以获得最佳性能。
  2. 善用官方示例:不要从零开始,直接研究 fabric-samples 中的 Python 示例,它们能教你如何正确配置路径、加载身份和处理异步操作。
  3. 理解异步:Fabric SDK 的 Python 接口是异步的,使用 asyncioawait 是标准做法,这对于处理网络 I/O 和提高性能至关重要。
  4. 身份管理是关键:正确地加载和管理用户身份(证书和私钥)是所有操作的基础。Wallet 类是你的好朋友。
  5. 错误处理:网络操作和交易都可能失败,务必使用 try...except 块来捕获和处理可能发生的异常,例如超时、拒绝交易等。

希望这份详细的指南能帮助你顺利地在 Hyperledger 项目中开始使用 Python!

分享:
扫描分享到社交APP
上一篇
下一篇