同态加密交易验证Demo
介绍同态加密交易验证Demo的使用方法。
只用于场景体验,不用于实际应用。
操作步骤
- 订购BCS实例。
版本为4.X.X(对应社区Hyperledger Fabric 2.2版本),区块链实例名称推荐使用全英文字符,安全机制选择ECDSA,组织数量和名称使用默认配置。
- 修改链码容器版本。
- 安装并实例化链代码。
安装示例链代码:transaction.zip、IDChaincode.zip,并实例化链代码。
- 为了方便后续操作,建议安装的链代码名称固定为transaction、idchaincode。
- 示例链代码中提供交易的脚本中已将链代码版本固定为1.0,安装链代码时,链代码版本号必须为1.0,链代码语言为go。
- 如果自己开发链代码,可以使用Chaincode库接口文件: api_ahe_cc.tar.gz。
- 在“实例管理”界面,在实例卡片中,单击“获取客户端配置”。
- 勾选需要下载的内容,参数请与如下内容完全保持一致:
- 单击“下载”,下载SDK配置文件、共识节点证书和Peer节点证书。
- 在本地服务器安装golang。
- 下载安装包:go1.11.5.linux-amd64.tar.gz,上传到本地服务器“/usr/local”目录下并解压。
tar -zxvf go1.11.5.linux-amd64.tar.gz
- 将以下环境变量配置到“/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
- 执行如下命令使环境变量生效。
source /etc/profile
- 下载安装包:go1.11.5.linux-amd64.tar.gz,上传到本地服务器“/usr/local”目录下并解压。
- 编译appdemo。
- 进入“/opt/gopath”目录下(如果没有gopath目录,请手动创建),上传sdk库(sdk1.11.5.tar.gz)、同态加密库(ahelib1.11.6.tar.gz)和openssl库(openssl.tar.gz),均解压至当前目录,命令:
tar -zxvf xxx
- 进入“/opt/gopath/src/ahe/PSW/deps/lib”目录,把路径里的文件复制到“/usr/local/include/openssl/”目录中(如果没有“openssl”目录则新建)。
- 进入“/opt/gopath/src/ahe/PSW/example/appdemo/”目录,执行go build,编译appdemo文件。
- 进入“/opt/gopath”目录下(如果没有gopath目录,请手动创建),上传sdk库(sdk1.11.5.tar.gz)、同态加密库(ahelib1.11.6.tar.gz)和openssl库(openssl.tar.gz),均解压至当前目录,命令:
- 打包镜像。
- 在“/home/paas/”下创建一个文件夹用来打包镜像,例如:mkdir cj
- 将步骤5中下载的包解压,在“/home/paas/cj”路径下,上传共识节点管理员证书和peer节点的管理员证书,并将步骤6.3中编译好的appdemo文件、openssl库和sdk库以及Dockerfile复制至当前目录下并解压。
解压后的openssl文件夹下缺少两个lib库文件(libltdl.so.7和libltdl.so.7.3.0),请将这两个lib文件复制至“/home/paas/cj/openssl”目录下。
- 解压共识节点管理员证书和peer节点的管理员证书:unzip xxx.zip,并将解压出来的证书文件分别移至“/home/paas/cj/orderer”文件夹和“/home/paas/cj/peer”文件夹(如果没有则创建)。如下图:
- 在本地解压步骤5中下载的包,从sdk-config文件夹中获取yaml文件,并修改其中证书路径的配置。
例如:
- 将所有路径中的节点域名地址删除哈希值前缀,修改为如下图的peer地址。
- 排查解压后的证书相关路径,修改完成后,sdk配置文件中不存在带hash值的路径。
- 去掉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
- 修改Dockerfile文件:将yaml文件名称修改为下载的sdk文件解压出来的yaml名称。
- 在“/home/paas/cj/”路径下,执行如下命令将所有文件打包成镜像(请自行安装docker)。
docker build -t tongtaidemotest:byl1 . docker save tongtaidemotest:byl1>tongtaitest.tar
请确保本地有euleros:2.2.5镜像,否则将会打包失败。
- 上传镜像。
- 交易验证。
- 登录集群弹性云服务器后台,执行如下命令查看应用容器是否正常。
docker ps -a | grep tongtai |grep container
- 可以看到部署的应用名,进入容器内部,命令如下:
docker exec -it 容器id bash
- 配置/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
- 执行命令配置环境变量,并查看注册命令。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/paas/openssl cd /home/paas ./appdemo register -h
- 如果后续同态demo交易中登出容器,再次登录后需重新执行配置环境变量命令。
- 其中./appdemo register -h是用来查看注册命令参数。
- 登录集群弹性云服务器后台,执行如下命令查看应用容器是否正常。
示例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
- 以相同的方法注册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转账
- 执行如下命令,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:查询账户余额
- 执行如下命令查询A账户的余额,返回值为A账户余额。
./appdemo querybalance -p XXXXXX -u A -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
- 执行如下名查询B账户的余额,返回值为B账户余额。
./appdemo querybalance -p XXXXXX -u B -c ./test-sdk-config.yaml -C tongtai -I idchaincode -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
示例4:测试同态加法
- 执行如下命令测试同态加法。
./appdemo homoadd -c ./test-sdk-config.yaml -a 30 -b 60 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
其中-a和-b后的参数为进行同态加的两个数字。
示例5:测试同态乘法
- 执行如下命令测试同态乘法。
./appdemo homomulti -c ./test-sdk-config.yaml -a 100 -b 5 -C tongtai -T transaction -o aa73c757c9026fb623495d7058ca177f6152bcea
其中-a和-b后的参数为进行同态乘的乘数和被乘数,其中-a后的参数会被加密,-b后的参数是明文。