Author

Topic: Byteball白皮书中文版(三) (Read 273 times)

hero member
Activity: 532
Merit: 500
March 24, 2017, 01:50:53 AM
#1
摘要: 翻译:Maxwell [email protected] 白皮书中文版(一) 传送门:http://www.bitett.com/portal.php?mod=viewaid=438Byteball 白皮书中文版(二) 传送门:http://www.bitett.com/portal.php?mod=viewaid=458 ...
翻译:Maxwell Alin  [email protected]
Byteball 白皮书中文版(一) 传送门:http://www.bitett.com/portal.php?mod=view&aid=438
Byteball 白皮书中文版(二) 传送门:http://www.bitett.com/portal.php?mod=view&aid=458


6.见证人

为寻求一个“客观公正的测试”,通过观察我们网络的一些参与者,他们可能是非匿名长期参与社区并拥有良好信誉的人,或是主动维护网络健康发展的组织。我们称之为证人。虽然期望他们诚实行事是合理的,但完全信任任何一个证人也是不合理的。如果我们知道几个见证人的Byteball地址,并且期望他们频繁地发布,然后,为了测量候选MC的真实性,可以沿着MC及时返回,并统计出见证授权单元的个数(如果同一证人多次被遇到,那么他也不会被重复计数)。我们一遇到大量见证人,就会停止行进,然后,我们会从测量图上的创造起点开始量出最长路径的长度。我们将这个长度称为我们停止的单元级别,以及我们正在测试的见证父母级别的MC。产生较大见证级别的候选MC被认为是更“真实”的,并且具有该MC的父母单元被选择为最佳父母单元。如果存在一些具有较大见证级别的竞争者,我们将选择其中最低级别的父母单元。如果连接持续,我们将选择具有最小单元散列值(在base64编码里)的父母单元。

这种算法允许吸引由见证人授权的单元的MC的选择,并且见证人被认为是现实的代表。

例如,如果攻击者从网络的真实数据分叉,并秘密地建立一个属于自己的单元(影子链)长链,其中一个包含双花 (双重支付),之后将他的分叉合并回诚实的DAG中,最佳父母单元选择算法在合并点处将选择把MC驱动到诚实DAG中的父母单元,因为这是证人活跃的地方。证人不能简单地投射到影子链中,因为在合并之前,他们无法看到它。这个MC的选择反映的是由证人和指定他们的用户所看到的事件的顺序。攻击结束后,整条影子链将着落在MC上的一点,并且影子链中包含的双花费(双重支付)将被视为无效,因为它的有效对手在点合并之前更早出现。


 

  这个例子说明为什么大多数证人必须被信任才能连续发布。大多数见证者不应与攻击者勾结串通,并发布在他的影子链上。注意,我们相信见证人只是根据客观的事实,并且不在任何影子链上发布非序列单元。我们并没有给予他们任何超过网络或相关部分的管理权。即使对于这小小的职责,指定见证人的用户可以随时改变他们的决定。

将一些已知的实体看作是现实标志的想法不是新的。很早就知道,一些公司从事这样的活动,为了证明一些数据在特定日期之前存在,可以在一些难以修改和广泛见证的媒体上分散并公布数据,如在印刷报纸[6]中发布哈希。 Byteball的见证人与报纸有着同样的功能。像报纸一样,他们是众所周知并且可信的。至于可信的报纸内容被限制在相信他们公布那些得到的数据之上,byteball的证人只有被信任才连续发布,而不是更多,就像报纸一样,证人不知道他们此刻见证的哈希值的背后是什么,而且几乎没有什么理由去关心。报纸很难被修改(但是具有修改的可能性,并且在《1984》中他们确实有这样做),然而证人产生的一切都受到数字签名的保护,这使得没有任何修改的可能性。考虑到可靠性,我们有一些证人,而不是只有一个,考虑到速度和便利,这些都是在线的。

  决定了一系列的证人名单后,接着,我们可以选择最好的父母单元,以及如同“这些证人生活在哪里” 最符合现实定义的相应的历史。同时,父母单元本身也有不同的证人名单以及最终对现实的不同定义。我们渴望现实的定义,并希望历史继承从他们开始,覆盖到周围所有相同的事物。为了实现这一点,我们介绍以下附加协议规则。

“近乎一致的规则”:最好的父母单元必须从那些证人名单与孩子证人名单存在至多一人变动的父母单元中选择。该规则确保MC上相邻单元的证人名单差不多,因此他们的历史大多是相互一致的。见证列表相差0或1个突变的父母单元将被要求兼容(直接包括它们的单元),而其他的不兼容。不兼容的父母单元仍然被承认,但他们没有机会成为最好的父母单元。如果无子单元中不存在兼容的潜在的父母单元(攻击者可以用携带完全不同的证人名单单元来泛滥网络),则应选择较老单元级别的父母单元。

上述意味着每个单元必须列出其证人名单,以便比较他们。我们要求证人的数量正好是12.选择12这个数字是因为:
1.它足够大,以防范一些证人偶然间出错(他们可能证明不诚实,或被黑客攻击,或长时间离线,或丢失私钥并永远离线);
2.它足够小,人们可以追踪所有证人的踪迹,了解谁是谁,并在必要时更改名单;
3.与那些未被更改的11名证人相比,允许突变的那一个得足够小。

如果用户认为任一见证人失去了他的信誉,或者刚好有更好的候选人,那么在他的名单中,用户可以用新的见证人更换那个见证人。考虑到他的证人名单可能与其他单元的名单在多个位置上没有不同。这意味着任何变化只能逐渐发生,对于大于一个位置的变化,需要一个普遍的共识。

7.结算

当新单元形成时,每个用户持续追踪其当前已被构建的MC,好像他将要发布一个基于所有当前无子单元的新单元。当前的MC在不同节点处可能不同,因为它们可能看到不同的无子单元集合。我们需要构建当前的MC,而不考虑见证列表,即用户自己的见证列表不重要,甚至不兼容的父母单元可被选择作为最好的父母单元。这意味着如果两个用户具有相同的无子单元集合,但具有不同的见证列表,那么它们当前的MCs将仍然是相同的。当前MC将不断随着新单元的形成而改变。然而,当我们将要示出时,一部分足够旧的当前MC将保持不变。

我们期望证人(或其中大多数人)诚实地行事,因此必须包括它们被任命的下一单元中的先前单元同样的证人。这意味着,当证人构建一个新单元,只有最近的单元是被选择作为父母单元的候选人。因此,我们可能预期,所有未来的当前MCs将不会比特定的稳定点更远地收敛(在回溯时间上)。实际上,创世单元是天然初始的稳定点。假设我们创建一个基于当前无子单元集的当前MC,并且有一些点存在于预先相信其是稳定的MC上,即所有未来的当前MC被认为在该点处或之前收敛(再次,在回溯时间上),然后沿着相同的路线行进。如果我们可以找到向前推进此点(远离创世元)的方向,可以通过感应证明稳定点的存在。

注意,如果我们忘记除了最好的父母单元之外的所有父母单元,我们的DAG将被缩减为仅由最佳父链接组成的树。显然,所有MCs将沿着这棵树的分支行进。然后需要考虑两种情况 - 当树在当前稳定点中分支时和当它不分支时 - 并且决定我们是否可以将稳定点向前推进到下一个MCI。


 

首先,假设树不分支。那么我们需要考虑一种可能性,即一个新的分支将仍然被添加,并以某种方式由证人支持,使其超过了现有的分支。另一种可能性是,证人非常重视支持现有分支,要求包括某人先前的单元,让他们只能继续支持现有的分支,而没有其他的选择,让我们量化后面的可能性。记住最好的父母单元被选择作为具有最大的见证水平的父母单元。让我们沿着当前的MC从尖端回溯到时间上,直到我们遇到很多见证人(我们指的是由位于当前稳定点上的单元定义的证人)。如果它们中的至少一个位于比当前稳定点更早的位置,那么我们不会尝试提前稳定点,否则我们会继续前进。在这种情况下,所有这些证人已经“投资”到当前的MC。在这些当中证人,我们找到最小见证级别min_wl。当这些见证人中的任何一个发布一个新的单元,这个单元可能拥有父母单元MC领导当前MC和导致竞争分叉,   并且具有最高见证级别的父母单元将会被选择作为最佳父母单元以及将会定义下一个当前MC的方向。由于证人不得不包括其以前的单元,领导当前MC的父母单元的见证级别将至少为min_wl。任何导致替代分支父母单元的见证级别将永远不会超过当前稳定点的水平,即使所有剩余(少数)证人涌向替代分支。因此,如果当前MC增长足够远使得min_wl大于当前稳定点的水平,大多数证人将不得不增加对现有MC的支持,然后替代分支失去了所有赢的机会,并且我们可以推动稳定点向下一个MCI前进。

接下来,假设树做分支。我们需要找到一个替代分支将失去任何超过当前的MC机会的条件。让我们从前面的例子中定义min_wl开始。在替代分支的所有单元中,我们则选择那些增加见证水平的人,即他们自己的见证水平大于每个父母单元的见证水平。在这些中,我们找到最大水平,然后,即使所有剩余的(少数)证人聚集在替代分支上,替代分支上的见证等级将永远不会超过这个最大等级。因此,如果这个最大水平小于min_wl,对于替代分支来说则游戏结束,并且我们可以沿着当前MC提前稳定点。

因此,在当前MC上存在一点,在该点之前MC将永远不会改变(假设大多数证人不发布非序列单元)。因此,相对于该MC定义的总顺序也是最终的。如果我们有非序列单元,我们可以决定其中哪一个是有效的,以及最终的。如果新的非序列单元出现与已经稳定在MC上的任何内容发生冲突,则在旧对应单元之后,新的非序列单元将一定会被排序,并且新的非序列单元将被认为是无效的。因此,包括在稳定MC上的单元中进行的任何付款已经不可逆。与比特币不同,交易最终性只是概率性的,这是确定性交易的终极性。

每个用户基于他所看到的单元构建他自己的(主观的)当前MC。由于新单元的传播不是即时的,并且它们可以以不同的顺序到达不同的用户,所以在任何给定时间内,用户将具有不同的当前MCs以及关于MC最后稳定点的不同看法。由于当前MC仅由用户已知的单元集合来定义,所以如果用户B尚未将其稳定点提升到与用户A相同的MCI,那么,以后他将不可避免地那么做。(即一旦他接收与用户A相同的或者更多的单元。因此,不同用户关于任何给定单元的状态的意见最终是一致的。

8.非序列单元的储存

当我们决定一个单元是非序列单元时,我们仍然必须存储它。然而,其数据中的一部分被替换为数据哈希值。这个规则有两个目的。第一,为了减少因没有人支付单元的存储消耗(非序列单元的整个内容被认为无效,包括其佣金付款)。第二,为了减少用户发送非序列单元的效用,因为哈希值更替了对于作者来说想要(免费)存储的所有有用的数据。这可以防止攻击者滥用非序列单元作为免费存储大量数据的方式。

存储哈希值而不是所有内容对攻击者仍然有一些实用性,因为他可以自己存储原始数据,并使用哈希来证明数据存在。但请记住:
  1.他仍然必须支付一个被认为有效的单元;
  2.如果攻击者已在内部存储必要的元数据来翻译byteball数据,他可以通过将所有数据合并到Merkle树中并使用Byteball仅存储一个小单元成本的Merkle根来做同样好的工作。
在这样的设计下,因此,这里不存在试图发送非序列单元的自身利益。

应该提到的是,我们不能在第一次看到非序列单元时就拒绝它们。如果我们这样做,攻击者可以以不同的顺序将其非序列单元发送给不同的用户。那时,不同的用户就会坚持他们第一次接收的版本并且拒绝基于其他一切的版本,如此,攻击者将成功地划分网络。这就是为什么我们必须存储两个版本,然后决定他们顺序的原因。甚至,用户应该像任何其他单元一样将非序列单元转发给同辈们,因为同辈们越早了解非序列单元越好。

我们仍然尽可能避免包括非序列单元:只要它们是无子单元,父母单元选择算法就会排除非序列单元。出于这个原因,希望能帮助同辈们尽快了解非序列单元。
 
9.球

一个单元稳定后(即它包括在MC的稳定部分)我们基于该单元创建一个新的结构,我们称之为一个球:

每个球包括关于它的所有祖先球的信息(通过父母单元),因此它依赖的增长的信息量的数量就像滚雪球。在这个球上,有一个标志可以告诉我们它是否是无效的(非序列),我们有引用到较老级别的球,以后我们将用于为轻客户建立证明。

当相应的单元变得稳定并且我们确定它是否是有序单元时,我们只能建立一个球。由于不同用户对于当前MCs的看法最终是一致的,因此它们将基于相同的单元构建完全相同的球。
Jump to: