群签名&&环签名rpc调用群签名&&环签名算法库,实现了BBS04群签名算法和可连接的环签名算法, 部署于机构内,用于提供群签名和环签名服务。
本节首先简单介绍群签名&&环签名rpc的主要模块及相关代码目录;接着介绍群签名&&环签名算法主要特性和流程,让大家对这两种算法有基本的认识;之后,简单介绍几种应用场景。
模块 && 代码目录 |
说明 |
---|---|
常用数据结构模块(devcore) | 定义了其他模块经常使用的基本数据结构,如配置解析、错误码、日志等 |
群签名算法模块(algorithm/bbs04/) (群签名算法接口:algorithm/GroupSig.h) |
BBS04群签名算法实现模块,bbs04是基于线性对的群签名算法,sig-service提供了多种线性对支持,用户可根据安全性需求自定义线性对 |
环签名算法模块(algorithm/ring-sig/) (环签名算法接口:algorithm/RingSig.h) |
可连接的环签名算法实现模块,用户可根据安全性需求,自定义环大小 |
rpc服务模块(httpserver) | 实现了群签名&&环签名rpc服务 (1) 群签名RPC服务主要在httpserver/GroupSigRpc.*中实现; (2) 环签名RPC服务主要通过httpserver/RingSig.*实现 |
数据库模块(database) | 存储签名参数信息,并提供秘钥托管服务,目前支持levelDB,但可方便地扩展到其他类型数据库 |
依赖软件安装脚本(script) | 调用该目录下的install_deps.sh和install.sh部署群签名&&环签名RPC的依赖软件 |
(1) 群签名和环签名主要特性
算法 |
特性 |
---|---|
群签名 | 1. 匿名性:群成员用群参数产生签名,其他人仅可验证签名的有效性,并通过签名知道签名者所属群组,却无法获取签名者身份信息; 2. 可追踪性: 在监管介入的场景中,群主可通过签名获取签名者身份. |
环签名 | 1. 完全匿名性:其他人仅可验证环签名的有效性,无法获取签名者身份信息; 2. 不可追踪性:无法追踪签名对应的签名者信息. |
(2) 群签名主要流程
流程 |
说明 |
---|---|
生成群 | 生成群公钥(gpk),群主私钥(gmsk)和群参数(可用不同线性对参数生成群,sig-service支持A, A1, E 和 F类型线性对,默认使用A类型线性对) |
加入群 | 群主为群成员产生私钥(gsk)和证书(cert) |
生成群签名 | 群成员用私钥和证书产生群签名 |
群签名验证 | 其他人通过群公钥、群参数验证群签名信息的有效性(此时其他人仅知道签名者属于哪个群,但无法获取签名者身份信息) |
追踪签名者信息 | 在监管介入场景中,群主通过签名信息可获取签名者证书,从而追踪到签名者身份 |
(3) 环签名主要流程
流程 |
说明 |
---|---|
初始化环 | 生成环参数 |
为环成员产生公私钥对 | 成员加入环时,rpc服务为环成员产生公私钥对 |
生成环签名 | 环成员使用私钥和其他环成员公钥产生匿名签名,环大小可由用户根据性能和安全性需求自定义指定(环越大,安全性越高,性能越低;环越小,安全性越低,性能越低,sig-service默认环大小为32) |
环签名验证 | 其他人通过环参数和产生环签名的公钥列表,验证环签名的有效性 |
群签名&&环签名RPC服务部署于可信机构内,提供群签名和环签名服务,该服务可与群签名&&环签名客户端 结合使用,应用于区块链场景,也可以作为机构的签名服务,应用于其他场景。
下面列举群签名&&环签名在区块链中的应用场景:
(1) 群签名场景
场景1( ToC ):拍卖、匿名存证等场景
机构内成员(C端用户)或机构内下属机构通过机构将群签名信息上链,其他人在链上验证签名时,仅可获知签名所属的群组,却无法获取签名者身份,保证成员的匿名性和签名的不可篡改性;
场景2(ToB):竞标、对账、匿名征信等场景
B端用户将生成的群签名通过AMOP发送给上链结构(如agency),上链机构将收集到的群签名信息统一上链,其他人验证签名时,无法获取签名者身份,保证成员的匿名性,监管可通过可信第三方追踪签名者信息,保证签名的可追踪性
(2) 环签名场景
场景1:(匿名投票)
机构内成员(C端用户)对投票信息进行环签名,并通过可信机构(如agency)将签名信息和投票结果写到链上,其他人可在链上验证签名时,仅可获取发布投票到链上的机构,却无法获取投票者身份信息
场景2:(如匿名存证、征信)
与群签名匿名存证、征信场景类似,唯一的区别是任何人都无法追踪签名者身份
场景3:匿名交易
在UTXO模型下,可将环签名算法应用于匿名交易,任何人都无法追踪转账交易双方;
群签名&&环签名RPC详细接口可参考群签名&&环签名RPC接口文档
本章主要介绍了如何部署和运行群签名&&环签名RPC服务。
(1) 安装基础依赖软件
部署群签名&&环签名RPC服务之前,要安装git, dos2unxi, lsof依赖软件:
- git:用于拉取最新代码
- dos2unix && lsof: 用于处理windows文件上传到linux服务器时,可执行文件无法被linux正确解析的问题;
可用如下命令安装这些基础依赖软件:
[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
ln -s /usr/bin/todos /usr/bin/unxi2dos
ln -s /usr/bin/fromdos /usr/bin/dos2unix
部署dos2unix后,调用format.sh脚本格式化可执行文件,使其可被linux系统正确解析:
# 格式化format.sh脚本
dos2unix format.sh
# 执行format.sh脚本格式化其他可执行文件,使其可被正确解析执行
bash format.sh
(2) 安装levelDB、gmp等依赖软件
群签名&&环签名rpc服务,需要安装levelDB, gmp等依赖软件,sig-service在script目录下提供了install_deps.sh脚本,执行以下命令安装这些依赖软件:
# 进入script目录 && 执行install_deps.sh脚本
cd script && sudo bash install_deps.sh
(3) 安装群签名算法依赖软件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
# 编译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
(1) 启动群签名&&环签名RPC服务
#群签名&&环签名RPC服务使用方法:
[app@VM_105_81_centos build]$ ./server -h
group sig and ring sig RPC:
-p [ --port ] arg listen port of group sig and ring sig RPC
-n [ --http_thread_num ] arg thread num of http server used to deal with
requests
-l [ --log_path ] arg path of log configuration
-s [ --ssl_cert ] arg path of ssl certification
-k [ --ssl_key ] arg key to access ssl certification
-h [ --help ] help of group sig and ring sig rpc
各参数含义如下:
参数 |
说明 |
默认参数 |
---|---|---|
-p, --port | rpc服务启动端口 | 8003 |
-n, --http_thread_num | rpc服务启动的http线程数目 | 50 |
-l, --log_path | 配置文件路径 | "log.conf" |
-s, --ssl_cert | ssl证书路径(针对https服务) | “” |
-k, --ssl_key | 访问ssl证书的秘钥(针对https服务) | “” |
-h, --help | 显示帮助信息 | - |
(2) 日志配置 log.conf
sig-service目录下存着一个日志配置文件示例log.conf,其内容如下。
用户使用时,需要:
- 修改FILENAME,将其修改为用户自己的日志文件路径;
- 根据需求,修改日志打印选项,生产环境中,一般WARNING/ERROR/FATAL打开(设置选项值为true),其他选项关闭(设置选项值为false);测试环境中,可打开DEBUG和TRACE
* GLOBAL:
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = false
FORMAT = "%level|%datetime{%Y-%M-%d %H:%m:%s:%g}|%msg"
FILENAME = "/data/sig-service/log/log_%datetime{%Y%M%d}.log"
MILLISECONDS_WIDTH = 3
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 209715200 ## 200MB - Comment starts with two hashes (##)
LOG_FLUSH_THRESHOLD = 100 ## Flush after every 100 logs
* TRACE:
ENABLED = false
FILENAME = "/data/sig-service/log/trace_log_%datetime{%Y%M%d}.log"
* DEBUG:
ENABLED = true
FILENAME = "/data/sig-service/log/debug_log_%datetime{%Y%M%d}.log"
* FATAL:
ENABLED = true
FILENAME = "/data/sig-service/log/fatal_log_%datetime{%Y%M%d}.log"
* ERROR:
ENABLED = true
FILENAME = "/data/sig-service/log/error_log_%datetime{%Y%M%d}.log"
* WARNING:
ENABLED = true
FILENAME = "/data/sig-service/log/warn_log_%datetime{%Y%M%d}.log"
* INFO:
ENABLED = true
FILENAME = "/data/sig-service/log/info_log_%datetime{%Y%M%d}.log"
* VERBOSE:
ENABLED = true
FILENAME = "/data/sig-service/log/verbose_log_%datetime{%Y%M%d}.log"
用户启动群签名&&环签名RPC服务时,用-l或--log_path选项设置日志路径,或者直接将log.conf拷贝到编译生成的可执行文件同一路径,不指定-l或--log_path,一个简单的启动例子如下:
#在8005端口启动群签名&&环签名RPC服务,日志配置文件路径是bak/log.conf; 开启的http线程数目是1000
[app@VM_105_81_centos sig-service]$ chmod +x build/server && ./build/server -p 8005 -n 1000 -l bak/log.conf
port:8005 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 8005 -n 1000 -l bak/log.conf > result.log 2>&1 &