区块链开发(一)搭建quorum联盟链环境

通过各方资料了解学习之后,决定自己搭建quorum联盟链。发现国内资料很少,仅有的几篇也都是坑,于是整理下搭建联盟链的过程,仅供产考。特意通过ubuntu服务器搭建。以下内容均基于ubuntu系统。

简介

Quorum是由美国的金融机构摩根大通推出的企业级区块链平台

Quorum是一个联盟链

Quorum基于以太坊, 在基础结构上保持与以太坊的同步, 增强的部分集中在隐私控制、权限控制、共识机制,以及提高整个链的交易性能

特点

逻辑架构


从上面的逻辑架构图可以看出一个Quorum结点由两部分组成:1.基于以太坊的QuorumNode 2.Quorum增加的Constellation.

Quorum最初设计的实现就是对以太坊geth的一个minimal fork, 官方的一个实践准则就是保持对以太坊geth的持续跟进.

在共识方法上, Quorum用QuorumChain取代了以太坊的POW, 最新推出的2.0.0又增加了Raft的共识方法, 最终的目标就是形成一个插件化的共识体系.

Quorum作为企业级联盟链, 强调隐私控制与权限管理, Constellation就是用于这一个目标的组件.Constellation中的Transaction Manager用于管理私有交易在联盟内部成员之间的同步, Enclave的职责就是配合Transaction Manager来完成私有交易的密码学相关的处理工作.

交易流程


结合上面的交易流程示意图, 一次Quorum的交易流程分成两种情况:

如果这是一个公开我交易, 那么这个交易直接走以太坊的交易流程, 交易不会经由Transaction Manager来处理.

如果这是一个私有交易, 那么这个交易就会被QuorumNode发送到Transaction Manager, 进行私有交易的处理(具体细节会在以后的系统中结合实例代码与演示加以剖析).

一,安装go环境

参考:https://blog.csdn.net/a1160712069/article/details/78257307

二、下载资源

首先安装quorum

git clone -b v2.1.0  https://github.com/jpmorganchase/quorum.git

cd quorum

make all

编译完后,quorum/build/bin目录下会生成如下文件列表

abigen bootnode evm examples faucet geth p2psim puppeth rlpdump swarm wnode

将上面这些加入系统path中。

三,获取costellation-node可执行文件

下载地址:https://github.com/jpmorganchase/constellation/releases/tag/v0.3.2

下载下来后解压,得到constellation-node,加入系统PATH中。

四、搭建raft共识的联盟链

因为联盟间一般是存在信任关系,因此可以使用raft共识算法,这个算法可以容忍节点挂掉,但不能容忍拜占庭错误,即不能存在恶意节点。这样就不用以太坊中的pow算法了,节省cup、内存,而且出块时间块。另外,这个算法中不会存在空块,节省大量空间,如果没有交易,那么生成区块就暂停。

1,首先安装quorum-examples

git clone https://github.com/jpmorganchase/quorum-examples.git

cd quorum-examples

2、初始化,创建7个节点,其中1-4号节点是permissioned节点,即这些节点只允许和permissioned-nodes.json中的节点建立连接,其他节点无法连接到这个节点。raft-init.sh

以第一个节点的配置为例解释命令:

第一行:创建节点1的目录

第二行:permissioned-nodes.json中存了已经设置好的enode值,即节点的地址,通过这个值,运行geth客户端时可以将不同的节点连接起来。与普通以太坊的geth客户端不同,这里需要一个static-nodes,应该是指定和哪些节点建立连接吧。如果启动geth时不指定--permissioned,启动后本节点就会寻找static-node里面的节点建立连接。

另外,这个enode的值是与nodekey相关的,就是第五行中的nodekey文件,两者应该是一一对应的。所以第五行中将nodekey复制到这个目录中,就相当于把一个节点的唯一标识复制过去。nodekey的生成方法:运行bootnode -genkey nodekey即可生成nodekey文件,再运行bootnode -nodekey nodekey就会输出本节点的enode信息,记录下来即可。

第三行:将permissioned-node.json复制到节点1的目录下,这里面记录了哪些节点可以与本节点建立连接,不在这个列表里的节点是不能和本节点连接的。

第四行:将一个账户文件复制到节点1下的目录,启动geth后,用eth.accounts查账户,就会显示这个文件中的账户地址。

第五行:将nodekey复制到节点1目录下,它作用如上面所述。

第六行:根据创世区块信息genesis.json初始化区块链。

3,启动constellation和geth节点

(1)constellation:可以将其看成是分布式密钥服务器、PGP加密和邮件传输代理的合并,用它来实现quorum的私有机制。

使用方法:生成密钥constellation-node --generatekeys node,就会生成node.pub和node.key两个密钥文件,分别是公私钥文件。如果在生成是使用密码加密,那么在启动contellation-node时是需要输入密码的,为了方便,下面的方法中不输入密码。启动节点的constellation-start.sh脚本

第五行是代表一共启动7个节点,需要在不同的节点目录

第7-9行:建立节点目录

第10-11行:将之前生成的公私钥对放到对应几点目录中

第12行:删除之前存在的旧的 .ipc文件(如果存在的话)

第13行:启动constellation-node节点,具体参数参考https://github.com/jpmorganchase/constellation/blob/master/sample.conf

第15行:将控制台的输出定向到指定文件里,如果启动错误,可以去对应文件查看错误内容

第18-28行:等待所有constellation-node启动完毕,其中24行 -S 是查看对应文件是否存在。

可以运行./constellation-start.sh来启动测试,启动完毕后输入ps -ef | grep constellation-node可以查看进程情况,输入killall constellation-node 来终止程序运行。

启动失败:

参考:https://www.jianshu.com/p/cb0f6372cf93

4,下面来启动7个geth节点,启动raft共识,raft-start.sh

其中

第7行:调用上面写的constellation-start.sh脚本,启动7个constellation

第11行:启动geth节点需要的参数,这里需要制定--raft来使用raft共识方法

第12-18行,启动7个geth节点,需要指定raftport端口号,用 --permissioned参数来指定那些节点是有连接权限的。

这样,constellation-node和geth节点都启动起来了,也就是环境已经搭建好了,可以在上面开发了。开发之前先做一下测试。

五,减少节点数量

很容易减少示例中使用的节点数量。您可能希望出于内存使用原因或仅尝试使用其他网络配置来执行此操作。

要运行具有5个节点而不是7个节点的示例,需要进行以下更改:

1,raft-start.sh

注释掉用于启动Quorum节点6和7的以下行

2.constellation-start.shtessera-start.sh(取决于您使用的隐私管理员):

将2个实例更改for i in {1..7}为for i in {1..5}

进行这些更改后,脚本raft-init.sh和raft-start.sh脚本可以正常运行。

本篇到此结束,

推荐阅读更多精彩内容