系列文章目录
区块链以太坊DApp开发实战(一)——基础知识
前言
从基本概念入手,逐步介绍区块链、共识、分叉等概念。
一、基本概念
1. 区块
类似与基本数据结构的**“链表”,区块就是一个对象,对象中可以定义属性、变量、方法**,将许多区块链接起来,就成了区块链。下面是一个区块的简单例子。
type Block struct {
Number string // 区块号
PreHash string // 前一个区块的哈希值
Hash string // 自身的哈希值
Value string // 携带的数据,可以将类型定义为string、自定义类型等满足不同需求
Create int64 // 创建的时间戳
}
在区块链中,相同区块号的区块不能以同一个身份(以太坊中允许有区块号一样的不同含义块)在同一条链中出现两次
一般来说,区块链公链包含但不限于以下技术模块:
- 加密签名模块
- 共识机制模块
- 分布式数据存储模块
- 点对点传输模块
- 智能合约模块
- App接口模块
当我们将这些模块技术实现的代码整合到一个程序中时,便是一个区块链应用。
2. 链
链通常分为3类:
- 公有链:维护节点比较多,对所有人开放,任何人都可以进行特定的数据访问。
- 私有链:面向个人或某个组织。
- 联盟链:多个组织团体的节点联合在一起维护的,仅对组织开放。
二、共识
区块链的节点都拥有自己存储数据的地方,节点之间相互通信,但又不彼此依赖,因为互不信任。
共识机制:为了维护数据的一致性,使链上相同的区块号的区块只有一个。
共识是一种规则。
矿工是区块链节点中的一个角色,是程序中的一个功能模块。矿工和区块链就是包含与被包含的关系。
每个节点都有一个账本,账本的内容是所有节点所维护的那条公链中的区块以及该区块的相关信息。
在区块产生的过程中,不同节点可能产生相同区块号的区块,这就需要共识算法做出选择放在公链上的是哪一个区块。
1. PoW算法
PoW(Proof of Work,工作量证明),区块链1.0。就像字面意思一样,谁干的活多,谁的话语权就大。代表是比特币BTC。
比特币挖矿就是通过计算符合某一个比特币区块头的哈希散列值争夺记账权。
在PoW共识算法下,当很多个节点都在挖矿时,每个节点都有可能挖出一个区块。
比特币区块链定义了区块被挖出后,随之要被广播到其他节点中去,然后每个节点根据对应的验证方式对区块进行是否合法的验证操作,被确认合法的区块便会被并入主链中。
在比特币挖矿中,一旦计算出来正确的哈希散列值,就生成新区块,并将生成的区块信息以广播形式告诉其他节点。其他节点收到广播信息后,停止手上的计算工作,开始验证该区块的信息。若信息有效,则最新区块被节点承认,各个节点开始挖下一个区块;若信息无效,则各个节点继续自己的计算工作。
难题在于哈希散列值的计算随着比特币中难度系数的增大会越来越困难,导致计算需要耗费大量的电力资源,工作量巨大。
PoW优点:
- 机制设计独特。挖矿难度系数自动调整、区块奖励逐步减半,都是基于经济学原理,能吸引和鼓励更多节点参与挖矿。
- 早参与早获利。在初始阶段,会促使加密货币迅速发展,节点网络迅速扩大。
- 通过“挖矿”方式发行币,把代笔分散给个人,相对公平。
Pow缺点:
- 算力是计算机硬件提供的,要耗费电力,是对能源的直接消耗。
- 算力逐渐向矿池、矿厂集中,与去中心化思想相悖。
- 挖矿难度越来越大,当挖矿成本高于挖矿收益时,挖矿积极性会降低,造成算力减少。
- 基于PoW节点网络的安全性令人堪忧。
- 大于51%算力的攻击,能够修改区块链中的区块信息。
2. PoS算法
PoS(Proof of Stake,股权证明),区块链2.0。像字面意思,谁的股份多,谁话语权就大。代表是以太坊ETC。
在PoS中,股份只是衡量话语权的概念,可以使用更复杂的实现,如多个变量参与到股份值计算。
只要拥有股份,不论多少都是有话语权的,都有概率被选中。
该算法没有挖矿过程,而是在创世区块内写明股权分配比例,之后通过转让、交易的方式**(IPO公开募股方式),逐渐分散到用户钱包地址中去,并通过“利息”**方式新增货币,实现对节点地址的奖励。
PoS优点:
- 缩短了共识达成的时间,链*识块的速度更快。
- 不需要大量消耗能源。
- 作弊得不偿失。如果一名持有多余50%以上股权的节点作弊,相当于“坑了自己”,作弊导致的结果往往是拥有股权越多的人损失越多。
PoS缺点:
- 攻击成本低,只要节点有物品数量,就能发起脏数据的区块攻击。
- 初始代币分配通过IPO方式发行,导致“少数人”获得大量成本极低的加密货币,在利益面前很难保证这些人不会大量出售。
- 拥有代币数量大的节点获得记账权的概率会更大,使网络共识受少数“富人”支配,失去公正性。
3. DPoS算法
DPoS(Delegated Proof of Stake,股份授权证明机制),区块链3.0。为了解决PoW和PoS的不足而出现的。代表是柚子EOS。
DPoS引入见证者节点,可以生成区块。
注意:有权限生成区块的是见证者节点,而不是持股节点。
持有代币的是持股节点,但不一定是见证者节点。见证者节点是由持股节点投票选举产生。
DPoS选举方式:
- 每一个持股节点都可以投票选举见证者节点。
- 得到总同意票数中的前N位候选者可以成为见证者节点。
- N应满足:至少一半的参与投票者相信N已经充分的去中心化。
- 最好为奇数。
第3点表明:至少有一半参与投票的持股节点认为,当达到N位见证者时,这条区块链已经充分地去中心化了。
第4点是为了解决“分叉”(下一节会提到)。
见证者节点的候选名单每个维护周期更新一次,候选者们会随机排序,然后按顺序,有一定的权限时间生成区块。若见证者在给定时间片内不能生成区块,区块生成权限将交给下一个见证人。
DPoS优点:
- 能耗更低。将节点数量进一步减少到N个,网络运行成本最低。
- 更加去中心化。
- 避免了PoS中“富人”权力过大的问题,话语权在被选举出的N个节点中。
- 更快的确认速度。
DPoS缺点:
- 投票的积极性不高,绝大多数持股节点未参与投票。
- 选举固定数量的见证人作为候选人可能不适合完全去中心化场景,在网络节点很少的场景,见证人的代表性也不强。
- 对坏节点的处理存在诸多困难,不能及时组织一些破坏节点出现,带来安全隐患。
三、分叉
产生原因:
由于区块链网络是分布式的,总有可能出现至少两个节点同生成块的可能,就有可能出现分叉。
假设节点A和B同时算出了合法的哈希值,产生了区块block,广播了出去。节点C和D都陆续接收到了来自A和B的区块。但由于C离A近,D离B近,C就会接收A的区块而拒绝B的区块;同样D会接收B的区块而拒绝A的区块。于是产生分叉。
分叉的两种情况:
- 软分叉。旧节点能够认可新节点产生的区块,最后的结果是能纠正的。
- 硬分叉。旧节点无法认可新节点产生的区块,最后的结果是链一分为二。
1. 软分叉
软分叉又分为两种情况:
(1)各节点使用了同样的共识算法
对于这种情况,矿工是比较容易自我纠正的。由于节点网络的整体解题能力和矿工的数量成正比,因此练的增长速度是不一样的,在一段时间后,总有一条链的长度会超过另一条。当矿工发现全网有一条更长的链时,就会抛弃当前的链,把长链复制过来,在长链的基础上继续挖矿。但不是所有的分叉都能自动纠正。
最优链选择机制:
- 最长链机制。以最长链为主,比特币就是这种机制。
- 其他链选择机制。以太坊“Ghost协议”机制。
(2)共识规则发生改变
共识规则改变后,旧节点使用旧共识规则,新节点使用新共识规则;旧节点能识别新节点的区块,但新节点不能接受旧节点的区块。
这种软分叉不一定能由节点自我纠正,解决办法必须依赖人力升级节点到同一版本。
- 当新节点的全网算力**大于51%**时,无论旧节点升不升级,最长的链最终都是由全部新节点生成的区块所组成的链,能够被新旧节点双方认可。
- 旧的能接收新的,分叉点之后的区块包含旧节点区块和新节点区块两种。
- 新的不能接收旧的,但最终新的总比旧的长。
- 当新节点全网算力**小于50%**时,不能通过短的复制长的达到统一,结果是硬分叉。
- 旧节点比新节点的链要长。
- 新的总是不能接受旧的,不会去复制含有自己不能接受的区块的链。
2. 硬分叉
硬分叉过程:
- 开发者发布新代码,新的节点代码改变了区块链规则且不被旧的兼容,节点程序出现了分叉(Software Fork)。
- 区块链网络部分节点开始运行新的节点代码,新规则产生的交易与区块被旧节点拒绝,旧节点开始短暂地断开与这些发送被自己拒绝的交易与区块的新节点的连接,于是整个区块党的网络出现分叉(Network Fork)。
- 新节点矿工开始基于新规则挖矿,旧节点矿工依然用旧的规则,不同的矿工算力导致分叉(Mining Fork)
最终,整个区块链出现了分叉(Chain Fork)。
总结
本章介绍了区块链的基础知识,包含区块链的定义、链的分类、共识算法等。