- 区块链中的哈希与加密技术
- 哈希与区块链
- 知乎首份区块链面试指南--之共识算法
- 凭什么你来记账?一文读懂区块链的共识机制
- 区块链技术学习资源整理
- 区块链的工作原理和区块的数据结构
- 分布式系列文章——Paxos算法原理与推导
-
POW:Proof of Work,工作证明
比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。
-
POS:Proof of Stake,股权证明。
POS:也称股权证明,类似于财产储存在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。 简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,在股权证明POS模式下,有一个名词叫币龄,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个POS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41个币,这下就很有意思了,持币有利息。
-
DPOS:Delegated Proof of Stake,委任权益证明
比特股的DPoS机制,中文名叫做股份授权证明机制(又称受托人机制),它的原理是让每一个持有比特股的人进行投票,由此产生101位代表 , 我们可以将其理解为101个超级节点或者矿池,而这101个超级节点彼此的权利是完全相等的。从某种角度来看,DPOS有点像是议会制度或人民代表大会制度。如果代表不能履行他们的职责(当轮到他们时,没能生成区块),他们会被除名,网络会选出新的超级节点来取代他们。DPOS的出现最主要还是因为矿机的产生,大量的算力在不了解也不关心比特币的人身上,类似演唱会的黄牛,大量囤票而丝毫不关心演唱会的内容。
-
PBFT:Practical Byzantine Fault Tolerance,实用拜占庭容错算法
PBFT是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。将所有的副本组成的集合使用大写字母R表示,使用0到|R|-1的整数表示每一个副本。为了描述方便,假设|R|=3f+1,这里f是有可能失效的副本的最大个数。尽管可以存在多于3f+1个副本,但是额外的副本除了降低性能之外不能提高可靠性。
以上主要是目前主流的共识算法。 从时间上来看,这个顺序也是按该共识算法从诞生到热门的顺序来定。 对于POW,直接让比特币成为了现实,并投入使用。而POS的存在主要是从经济学上的考虑和创新。而最终由于专业矿工和矿机的存在,让社区对这个标榜去中心化的算法有了实质性的中心化担忧,即传闻60%~70%的算力集中在中国。因此后来又出现DPOS,这种不需要消耗太多额外的算力来进行矿池产出物的分配权益方式。但要说能起到替代作用,DPOS来单独替代POW,POS或者POW+POS也不太可能,毕竟存在即合理。每种算法都在特定的时间段中有各自的考虑和意义,无论是技术上,还是业务上。
至于说算法的选择,这里引用季总的这一段话作为结束:
一言以蔽之,共识最好的设计是模块化,例如Notary,共识算法的选择与应用场景高度相关,可信环境使用paxos 或者raft,带许可的联盟可使用pbft ,非许可链可以是pow,pos,ripple共识等,根据对手方信任度分级,自由选择共识机制,这样才是真的最优。
决定谁能够写入新区块的一种机制
- 什么是共识机制?
我们都知道,区块链可以看作一本记录所有交易的分布式公开帐簿,区块链网络中的每个参与者都把它看作一本所有权的权威记录。
公开账本历史数据不可篡改,只允许往后添加,每个节点都具有相同的权限,那么就带来一个问题:
公开账本每个新区块由谁来负责写入?
因为所有节点都一样,如果所有节点同时一起写入账本数据,那么肯定数据会不一致。
因此需要一种机制来保证区块链中的每一区块只能由一个节点来负责写入,如何选出写入账本数据的节点,这就是共识机制。让平等的参与者按照某种秩序达成一致意见。
打个比方,
现在有一个中心数据库,所有客户端都能来查询,每个客户端权限都是一样,但如果要对数据库进行增删改,不好意思,每次只允许一个客户端来操作,通俗讲,就是让数据库串行修改数据库。通过一个算法机制来抉择出操作的客户端。这个机制就是共识机制,所谓的共识就是在人人平等的社会里需要大家共同形成一个共识,产生一个操作者、临时决策者,代表大家来进行中心化的操作,大家按照这个共识来维持去中心化的网络世界。
所以常见的选举算法可能应用到区块链中实现共识机制。如Raft、Paxos。
- 主流的共识算法有哪些?
区块链中的共识算法说到底还是分布式系统中最重要的一致性问题:
在分布式网络中如何保证数据一致性。
说到一致性问题,就不得不提大名鼎鼎的拜占庭将军问题。是 Leslie Lamport 1982 年提出用来解释一致性问题的一个虚构模型。拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统中的多个节点)需要通过信使来传递消息,达成某些一致的决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。
具体详情内容可执行google,我这里只说结论:
Leslie Lamport 证明,当叛变者不超过1/3时,存在有效的算法,不论叛变者如何折腾,忠诚的将军们总能达成一致的结果。如果叛变者过多,则无法保证一定能达到一致性。
- 区块高度:可以理解为每个区块的唯一ID,从零开始的“创世块”(即块高度为0),一段时间生成一个块,块高度加1。
- 头哈希:每一个区块都有一个唯一哈希值,依据上一个区块的头哈希+数据块哈希+随机数生成
- 父哈希:上一个高度区块的哈希值
- merkle根:区块中每一笔交易对应一个哈希,呈树装结构,生成的最终值(根),代表了改区块中的交易。
- 难度:难度不是固定不变的,会随着网络现有算力的变化而自动调节
- Nonce:挖矿所要达到的目标值
- 时间戳:
- 区块体:一定时间内所生成的交易信息,即账本。
说到这里,一定还有头脑中没有形成区块链的概念,所以我下面描述一个比特币中交易的“全流程”:
小明和小红每人有一个比特币的地址(公钥:相当于是我们银行卡的卡号 )和一个私钥(相当于银行卡密码或者说你的签名),像这个样子:
1JQMpgRThCJjKbs7P8Ht6x142zjPJFmZVY
我们需要填写转账的金额和对方的比特币地址,就像我们平时用银行卡转账一样的操作,一段时间后,对方即可收到你的转账金额。
这是作为用户能感知到的,看上去和我们平时的转账交易没什么不同,只是“卡号”看起来奇怪了一点,交易时间变长了一点。
那么当你按下“转账”按钮时,背后的区块链系统到底发生了什么?
- 使用私钥对这笔即将发生的交易进行签名
- 从你的客户端把你的这笔交易提交到区块链网络
- 由已经开启“挖矿”程序的计算机(称为矿机)把10分钟内的交易打包成一个数据块(相当于一个账本,其中就包含了小明的这笔交易)
- 这个数据块就是上图中的“区块主体”,而此时,这些区块主体中的交易并未生效。
- 那么如何使这些交易生效呢?每个区块中都有一个哈希值,通过不断哈希运算,不断哈希运算(可能是几亿次)最终找到一个比当前哈希小的值,就认为这个区块被确认。即为交易生效,这个过程就称为“挖矿”。
- 那谁来做这个哈希呢?全球那么多交易,如果只是一家公司的几台计算机是远远不够的。所以,比特币有“激励机制”,当一台计算机确认了一个区块,就可以奖励12.5个比特币。为了得到Money,越来越多矿工就有动力造更大更多算力的矿机来“挖矿 ”。越多的人参与挖矿的竞争,算力就越分散,比特币系统就越不可能被某一个人控制。这就形成了“双赢”的局面,对于矿工来说,想想你每天游山玩水,有一台机器每天帮你赚钱,源源不断地打到你的账户#滑稽脸。对于创造比特币的人来说,几乎不花钱一分钱就能常年安全稳定地运行一套这么牛X的系统,一样可以去游山玩水而不用担心系统的维护。
默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。
默克尔树的典型应用场景包括:
-
快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
-
快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root --> N4 --> N1,可以快速定位到发生改变的 D1;
-
零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知道其它内容。