区块链学习笔记1

区块链不等于XX币!

区块链不等于XX币!

区块链不等于XX币!

区块链本质是一种 去中心化的不可修改的分布式数据库核心要解决的是信任问题。 根据场景可以分为3类:

  1. 公开链
  2. 私有链
  3. 联盟链

著名的BTC以及各种XX币大多都是基于公开链的第一代应用,而以太坊(Ethereum)则更进一步,可以说是第二代的区块链应用。基于以太坊,更是诞生了智能合约(Smart contracts)应用,大大简化了编写区块链应用的难度。

而联盟链,现在最火的就是Linux基金会旗下的超级账本(hyperledger)了,相对而言,我个人更看好这个。另外还有个叫做闪电网络的(个人觉得这货有点类似于资金池,略有违背去中心化的初衷),也值得关注。

一条消息,或者说一条记录,最重要的有2个性质:

  1. 完整性
  2. 真实性

学过网络课程的小伙伴都知道,信息在网络底层都是以字节流传递的,而网络并不是百分百可靠的。比如10010011在传递过程中就可能丢失一位变成了1001001,那么我们怎么验证消息在传递过程中没有由于某种原因被改变呢?

这里就用到一个叫做数字摘要(数字指纹)的技术了。通过某些Hash函数计算后,不论原文是什么样子都会得到一个统一长度的摘要值(指纹)。常见的算法有MD5、SHA256等。

比如roy使用SHA256计算后就变成了a59b1da0739609cfd823420304bebb268693eade4ff3e1269fce24548c301240,而只要有一点变化,比如rox的摘要就变成了69aa9465c104e9193951b14c4abd541990c3a0b17a2711d60a8f974be2a013f7。所以,在传递消息时候,只要把原文和指纹同时传递,接收方就可以根据公开的算法进行完整性验证了,只要有一点变化,指纹就会不同。

那么,这样就行了吗?答案是否定的。

对网络安全有了解的都知道一种攻击方式叫做中间人攻击。如果有坏人截获了原文和指纹,并且替换成伪造的,那么接收方不就被骗了吗?换言之,消息的真实性如何保证呢?

这里就引出了另一个技术:非对称加密

这里具体的数学细节不说了,简单来说,使用私钥加密后的密文可以使用公钥解密得到原文,但永远反推不回来私钥是什么。我们使用私钥将指纹加密,并公布公钥。这样,即便中间有人截获了消息,但是由于没有私钥,没法伪造加密后的指纹,接收者使用公钥解密后即可发现指纹不同。这样就解决了真实性问题。

数字摘要和非对称加密都不是什么新鲜的玩意,那么和区块链到底有什么联系呢?

上面说到区块链是分布式的,说道分布式那么一个避免不了的问题就是共识。

而共识问题有可以分2类:

  1. 拜占庭将军问题,主要指包含恶意响应的情况。
  2. 非拜占庭将军问题:主要指响应可信但有可能不响应的情况。

对于第二种情况,可以使用paxos或者raft算法,而第一种情况,目前则有POW,POS(比特币、以太坊用这两个),DPOS,PBFT(超级账本采用这个)。

比特币中是使用了POW(Proof of Work,工作证明)来解决共识问题,这里简单记录下。简单说,一个区块中包含下面4个内容:

  1. 前一个区块的指纹
  2. 一些固定信息
  3. 交易记录
  4. 一个随机数

BTC规定,一个新的区块指纹前72位必须为0。而前3个内容都是固定的,想要  出正确的Hash值,只能通过不停的变换随机数来重新计算。这也就是所谓的"挖矿"。找到这个数的矿工则有了记账权,同时获得一定数量的比特币作为奖励。所以谁的算力强,就能更快的蒙出这个Hash值。虽然只是很小很小的概率,会出现2个矿工同时计算出Hash值的情况,这就是所谓的"分叉"。如果真的出现了分叉,那么正常情况下就会同时存在2个链,看哪个更快的计算出下一个区块的Hash形成更长的链,之后所有的矿工都会以这个最长的链为基础进行下一步操作。

至于原因,可以参考比特币白皮书

那么为什么又会有POS(Proof of Stack,权益证明)呢?根据POW,算力越强的人越有挖矿的动力,而如果全网51%的算力都掌握在一个人手中时,基本他就可以伪造任何交易了。而POS有点类似银行,引入了一个概念叫做“币龄”,币龄根据持币数量和时间来进行计算,币龄高的获得记账权。简单说,一个有100币的人和一个只有1个币的人,同样的持币时间下前一个人获得记账权的概率是后一个人的100倍。

POS解决了POW浪费大量资源的缺点,以及提高了51%攻击的代价。(想要进行51%攻击的话,就得拥有51%的货币。也就是说,这东西越值钱,攻击的成本就越高)

但是,POS也有一个缺点——富者越富,币龄低的很难获得记账权,于是便引出了另一个算法——DPOS。

DPOS(Delegated Proof of Stake,委托权益证明)在POS的基础上,让每一个节点参与投票,选出一个代表自己利益的人参与到获取记账权的争夺战中(议会制?),每一个参与者都能够选举任意数量的节点生成下一个区块,得票最多的前 M 个节点会被选择成为区块的候选创建者,下一个区块的创建者就会从这样一组当选者中随机选取,除此之外,M的数量也是由整个网络投票决定的,所以可以尽可能地保证网络的去中心化,而且最重要的还是随机选出的,也就是说数量M不确定,M中选取哪一个也不确定,再加上足够多的总量,可以确定几乎是不可操控的。

关于DPOS更详细的可以参考这里

至于paxos、raft、PBFT,不是一句话能描述清楚的,单独记录。