更新时间:2024-01-11 GMT+08:00

同态加密交易验证Demo

介绍同态加密交易验证Demo的使用方法。

只用于场景体验,不用于实际应用。

操作步骤

  1. 订购BCS实例。

    版本为4.X.X(对应社区Hyperledger Fabric 2.2版本),区块链实例名称推荐使用全英文字符,安全机制选择ECDSA,组织数量和名称使用默认配置。

  2. 修改链码容器版本。

    1. 选择实例管理,单击打算安装同态加密链代码的实例的容器集群。
    2. 单击工作负载页签,切换到对应集群,编辑peer负载的yaml文件。

    3. 修改CORE_PEER_CCENV_IMAGE_NAME的版本号为3.0.5。

  3. 安装并实例化链代码。

    安装示例链代码:transaction.zipIDChaincode.zip,并实例化链代码。

    • 为了方便后续操作,建议安装的链代码名称固定为transactionidchaincode
    • 示例链代码中提供交易的脚本中已将链代码版本固定为1.0,安装链代码时,链代码版本号必须为1.0链代码语言为go
    • 如果自己开发链代码,可以使用Chaincode库接口文件: api_ahe_cc.tar.gz

  4. 在“实例管理”界面,在实例卡片中,单击“获取客户端配置”。
  5. 勾选需要下载的内容,参数请与如下内容完全保持一致:

    • 勾选“SDK文件”:

      链代码名称:transaction

      证书存放路径:/home/paas

      通道名称:channel

      选择成员:organization

    • 勾选“共识节点证书”。
    • 勾选“Peer节点证书”,指定节点组织保持默认值,勾选“管理员证书”。

  6. 单击“下载”,下载SDK配置文件、共识节点证书和Peer节点证书。
  7. 在本地服务器安装golang。

    1. 下载安装包:go1.11.5.linux-amd64.tar.gz,上传到本地服务器“/usr/local”目录下并解压。
      tar -zxvf go1.11.5.linux-amd64.tar.gz

    2. 将以下环境变量配置到“/etc/profile”文件中。
      export GOROOT=/usr/local/go
      export PATH=$PATH:$GOROOT/bin
      export GOPATH=/opt/gopath
      export PAAS_CRYPTO_PATH=/opt/hao
      export PAAS_SSL_ROOT=/opt/hao
    3. 执行如下命令使环境变量生效。
      source /etc/profile

  8. 编译appdemo。

    1. 进入“/opt/gopath”目录下(如果没有gopath目录,请手动创建),上传sdk库(sdk1.11.5.tar.gz)、同态加密库(ahelib1.11.6.tar.gz)和openssl库(openssl.tar.gz),均解压至当前目录,命令:
      tar -zxvf xxx

    2. 进入“/opt/gopath/src/ahe/PSW/deps/lib”目录,把路径里的文件复制到“/usr/local/include/openssl/”目录中(如果没有“openssl”目录则新建)。
    3. 进入“/opt/gopath/src/ahe/PSW/example/appdemo/”目录,执行go build,编译appdemo文件。

  9. 打包镜像。

    1. 在“/home/paas/”下创建一个文件夹用来打包镜像,例如:mkdir cj
    2. 将步骤5中下载的包解压,在“/home/paas/cj”路径下,上传共识节点管理员证书和peer节点的管理员证书,并将步骤6.3中编译好的appdemo文件、openssl库和sdk库以及Dockerfile复制至当前目录下并解压。

      解压后的openssl文件夹下缺少两个lib库文件(libltdl.so.7libltdl.so.7.3.0),请将这两个lib文件复制至“/home/paas/cj/openssl”目录下。

    3. 解压共识节点管理员证书和peer节点的管理员证书:unzip xxx.zip,并将解压出来的证书文件分别移至“/home/paas/cj/orderer”文件夹和“/home/paas/cj/peer”文件夹(如果没有则创建)。如下图:

    4. 在本地解压步骤5中下载的包,从sdk-config文件夹中获取yaml文件,并修改其中证书路径的配置。
      例如:
      1. 将所有路径中的节点域名地址删除哈希值前缀,修改为如下图的peer地址。

      2. 排查解压后的证书相关路径,修改完成后,sdk配置文件中不存在带hash值的路径。

      3. 去掉sdk配置文件中certificateAuthorities部分代码块(如果没有则跳过),保存后,将该文件上传至“/home/paas/cj”路径下。

        如下为全部修改好后的sdk配置文件示例:
        name: "global-trade-network"
        
        x-type: "hlfv1"
        x-loggingLevel: info
        
        description: "The network to be in if you want to stay in the global trade business"
        
        version: 1.0.0
        
        client:
        
          organization: aa73c757c9026fb623495d7058ca177f6152bcea
        
          logging:
            level: info
        
          peer:
            timeout:
              connection: 10s
              queryResponse: 45s
              executeTxResponse: 120s
          eventService:
            timeout:
              connection: 10s
              registrationResponse: 50s
          orderer:
            timeout:
              connection: 10s
              response: 45s
        
          cryptoconfig:
            path: /opt/gopath/src/github.com/hyperledger/fabric
        
          credentialStore:
            path: "/tmp/hfc-kvs"
        
            cryptoStore:
              path: /tmp/msp
        
            wallet: wallet-name
        
          BCCSP:
            security:
             enabled: true
             default:
              provider: "SW"
             hashAlgorithm: "SHA2"
             softVerify: true
             ephemeral: false
             level: 256
        
        channels:
        
          tongtai:
            orderers:
        
              - orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9-0.orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9.default.svc.cluster.local
        
            peers:
        
              peer-aa73c757c9026fb623495d7058ca177f6152bcea-0.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local:30605:
                endorsingPeer: true
                chaincodeQuery: true
                ledgerQuery: true
                eventSource: true
        
              peer-aa73c757c9026fb623495d7058ca177f6152bcea-1.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local:30606:
                endorsingPeer: true
                chaincodeQuery: true
                ledgerQuery: true
                eventSource: true
        
            chaincodes:
              - transaction:1.0
        
        organization:
        
          aa73c757c9026fb623495d7058ca177f6152bcea:
            mspid: aa73c757c9026fb623495d7058ca177f6152bceaMSP
        
            cryptoPath:  /home/paas/peer/msp
            tlsCryptoKeyPath: /home/paas/peer/tls/server.key
            tlsCryptoCertPath: /home/paas/peer/tls/server.crt
        
            peers:
        
              - peer-aa73c757c9026fb623495d7058ca177f6152bcea-0.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local:30605
        
              - peer-aa73c757c9026fb623495d7058ca177f6152bcea-1.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local:30606
        
            certificateAuthorities:
              - ca-org1
        
          ordererorg:
              mspID: "2cf8802066c1c5011fd396c54c9126a17c9cfcc9MSP"
        
              cryptoPath: /home/paas/orderer/msp
        orderer-eip: 49.4.81.160
        orderers:
        
          orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9-0.orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9.default.svc.cluster.local:
            url: grpcs://49.4.81.160:30805
        
            grpcOptions:
              ssl-target-name-override: orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9-0.orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9.default.svc.cluster.local
              grpc-max-send-message-length: 15
        
            tlsCACerts:
              path: /home/paas/orderer/msp/tlscacerts/tlsca.2cf8802066c1c5011fd396c54c9126a17c9cfcc9-cert.pem
        
        peers:
        
        
          peer-aa73c757c9026fb623495d7058ca177f6152bcea-0.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local:30605:
        
        
            url: grpcs://49.4.81.160:30605
        
            grpcOptions:
              ssl-target-name-override: peer-aa73c757c9026fb623495d7058ca177f6152bcea-0.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local
              grpc.http2.keepalive_time: 15
        
            tlsCACerts:
              path: /home/paas/peer/msp/tlscacerts/tlsca.aa73c757c9026fb623495d7058ca177f6152bcea-cert.pem
        
        
          peer-aa73c757c9026fb623495d7058ca177f6152bcea-1.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local:30606:
        
        
            url: grpcs://49.4.81.160:30606
        
            grpcOptions:
              ssl-target-name-override: peer-aa73c757c9026fb623495d7058ca177f6152bcea-1.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local
              grpc.http2.keepalive_time: 15
        
            tlsCACerts:
              path: /home/paas/peer/msp/tlscacerts/tlsca.aa73c757c9026fb623495d7058ca177f6152bcea-cert.pem
    5. 修改Dockerfile文件:将yaml文件名称修改为下载的sdk文件解压出来的yaml名称。

    6. 在“/home/paas/cj/”路径下,执行如下命令将所有文件打包成镜像(请自行安装docker)。
      docker build -t tongtaidemotest:byl1 . 
      docker save tongtaidemotest:byl1>tongtaitest.tar

      请确保本地有euleros:2.2.5镜像,否则将会打包失败。

  10. 上传镜像。

    1. 将打包完成的镜像下载到本地,登录华为云,进入云容器引擎页面,在部署了BCS实例对应的集群下,创建无状态工作负载,实例数量选择1个。如果界面布局不一致,请在右上角切换新版cce界面。

    2. 在“容器配置”页签,选择镜像。

    3. 单击“上传镜像”,跳转到总览页面,上传镜像。

    4. 选择打包好的镜像文件,等待上传完毕。

    5. 镜像上传完成后,回到镜像选择界面,选择对应镜像,单击“确定”。

    6. 在“生命周期”页签,设置启动命令。
      • 运行命令:/bin/sh
      • 运行参数:

        -c

        sleep 10000

    7. 提交后,无状态工作负载创建成功。

  11. 交易验证。

    1. 登录集群弹性云服务器后台,执行如下命令查看应用容器是否正常。
      docker ps -a | grep tongtai |grep container

    2. 可以看到部署的应用名,进入容器内部,命令如下:
      docker exec -it 容器id bash
    3. 配置/etc/hosts文件,增加order节点和peer节点的域名映射。

      在下载的sdk.yaml文件中查询orderer和peer的域名信息,将ip+orderer域名和ip+peer域名补充在/etc/hosts文件的最后,如下所示:

      x.x.x.x orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9-0.orderer-2cf8802066c1c5011fd396c54c9126a17c9cfcc9.default.svc.cluster.local
      x.x.x.x peer-aa73c757c9026fb623495d7058ca177f6152bcea-0.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local
      x.x.x.x peer-aa73c757c9026fb623495d7058ca177f6152bcea-1.peer-aa73c757c9026fb623495d7058ca177f6152bcea.default.svc.cluster.local
    4. 执行命令配置环境变量,并查看注册命令。
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/paas/openssl
      cd /home/paas
      ./appdemo register -h
      • 如果后续同态demo交易中登出容器,再次登录后需重新执行配置环境变量命令。
      • 其中./appdemo register -h是用来查看注册命令参数。

示例1:注册账户

  1. 执行如下命令注册B账户,账户金额为100。

    ./appdemo register -u B -p XXXXXX -i 100  -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

    -u:为注册的用户名B、-p:为B用户密码XXXXXX,密码必须包含大写、小写、数字、特殊字符中的至少两种,-c:为sdk配置文件名,-C:为安装链代码的通道名,-I:为安装示例链代码IDChaincode的实际安装链代码名,-T:为安装示例链代码Transaction的实际安装链代码名,-o:为peer节点组织的ID,可在通道管理界面查询。参数下同。

    返回值为一串加密地址,示例:

    b22edf18d64f57954640c8f3f6cf67d9401f262daead588ddfexxxxx

  2. 以相同的方法注册A账户,账户金额为200。

    ./appdemo register -u A -p XXXXXX -i 200  -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

    返回值为一串加密地址,示例:

    2efc4639bc281060ce013dfea33a47b647b6f4a20103a6321c33dxxxxxx

示例2:A向B转账

  1. 执行如下命令,A向B转账,金额为10。

    ./appdemo transaction -u A -p XXXXXXA -b b22edf18d64f57954640c8f3f6cf67d9401f262daead588ddfe8178xxxx -t 10 -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

    其中-b后的参数为接收方的地址。示例中为注册B用户时的返回值,即B用户注册数据的地址信息。

    返回值为A账户的地址:2efc4639bc281060ce013dfea33a47b647b6f4a20103a6321c33d67d5xxxx

示例3:查询账户余额

  1. 执行如下命令查询A账户的余额,返回值为A账户余额。

    ./appdemo querybalance -p XXXXXX -u A -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

  2. 执行如下名查询B账户的余额,返回值为B账户余额。

    ./appdemo querybalance -p XXXXXX -u B -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

示例4:测试同态加法

  1. 执行如下命令测试同态加法。

    ./appdemo homoadd -c ./test-sdk-config.yaml -a 30 -b 60 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

    其中-a和-b后的参数为进行同态加的两个数字。

示例5:测试同态乘法

  1. 执行如下命令测试同态乘法。

    ./appdemo homomulti -c ./test-sdk-config.yaml -a 100 -b 5 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea

    其中-a和-b后的参数为进行同态乘的乘数和被乘数,其中-a后的参数会被加密,-b后的参数是明文。