【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用

文章目录

      • 我对这两个开源库的主要修改
      • 实验环境
      • 1. 客户端与服务端都需要的环境部署
          • 1.1 安装基础依赖软件
      • 2. 签名 RPC 服务端的部署
        • 2.1 安装 levelDB、gmp 等依赖软件
        • 2.2 安装群签名算法依赖软件 pbc 和 pbc-sig
        • 2.3 编译安装群签名&&环签名 RPC 服务
      • 3. 签名客户端的部署
          • 3.1 拉取 sig-service-client 代码
          • 3.2 编译群签名&&环签名客户端
      • 4. 群签名&&环签名客户端使用
      • 结语


最近需要使用环签名算法实现签名与签名验证(群签名与环签名的介绍),想查看网上有没有开源的环签名算法实现,搜了一圈最终只发现 FISCO-BCOS(金链盟区块链底层开源平台) 有相关的开源代码且有详细的文档,并提供额外的开源库给用户体验与尝试群签名和环签名的服务,恰好符合我的需求,于是我开始着手部署这些开源项目。

由于提供群签名和环签名服务的两个开源库已是两年前的项目了,并且该项目文档也存在一些纰漏,导致我在部署的过程中遇到了不少坑,浪费了很多时间,此处记录一下,希望能帮到有类似需求的朋友。

如果和我一样,只想使用签名和验证签名的 RPC 而不需要上链和在链上进行验证的话,则只需配置部署以下两个项目的源码即可:

1. Sig-service
2. Sig-service-client


我对这两个开源库的主要修改

服务端:

  • README.md —— 2.1 部署依赖软件包:
    • ln -s /usr/bin/todos /usr/bin/unxi2dos 修改为 sudo ln -s /usr/bin/todos /usr/bin/unix2dos
    • ln -s /usr/bin/fromdos /usr/bin/dos2unix 修改为 sudo ln -s /usr/bin/fromdos /usr/bin/dos2unix
    • 添加 sudo apt install libjsonrpccpp-dev libjsonrpccpp-tools
  • README.md —— 2.3 使用说明:
    • 最后的启动示例,将监听端口修改为 8003,与客户端示例保持一致。
  • sig-service/devcore/ConfigParser.h :
    • 将文件中 第 73 行的删除

客户端:

  • README.md —— 2.1 依赖部署:
    • ln -s /usr/bin/todos /usr/bin/unxi2dos 修改为 sudo ln -s /usr/bin/todos /usr/bin/unix2dos
    • ln -s /usr/bin/fromdos /usr/bin/dos2unix 修改为 sudo ln -s /usr/bin/fromdos /usr/bin/dos2unix
  • sig-service-client/sig_client/src/main/executive/shell/runSigService.sh:
    • 添加将环签名字符串 json 格式化的命令
    • 添加环签名有效性验证的的命令示例

实验环境

  • 操作系统:Ubuntu 18.04.3 LTS 64bit
  • 内存:2G
  • CPU: i7-9700 3.0Ghz * 2 (两核)
  • 硬盘:40G

开始部署:

1. 客户端与服务端都需要的环境部署

(若客户端与服务端在同一台机器或虚拟机上,则部署一次就行)

1.1 安装基础依赖软件

部署群签名 && 环签名 RPC 服务之前,要安装 git, dos2unxi, lsof 等依赖软件:

  • git:用于拉取最新代码
  • dos2unix && lsof: 用于处理 windows 文件上传到 linux 服务器时,可执行文件无法被 linux 正确解析的问题;

可用如下命令安装这些基础依赖软件(注意区分 centos 和 ubuntu 系统使用的命令):

[centos]
sudo yum -y install git
sudo yum -y install dos2unix
sudo yum -y install java
sudo yum -y install lsof

[ubuntu]
sudo apt install git
sudo apt install lsof
sudo apt install tofrodos

sudo ln -s /usr/bin/todos /usr/bin/unix2dos
sudo ln -s /usr/bin/fromdos /usr/bin/dos2unix

以上命令大约共耗时 5 分钟

部署 dos2unix 后,调用 format.sh 脚本格式化可执行文件,使其可被 linux 系统正确解析:

# 格式化format.sh脚本
dos2unix format.sh
# 执行format.sh脚本格式化其他可执行文件,使其可被正确解析执行
bash format.sh

2. 签名 RPC 服务端的部署

2.1 安装 levelDB、gmp 等依赖软件

拉取官方 git 代码

git clone https://github.com/FISCO-BCOS/sig-service.git

或拉取我个人修改过的 git 代码

git clone https://github.com/yohstone/sig-service.git

群签名&&环签名 rpc 服务,需要安装 levelDB, gmp 等依赖软件,sig-service 在 script 目录下提供了 install_deps.sh 脚本,执行以下命令安装这些依赖软件:

# git 代码目录下进入 script 目录 && 执行 install_deps.sh 脚本
cd script && sudo bash install_deps.sh

此过程大约耗时 1 ~ 3 个小时,视网速而定,建议更改 Ubuntu 的软件源,下载会更快。
更改软件源方法

2.2 安装群签名算法依赖软件 pbc 和 pbc-sig

群签名算法依赖 pbc 库和 pbc-sig 库,部署群签名&&环签名 RPC 服务前,首先要安装 pbc 和 pbc-sig 库,sig-service 在 script 目录下提供了 pbc 和 pbc-sig 一键安装脚本 install.sh,执行以下命令安装 pbc 和 pbc-sig:

# 进入 script 目录,执行 install.sh 脚本安装 pbc 和 pbc-sig
cd script && sudo bash install.sh
# 或者 (注:执行下面命令前,需要先保证 install.sh 脚本可执行 :
# chmod +x install.sh 可使其可执行)
cd script && sudo ./install.sh

此过程大约耗时1个小时(下载卡住很久时,建议按 ctrl + c 强行结束,然后重新运行命令)

安装后提示:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第1张图片

2.3 编译安装群签名&&环签名 RPC 服务

# 编译 sig-service
# 方法一: 使用 compile 脚本编译
cd sig-service && bash compile.sh
# 或者: (注:执行下面命令前,需要先保证 compile.sh 脚本可执行 :chmod +x compile.sh 可使其可执行)
cd sig-service && ./compile.sh

# 方法二: 手动编译, 其中 -j4 表示用 4 个线程并发编译,
# 用户可根据机器实际配置动态调整编译线程数
##(1)【Centos 系统】编译后,会在 build 目录下生成 rpc 服务程序 server
cd sig-service && mkdir -p build && cd build && cmake3 .. && make -j4
###(2)【Ubuntu 系统】编译后,会在 build 目录下生成 rpc 服务程序 server
cd sig-service && mkdir -p build && cd build && cmake .. && make -j4

编译期间遇到问题:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第2张图片
可以看到报错提示是 JsonRpcCpp::Server 这个库路径不存在,库找不到,所以需要下载安装这个库:

sudo apt install libjsonrpccpp-dev libjsonrpccpp-tools

一般运行完以上命令就能继续编译了,若不行,可以继续运行以下的备用命令:

sudo apt install libcurl3
sudo apt install libmicrohttpd-dev
sudo apt install libjsoncpp1
sudo apt install libjsoncpp-dev
sudo apt install libargtable2-0
sudo apt install libargtable2-dev
sudo apt install curl
sudo apt install libcurl4-openssl-dev

安装好后重新运行编译命令(建议每次重新编译前都将之前编译失败生成的 build/ 目录删掉);
有可能会卡在类似下图的下载压缩包的过程,视你的网络状况而定
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第3张图片
为了缩短编译过程的时间,建议先把所有的压缩包都下载好,然后放到一个目录下(我是放在 /home/test1/research/files_lib/ 目录下的),将源码中的对应下载路径直接修改为你存放压缩包的路径,如下:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第4张图片
修改示例:

  • cmake/ProjectBoost.cmake 中的 https://github.com/ethereum/cpp-dependencies/releases/download/cache/boost_1_63_0.tar.gz
    修改为:/home/test1/research/files_lib/boost_1_63_0.tar.gz
  • cmake/ProjectCryptopp.cmake 中的 https://github.com/weidai11/cryptopp/archive/bccc6443c4d4d611066c2de4c17109380cf97704.tar.gz
    修改为:/home/test1/research/files_lib/cryptopp-bccc6443c4d4d611066c2de4c17109380cf97704.tar.gz
  • cmake/ProjectJsonCpp.cmake 中的 : https://github.com/open-source-parsers/jsoncpp/archive/1.7.7.tar.gz
    修改为:/home/test1/research/files_lib/jsoncpp-1.7.7.tar.gz
    【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第5张图片

所有可能需要用的压缩包我已经上传至百度云,可自行下载:

百度云
链接:https://pan.baidu.com/s/1tLGDar3Lw1U3J2OK2nt4Jw 
提取码:apf6

然后重新编译(建议每次重新编译前都将之前编译失败生成的 build/ 目录删掉),
此时编译到 55% 时遇到以下报错:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第6张图片
报错提示的是 /home/test1/research/sig-service/devcore/ConfigParser.h 文件中存在语法错误。

解决办法:
找到并打开改文件,将 /home/test1/research/sig-service/devcore/ConfigParser.h 文件中 第 73 行的 删除:在这里插入图片描述

再次重新编译(建议每次重新编译前都将之前编译失败生成的 build/ 目录删掉);

若编译结束显示 [100%] Built target server,并在 build 文件目录下生成 rpc 服务程序 server,则表示编译成功了,如下图:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第7张图片
此时签名 RPC 服务端部署配置完成。

官方文档中提到的配置文件可以根据自己需要进行修改,也可以直接使用默认的设置(建议修改log.conf 中的日志文件路径)。
最后,使用以下命令运行 RPC 服务测试一下:

# 在 8003 端口启动群签名&&环签名 RPC 服务,日志配置文件路径是 bak/log.conf; 
# 开启的 http 线程数目是 1000
$ chmod +x build/server && ./build/server -p 8003 -n 1000 -l bak/log.conf 
port:8003 thread:1000
ADD HTTP CONNECTOR TO test_server
start listening on port 8005

### 若要把 server 放到后台执行,则可借助 screen, tmux, nohup 等工具,
# 用 nohup 将程序放到后台执行的命令示例:
chmod +x build/server && nohup ./build/server -p 8003 -n 1000 -l bak/log.conf &

如图是我的启动示例:
在这里插入图片描述
表示 RPC 服务端启动成功。
到此签名服务端部署成功。
此过程需要 3 个小时左右。

3. 签名客户端的部署

3.1 拉取 sig-service-client 代码
  • 从 git 上拉取代码
  • 若是 linux/unix 环境,安装依赖软件之后,执行 format.sh 脚本格式化 shell 脚本和 json 配置文件,使其可被 linux/unix 正确解析
	# 拉取官方 git 代码
	git clone https://github.com/FISCO-BCOS/sig-service-client.git
	# 或拉取我个人修改过的 git 代码
	git clone https://github.com/yohstone/sig-service-client.git
	# 格式化 shell 脚本和 json 配置文件
	$ bash format.sh

3.2 编译群签名&&环签名客户端

编译依赖软件如下:

软件 版本
jdk jdk 1.8以上
gradle gradle 4.6以上

为了方便用户,sig-service-client 在 sig_client 文件夹下配备了自动化编译脚 compile.sh(针对centos/ubuntu运行环境,windows 环境下也可用 gradle 编译)

用户通过运行该脚本编译客户端:

	# 进入 sig_client 目录
	[test1@ubuntu:~/research/sig-service-client]$ cd sig_client/    
	[test1@ubuntu:~/research/sig-service-client/sig_client]$ ls
	build.gradle  compile.sh  lib  src
	# 调用 compile 脚本编译群签名&&环签名客户端
	# compile.sh 脚本主要包括如下功能:
	# (1) 判断系统 java 版本(jdk 版本必须大于 1.8)
	# (2) 若系统 java 版本小于 1.8 或者系统没安装 java,则脚本从官网下载并安装 jdk1.8
	# (3) 根据操作系统类型安装依赖包(目前支持 Ubuntu 和 centos/federa )
	# (4) 下载并安装 gradle4.6 (首次编译时安装,之后再编译不会再安装)
	# (5) 使用 grandle build 命令编译 java 工程,产生客户端 jar 包 sig_client.jar: 
	#    会在 sig_client 目录下生成 sig_client_toolkit 目录,所有 jar 包都位于 sig_client_toolkit/lib 目录下
	# 注:首次编译时,由于可能会安装 java 和 gradle,因此要用 root 权限执行 compile 脚本(执行时加 sudo)
	#     之后如果再重新编译,则以
	$ sudo bash compile.sh 

我编译之后遇到的问题:

【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第8张图片
明显是因为 gradle 没安装,自己运行: sudo apt install gradle
然后再次编译 bash compile.sh
编译结束后显示:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第9张图片
至此,客户端编译部署完成。



4. 群签名&&环签名客户端使用

编译完 sig-service-client 后,sig-service-client/sig_client/sig_client_toolkit/bin 目录下会生成可执行文件 runSigService.sh,该文件封装了群签名&&环签名客户端所有接口,可在其中添加相应接口调用,然后运行该文件,进而使用客户端。

(客户端接口列表详情可参考:群签名&&环签名客户端接口)

运行 runSigService.sh 前,需要先修改 sig-service-client/sig_client/sig_client_toolkit/bin 目录下的 conn.json 文件,将ip 和 端口修改为服务端的 ip 和 服务端监听的端口,如 8003 :
在这里插入图片描述
然后修改脚本文件 runSigService.sh,将想要调用的接口前的注释去掉,此处我以环签名为例:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第10张图片
将446 ~ 451 行代码的注释去掉,这些代码的作用分别是:
初始化一个名为 ring1 的环;(第 446 行)
在环中加入 4 个成员;(第 447 ~ 450 行)
为环 ring1 在位置 0 处的环成员生成对消息 hello 的环签名,环签名中环成员数为 4;(第 451 行)

然后运行 runSigService.sh : sudo bash runSigService.sh
开始生成签名
运行过程中可能会有一些 WARNING 提示,这是因为项目代码库使用的 jdk 是 1.8 的版本,然而我们安装的 jdk 有可能是最新版,有些代码以后可能会不兼容了,所以会给你提示,暂时不管。
签名成功后,服务端会返回一个 json 字符串,其中会有环签名相关的信息,如下图:
【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第11张图片
然后验证签名:

  • 先修改 runSigService.sh 中的代码:
    添加命令 ring_verify "conn.json" "ring1" '' "hello" 到文件中,并将之前的代码注释掉。
    【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第12张图片
  • 然后复制返回的签名,如下图白色部分,即 “sig” 字段的值:

【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第13张图片

  • 然后将该签名值粘贴到 命令 ring_verify "conn.json" "ring1" '' "hello" ring1 与 hello 之间的单引号中,如下图:
    在这里插入图片描述
    但如果此时你直接验证的话,会提示验证失败:
    【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第14张图片
    此时,若去看服务端的 log 日志的话,你就会发现服务端根本没有解析成功你发过去的签名。
    也就是说该签名不是服务端能验证的 json 格式。
    当初我在这个问题上卡了两个小时,经过不断尝试之后,我总结出服务端能接受的 json 格式为:
    除了要符合 json 字符串的基本格式外,还需要给每个符号添加转义符,同时字符串内不能有空格。
    所以,需要先对签名字符串进行处理,我写了以下这条命令进行处理:
    # delete space and \n , replace ',' with '\,' in the str
    echo '' | sed 's/[[:space:]]//g' | sed 's/\\n//g' | sed 's/,/\\,/g'    
    
    
    只要将签名字符串插入 echo 之后的单引号 ‘’ 里,然后运行该命令,输出的结果就是符合服务端要求的 json 字符串,直接复制到 ring verify 命令里就行了。
    这是正确的 json 格式字符串示例:
    【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第15张图片
    运行验证之后可以看到验证成功:
    【FISCO-BCOS】群签名 && 环签名 客户端与RPC服务端的部署与使用_第16张图片
    至此,客户端部署完成,并测试使用成功。
    整个过程大约耗时 3 个小时。

结语

若需要上链,并且在链上验证签名的话,还需要部署 FISCO-BCOS 项目的代码。
我根据 sig-service-client 的文档,尝试部署了 FISCO-BCOS master-1.3 的版本,因为版本比较旧,文档也比较混乱,所以遇到了很多问题,目前节点间还没能正常相互连接。由于我的需求已经满足,就暂时不继续弄了,也没什么时间。

倘若哪位朋友有上链并且在链上验证签名的需求的话,我推荐还是部署最新版的 FISCO-BCOS 项目代码,遇到的问题应该会少很多。

以上,如有问题,欢迎指正哈~

你可能感兴趣的:(区块链)