
# 同态加密交易验证Demo
介绍同态加密交易验证Demo的使用方法。
![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
只用于场景体验，不用于实际应用。
#### 操作步骤
1. 订购BCS实例。 
   版本为4.X.X（对应社区Hyperledger Fabric 2.2版本），区块链实例名称推荐使用全英文字符，安全机制选择ECDSA，组织数量和名称使用默认配置。
   
   
2. 修改链码容器版本。 
   1. 选择实例管理，单击打算安装同态加密链代码的实例的容器集群。
   
   2. 单击工作负载页签，切换到对应集群，编辑peer负载的yaml文件。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346513517.png "点击放大")
      
   
   3. 修改CORE_PEER_CCENV_IMAGE_NAME的版本号为3.0.5。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346313233.png "点击放大")
      
   
   
   
   
3. 安装并实例化链代码。 
   安装示例链代码：[transaction.zip](https://homomorphic-encryption.obs.cn-north-1.myhuaweicloud.com/transaction.zip)、[IDChaincode.zip](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/IDChaincode.zip)，并实例化链代码。
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   - 为了方便后续操作，建议安装的链代码名称固定为**transaction** 、**idchaincode**。
   
   - 示例链代码中提供交易的脚本中已将链代码版本固定为1.0，安装链代码时，链代码版本号必须为1.0**，** 链代码语言为go**。**
   
   - 如果自己开发链代码，可以使用Chaincode库接口文件: [api_ahe_cc.tar.gz](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/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](https://redirector.gvt1.com/edgedl/go/go1.11.5.linux-amd64.tar.gz)，上传到本地服务器"/usr/local"目录下并解压。
      ```
      tar -zxvf go1.11.5.linux-amd64.tar.gz
      ```
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346393377.jpg "点击放大")
      
   
   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](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/sdk1.11.5.tar.gz)）、同态加密库（[ahelib1.11.6.tar.gz](https://homomorphic-encryption.obs.cn-north-1.myhuaweicloud.com/ahelib1.11.6.tar.gz)）和openssl库（[openssl.tar.gz](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/openssl.tar.gz)），均解压至当前目录，命令：
      ```
      tar -zxvf xxx
      ```
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293313634.jpg "点击放大")
      
   
   2. 进入"/opt/gopath/src/ahe/PSW/deps/lib"目录，把路径里的文件复制到"/usr/local/include/openssl/"目录中（如果没有"openssl"目录则新建）。
   
   3. 进入"/opt/gopath/src/ahe/PSW/example/appdemo/"目录，执行go build，编译appdemo文件。
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293153682.jpg "点击放大")
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293473482.jpg "点击放大")
      
   
   
   
   
9. 打包镜像。 
   1. 在"/home/paas/"下创建一个文件夹用来打包镜像，例如：**mkdir cj**
   
   2. 将步骤[5]中下载的包解压，在"/home/paas/cj"路径下，上传共识节点管理员证书和peer节点的管理员证书，并将步骤[6.3]中编译好的appdemo文件、openssl库和sdk库以及[Dockerfile](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/Dockerfile)复制至当前目录下并解压。
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293633130.jpg "点击放大")
      ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
      解压后的openssl文件夹下缺少两个lib库文件（[libltdl.so.7](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/libltdl.so.7)和[libltdl.so.7.3.0](https://bcs.obs.cn-north-1.myhuaweicloud.com/homomorphic-encryption/libltdl.so.7.3.0)），请将这两个lib文件复制至"/home/paas/cj/openssl"目录下。
      
   
   3. 解压共识节点管理员证书和peer节点的管理员证书：**unzip xxx.zip** ，并将解压出来的证书文件分别移至"/home/paas/cj/orderer"文件夹和"/home/paas/cj/peer"文件夹（如果没有则创建）。如下图：
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346192833.jpg "点击放大")
      
   
   4. 在本地解压步骤[5]中下载的包，从sdk-config文件夹中获取yaml文件，并修改其中证书路径的配置。
      例如：
      1. 将所有路径中的节点域名地址删除哈希值前缀，修改为如下图的peer地址。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346513521.png "点击放大")
         
      
      2. 排查解压后的证书相关路径，修改完成后，**sdk** 配置文件中不存在带hash值的路径。
         ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346313237.png "点击放大")
         
      
      3. 去掉**sdk** 配置文件中**certificateAuthorities** 部分代码块（如果没有则跳过），保存后，将该文件上传至"/home/paas/cj"路径下。
         ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346393381.png "点击放大")
         如下为全部修改好后的**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名称。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293313638.jpg "点击放大")
      
   
   6. 在"/home/paas/cj/"路径下，执行如下命令将所有文件打包成镜像（请自行安装docker）。
      ```
      docker build -t tongtaidemotest:byl1 . 
      docker save tongtaidemotest:byl1>tongtaitest.tar
      ```
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293153694.jpg "点击放大")
      ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
      请确保本地有euleros：2.2.5镜像，否则将会打包失败。
      ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293473490.jpg "点击放大")
      
   
   
   
   
10. 上传镜像。 
    1. 将打包完成的镜像下载到本地，登录华为云，进入云容器引擎页面，在部署了BCS实例对应的集群下，创建无状态工作负载，实例数量选择1个。如果界面布局不一致，请在右上角切换新版cce界面。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293633134.png "点击放大")
       ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346192837.png "点击放大")
       
    
    2. 在"容器配置"页签，选择镜像。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346513525.png "点击放大")
       
    
    3. 单击"上传镜像"，跳转到总览页面，上传镜像。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346313241.png "点击放大")
       ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346393385.png "点击放大")
       
    
    4. 选择打包好的镜像文件，等待上传完毕。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293313642.png "点击放大")
       
    
    5. 镜像上传完成后，回到镜像选择界面，选择对应镜像，单击"确定"。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293153698.png "点击放大")
       
    
    6. 在"生命周期"页签，设置启动命令。
       - 运行命令：/bin/sh
       
       - 运行参数： -c
         sleep 10000
         
       
       
       ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293473494.png "点击放大")
       
    
    7. 提交后，无状态工作负载创建成功。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001293633138.png "点击放大")
       
    
    
    
    
11. 交易验证。 
    1. 登录集群弹性云服务器后台，执行如下命令查看应用容器是否正常。
       ```
       docker ps -a | grep tongtai | grep container
       ```
       ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346192841.jpg "点击放大")
       
    
    2. 可以看到部署的应用名，进入容器内部，命令如下：
       ```
       docker exec -it 容器id bash
       ```
       
    
    3. 配置**/etc/hosts** 文件，增加order节点和peer节点的域名映射。
       在下载的sdk.yaml文件中查询orderer和peer的域名信息，将**ip** +orderer域名和**ip** +peer域名补充在**/etc/hosts**文件的最后，如下所示：
       ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346513529.jpg "点击放大")
       ```
       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
       ```
       ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
       - 如果后续同态demo交易中登出容器，再次登录后需重新执行配置环境变量命令。
       
       - 其中./appdemo register -h是用来查看注册命令参数。
        
       ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001346313245.jpg "点击放大")
       
    
    
    
    
 
#### 示例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
   ```
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   -u：为注册的用户名B、-p：为B用户密码XXXXXX，密码必须包含大写、小写、数字、特殊字符中的至少两种，-c：为sdk配置文件名，-C：为安装链代码的通道名，-I：为安装示例链代码IDChaincode的实际安装链代码名，-T：为安装示例链代码Transaction的实际安装链代码名，-o：为peer节点组织的ID，可在通道管理界面查询。参数下同。
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001081774762.jpg "点击放大")
   返回值为一串加密地址，示例：
   ```
   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
   ```
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001081903256.jpg "点击放大")
   返回值为一串加密地址，示例：
   ```
   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
   ```
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   其中-b后的参数为接收方的地址。示例中为注册B用户时的返回值，即B用户注册数据的地址信息。
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001128682371.jpg "点击放大")
   返回值为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
   ```
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001128820631.jpg "点击放大")
   
   
2. 执行如下命令查询B账户的余额，返回值为B账户余额。 
   ```
   ./appdemo querybalance -p XXXXXX -u B -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
   ```
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001082222840.jpg "点击放大")
   
   
 
#### 示例4：测试同态加法
1. 执行如下命令测试同态加法。 
   ```
   ./appdemo homoadd -c ./test-sdk-config.yaml -a 30 -b 60 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
   ```
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001128525161.png "点击放大")
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   其中-a和-b后的参数为进行同态加的两个数字。
   
   
 
#### 示例5：测试同态乘法
1. 执行如下命令测试同态乘法。 
   ```
   ./appdemo homomulti -c ./test-sdk-config.yaml -a 100 -b 5 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
   ```
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001347210373.png "点击放大")
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   其中-a和-b后的参数为进行同态乘的乘数和被乘数，其中-a后的参数会被加密，-b后的参数是明文。
   
   
