返回

在 Debian 上构建 Hyperledger Fabric 2.4 开发环境并运行示例用例

闲谈

导言

分布式账本技术 (DLT) 正以其去中心化、安全性和透明性的特性改变着各种行业。其中,Hyperledger Fabric 是一个领先的企业区块链平台,为开发人员提供了构建高度可扩展且灵活的区块链应用程序所需的工具和框架。

在本文中,我们将引导您在 Debian 系统上设置一个 Hyperledger Fabric 2.4 开发环境,并逐步指导您运行一个简单的示例用例。我们将涵盖以下主题:

  • 设置 Hyperledger Fabric 开发环境
  • 运行 Fabric 网络
  • 部署智能合约
  • 调用智能合约

要求

  • Debian 10 或更高版本
  • Docker 18.09 或更高版本
  • Docker Compose 1.25 或更高版本
  • 具有 sudo 权限的非 root 用户

设置 Hyperledger Fabric 开发环境

  1. 安装 Docker 和 Docker Compose

    sudo apt update
    sudo apt install docker.io docker-compose
    
  2. 下载 Fabric 二进制文件

    创建用于存储 Fabric 二进制文件和样本代码的目录:

    mkdir fabric-samples
    cd fabric-samples
    

    下载 Fabric 二进制文件:

    curl -O https://github.com/hyperledger/fabric/releases/download/v2.4.3/hyperledger-fabric-linux-amd64-2.4.3.tar.gz
    tar -xzf hyperledger-fabric-linux-amd64-2.4.3.tar.gz
    
  3. 设置环境变量

    编辑 ~/.profile 文件并添加以下行:

    export FABRIC_HOME=/path/to/fabric-samples/fabric
    export PATH=$PATH:$FABRIC_HOME/bin
    

    其中 /path/to/fabric-samples/fabric 是 Fabric 二进制文件解压缩到的目录。

  4. 初始化 Fabric 网络

    初始化一个名为 my-network 的新 Fabric 网络:

    cd fabric/scripts
    ./bootstrap.sh
    

运行 Fabric 网络

  1. 启动 Fabric 网络

    使用 Docker Compose 运行 Fabric 网络:

    cd ..
    docker-compose up -d
    
  2. 创建通道

    创建一个名为 mychannel 的新通道:

    ./createChannel.sh mychannel
    
  3. 加入通道

    让组织加入通道:

    ./joinChannel.sh org1 mychannel
    ./joinChannel.sh org2 mychannel
    

部署智能合约

  1. 编写智能合约

    创建一个名为 simplechaincode 的新智能合约:

    mkdir chaincode
    cd chaincode
    touch simplechaincode.go
    

    将以下代码添加到 simplechaincode.go 文件中:

    package main
    
    import (
        "fmt"
    
        "github.com/hyperledger/fabric-contract-api-go/contractapi"
    )
    
    type SmartContract struct {
        contractapi.Contract
    }
    
    func (s *SmartContract) Init(ctx contractapi.TransactionContextInterface) error {
        return nil
    }
    
    func (s *SmartContract) Invoke(ctx contractapi.TransactionContextInterface) error {
        function, args := ctx.GetStub().GetFunctionAndParameters()
    
        switch function {
        case "set":
            return s.set(ctx, args)
        case "get":
            return s.get(ctx, args)
        default:
            return fmt.Errorf("invalid function name: %s", function)
        }
    }
    
    func (s *SmartContract) set(ctx contractapi.TransactionContextInterface, args []string) error {
        if len(args) != 2 {
            return fmt.Errorf("incorrect number of arguments. Expecting 2")
        }
    
        key := args[0]
        value := args[1]
    
        err := ctx.GetStub().PutState(key, []byte(value))
        if err != nil {
            return fmt.Errorf("failed to set state: %v", err)
        }
    
        return nil
    }
    
    func (s *SmartContract) get(ctx contractapi.TransactionContextInterface, args []string) error {
        if len(args) != 1 {
            return fmt.Errorf("incorrect number of arguments. Expecting 1")
        }
    
        key := args[0]
    
        value, err := ctx.GetStub().GetState(key)
        if err != nil {
            return fmt.Errorf("failed to get state: %v", err)
        }
    
        if value == nil {
            return fmt.Errorf("key %s does not exist", key)
        }
    
        return ctx.GetStub().SetEvent("my-event", []byte(value))
    }
    
    func main() {
        chaincode, err := contractapi.NewChaincode(new(SmartContract))
        if err != nil {
            fmt.Printf("Error creating chaincode: %s", err.Error())
        }
    
        if err := chaincode.Start(); err != nil {
            fmt.Printf("Error starting chaincode: %s", err.Error())
        }
    }
    
  2. 打包智能合约

    打包智能合约映像:

    docker-compose run cli peer lifecycle chaincode package simplechaincode.tar.gz --path chaincode/simplechaincode --lang golang --label mychaincode
    
  3. 安装智能合约

    在所有组织中安装智能合约:

    ./installChaincode.sh mychannel 1 org1 mychaincode
    ./installChaincode.sh mychannel 2 org2 mychaincode
    
  4. 实例化智能合约

    在通道上实例化智能合约:

    ./instantiateChaincode.sh mychannel org1 mychaincode
    

调用智能合约

  1. 调用 set 函数

    使用 cli 容器调用智能合约的 set 函数:

    docker-compose exec cli peer chaincode invoke -n mychaincode -c '{"Args":["set", "key1", "value1"]}' -C mychannel
    
  2. 调用 get 函数

    使用 cli 容器调用智能合约的 get 函数:

    docker-compose exec cli peer chaincode query -n mychaincode -c '{"Args":["get", "key1"]}' -C mychannel
    

结论

恭喜您!您已成功在 Debian 上设置了一个 Hyperledger Fabric 2.4 开发环境,并运行了一个简单的示例用例。通过遵循本文中的步骤,您可以构建和部署自己的 Fabric 应用程序,探索 DLT 技术在各种行业中的潜力。