区块链基础知识(二)

4.挖矿

区块在被增加到区块链之前,并不是所有的区块都可以生成区块数据,也不是所有区块数据都能被增加到区块链成为最新的数据,这个过程有一定的门槛,需要筛选出一个值得信任的节点来生成数据,然后由其他节点来验证生成属数据的有效性,因此很多节点会加入生产区块的竞争。如果某个节点生产的区块数据得到了其他节点的验证,则其他节点会将最新的区块存储在本地,然后加入下一个数据块的生产竞争,这个过程被称作挖矿,而生成数据的节点被称作矿工。

如上图所示,所有的交易会被保存在一个交易池中,不同的矿工会选择不同的交易进行打包,然后制作属于自己的区块,假设当前将要生成的区块编号是121,因为区块链网络是一个点对点的网络,没有中心节点进行协调,所以这些矿工节点无法感知到彼此的存在。

在矿工将交易打包为区块之后,还需要查找一个数字n,这个数字n需要满足图中的不等式,得到该数字之后将其放入打包的区块数据中,然后将该区块数据广播到区块链网络中,如果该区块被认可,则这个矿工就成了区块高度121的出块人,而网络中的节点将新生产的区块存储在本地,并将其链接到其他区块数据之后,基于此生产下的一个区块。计算有效数字n的过程是需要付出算力的,而这个算力付出的过程是值得信赖的,这就是区块链为何可以在没有中心管理者的情况下正常运作,且任何人都可以在无需信任的情况下参与区块链业务,正所谓“In math we trust”。

成为出块人就可以成功拿到奖励,奖励分为系统的奖励和交易中的交易手续费,在每一笔交易数据中,转账人都可以手动设置手续费,这些手续费用于奖励矿工打包的工作。在转账时设置的手续费越高,转账时间越短,转账速度就越快,这是因为矿工们会优先选择手续费高的交易进行打包,而如果交易的手续费过低,很可能会因为没有矿工愿意为其打包而导致转账失败。

5.共识算法

在挖矿的过程中,矿工需要付出算力来查找一个满足条件的数字,这种算力的付出是无法伪造的,必须付出相应的算力和电力之后才能得到正确的数字。当某一个节点发现该数字之后,其他节点可以很快验证该数字的有效性,验证并不用花费太多的算力和能源。也就是说查找满足不等式条件的数字的过程是困难的,但是验证不等式的过程是简单的,。这种为了持续生产区块而被所有网络节点认可的方案就叫做共识算法,而付出算力来证明自己工作的共识算法被称作PoW(Proof of Work)。

除了PoW这种共识算法,还有一些其他的共识算法,它们的特征都是一样的,全网节点都共同认可并遵守该算法,并且该算法产生的结果无法被伪造,但可以被轻易验证。目前比较流行的共识算法有DPos、BFT和PosT等。

  • DPos算法类似于民主选举的运行模式,该算法根据数字货币持有的数量对区块事务进行投票管理,并且轮流来选举出块人进行出块,笔者认为这种弱中心化的方案与区块链的根本价值观背道而驰,但是此方案曾经流行一时。
  • BFT是著名的拜占庭容错机制,该机制的产生有着有趣的背景故事,读者可以自行查找相关细节。简单来讲,该方案通过多次通信交互来区分恶意节点和诚实节点,接收诚实节点的区块数据,丢弃恶意节点发生的数据和信息。、
  • DoST是存储公链的共识算法之一,即统计节点有效存储的数据的大小和时长,将其作为节点的算力,来竞争成为出块节点,,算力越大成为出块节点的概率越高,算力越大生成恶意数据的动力就越小,这是通过一种经济手段约束恶意行为的共识算法。

以上共识算法只是众多公链共识算法中的一小部分,是目前比较流行得出几种方案。算法的技术细节,本文仅做简单论述,不再详细讲解。

6.分叉

因为整个区块链系统是点对点的对等网络,没有统一的中心机构协调各个节点的行为,所以在生产区块时,各个节点的行为都是互相独立的,很有可能同时由多个矿工在同一区块高度生产出2个以上的区块来。这些区块打包的交易很可能是不一样的,同时满足条件的数字n是不唯一的,多个矿工之间生产的数字n是不一样的,但是同样是满足不等式的。在这种情况下,网络中的其他节点很可能很可能同步到不同的区块数据,并且这些数据在数学上都是合法的、有效的。当不同的节点中的不同区块作为当前最新区块时,就会存在分叉的情况,即不同的矿机对同一高度的区块生产了内容不一样的新区块,并且这些矿工都找到了满足不等式的数字n。

如上图所示,矿工A和B同时对编号121的区块进行打包并签名,它们同时广播了自己的区块到系统中,不同的节点有些会收到矿工A的区块数据,然后验证通过,并加入本地的账本,有些会收到矿工B的区块,这样整个系统的账本就会出现不一致的情况。为了解决这个问题,区块链采用了一种长链抛弃短链的决策方式:即当矿工 C 挖出了第122块数据,并将数据指向了矿工 B 的121区块时,因为矿工B所在的区块链更长,凝聚了更多的算力,既是最安全的,也是付出算力和资源最多的,此时矿工A所在的区块链在区块120位置发生的分叉将会被抛弃。区块121_A内所包含的交易也将失败,如果有一笔交易既被区块121_A 打包,又被区块121_B 打包,那么即使区块121_A被抛弃,该交易仍然成功;如果交易只在121_A区块中,则交易会在短链被抛弃前显示成功,在短链被抛弃后显示失败,失败后交易双方的账户余额会恢复到转账之前的状态。

这个分叉非常像我们在微信群里参加某项活动时的报名接龙,由于报名者在看到报名接龙消息后,并不知道其他报名者的报名意愿和状态,很可能出现多个人报同一个序号的情况,在这种情况下,接下来的人会选择其中一个信息次序往下接龙,而未被选中的那一个次序将被抛弃,被抛弃的报名者只能基于最新的接龙信息来重新报名。

7.攻击

区块链对于交易的组织方式及账户的管理方式决定了只有私钥持有者才有权修改本账户下的数字货币信息。任何区块链网络中的参与者都无法控制或者篡改其他人的账户信息,也可以说从经济的角度看,篡改这些数据的成本极高,这与中心化的银行有着完全不同的特点,在前文曾讲到的A转100元给B的过程中,如果银行有内部员工,在给A扣除金额或者给B增加金额的环节修改数据,则A和B都无法控制这样的事情发生。

但是这并不意味着区块链是绝对安全的,不同于攻击银行是违反法律法规的情况,由于区块链网络是无主的,每个持有数字货币的账户和区块打包的矿工都无须审批、无须信任,随时随地可以参与,因此,只要拥有足够的算力就可以对整个网络发起攻击,比如著名的51%算力攻击,BCH区块链网络的算力大战就证明了区块链在安全上也有自己天然的弱点。除了算力攻击,还有很多中心化银行不会存在,仅属于区块链点对点网络特有的攻击,比如女巫攻击、日食攻击等,在本书的最后会对此类安全问题做一个较为概括的论述。本节仅以一种算力攻击为例,简单讲解一下区块链特有的安全问题。

结合上一节讲到的分叉问题,如果矿工D拥有足够的算力,则当矿工A生产区块121时,矿工D已经生产了区块121,但是矿工D可以将最新的区块保留,而不是将其广播到网络中(区块链代码都是开源的,任何人都可以修改属于自己的版本,只要符合区块链的基本协议,就可以加入区块链网络,只要其行为被网络中的其他节点认可即可),并且继续生产最新的区块122,这样在A生产出来121区块之后、其他矿工生产122之前,矿工D可以将区块121和122一次性地全部广播到网络中,那么之前矿工A生产的区块就会被当作短链而抛弃,而矿工A中的所有交易也将被重置为失效。

在这样的一种攻击模型下,假设Alice在矿工A生产的区块中发生了一笔交易,这笔交易是将余额转到数字货币交易所变现,在数字货币交易所收到这笔交易之后,Alice在数字货币交易所的账户余额会增加。然后Alice将矿工D的2个区块同时广播,则Alice转账到交易所的交易就会失效, Alice的区块链账户余额会恢复,但是因为数字货币交易所的数字余额是中心化管理的,在感知到区块链被攻击之前,Alice可以将数字货币兑换成法币。这样Alice就可以在数字货币余额不变的情况下将其成功变现为法币。

订阅我们的新闻
获取最新的文章
更多内容
您想提升区块链认知吗?
让我们保持联系