一种利用Raspberry 搭建区块链私有链全节点的方法研究
2020-11-24牛岩松宗峰
牛岩松,宗峰
(山东英才学院信息工程学院,济南250104)
0 引言
近期,对于区块链利有利政策不断提出,区块链逐渐成为资本市场的焦点。2019 年10 月份区块链被提升到战略高度的层面去发展;紧接着密码法出台,越来越多的地区开始布局区块链,但是有一些人可能并不太清楚区块链概念以及原理,而且在国内似乎很少有人利用树莓派和PC 组建私人区块链,尤其是在国内某些行业因为缺乏数据储存,以及追溯能力的不足,造成相关行业不规范,在本文中介绍的就是一个利用Rasp⁃berry 搭建区块链私有链全节点的方法,希望可以为今后探索区块链应用提供部分思路。
1 树莓派简介以及重装系统
1.1 树莓派简介
Raspberry Pi 只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT 的发布,我们也将可以用上运行Windows 的树莓派。RaspberryPi 配备了一颗ARM11 系列,主频为700M 的CPU,以SD 卡为内存硬盘,卡片主板周围有两个USB 接口和一个网口,可连接键盘、鼠标和网线[1]。同时拥有视频模拟信号的电视输出接口和HDMI 高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上,具备所有PC 的基本功能只需接通电视机和键盘,就能执行如电子表格、文字处理、玩游戏、播放高清视频等著多功能。RaspberryPiB 款只提供电脑板,无内存、电源、键盘、机箱或连线,考虑到便于普及和成本的问题,又细分为Model-A 和Model-B 两个版本。而且树莓派在改装成比特币挖矿机,其在能耗方面的优势将更加凸显。
1.2 树莓派重装系统
(1)准备工作下载树莓派系统,下载Win32 Disk Image,在这里需要注意如果树莓派已经安装系统,则使用DiskGenius 格式化再重新分区,SSH 连接软件putty、XShell 等。
使用Win32 Disk Image 安装系统,下载好最新的树莓派系统后解压,安装Win32 Disk Image 工具,并格式化好TF 卡,打开Win32 Disk Image,写入即可,写入完成后,将TF 卡插到树莓派,开机[2]。
(2)SSH 连接,将SD 卡连接到电脑打开,在根目录直接新建“SSH”文件(无后缀)。有线连接,电脑连接Wi-Fi,树莓派和电脑之间通过网线连接,打开Win⁃dows 的网络和共享中心,勾选允许其他网络用户通过此计算机的Internet 连接,打开CMD,输入arp-a 获得树莓派IP,获得IP 地址后使用SSH 连接软件进行连接[3]。
(3)各个节点通过编辑/etc/hostname 来修改机器名称,通过编辑/etc/dhcpdc.conf 设置静态IP 地址。
1.3 配置Wi-Fi
使用命令:sudo raspi-config 进行树莓派配置,进入配置页面后,选择2.Network Options,选择国家China,在输入SSID 和密码即可,SSID 即为Wi-Fi 名称。登录路由器管理界面,查询树莓派IP,就可以直接使用Wi-Fi连接树莓派[1]。
2 区块链共识机制
2.1 区块链介绍
区块链是一种以密码学方式保证的不可篡改和不可伪造的分布式账本。区块链最早产生于2008 年1月中本聪提出区块链的概念,再后来出现创世区块链以及序号为1 的区块链。区块链主要特征为去中心化、开放性、独立性、信息不可篡改、匿名性,区块链的核心技术包括分布式账本,对称加密和授权技术,共识机制,智能合约[4]。在从长远的角度来看,数字货币交易完成了向全球交易平台的转移,在未来的数字货币将成为不可阻挡的历史潮流,而在现实中,区块链的大规模应用存在许多瓶颈,因此也是受到很多人的质疑。
2.2 共识机制比较选择
(1)PoW(Proof-of-Work)
PoW 最著名的应用就是比特币以及以太坊和一些其他基于PoW 协议的货币。其最大的缺点是会面临51%以上的攻击,但由于区块链是不可变的,但是可以通过拒绝服务,来使得无法正常运行,并且需要消耗大量的算力大量的电力,并不适合树莓派来搭建,PoW 协议更多的适用于公链[4]。
(2)PoS(Proof-of-Stake)
PoS 要求证明人提供一定数量加密货币的所有权,此机制会根据每个节点拥有代币的比例和时间,依据算法等比例降低节点的挖矿难度,从而加快了寻找随机数的速度[4]。这种机制相较于PoW 来说或许是一种好的选择,但是它本质上仍然需要网络中的系统但进行挖矿运算,不能为我们提供我们足够所需的控制和安全级别。
(3)PoA(Proof-of-Authority)
PoA 是相对PoW 和PoS 来说算是一个新概念,在这个概念中,您拥有许多预先批准的授权节点(即矿工)。您要添加任何新节点,必须由当前已有的矿工投票,这使您可以完全控制哪一些节点可以做为矿工。以太坊的PoA 协议称为Clique,它适用于私链,但不适用于公链。
2.3 安装最新版本go语言
在go 语言官方网站下载最新版本适合自己操作系统和框架的版本:在https://studygolang.com/dl 下载解压缩完成后需要设置添加环境变量,这里使用Linux。
vi/etc/profile 在最后面添加以下设置:
export GOPATH=/opt/gopath
export GOROOT=/usr/lib/go
export GOARCH=386
export GOOS=linux
export GOTOOLS=$GOROOT/pkg/tool
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
执行source/etc/profile。
2.4 Go-ethereum客户端安装
Go-ethereum 客户端通常称为Geth,它是个命令行界面,执行在Go 上实现的完整以太坊节点。Geth 得益于Go 语言的多平台特性,支持在多个平台上使用(例如 Windows、Linux、Mac)。Geth 是以太坊协议的具体落地实现,通过Geth,可以实现POA 协议的部署和执行[5]。
在 Geth 官网(https://geth.ethereum.org/downloads/)下载自己操作系统和框架匹配的版本:
在此需要注意的是,有官方提供的二进制安装包,直接下载解压就可以使用。而在Linux 下可以将Geth所在的目录添加到环境变量,或者直接sudo mv geth/usr/bin。
Go-ethereum 客户端安装环境:
Apt install golang-y
Apt-get install-y build-essential
在Raspberry 下载Go 相应版本的源码,编译过程在其中一台设备上进行即可,其余设备可通过WinScp上传再执行完成。
2.5 创建签名账户
因为树莓派的内存比较小,新建账户的时候可能会出现out of memory 的情况,所以在启动节点前新建账户,减少新建账户的内存使用量。在这里进入到需要新建节点的目录,cd 指令切换到相应目录,出现geth--datadir.pichain account new 按照指示输入密码。
在每个节点上运行geth--datadir node account new创建账户,需要注意的是要保存密码,同时记住个节点账户(后续启动账户需要)[6]。
3 搭建私有链
3.1 创建创世文件
利用编译生成的客户端交互工具puppeth 可以生成创世块文件。在这里需要用到上面的账户代码,同时需要记住网络ID。直接运行./puppeth 按照提示选择即可,最后生成poa_test.json 文件。
3.2 私有链节点初始化
准备好JSON 配置文件后,进行初始化区块链,将创世区块信息写入到区块链中。第一步是进行新建一个目录data()用来存放区块链数据,在这里目录data()相当于一个根节点[6]。
将上面生成的poa_test.json 文件通过WinScp 上传到各节点/home/deling.json,执行 geth--datadir node init deling.json 来进行初始化。
3.3 启动私有链节点
需要注意的是这时要使用全同步模式,就是--syn⁃cmode full,不然的话后续和服务器连接同步时可能会出错。首次启动节点是获得节点enodeid,节点这里初始化完成后还未建立连接,因此会显示Signed recently,must wait for others。
3.4 首次启动节点完成后的调整
需要注意的是直接启动节点时会报错,在这里需要将生成的key 复制到datadir 中的keystore,然后分别在每台机器上运行,在这里分别记录下各节点的地址,编辑为.json 文件,保存起来。
4 结语
本文详细介绍了基于树莓派来搭建区块链私有链的方法,在文中介绍对比了区块链几种共识机制,最终采用PoA 协议来搭建私有链,通过Go 语言以及Geth的运用,来实现以太坊协议的具体实现来完成PoA 协议的部署和执行,最终实现了私有链的搭建,该区块链的搭建解决了国内某些行业因为缺乏数据储存和追溯能力的不足的问题,希望可以为今后探索区块链应用提供部分思路。