https://github.com/hyperledger-labs/minbft
系统运行在Ubuntu 18.04 LTS (Bionic Beaver),首先安装其他必需的软件包:
sudo apt-get install build-essential pkg-config
go1.11
is used to build this project. 因此我安装了go 1.11.10
The Intel® SGX enclave implementation has been tested with Intel® SGX SDK for Linux version 2.3.1.
这里我安装了SGX Linux 2.3.1
Intel®SGX Enclave实施已通过Intel®SGXSDK for Linux 2.3.1版测试。
1. 在~/.profile
文件中根据自己的配置情况加入以下内容:
. /opt/intel/sgxsdk/environment
其中/opt/intel/是SGX的安装路径。我的是:
. /home/lee/SGXSDK/sgxsdk/environment
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
/opt/intel/sgxsdk/sdk_libs
我的是:
/home/lee/SGXSDK/sgxsdk/sdk_libs
在minbft路径下运行make install
,出现以下内容应该是SGX环境已经搭建成功:
注意!如果之前运行过,需要先清除一些文件。因此在make install之前先执行一次make clean。
golong这部分说一下。配置好SGX以后,但golong这部分一直报错。出现过的错误如下:
总而言之应该是被墙了,每次下载不下来的内容也不尽相同。
重点是,尝试了很多方法,都没有立即有效。后来多次尝试make install最后成功安装。很是无语。
尝试过的方法如下:
(1)安装蓝灯
但是大多是时候处于连接中的状态,没用。
(2)安装gRPC
参考:Ubuntu16.04 安装gRPC
(3)设置GOPROXY
环境变量
参考:一键解决 go get golang.org/x 包失败
修改环境变量后别忘了 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).
运行示例进行一些设置。首先确保该项目已构建成功,并生成了sample/bin/keytool
and sample/bin/peer
二进制文件。可以通过配置文件,环境变量或命令行参数为这些二进制文件提供选项。可以通过使用help
参数调用这些二进制文件来查询有关可用选项的更多信息。Sample配置文件可分别在sample/authentication/keytool/
and sample/peer/
目录中找到。
接下来的命令都在sample
目录下进行:
cd sample
可以使用keytool
命令生成用于测试的示例秘钥集文件。 此命令生成适合在本地计算机上运行该示例的秘钥集文件:
bin/keytool generate -u lib/libusig.signed.so
此调用将创建一个名为keys.yaml
的示例密钥集文件,默认情况下包含3个用于副本的密钥对和1个用于客户端的秘钥对。
可以通过配置文件设置共识选项。这里使用cp
命令从config文件夹下复制了consensus.yaml文件。可以使用示例共识配置文件作为示例:
cp config/consensus.yaml ./
可以在该文件中更改端口号。
可以在配置文件中提供Peer配置。 可以通过peer
二进制的命令行参数修改所选选项。 示例配置可用作示例:
cp peer/peer.yaml ./
到这里,就已经在sample 文件夹下创建了三个文件consensus.yaml
、keys.yaml
和peer.yaml
:
在本地计算机上启动副本的示例共识网络,分别输入:
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
错误。
这就使用了在先前步骤中准备的配置文件在后台启动副本节点作为3个单独的OS进程:
为方便起见,可以使用相同的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
。
全部运行结果:
从运行结果可以看出,这些命令应生成了以下输出,显示已提交的请求的排序和执行结果:
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排序和执行。该服务通过简单地将每个请求的新块附加到由服务维护的普通区块链来执行请求。
终止正在运行的副本进程并释放占用的TCP端口:
killall peer
以上示例显示了共识网络的简单正常情况。接下来的测试是当一些副本出现故障时系统的行为方式。
最简单的故障是备份副本上的崩溃故障。 请注意,在实现视图更改操作之前,我们不能容忍主副本上的任何类型的故障。
重新启动网络,并记下每个副本进程的进程ID。
通过发送请求确保所有副本正常工作:
现在kill replica 1并发送另一个请求:
仍然会收到成功同意的回复消息。 接下来,kill另一个备份副本并发送另一个请求:
我们未能达成共识并且没有得到回应,因为超过f
个副本是故障的。
修改代码后,需要先对代码进行编译才能 执行新代码 :
make clean
make install
bin/keytool generate -u lib/libusig.signed.so
7个节点运行演示:
修改了代码中的几个地方,将节点数修改为7
(XXXX_test.go文件都不用改):
sample /config /consensus.yaml
sample /authentication /keytool /keytool.yaml
sample /authentication /keytool /cmd /generate.go
经测试,在本地计算机上启动副本形成共识网络时,每启动一个节点,该节点都会 与所有其他节点进行连接 ,且这个过程是并行的, gRPC的地址target就是address就是端口号 :