1. 首页 > 自媒体

我们到底需要什么样的共识算法?什么才是安全的区块链共识算法?

比如上图中的节点 A 和 B,A 记录了自己所创建的所有 Events,即 a1 和 a2.而 B 同样记录了自己所有的 Events,b1 和 b2.但是 A 缺少 B 的所有 Events,而 B 则缺少 A 的最新 Event a2.

当 A 准备把 a2 发给(gossip)给 B ,如下:

并且,A 准备更新自己副本上 B 这部分的数据时,发现自己缺少 B 这部分前序的数据,因此,B 会把它的历史数据同步(Sync)给 A。而 B 的副本上由于已经有 a1 了,因此在收到 a2 之后无需再同步。

最终,hashgraph 就会更新成如下状态:

现在,我们对于 Gossip 过程和副本结构有了一个初步的认识,接下来,我们来了解 Hashgraph 算法中定义了哪些状态

可见

由于 hashgraph 中,所有 events 都会引用两个 parent events,因此,如果一个 child event y 可以回溯到某个 ancestor event x,那么就说 y 可见 x。

而且,同一个节点产生的事件,后续事件总是可见先前所有事件,实际上,它们还是强可见的。

如下:

强可见

当事件 Y 能找到事件 X 的所有路径中跨越了绝对多数的节点,那么事件 Y 强可见事件 X。白皮书中提到经过数学论证可以保证两个强可见的节点在虚拟投票时能获得一致的结果

比如下图,想要判断 b5 是否强可见 c1.

我们需要做的就是,把所有从 b5 能可见 c1 的路径都找出来,如果这些路径集合中,能够包含超过 2/3 的节点(也就是要包含至少 4 个节点),那么就说 b5 强可见 c1.

如下:

可以看到,b5 有 3 条路径都能可见 c1.这 3 天路径经过的节点分别是,path1: (B, C),path2:(B, D, C), path3(B, E, C),

一共经过了 B, C, D, E 4 个节点,满足超过 2/3 节点的要求,因此,可以确认事件 b5 强可见事件 c1.

轮次 Round

在 Hashgraph 中,根据事件所处的可见状态,把他们分为不同的轮次(Round)。

当一个事件强可见绝对多数节点上的先前事件时,我们就说该事件在一个新的轮次上,记为 R。

我们通过一个示意图来理解轮次的概念

上图中,事件 a5 强可见了 R 轮的 a1. b1. c1. d1 共 4 个事件,也就是说强可见了绝对多数节点的第R 轮的事件,因此,a5 就在一个新的轮次 R + 1 上。

注:这里的绝对多数是指 Supermajoiry,即超过 2/3.文章后续内容有使用绝对多数的地方均表示超过 2/3 的意思。

创建轮

所谓的创建轮(Creation Round),就是当一个事件被创建时,它所在的轮次。通常,一个事件被创建时,它会被立即赋予一个轮次号,跟其父事件是在同一个轮次一样。也就是说,如果同节点的父事件是 R 轮,那该事件被创建时也是在第 R 轮,它的创建轮就是 R 轮。

比如,上图中,初始(Genisis)情况下,所有节点的状态都是相同的,把它定义为定义而第 R 轮,并且 R = 1.后续创建的事件都是在第 R 轮的。

接收轮(Receive Round)很好理解,就是当某个事件强可见超过 2/3节点的本轮或者上一轮的事件时,这个事件就达到了一个新的轮次,这个轮次就是他的接收轮。如下图:

从上图中,我们可以看到,当 a5 和 d5 被创建时,它们的创建轮是第 R 轮,而当它们能够强可见绝对多数节点的第 R 轮的见证人事件(即 a1. b1. c1. d1)时,它的接收轮就变为 R + 1 轮,也就是说,a5 和 d5 都变成 R + 1 轮的事件了,并且,在它们之后创建的子孙事件都在 R + 1 轮。

这里需要注意的是:如果事件 a5 只能强可见 R 轮某节点的见证人时,a5 的轮次是不会增加的,依然为此在 R 轮。只有当其强可见绝对多数节点的第R 轮的见证人,它的轮次才变为 R + 1 轮。

见证人和知名见证人

见证人(Witness),就是第 R 轮所创建的第一个事件。比如上图的 a1.b1.c1. d1 和 e1.它们都是各自节点的见证人事件。

知名见证人(Famous Witness),当 R 轮的见证人事件被 R + 1 轮的多数(超过 2/3)见证人强可见时,它就是知名见证人事件。

由上图我们可以看到,c1 被 R +1 轮的大部分见证人事件强可见,因此 c1 就是知名见证人。

我们注意到这里暗含了一个强约束条件,就是 R + 1 轮的见证人事件,这

意味着 [a5. b5. c5. d5] 这几个事件必然是强可见大部分节点的第R 轮见证人事件的,但不必然强可见 c1(比如他们都强可见 [a1. b1. d1. e1] 这 4 个见证人事件。所以,要判断 c1 是否是知名见证人,就必须要求 R + 1 轮的大部分事件都强可见 c1.一旦满足,说明 c1 就是知名见证人了,知名见证人意味着不可更改,这时候系统就可以对该事件进行 commit。

虚拟投票(Virtual Vote)

上述 Event 状态变迁和系统状态变迁的过程其实也包含了投票的过程,投票是在上述状态变迁过程中完成的。

根据上述的算法介绍,我们知道一个 Event 的状态变迁过程是这样的:

可见 -> 强可见某祖先 Event -> 强可见绝对多数节点的祖先 Events -> 轮次增加(即 Round + 1) -> 大多数 R+1 轮 Witness 强可见 R 轮某个 witness -> R 轮该 Witness 成为 famous witness-> commit。

如图:

虚拟投票实际上就是指上述两个黄色部分。它主要是分为两个步骤来进行的,① 处相当于 Pre-Vote 过程,这里其实是确定投票委员会成员,如果一个事件强可见大多数 witness,那么它对某 witness 的票就有效。而② 处则是 Pre-Commit 过程,收集投票委员会对某个祖先 Event 所投的票,如果票数超过 2/3.那么就可以把该 Event 标记为 Famous,也就是不可更改了。接下来只需要 commit 就行了。

注:R + 1 轮的 Witness 只会对 R 轮的 Witness 投票,R 轮 Witness 后续的 Events 不会收到投票。 Witness 是指 R 轮第一个创建的 Event,如下:

我们来看一下想要把 R 轮的 c1 标记为 Famous 需要经过哪些步骤:

1)判断每个节点满足 R + 1 轮的 Event

这是一个对当前节点的各 Event 进行不断回溯验证的过程。

2)判断每个节点中,R + 1 的 Event 是否强可见 c1.如果强可见,那就相当于 Vote Yes。

3)计算 Vote 数量,如果超过 2/3 的 Event 都投票 Yes。就把 c1 标记为 Famous。

实际上,计票过程是在 R + 2 轮进行的。因为即使 R + 1 轮所有 Event 都强可见 c1.它们彼此之间也互相不知道对方的投票情况。因此,必须由下一轮的 Event 来收集大家的

投票结果。

由上图可见,R + 1 轮的 [a5. b5. c5. d5] 以绝对多数的比例对 c1 形成了强可见状态,使得 c1 满足知名见证人人条件。R+2 轮上的每个见证人则对 R+1 轮进行收集投票。如图,a9 强可见了 R+1 轮的这 4 个强可见 c1 的事件,因为已经超过绝对多数,因此 a9 可以立即确认 c1 事件,也就是 c1 已经达到全网共识而且不可更改。

注:Hashgraph 根据数学理论证明,任何一个 R+2 轮见证人如果对投票结果做出了决定,那么这个结果就是全网的结论,如果这轮见证人无法做出决定,就由下一轮见证人计票决定,直到得出确切结论。

事实上,R + 2 轮这个收集投票的过程只是一个学习共识结果并进行 commit 的过程,因为一旦知名见证人被确定,剩下的过程就是各个节点把这个结果进行提交了。

接收轮次和共识时间戳

一旦某个轮次确定了所有的(or 绝对多数)知名见证人,就可以为这一轮次中的其他普通事件(非 witness)确定接收轮次和共识时间戳(consensus timestamp)。

如果一个事件被某轮的所有知名见证人(知名见证人数量必须超过 2/3)都可见,就说它的接收轮为这些知名见证人所在的轮次。

比如,第 R + 1 轮的所有知名见证人都已经得到确认,如果这些知名见证人都可见某个祖先事件,那么就说这个祖先事件的接收轮为 R + 1.

比如下图,假定 a5. b5. c5. d5 都是 R = 2 轮的知名见证人,它们都可见 a3 事件,我们就说 a3 在 R = 2 轮被接受。而对于 b4 来说,只有 b5 可见它,其他见证人并不可见它,因此,它的接收轮还不确定,只能等待后续轮次的见证人满足可见的条件,才能确定它的接收轮。

现在假定我们有一个 Event x,其接收轮为 R + 1.我们想要确定其在所有 event 中的 timestamp。

Hashgraph 采用的方法是,先确定各个节点中的可见 Event x的最早 Event,然后把它们的 timestamps 集合取中位数作为 x 最终的 timestamp。比如,找到节点 A 中最早可见 x 的 Event,样,找到节点 B,C, D 中最早可见 x 的 Event 。对于 A 来说,最早可见 x 的就是 x 自己,而对 B, C, D 来说,最早可见可以是任意 Event。

为了便于理解,我画了一个示意图来描述,如下:

想要确定 a3 的 timestamp,我们从各个可见它的见证人节点中,查找最早可见 a3 的 events。

如上图,A 节点最早可见 a3 的时间就是 a3 自己,而 B 节点最早可见 a3 的则是 b3.同理得到 c4 和 d4.

这样,我们就得到一个 timestamp 集合:[a3. b3. c4. d4],取它们的中位数,就得到一个基准 timestamp,把它作为 a3 的真实 timestamp。

根据相同的做法,我们可以得到其他所有 Events 的 timestamp,也就是说我们可以得到一个 Total order。

Tie breaker

当然,仅有 timestamp 可能还无法确定 Event 的先后顺序,因为很有可能两个 events 会有相同的 timestamp。所以还需要一些其他条件和规则来约定顺序,在Hashgraph中,是按照如下规则来排序的。

什么是区块链哈希算法?哈希算法是一种只能加密不能解密的密码学算法。可以将任意长度的信息转换成一段固定长度的字符串。简言之,哈希算法是将任意长度的字符串映射为较短的固定长度的字符串。比特币则是使用SHA-256摘要算法对任意长度的输入给出的是256bit的输出。那么,加密货币中哈希算法的应用有哪些?

1、加密哈希函数

2、数据结构

3、挖矿

4、加密哈希函数:

一个加密哈希函数有如下特性:确定性 :无论在同一个哈希函数中解析多少次,输入同一个A总是能得到相同的输出h(A)。

高效运算 :计算哈希值的过程是高效的。

抗原像攻击(隐匿性) :对一个给定的输出结果h(A),想要逆推出输入A,在计算上是不可行的。抗碰撞性(抗弱碰撞性) :对任何给定的A和B,找到满足B≠A且h(A)=h(B)的B,在计算上是不可行的。

细微变化影响 :任何输入端的细微变化都会对哈希函数的输出结果产生剧烈影响。

谜题友好性 :对任意给定的Hash码Y和输入值x而言,找到一个满足h(k|x)=Y的k值在计算上是不可行的。加密哈希函数对区块链的安全性和挖矿有巨大的帮助。

数据结构:有两种数据结构对于理解区块链非常重要:链表和哈希指针。

链表:链表是依次按顺序连接而成的数据区块,如下图所示:

在链表中的每个区块都通过一个指针指向另一个区块。

指针:指针是包含其他变量地址的变量。因此,正如其名,指针就是指向其他变量的变量。

哈希指针:哈希指针不仅有其他变量的地址,还有该变量中数据的哈希值。那么,这对区块链而言有何帮助呢?

区块链的构成如下图所示:

区块链本质上是一个链表,其中的每个新区块都包含一个哈希指针。指针指向前一区块及其含有的所有数据的哈希值。借此特性,区块链拥有了不可更改性(immutability)的伟大特质。哈希算法保证了比特币挖矿不能逆向推导出结果,所以矿工持续不断地进行运算。本质上是在暴力破解正确的输入值,谁最先找到谁就能获得比特币奖励。

简言之,哈希算法是将任意长度的字符串映射为较短的固定长度的字符串。比特币则是使用SHA-256摘要算法对任意长度的输入给出的是256bit的输出。那么

,加密货币中哈希算法的应用有哪些?

加密哈希函数

数据结构

挖矿

加密哈希函数:

一个加密哈希函数有如下特性:

确定性 :无论在同一个哈希函数中解析多少次,输入同一个A总是能得到相同的输出h(A)。

高效运算 :计算哈希值的过程是高效的。

抗原像攻击(隐匿性) :对一个给定的输出结果h(A),想要逆推出输入A,在计算上是不可行的。

抗碰撞性(抗弱碰撞性) :对任何给定的A和B,找到满足B≠A且h(A)=h(B)的B,在计算上是不可行的。

 3/5   首页 上一页 1 2 3 4 5 下一页 尾页

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:http://www.longfuchaju.com//zmt/4045.html

联系我们

在线咨询:点击这里给我发消息

微信号:wx123456