《以太坊技术详解与实战》第3章 - 不同类型的以太坊区块链及其部署

前面章节已经深入说明了关于以太坊的概念和原理,本章将针对不同类型的以太坊网络来介绍以太坊的安装和部署工作,让读者接触到真正的以太坊,并对其有更加直观的认识。

3.1 区块链类型

根据区块链网络类型分类,现有的区块链主要分为三类,即私有链、联盟链和公有链 。相比于公有链,私有链节点所有者是一家机构,它的规则可以根据需求更改,交易成本更便宜。 联盟链可以根据参与成员的需求制定规则,同时成员之间又可以相互监督约束 。 而公有链是真正意义上的完全去中心化的区块链,所有数据公开透明 。

表 3-1 展示了以太坊公有链、联盟链和私有链的一些特点对比 。 由于联盟链结合了公有链区块链架构、一定的共识机制以及私有链的授权网络机制等优点,拥有私密、安全、高效等优势,近年来得到金融、物联网等领域企业的重点关注 。

在这里插入图片描述
这三种区块链各有其优势和适用场景,下面将分别介绍这三种区块链 。

3.1.1 公有链

公有链( Public Blockchain ) 是世界上任何人都可以访问读取的、任何人都可以发送交易并且如果交易有效的话可以将之包括到区块中的,以及任何人都能够参与其共识过程的区块链 。 共识过程决定了哪一个区块被添加到当前的区块链中和明确当前的网络状态 。 作为中心化或者准中心化信任的替代品,公有链的安全由“加密数字经济”保障,加密数字经济采取工作量证明机制或股权证明机制等方式,将经济奖励和密码学结合起来,并遵循如下基本原则:每个人从中获得的经济奖励与对共识过程做出的贡献成正比 。 公有链是真正意义上的完全去中心化的区块链 。 公有链主要适用于虚拟货币、面向大众的电子商务等现实场景 。

3.1.2 联盟链

联盟链( Consortium Blockchain )即其共识过程受到一些预选节点控制的区块链 。 多个由不同实体(如企业、银行等)分别控制的节点组成一个联盟,区块链上面的读写、记账权限都由联盟规则制定,这些节点共同组成一个授权网络 。 网络中的区块链和节点状态的改写更新由联盟中的各节点达成共识所决定 。 而对于网络中其他非联盟节点,最多只能够读取到联盟区块链中的全部或部分数据,但是无权参与共识达成过程 。

与以太坊公有链在公网环境下运行不同,联盟链运行在由特定成员组成的联盟(如企业之间所组成的商业联盟)所控制的授权网络上 。 联盟中的每个成员控制着授权网络中的一个或多个节点,每个节点可根据其身份进行交易发送、区块生成、区块验证、状态更新等操作 。 授权网络要求对每个节点的身份进行验证,并且有一定的准入机制,以确保控制每个节点的实体均为联盟中的成员之一,这也意味着网络中的节点之间可以相互信任 。
在授权网络上运行的联盟链解决了许多以太坊公有链所遇到的一些分布式计算问题,如构建拜占庭容错系统等 。 由于授权网络保证了节点之间可以相互信任,因此在联盟链中可对以太坊公有链上原有的一些机制进行简化 。 例如:

  • 可以改用 Raft 共识机制,由各节点选举出一个“领导节点”来打包生成区块 。
  • 在区块验证过程中,由于无需担心区块是否为恶意节点生成,因此只需验证区块的正确性,无需再进行工作量证明的验证。
  • 简化原有共识机制中的工作量证明可以大大降低区块生成的时间,从而提高区块链的执行效率。

由于联盟链相对于以太坊公有链有一定的性能优势,适合企业内部或企业之间的商业应用,因此包括信息 、 金融、能源等多个领域的跨国企业 、 初创公司和研究机构都投入到企业级联盟链的研发中 。

联盟链是一种需要参与许可的区块链, 是在一群值得信任的参与者中共享的区块链 。

如:Linux 基金会发起的超级账本( Hyperledger开源项目)、 R3 区块链联盟、基于以太坊协议开发的联盟区块链一Quorum

3.1.3 私有链

私有链( Privat巳 Blockchain )是指写人权限仅在某一个组织控制下的区块链,而读权限可能公开或者任意程度地加以限制 。 完全私有的区块链则是更接近于中心化的数据库 。 该授权网络中节点的接人权限完全受控于一个实体(或由该实体控制的节点) 。 此外,网络中的区块链和节点状态完全由一个权威节点所决定 。 该权威节点对区块链数据有写入权限,并且能够决定网络中其他节点对数据的读取权限 。 私有链的应用场景主要包括单个公司内部的数据库管理、账目审计等 。 尽管在有些情况下需要它有公共的可审计性,然而在很多情况下公共的可读性并非是必需的 。 私有链的主要价值是提供区块链安全高效、公开透明、可追溯、不可篡改的特性,同时具有较好的防范外部攻击的性能 。

3.2 安装和部署以太坊

3.2.1 安装以太坊客户端

3.2.2 部署以太坊联盟链
安装好以太坊客户端之后 ,创建或导人以太坊账户就可 以直接连接上以太坊公有链网络了。 不过,除了公有链 ,用户 还可以 自己 搭建一条私有链或联盟链,下面将介绍使用Geth 客户端以及使用 Azure 联盟链模板搭建属于自己 的以太坊联盟链的方法 。

1 . 使用 Geth 部署以太坊联盟链
以太坊 Geth 客户端提供了以太坊协议相关的许多功能, 用户只需对创世区块、 Geth参数等进行配置,就可以在自己制定的几台机器上搭建一个私有的以太坊联盟链网络。下面以三 台 Windows 系统虚拟机为例 ,使用 Geth 1.7.3 版本搭建一个 以太坊联盟链网络 。

(1) 创世区块文件 genesis.json
创世区块文件 genesis.json 是区块链最重要 的识别标志之一,每一条区块链都有唯一识别的创世区块文件,如果两台机器启动 Geth 时所选用的创世区块文件不同,就无法被识别为同一条区块链的成员 。 因此,同一条联盟链中的所有节点必须使用同一份创世区块文件进行初始化配置。
下面是一个创世区块文件 genesis.json 的示例。
在这里插入图片描述
其中, config 中的内容是区块链相关的基本配置参数,最重要的是链编号 chainld ,这是用于标识该区块链的编号,这里设为 72 。 alloc 中为以太坊账户信息,可以留空,等待部署完成后再启动以太坊创建账户;也可以预先配置好以太坊账户及其余额,这里的账户余额是以 wei 为单位,也就是数值 10^18 表示 1 ether。 其下的 coinbase 是联盟链挖矿的收益账户,可以设置为零地址,留待运行以太坊挖矿之前再设置 。 difficulty 是初始的挖矿难度,可以设置为较低数值,如 0x400 。 gasLimit 为每个区块所消耗的 Gas 限制 。 其余的如extraData 、 nonce 、 mixhash 、 parentHash 以及 timestamp 等均可以设置为零或留空。
( 2 )初始化配置
创建完创世区块文件之后,接下来需要创建以太坊联盟链账户 。 以太坊账户由一对公私钥组成,用户首先设置账户密码,然后使用 Geth 由账户密码生成一对公私钥,再由公钥生成账户地址,最后将账户地址添加到创世区块文件 genesis.json 中 。
在本地目录中新建一个文件夹 data,用于存储联盟链数据,然后使用以下命令创建联盟链账户 。

$ geth -datadir .\data\ account new

输入两次密码后返回新账户的地址:

Address:{ <address of new account> }

将该地址复制到 genesis.json 的 alloc 参数中 。 重复上述过程, 创建三个联盟链账户 。此时,在 data 目录下会自动创建 keystore 文件夹,其中存储了所建账户的公私钥文件 。
然后将 genesis.json 文件和 data 文件夹复制传输到另外两台机器中 。 接下来在每台机器上使用以下命令创建联盟链节点 。

$ geth -datadir .\data\ init .\genesis.json

( 3 )搭建联盟链网络
在每台机器上完成联盟链节点初始化配置之后,接下来需要将各个节点连接起来。 首先要确认网络连通并且各机器的防火墙已正确配置, Geth 所使用的端口正常开放( Geth 常用端口有 8545 、 30303 等),然后在每个节点上使用以下命令启动 Geth 并获取节点的地址 。

$ geth -datadir .\data\ --networkid 72 console
> admin.nodeinfo.enode

enode 返回的节点信息格式如下, 包含节点的公钥地址和 Geth 端口号(默认为 30303 ) 。

"enode://< node public key >@[::]:<port>"

将其中的“[::]”部分替换为该机器的公网 IP 地址,即可得到该节点的完整地址 。
在任一节点的.\data\geth\目录下创建静态节点文件 static-nodes.json ,并写入其他节点的完整地址信息,格式如下 :

[
"enode://< node1 public key>@< node1 IP address >:< node1 port >",
"enode://< node2 public key>@< node2 IP address >:< node2 port >",
"enode://< node3 public key>@< node3 IP address >:< node3 port >"
]

在每个节点的机器上使用以下命令启动 Geth 并查看已连接上的其他节点信息 。 其中,datadir 参数为联盟链的数据存储目录,每次启动时必须指定,否则默认使用公有链数据存储目录,即连接到以太坊公有链上; networkid 参数为所连接的网络编号,这一编号需与创世区块文件中的 chainld 参数一致。 如果初始化过程正确且网络状况正常,各节点 Geth 客户端启动后会按照静态节点文件中的节点地址自动搜索连接其他节点 。

$ geth -datadir . \data\ - -networkid 72 console
> admin.peers

如果其他节点仍未连接上,可以使用动态的方法添加节点 。

> admin.addPeer (" enode://< node public key >@< node IP address >:< node port >")

节点相互连接之后就完成了联盟链网络的搭建,下面进行测试。
( 4 )测试联盟链
首先使用以下命令开启 一个节点进行挖矿,其中 etherbase 参数为指定挖矿所得的以太币收益账户,这里的以太币只能在该联盟链的账户中使用,与公有链上的以太币是完全分隔开的; minerthreads 参数为指定的挖矿线程数,由于联盟链挖矿难度低,只需开启一条线程即可 。

geth -datadir .\data\ --networkid 72 -etherbase "0x< ethereum consortium account
>" -mine -minerthreads 1

或者也可以在 Geth 的控制台命令行中使用以下命令指定挖矿收益账户并开始挖矿,这里将第一个预设账户作为收益账户, miner.start()中的参数为挖矿线程数 。

> eth.setEtherbase(eth.accounts[0])
> miner.start(1)

如果要停止挖矿可以使用以下命令:

> miner. stop ( )

由于在 genesis.json 中挖矿难度初始值设置很低,并且以太坊自身有自动调节挖矿难度的机制,因此在联盟链中挖矿的速度很快,消耗的算力也较低,挖矿收益账户很快就会收到很多以太币 。 不过需要注意的是,挖矿也需要初始化过程,在挖出第一个区块之前,节点需要用大约一分钟的时间生成一个 DAG 有向图,之后大约两三秒钟就能生成一个区块 。
挖矿节点开启之后,在另外一个节点上输入密码解锁账户并在该账户上发送交易信息 。
以下示例为第二个预设账户向第三个预设账户转账 1 ether ,返回该交易信息的散列值。

> personal.unlockAccount(eth.accounts[1])
> eth.sendTransaction({from:eth.accounts[1],to:eth.accounts[2],value:1*1e18})

然后该交易会被挖矿节点接收,并打包人下一区块中 。 根据交易散列值查询该交易的相关信息以及所在的区块信息 。

> eth.getTransaction("0x< transaction hash >")
> eth.getBlock(eth.getTransaction (" 0x< transaction hash >").blockNumber)

查看各账户余额(单位转换为 ether),可以看到第一个账户获得了 1385 ether 的挖矿奖励,第二个账户转出了 1 ether 到第三个账户 。 此外,这笔交易还需要 0.000378 ether 的燃料费,其从第二个账户的余额中扣除,并作为挖矿费用转移到“矿工”节点指定的收益账户,也就是第一个账户 。

> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
1386.000378
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
0.999622
> web3.fromWei(eth.getBalance(eth.accounts[2]), "ether")
4

2 . 使用 Azure模板部署以太坊联盟链

3.3 如何在 Azure 上挖矿

3.4 本章小结

我们常说的以太坊一般指的是面向所有人的以太坊公共区块链,除此之外还有面向小范围节点的以太坊联盟链和以太坊私有链,其拥有更好的隐私性,同时保留了以太坊区块链的基本功能 。 以太坊的入口是以太坊客户端,本章首先为读者介绍了以太坊公有链、联盟链和私有链的特征,以及联盟链的实例 Quorum ;然后介绍了不同系统中以太坊公有链客户端的一键安装、源代码编译安装以及以太坊公网节点的部署 ;此外,本章还为读者介绍了使用 Geth 客户端以及 Azure 联盟链模板搭建以太坊联盟链网络的方法 。 最后,本章还提供了在 Azure 虚拟机上使用 GPU 进行以太坊公有链挖矿的方法,并通过具体计算向读者阐明了使用 Azure 虚拟机挖矿的收益情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值