区块链以太坊DApp开发实战(一)——基础知识
从基本概念入手,逐步介绍区块链、共识、分叉等概念。
类似与基本数据结构的**“链表”,区块就是一个对象,对象中可以定义属性、变量、方法**,将许多区块链接起来,就成了区块链。下面是一个区块的简单例子。
type Block struct {
Number string // 区块号
PreHash string // 前一个区块的哈希值
Hash string // 自身的哈希值
Value string // 携带的数据,可以将类型定义为string、自定义类型等满足不同需求
Create int64 // 创建的时间戳
}
在区块链中,相同区块号的区块不能以同一个身份(以太坊中允许有区块号一样的不同含义块)在同一条链中出现两次
一般来说,区块链公链包含但不限于以下技术模块:
当我们将这些模块技术实现的代码整合到一个程序中时,便是一个区块链应用。
链通常分为3类:
区块链的节点都拥有自己存储数据的地方,节点之间相互通信,但又不彼此依赖,因为互不信任。
共识机制:为了维护数据的一致性,使链上相同的区块号的区块只有一个。
共识是一种规则。
矿工是区块链节点中的一个角色,是程序中的一个功能模块。矿工和区块链就是包含与被包含的关系。
每个节点都有一个账本,账本的内容是所有节点所维护的那条公链中的区块以及该区块的相关信息。
在区块产生的过程中,不同节点可能产生相同区块号的区块,这就需要共识算法做出选择放在公链上的是哪一个区块。
PoW(Proof of Work,工作量证明),区块链1.0。就像字面意思一样,谁干的活多,谁的话语权就大。代表是比特币BTC。
比特币挖矿就是通过计算符合某一个比特币区块头的哈希散列值争夺记账权。
在PoW共识算法下,当很多个节点都在挖矿时,每个节点都有可能挖出一个区块。
比特币区块链定义了区块被挖出后,随之要被广播到其他节点中去,然后每个节点根据对应的验证方式对区块进行是否合法的验证操作,被确认合法的区块便会被并入主链中。
在比特币挖矿中,一旦计算出来正确的哈希散列值,就生成新区块,并将生成的区块信息以广播形式告诉其他节点。其他节点收到广播信息后,停止手上的计算工作,开始验证该区块的信息。若信息有效,则最新区块被节点承认,各个节点开始挖下一个区块;若信息无效,则各个节点继续自己的计算工作。
难题在于哈希散列值的计算随着比特币中难度系数的增大会越来越困难,导致计算需要耗费大量的电力资源,工作量巨大。
PoW优点:
Pow缺点:
PoS(Proof of Stake,股权证明),区块链2.0。像字面意思,谁的股份多,谁话语权就大。代表是以太坊ETC。
在PoS中,股份只是衡量话语权的概念,可以使用更复杂的实现,如多个变量参与到股份值计算。
只要拥有股份,不论多少都是有话语权的,都有概率被选中。
该算法没有挖矿过程,而是在创世区块内写明股权分配比例,之后通过转让、交易的方式**(IPO公开募股方式),逐渐分散到用户钱包地址中去,并通过“利息”**方式新增货币,实现对节点地址的奖励。
PoS优点:
PoS缺点:
DPoS(Delegated Proof of Stake,股份授权证明机制),区块链3.0。为了解决PoW和PoS的不足而出现的。代表是柚子EOS。
DPoS引入见证者节点,可以生成区块。
注意:有权限生成区块的是见证者节点,而不是持股节点。
持有代币的是持股节点,但不一定是见证者节点。见证者节点是由持股节点投票选举产生。
DPoS选举方式:
第3点表明:至少有一半参与投票的持股节点认为,当达到N位见证者时,这条区块链已经充分地去中心化了。
第4点是为了解决“分叉”(下一节会提到)。
见证者节点的候选名单每个维护周期更新一次,候选者们会随机排序,然后按顺序,有一定的权限时间生成区块。若见证者在给定时间片内不能生成区块,区块生成权限将交给下一个见证人。
DPoS优点:
DPoS缺点:
产生原因:
由于区块链网络是分布式的,总有可能出现至少两个节点同生成块的可能,就有可能出现分叉。
假设节点A和B同时算出了合法的哈希值,产生了区块block,广播了出去。节点C和D都陆续接收到了来自A和B的区块。但由于C离A近,D离B近,C就会接收A的区块而拒绝B的区块;同样D会接收B的区块而拒绝A的区块。于是产生分叉。
分叉的两种情况:
软分叉又分为两种情况:
(1)各节点使用了同样的共识算法
对于这种情况,矿工是比较容易自我纠正的。由于节点网络的整体解题能力和矿工的数量成正比,因此练的增长速度是不一样的,在一段时间后,总有一条链的长度会超过另一条。当矿工发现全网有一条更长的链时,就会抛弃当前的链,把长链复制过来,在长链的基础上继续挖矿。但不是所有的分叉都能自动纠正。
最优链选择机制:
(2)共识规则发生改变
共识规则改变后,旧节点使用旧共识规则,新节点使用新共识规则;旧节点能识别新节点的区块,但新节点不能接受旧节点的区块。
这种软分叉不一定能由节点自我纠正,解决办法必须依赖人力升级节点到同一版本。
硬分叉过程:
最终,整个区块链出现了分叉(Chain Fork)。
本章介绍了区块链的基础知识,包含区块链的定义、链的分类、共识算法等。