翻译:Maxwell   rfmpwxbo@qq.com
Byteball 白皮书中文版(一) 传送门:http://www.bitett.com/portal.php?mod=view&aid=438



2.数据库结构

当用户想要向数据库添加数据时,他创建一个新的存储单元并将其广播给他的对等节点。存储单元(除了别的以外)还包括:

•要存储的数据。一个单元可以包括多个数据包,称之为信息。 有许多不同类型的信息,且各有自己的结构。 其中一种信息类型是支付,用于向对等节点发送bytes(字节币)或其他资产。

•创建单元的一个或多个用户的签名。 用户由其地址标识。 个人用户可以(并且鼓励)拥有多个地址,就像比特币。最简单的情况,地址源于公钥,再次类似于比特币。

•引用由其哈希值标识的一个或多个先前的单元(父母单元)。

引用父母单元是建立单元的次序(目前为止只有部分次序)和推广区块链结构。由于我们不局限于连续块之间的单亲 - 单子关系,所以我们不必争取近同步(),并且可以安全地承受大的延迟和高吞吐量:每个单元只会有更多的父母单元和更多的子单元。如果我们沿着父子链在历史上前进,当同一单元被多个后来的单元引用时,我们将观察到许多分叉,并且当同一单元引用多个较早单元时,许多单元逐渐融合(开发者已经习惯看到这个动态)。这种结构在图论中称为有向无环图(DAG)。 单元是顶点,父子链是图的边缘。


1,连接成一个DAG存储单元。箭头是从子单元到父母单元,G是创始单元

在新的单元极少到来这种特殊情况下,DAG将看起来几乎就像一个链,偶尔分叉而又快速融合。

类似于让每个新块确认先前所有块(以及其中的交易)的区块链中,DAG中的每个新子单元确认其父母单元,父母单元的所有父母单元,父母单元的父母单元的父母单元等。如果有人尝试编辑一个单元,他也必须改变它的哈希值。 不可避免地,这将破坏所有引用此单元哈希值的子单元,因为子节点的签名和哈希值取决于父哈希值。因此,不能在窃取其私钥或是不与其所有子单元达成合作的情况下修改单元。 子单元们不能在没有与子单元合作的情况下修改他们的单元(原单元的孙子单元),等等这些。 一旦一个单元被广播到网络中,并且其他用户开始在它上面构建它们的单元(将其称为父单元),编辑这个单元所需的二次修改就如雪球一样增长。这就是为什么我们称之为Byteball(我们的雪花是数据中的字节)。

与“发布一个块是一个罕见的事件,且只有特权阶层的用户在实践中从事这项活动”的区块链不同,在Byteball中,单元发布之后,立即开始累积确认,并且确认可以来自另一个新单元被任何人发布的任何时候。这里没有普通用户和矿工这样的两层系统。相反,用户互相帮助:通过添加一个新单元,发布者也确认了所有以前的单元。

如果尝试修改过去的交易,与需要大量计算工作的比特币不同,尝试修改Byteball中过去的记录需要与大量且越来越多的其他用户协调,其中大多数是匿名的陌生人。因此,过去记录的不变性是基于与如此大量的陌生人协调的复杂性,这些人难以达成一致,对合作没有兴趣,并且每一个人都可以否决修订。

通过引用其父单元,一个单元将包括其父单元。它不包括父母单元的全部内容;相反,它的内容取决于父母单元哈希值的信息。同样,单位间接依赖于并因此包括父母的父母,其父母等,并且每个单元最终包括创世单元。

有一个协议规则,一个单元不能引用多余的父母单元换言之,这些父母单元是一个父母单元包括另一个。 例如,如果单元B引用单元A,则单元C不能同时引用单元AB. A已经以某种方式包含在B中。此规则去除了,不能向DAG中添加任何新的有效连通性的不必要链接。

3.天然货币:Bytes

接下来,为了防止无用信息刷屏数据库,我们需要引入一些摩擦力。 入口的屏障应大致反映用户的存储效用和网络的存储成本。 对于这两者而言最简单的测量方法是测量存储单元的大小。因此,要将数据存储在去中心化的全球数据库中,您必须以内部货币(称为字节币)来做为支付费用,您支付的金额与你打算存储的数据大小相对等(包括所有标头,签名等)。就如同首次推出时等于一磅银的英镑,货币的名称反映了它的价值。

为了使激励措施与网络的利益保持一致,在大大小小的计算规则中存在一个例外。为了计算单元大小,假定单元就恰好具有两个父单元,不论真实数字。因此,两个父单元的哈希值的大小总是包含在单元大小中。此例外确保用户不会为了尽量降低成本,而尝试只包含一个父单元,因为无论包含多少父母单元,这成本都是相同的。

为了使DAG尽可能地精确,我们鼓励用户尽可能多地包含父母单元(如前所述,这不会对应付的大小产生负面影响),并且尽可能地通过那些最初作为父单元将其包含的单元费用的支付部分成为最近的父母单元。我们稍后将定义什么是“最初”。

字节币不仅可用于支付存储费用(也称为佣金),还可以发送给其他用户支付商品或服务或换取其他资产。为了发送付款,用户需创建包括诸如以下(从现在开始,我们使用JSON来描述数据结构)的支付信息的新单元:


该信息包含:

输出数组:一个或多个接受字节币和金额的地址;

输入数组:一个或多个先前输出用于转移基金的引用,这些是过去被发送到作者地址且还未被使用的输出。

输入总和应等于输出加佣金的总和(输入金额从先前的输出读取,在支出时没有明确说明)。该单元用作者的私钥签名。

循环中的字节总数为1015,这个数是常量。所有字节币都在创始单元发出,然后从用户转移到用户。费用由帮助维护网络健康的用户收取(更多细节过后补充),所以他们保持流通。之所以选择1015是因为在JavaScript中它代表最大的整数,数量只能是整数。货币的较大单位通过标准的前缀得出:1千字节(Kb)是1000字节,1兆字节(Mb)是1百万字节等等。

4.双花(双重支付)

如果用户尝试使用两次相同的输出,有两种可能的情况:

1、在尝试使用相同输出的两个单元有序,即一个单元(直接或间接)中包括另一个单元,并且在它之后。在这种情况下,我们显然可以安全地拒绝后面的单元。

2、他们之间无序关系,在这种情况下,我们都接受。我们建立单位之间的总序后,当他们隐藏在足够深的新单位里(见下文我们如何怎么做)。在总序较早出现的一方视为有效,另一方视为无效。

有一个简化定义总序的协议规则。我们要求,如果相同的地址发布超过一个单元,则它应当(直接或间接地)在每个后续单元中包含其所有先前单元,即来自相同地址的连续单元之间应当有序。换句话说,从同一作者的所有单元应连续。

如果有人违反这一规定并发布两个单元,使得它们无序(非序列单元),则这两个单元被视为双重支付,即使它们没有尝试使用相同的输出。这种非系列单元如上面情况2所述处理。


2 双花(双重支付) 它们之间无序

如果用户遵循这个规则,但仍尝试两次花费相同的输出,则双重支付变得明确有序,并且我们可以安全地拒绝后一种情况,如上面情况1所示。因此,同时不是非序列的双支出容易被过滤掉。

这个规则其实很自然。当用户组成一个新的单元时,他选择最近的其他单元作为其单元的母单元。通过把他们列在他的母名单上,他向外宣布他的图片,这意味着他已经看到了这些单元。因此,他看到了母单元里的所有母单元,母单元的母单元等等,直到创世块。这个巨大的集合应该显然包括他自己已经产生的一切,并且他自己可见。
用户通过不包含一个单元(甚至是间接地通过父母单元)来否认他看到的这个单元。如果用户通过不包含他自己以前的单元来否认已经看到的这个单元,我们会说这很奇怪,这事有蹊跷。我们不鼓励这种行为。

5. 主链

我们的DAG是一个特殊的DAG。在正常使用中,人们通常将他们的新单元链接到略小的最近单元上,这意味着DAG仅在一个方向上增长。人们可以把它画成一条里面带有许多交错线的粗线。该属性表明我们可以在DAG中沿着“子-父链”选择单个链,然后将所有单元关联到此链。所有的单元要么将直接位于这条我们称之为主链的链上,要么沿着DAG的边缘从相对少量的跃点到达。它就像一条连接着侧面道路的高速公路。

构建主链的方法之一是开发一种算法,在既定单元的所有父母单元中,选择一个作为“最佳父母单元”。选择算法应该仅基于所讨论的单元可用的知识,即选择算法应仅基于所讨论的单元可用的知识,即单元本身和其所有祖先中包含的数据。从DAG的任意顶端(无子单元)开始,然后沿着最佳父单元链接沿着历史向后进行。以这种方式移动,我们构建主链并最终到达创世单元。注意,从一个特定单元建立的主链不会因为新单元的增加而改变。这是因为,我们移动的每一步都是从子单元到父单元,而现存的单元永远不会获得新的父母单元。

如果我们从另一个顶端开始,我们将构建另一条主链。这里值得注意的是,如果这两条主链在历史返程中曾相互交叉,那么它们将在相交点之后沿着相同的路径行进。
在最坏的情况下,主链将仅在创始区相交。然而,考虑到单元生产的过程在用户之间不协调,人们期望可以找到一类主链,其聚集的位置离顶端不太远。


图3,由不同的无子单元建立的主链相交,然后沿着相同的路径行进。在两个双重支付中,具有较低主链指数(5)的一条赢得胜利,而另一条(具有MCI = 6)被认为无效。

一旦我们有一条主链,就可以在两个矛盾的、无序的单元之间建立总序。首先让我们索引直接位于主链上的单元。创世单元的索引值为0,下一个    MC单元是创世元的子单元,其索引值为1,因此,沿着MC向前行进,我们为位于MC上的单元分配索引。对于不在MC上的单元,我们可以找到其中首先包括(直接或间接)该单元的MC索引。以这样的方式,我们可以给每一个单元指定一个MC指数(MCI)。

然后,在两个非序列中,具有较低MCI的那一个被认为是较早并且有效的序列,另一个则无效。如果两个非序列恰巧具有相同的MCI,根据tiebreaker规则,具有较低散列值的单元(如基本64编码中所表示的)是有效的。请注意,我们保留所有版本的双重支付,包括最终损失的那些。DagCoin [3]是第一个发表的作品,建议存储所有冲突的交易并且决定哪一个被视为有效。

由一个特定的单元建立的MC指数告诉我们这个单元的作者对过去事件顺序的看法,即他对历史的观点。该顺序意味着要考虑哪个非序列单元有效,如上所述。注意,我们通过选择给定单元的所有父母中的最佳父母单元,并在他们的MC之间进行选择:所讨论的单元的MC指数将是最佳父单元通过一个链接向前延伸的MC。

识别许多(甚至所有)可能由攻击者创建的父母单元,并记住最佳父母单元的选择本质上是历史版本的选择,我们应该要求从我们的最佳父母单元选择算法,该算法喜欢从子单元的角度来看“真实”的历史。因此,我们需要设计一个“现实测试”,我们的算法将对所有候选MCs运行,以选择得分最佳的一个。

(待续)


↓这是个Byteball钱包打赏地址:
CMAOL3JX4V4NLZ6O5ZTUW643YRBVAEOO
您的支持是对我们最大的鼓励!