MinBFT共识算法代码库搭建

文章目录

  • 1. 项目地址
  • 2. 运行需要
    • Operating System
    • 2.1 成功安装Golang
    • 2.2 成功安装SGX
  • 3. 搭建过程
    • 3.1 Intel® SGX SDKcp
      • 3.1.1 配置SGX环境变量
      • 3.1.2 golong的错误
  • 4. 运行示例
    • 4.1 Generating Keys(生成秘钥)
    • 4.2 Consensus Options Configuration(共识选项配置)
    • 4.3 Peer Configuration(Peer配置)
    • 4.4 Running Replicas(运行副本)
    • 4.5 Submitting Requests(提交请求)
    • 4.6 Tear Down(关闭)
  • 5. Fault Tolerance(容错)
    • Crash Fault on Backup(副本上的崩溃故障)
  • 6. 修改代码后运行

用了一周左右的时间才跑起来,解决了各种各样没有预料到的问题。Linux爬坑路漫漫。
跑的好像仍然不是很完美,感觉还有些不对。继续学习完善吧。

1. 项目地址

https://github.com/hyperledger-labs/minbft

2. 运行需要

Operating System

系统运行在Ubuntu 18.04 LTS (Bionic Beaver),首先安装其他必需的软件包:

sudo apt-get install build-essential pkg-config 

2.1 成功安装Golang

go1.11 is used to build this project. 因此我安装了go 1.11.10
MinBFT共识算法代码库搭建_第1张图片

2.2 成功安装SGX

The Intel® SGX enclave implementation has been tested with Intel® SGX SDK for Linux version 2.3.1.
这里我安装了SGX Linux 2.3.1

3. 搭建过程

3.1 Intel® SGX SDKcp

Intel®SGX Enclave实施已通过Intel®SGXSDK for Linux 2.3.1版测试。

官方描述:
MinBFT共识算法代码库搭建_第2张图片

3.1.1 配置SGX环境变量

1.~/.profile文件中根据自己的配置情况加入以下内容:

. /opt/intel/sgxsdk/environment

其中/opt/intel/是SGX的安装路径。我的是:

. /home/lee/SGXSDK/sgxsdk/environment

MinBFT共识算法代码库搭建_第3张图片
2./etc/ld.so.conf.d路径下创建文件sgx-sdk.conf
进入到/etc/ld.so.conf.d路径,输入命令

sudo touch sgx-sdk.conf
sudo chmod 777 sgx-sdk.conf
sudo gedit sgx-sdk.conf 

MinBFT共识算法代码库搭建_第4张图片
sgx-sdk.conf文件中加入以下内容:

/opt/intel/sgxsdk/sdk_libs 

我的是:

/home/lee/SGXSDK/sgxsdk/sdk_libs

在这里插入图片描述
在minbft路径下运行make install,出现以下内容应该是SGX环境已经搭建成功:

注意!如果之前运行过,需要先清除一些文件。因此在make install之前先执行一次make clean。

MinBFT共识算法代码库搭建_第5张图片

3.1.2 golong的错误

golong这部分说一下。配置好SGX以后,但golong这部分一直报错。出现过的错误如下:
MinBFT共识算法代码库搭建_第6张图片
MinBFT共识算法代码库搭建_第7张图片
总而言之应该是被墙了,每次下载不下来的内容也不尽相同。
重点是,尝试了很多方法,都没有立即有效。后来多次尝试make install最后成功安装。很是无语。

尝试过的方法如下:

(1)安装蓝灯

但是大多是时候处于连接中的状态,没用。

(2)安装gRPC

参考:Ubuntu16.04 安装gRPC

(3)设置GOPROXY环境变量

参考:一键解决 go get golang.org/x 包失败
MinBFT共识算法代码库搭建_第8张图片
修改环境变量后别忘了 source /etc/profile .

(4)手动下载

参考:golang 不安装golang.org/x/net
golang报错:unrecognized import path “golang.org/x/tour”

为了使包的导入方式不变,在src目录下面构造目录结构

1) mkdir -p $GOPATH/src/golang.org/x/
是在$GOPATH/src下,而不是$GOPATH下(这里我运行的时候装错了,也在蓝灯开着的一小会运行出来了)。

2)cd $GOPATH/src/golang.org/x/
我的是 ~/BlockchainExperiment/GoCode/src/golang.org/x

3)git clone https://github.com/golang/net.git
这里以net为例。安装其他包时将net更换为其他包名即可,如 git clone https://github.com/golang/crypto.git
4)$go install net
(为了让其生成{$GOPAT}/pkg/xxx,不加这一步也可以)。

执行go install之后没有提示,就说明安装好了。

手动下载以下每个包:

benchmarks — benchmarks to measure Go as it is developed.
blog — blog.golang.org's implementation.
build — build.golang.org's implementation.
crypto — additional cryptography packages.
debug — an experimental debugger for Go.
image — additional imaging packages.
mobile — experimental support for Go on mobile platforms.
net — additional networking packages.
perf — packages and tools for performance measurement, storage, and analysis.
review — a tool for working with Gerrit code reviews.
sync — additional concurrency primitives.
sys — packages for making system calls.
text — packages for working with text.
time — additional time packages.
tools — godoc, goimports, gorename, and other tools.
tour — tour.golang.org's implementation.
exp — experimental and deprecated packages (may change without warning).

4. 运行示例

运行示例进行一些设置。首先确保该项目已构建成功,并生成了sample/bin/keytool and sample/bin/peer二进制文件。可以通过配置文件,环境变量或命令行参数为这些二进制文件提供选项。可以通过使用help参数调用这些二进制文件来查询有关可用选项的更多信息。Sample配置文件可分别在sample/authentication/keytool/ and sample/peer/目录中找到。
MinBFT共识算法代码库搭建_第9张图片

4.1 Generating Keys(生成秘钥)

接下来的命令都在sample目录下进行:

cd sample

可以使用keytool命令生成用于测试的示例秘钥集文件。 此命令生成适合在本地计算机上运行该示例的秘钥集文件:

bin/keytool generate -u lib/libusig.signed.so

此调用将创建一个名为keys.yaml的示例密钥集文件,默认情况下包含3个用于副本的密钥对和1个用于客户端的秘钥对。

4.2 Consensus Options Configuration(共识选项配置)

可以通过配置文件设置共识选项。这里使用cp命令从config文件夹下复制了consensus.yaml文件。可以使用示例共识配置文件作为示例:

cp config/consensus.yaml ./

可以在该文件中更改端口号。

4.3 Peer Configuration(Peer配置)

可以在配置文件中提供Peer配置。 可以通过peer 二进制的命令行参数修改所选选项。 示例配置可用作示例:

cp peer/peer.yaml ./

到这里,就已经在sample 文件夹下创建了三个文件consensus.yamlkeys.yamlpeer.yaml
MinBFT共识算法代码库搭建_第10张图片

4.4 Running Replicas(运行副本)

在本地计算机上启动副本的示例共识网络,分别输入:

bin/peer run 0 &
bin/peer run 1 &
bin/peer run 2 &

注意!每次输入bin/peer run 0 &敲回车后光标会停留如下。这里是因为进入replica-server中的ListenAndServe(addr string)方法时会阻塞, 这时候继续敲回车即可,否则会引起rpc error: code = Unavailable desc = transport is closing错误。
MinBFT共识算法代码库搭建_第11张图片

这就使用了在先前步骤中准备的配置文件在后台启动副本节点作为3个单独的OS进程:
MinBFT共识算法代码库搭建_第12张图片

4.5 Submitting Requests(提交请求)

为方便起见,可以使用相同的peer二进制文件和配置文件将请求提交给示例共识网络进行排序和执行。 最好在另一个终端中发出以下命令,以便输出消息不会混合:

bin/peer request First request
bin/peer request Second request
bin/peer request Another request

注意!由于http监听(http.ListenAndServe())阻塞的原因,bin/peer request First request运行完后应立即执行bin/peer request Second request ,以此类推。否则会出现rpc error: code = Unavailable desc = transport is closing

全部运行结果:
MinBFT共识算法代码库搭建_第13张图片
MinBFT共识算法代码库搭建_第14张图片
MinBFT共识算法代码库搭建_第15张图片
从运行结果可以看出,这些命令应生成了以下输出,显示已提交的请求的排序和执行结果:

Reply: {"Height":1,"PrevBlockHash":null,"Payload":"Rmlyc3QgcmVxdWVzdA=="}
Reply: {"Height":2,"PrevBlockHash":"DuAGbE1hVQCvgi+R0E5zWaKSlVYFEo3CjlRj9Eik5h4=","Payload":"U2Vjb25kIHJlcXVlc3Q="}
Reply: {"Height":3,"PrevBlockHash":"963Kn659GbtX35MZYzguEwSH1UvF2cRYo6lNpIyuCUE=","Payload":"QW5vdGhlciByZXF1ZXN0"}

输出显示提交的请求已经被sample blockchain service排序和执行。该服务通过简单地将每个请求的新块附加到由服务维护的普通区块链来执行请求。

4.6 Tear Down(关闭)

终止正在运行的副本进程并释放占用的TCP端口:

killall peer

5. Fault Tolerance(容错)

以上示例显示了共识网络的简单正常情况。接下来的测试是当一些副本出现故障时系统的行为方式。

Crash Fault on Backup(副本上的崩溃故障)

最简单的故障是备份副本上的崩溃故障。 请注意,在实现视图更改操作之前,我们不能容忍主副本上的任何类型的故障。

重新启动网络,并记下每个副本进程的进程ID。
MinBFT共识算法代码库搭建_第16张图片
通过发送请求确保所有副本正常工作:
MinBFT共识算法代码库搭建_第17张图片
现在kill replica 1并发送另一个请求:
MinBFT共识算法代码库搭建_第18张图片
仍然会收到成功同意的回复消息。 接下来,kill另一个备份副本并发送另一个请求:
MinBFT共识算法代码库搭建_第19张图片
我们未能达成共识并且没有得到回应,因为超过f个副本是故障的。

6. 修改代码后运行

修改代码后,需要先对代码进行编译才能 执行新代码 :

  1. minbft路径下先进行清理:
make clean
  1. 安装 :
make install  
  1. 然后可以进行正常的测试了:
    先进到sample目录下,然后生成秘钥集文件:
bin/keytool generate -u lib/libusig.signed.so

MinBFT共识算法代码库搭建_第20张图片
7个节点运行演示:
修改了代码中的几个地方,将节点数修改为7 (XXXX_test.go文件都不用改):

  1. sample /config /consensus.yaml
  2. sample /authentication /keytool /keytool.yaml
  3. sample /authentication /keytool /cmd /generate.go



32个节点的运行情况:
MinBFT共识算法代码库搭建_第21张图片
副本连接 :

经测试,在本地计算机上启动副本形成共识网络时,每启动一个节点,该节点都会 与所有其他节点进行连接 ,且这个过程是并行的, gRPC的地址target就是address就是端口号 :

MinBFT共识算法代码库搭建_第22张图片

你可能感兴趣的:(可信执行环境(TEE),Linux进阶之路,共识算法)