本人最近正在安装零知识证明C++库libsnark(Github链接在此),网上教程极少,很多方法不适合自己,走了很多弯路,前前后后抑郁了十天左右,终于喜大普奔的安好了。在此记录一下自己这些天的历程。有时候不是教程不对,而是各种玄学问题,往往头一天怎么也搞不出来第二天一下就好了,所以心态要放平,不要焦躁,一时配不出来没关系,回去睡一觉再来,做好配他半个月的准备。其实我认认真真装也就装了五六天左右,这期间倒是把整个库给摸清楚了。其实这个库的官网安装教程非常详细,花些功夫自己摸索不借助别人的教程也能顺利安装,所以不要过度依赖网上的教程,自己明白各个部分的功能以后安装很快的,有bug还更容易排查。
我是在win10中安装VMware,然后安装的ubuntu18.04.6,换了国内的清华镜像源。网上教程很多,这里浅放几条我当时用的以作参考:
VMware虚拟机安装Ubuntu16-18系统超详细过程(含下载地址)
Windows10下安装Ubuntu18.04LTS详细教程
Ubuntu换国内阿里、清华镜像源
这是官网上说的需要的依赖项:
暂时不知道这些是干嘛的没关系,主要是这一条:
Fetch and compiled via Git submodules:
libff,libfqfft,GTest,ate-pairing,xbyak,Subset of SUPERCOP
也就是说这六个子模块要分别拉取然后编译,在哪拉取呢,我们来看一看libsnark库里有些啥:
看到depends文件夹了吗?点开,这里面就是我们需要的六个子模块的链接地址,如下图所示。挨个下载编译就可以了。点开任意一个子模块,里面都有详细的README.md文件,告诉你这个子模块是干什么的,如何安装,非常详细,跟着做就可以了。
接着看到README.md文件里这几句话:
这是libsnark安装运行所需要的包,先安上。根据自己的ubuntu版本选择相应命令。我是Ubuntu18.04.6,所以执行第一条:
sudo apt install build-essential cmake git libgmp3-dev libprocps-dev python3-markdown libboost-program-options-dev libssl-dev python3 pkg-config
然后开始正式安装整个libsnark库。
找个地方建一个文件夹,cd
进去,比如我是在Desktop里建了一个libsnark文件夹(可以换一个名字,我当时没在意,现在发现下载的包也叫libsnark,两个libsnark套一起,有时候容易混)
cd Desktop mkdir libsnark cd libsnark
然后把整个库克隆下来,有两种方法
执行命令
git clone https://github.com/scipr-lab/libsnark.git
这个网站好像不太好下载,经常git不下来,出现诸如以下这样的问题
没关系,多试几次,实在不行用方法二。
直接在libsnark的github官网首页点击“Code”–“Download ZIP”,下载后解压到我们建的libsnark文件夹,结果是一样的
下载好后,打开我们刚刚下载的libsnark文件夹,双击打开depends文件夹,发现里面有六个文件夹,名字正好对应六个待安装的子模块,外加一个CMakeLists.txt文件。打开这六个文件夹里面都是空的,需要我们分别单独下载安装。
我没有按照官网顺序安装,因为我反反复复安装几十遍以后发现各个子模块之间有依赖关系,所以我从最底层的xbyak开始安装。
(1)先cd
进需要安装的文件夹
cd depends cd xbyak
(2)然后下载更新子模块并安装,同样有两种方法
终端输入以下命令:
git submodule init && git submodule update make install
出现以下代码就算是装好了
和之前一样直接下载压缩包。点击xbyak@f0a8f7f进入
下载压缩包
解压后得到以下文件,全选后复制进~/Desktop/libsnark/libsnark/depends/xbyak目录下
回到终端,执行以下命令:
make install
安装成功后命令行显示跟方法一的一样
其实方法二就是将方法一中的git submodule init && git submodule update命令改为手动下后载解压,本质没太大区别,只是本人这几天网实在不行,只能直接下载压缩包了。后面每个子模块都可以这样代替,我就不详细写了。
(1)先从xbyak文件夹出来,cd
进ate-pairing:
cd .. cd ate-pairing
(2)更新下载该子模块:
git submodule init && git submodule update
网和我一样不好的直接下载压缩包解压进ate-pairing文件夹就可以了,和之前的一样
(3)查看一下ate-pairing的README.md文件,这个库的安装有两个命令,依次执行就ok:
make -j test/bn
make -j
后出来一大堆,最后几行是这样:
test/bn
后出来一大堆,最后几行大致是这样:
(1)进入libsnark-supercop文件夹:
cd .. cd libsnark-supercop
(2)更新下载子模块:
git submodule init && git submodule update
或者直接下载压缩包,解压,复制粘贴进ate-pairing文件夹
(3)查看一下libsnark-supercop的README.md,有这么一句话:
意思是如果解压后不能直接运行,先在这个文件夹中执行一下./do
管他能不能运行,先执行一下比较保险
./do
出现下面这些,说明安装成功
(1)进入gtest文件夹:
cd .. cd gtest
(2)更新下载子模块:
git submodule init && git submodule update
或者直接下载解压压缩包
这个库没有需要操作的,下载完了就行了
(1)进入libff文件夹:
cd .. cd libff
(2)更新下载子模块:
git submodule init && git submodule update
或者直接下载解压压缩包
重点来了,点击libff–>depends,可以看到一个ate-pairing文件夹和一个xbyak文件夹,这是libff需要的依赖项。打开这两个文件夹,大概率会发现它们是空的,这时候就要在这两个文件夹里重新拉取这两个依赖项
cd depends cd ate-pairing git submodule init && git submodule update cd .. cd xbyak git submodule init && git submodule update cd .. cd ..
也可以把之前下载解压的ate-pairing和xbyak里的文件直接复制过来。这两个依赖项不需要再make。如果这两个文件夹是空的没拉取,cmake的时候会出现下面的错误:
(3)现在libff子模块就拉完整了,查看一下libff的README.md文件,有这几个命令:
明白了,先建一个build文件夹,cd进去,cmake一下:
mkdir build cd build cmake ..
有这几行字就是cmake成功了,因为我是第二次cmake,字比较少,第一次cmake的话会多几行
(4)make一下,然后install:
make sudo make install
sudo make install
之后会需要输入密码,输入ubuntu登录密码就可以
这样就是make好了:
这样就是install好了:
官网给的命令make install
安装有可能出现权限不够的情况,所以改成了sudo make install
,参考的这篇博客:如何拉取libsnark库?——新手指南教程
(5)安装完以后check一下
make check
像下面这样就是OK了
这个子模块的安装和libff几乎一样
(1)进入libfqfft文件夹:
cd .. cd .. cd libfqfft
(2)更新下载子模块:
git submodule init && git submodule update
或者直接下载解压。
点开libfqfft–>depends,可以看到libfqfft有四个依赖项,分别是ate-pairing, gtest, libff, xbyak,点开来依然都是空的,需要依次拉取。和之前一样挨个cd
进去执行git submodule init && git submodule update
,或者把之前的解压文件复制进去。注意libff里还有depends文件夹,里面的ate-pairing和xbyaky也是空的,也要再拉。这些都是拉了就可以了,不用编译。最后记得检查一下所有的depends文件夹里的依赖项,都不能是空的。
(3)看一下libfqfft的README.md文件,安装步骤和libff差不多。先建一个build文件夹,cd
进去,cmake一下:
mkdir build cd build cmake ..
这样就是cmake成功了:
(4)make一下,然后install:
make sudo make install
这样就是make好了:
这样就是install好了:
(5)check一下
make check
出现这个就是好了:
(1)根据官网教程,回到~/Desktop/libsnark/libsnark目录下,建立build文件夹,cd
进去, cmake
一下,然后make
,make doc
,make check
:
cd .. cd .. cd .. mkdir build cd build cmake .. make make doc make check
cmake
成功的命令行显示跟之前差不多
make
的命令行显示注意要有这几条很亮的绿色的Linking…,说明已经成功连接到这几个库。不然check的时候会报错(我就死在这上面两天):
如果没有的话就去前面六个子模块找,看看是哪个没装好,重装一下。比如我一开始就是ate-pairing没装好所以libzm.a就连不上。
make doc
成功命令行最后几行显示如下:
make check
成功命令行最后几行显示如下:
至此,整个环境就搭建好了!
整个过程不可能一帆风顺的,就算每一步都正确也会出现玄学bug,不要焦躁,不行就重来。我反正大大小小来来回回装了有十几次吧,谁没有个几天几夜配环境的经历呢。
有时候会觉得自己明明哪都没错啊,子模块也都没问题,为啥整体编译就出错。这种情况下要么去前面子模块找问题重新安装相应子模块,再不行放它一天回去睡一觉再来说不定就好了。
有时候可能不知道某个问题对应的子模块是哪个,这时候就打开vscode,打开整个libsnark项目文件夹,在整个项目里面搜关键词。比如我一直整体make check
时报的错/usr/bin/ld: cannot find -lzm
,上网查了一下喔这种一般是少了个包,一般can’t find -lxx就是少了libxx,sudo apt-get install libxx-dev
就行,但我执行了一下sudo apt-get install libzm-dev
,它说Unable to locate package libzm-dev
,并没有这个包,那就说明这个包是我某个子模块安装的。去vscode里一搜libzm,果然,矛头直指ate-pairing,那就是他没安好了。
网不好的强烈建议直接下载压缩包,在封校的垃圾网速下也依然很快,而且后面libff,libfqfft的一堆依赖项,每个都cd
进去git submodule update
特别费时,如果一开始六个依赖项的压缩包都下好了后面解压直接复制粘贴快到飞起。
不要过于依赖别人的教程,比如说我看的那个教程很详细,但是他直接漏了一个依赖项没写。。我整个人当时就是一个大懵逼状态也不知道自己检查一下,还找人帮我de了半天bug,最后发现自己直接少一个子模块,丢人。。。
有些时候可能看不懂命令行里的报错,这时候就复制粘贴狂搜就好,虽然可能找不到一模一样的问题但能启发你问题出在哪,怎么解决。
我觉得配环境就像是御灵师训神兽一样,我们训的是电脑。一开始它可能非常不听话啥都出错,网上找各种方法解决。但是训着训着就乖顺了,即使重来一遍之前的问题也都没有了。我现在翻看我之前的配环境日志发现之前记录的好多bug和当时解决它们的办法在我最后一遍安装的时候都没用遇上,顺顺利利就安完了。