比特币重生计划:Metanet 技术实现

Metanet 技术实现

Metanet 的技术实现细节可查阅下面两个文档:

  • Metanet Technical Summary
  • Metanet 技术概要

下面的这个 Slide 可以更容易理解 Metanet 是如何将交易组织起来的

  • The Metanet - Coingeek Toronto Presentation 29-05-2019

节点与边

在上一篇文章中,我仔细区分了 Metanet 概念与 Metanet 协议。

之所以如此安排,是考虑到 Metanet 致力于创建全球价值网络的宏伟愿景,随着时间的推移,它无疑将涵盖各种领域、标准和技术。原则上,这类似于当前支撑互联网的基础设施由许多相互交织的协议和架构组成的方式,例如超文本传输安全协议(HTTPS)、文件传输协议(FTP)和可扩展标记语言(XML)。

另一方面,Metanet 协议可以被视为一种独立的协议,它在 Metanet 庞大的生态系统中具有特定的功能和作用。与互联网利用上述协议来定义互联网的通信、文件传输和互操作性等标准相同,Metanet 协议也可用于 Metanet 的特定目的。

那么,到底是什么目的?

Metanet 是以比特币为基础的数据结构。 —_nwriter,Medium

在此郑重提醒:本系列文章不止一次引用了 _unwriter 的成果,而且未来肯定还会继续引用。他们题为 “Metanet 启航 ” 的文章包罗万象,无疑是迄今为止对 Metanet 和 Metanet 协议最完整、最清晰和最深刻的解释之一,这就是为什么您会发现我不停在整个系列中加以引用。

上面的语录堪称是描述 Metanet 协议的目的和功能的金玉良言。在 CoinGeek 多伦多大会上,我用了类似(但不如其优雅)的措辞来表达同样的观点:

  • 构建链上互联网的协议。*

我知道现在情况变得更加明确,Metanet 协议的主要目标是为了从区块链中挖掘类似互联网的数据提供某种结构和组织。众所周知,近几个月来,许多令人瞩目的企业应用程序都以比特币 SV 区块链作为基底,利用链上数据。

Metanet 协议是一种可以将这些应用程序——以及未来的更多应用程序使用的链上数据组合起来的工具。因此,我们允许对不相干的链上数据进行结构化,以改善其所支持应用程序的功能,并帮助实现让用户在 Metanet 上真正拥有自己的数据的使命。

Metanet 协议的技术摘要现在可在 nChain 网站 查阅:

nChain

我强烈建议您在适当时候阅读该技术摘要,其中载有 Metanet 协议提炼成基本概念的过程,包括理解和构建 Metanet 的链上结构所需的全部要素。

但是,正如先前所说,我的博客旨在深入解释这些概念,接着夯实基础,抛砖引玉。

在接下来的四篇文章中,我们将分解以上文档中概述的概念,对 Metanet 协议建立基本的认识。我们将透视它的工作原理,讨论它在开发中支持设计选择的一些原因。

载有技术摘要的文件将依据内容分为下列主题,每个主题都设有专门的讨论帖:

  • 1——节点和边缘结构
  • 2——域名、命名和定位
  • 3——Metanet 与现有协议
  • 4——数据插入和交易结构

不过,在钻研 Metanet 协议本身的细节之前,我们先通过今天的文章介绍一些基本的讨论背景:有向无环图(DAG)的简要概述。

有向无环图(DAG)

要讨论 Metanet 协议,我们需要理解谈论有向无环图(DAG)的意义。

不可避免的是,我们在这里必须涉足 * 图论 *——数学的一个分支,普遍认为起源于莱昂哈德 · 欧拉(Leonhard Euler)。欧拉的《柯尼斯堡七桥问题》 这篇论文实际上催生了对图形结构的科学研究。

当我们使用图这个术语时,在图论的上下文中,我们通常指的是由节点(也称为顶点)和边组成的任何结构。这里的术语可能有些生僻,但我们所说的 “节点” 实际上是指一些对象,“边”是指一对节点之间的某种连接。

所以,简单来说:

  • 图是由边连接的节点构成的结构。*

边(节点之间的成对连接)的一个有趣属性是它们可能有一个特定的方向。所有边都有方向的图称为有向图。

给定有向图中的一对节点,比如节点 A 和节点 B,连接它们的边可以有两个方向:A→B 或 B→A。

根据这两个节点之间的方向选择,我们会定义它们之间的不同关系。我们的意思是,对于由有向边连接的一对节点 A 和节点 B,一个节点将被视为 “父” 节点,另一个节点将被视为 “子” 节点。

为了看得更清楚,我们在下图中绘制了一对节点:

在我们的描述中,节点 A 和节点 B 由两个圆(即通用“对象”)表示,它们之间的有向边由箭头表示。在上面的例子中,箭头方向为 A→B,这意味着节点 A 是父节点,节点 B 是子节点。

我们将在本文甚至本系列的其余部分中使用关于有向图的简单知识。了解清楚有向图之后,我们只需要介绍最后一个方面:无环属性。

如果沿着有向边没有一条路径在同一节点开始和结束,则认为有向图是无环的。例如,如果有一幅包含节点 A、B、C 等三个节点的图形,遵循 A→B→C→A 这样的路径,则形成了循环。因此,无环图就是一幅不可能形成此类循环的有向图形。

根据上面介绍的一些最基础的图论知识,现在我们就可以定义一幅有向无环图(DAG)。

DAG 是一种具有以下属性的结构:

  • Directed,有向——一对节点之间的每条边都是有方向的。
  • Acyclic,无环——不包含循环。
  • Graph,图——包含节点和边。

那么,为什么我们要花这么多宝贵的时间来谈论图形结构呢?

答案很简单:有向无环图不仅在各种自然环境中普遍存在,而且也是现代数据结构和信息系统(包括比特币)的基石。

我们在现实场景中发现了 DAG,例如家谱、时限调度系统、以及现代版本控制系统(如广泛应用的 Git 数据模型)。但是,当我们观察到区块链本身作为一种数据结构也包含 DAG 时,一切开始变得真正有趣起来。

区块链与 DAG

比特币白皮书明确指出,区块链是 DAG。值得注意的是,这一观察结果经常被误解或完全忽略,而代之以区块链的工作量证明属性。“比较”区块链与 DAG 的文章并不少见,就好像它们是互不相干的概念——这真是谬以千里。

按照我们刚刚确立的定义,不仅区块链可以视为一个恰当的 DAG 实例,事实上,只要本着开放的心态去观察,我们还可以在区块链中发现多种不同的 DAG 结构。

今天将重点讨论比特币区块链中包含的两个最明显的 DAG 结构
实例:

  1. 区块 DAG;以及
  2. 交易 DAG。

让我们看一看这两幅 DAG 是如何形成的。

区块 DAG

我相信几乎所有的读者都知道,区块链简单来说就是一串加密链接的数据块。每个区块中的数据依次包括一个区块标题和一组交易,但从图论的角度看,我们只把整个数据块看作离散对象,而不会将其进一步分解成组件。

不过,重要的是理解我刚才提到的区块之间的 “加密链接” 从何而来。这里的关键知识是:

  • 每个区块都含有前一区块标题的加密哈希值。*

这只是一种别致的说法,即每个新区块都 * 引用 * 了前一区块。巧妙之处在于引用前一区块标题的加密哈希值的形式,而加密哈希值只是单向加密哈希函数的输出。

因为前一区块的哈希值包含在每个新区块中,所以我们可以把区块链视为 DAG:

在上图中,每个区块代表图中的一个节点。这些节点通过由前一区块各自的加密哈希值表示的边成对地依次连接。例如,节点 B1 通过边 B1→B2 连接到节点 B2,因为 B2 含有加密哈希值 H(B1),其中 H( )表示哈希函数。

严格来说,这里应该专门讨论区块标题,但区块一词足以表达所有的意图和目的。

  • 顺便插一句,上文所示区块之间的边的方向性,乍一看,似乎与 “孤块” 的概念相冲突。*

对于不熟悉这一概念的人来说,孤块是由于多位矿工在非常接近的时间找到了有效的工作量证明解决方案而被挖到的区块,它们可能暂时有效,却不会作为构建基础。因此,“孤块”一词意味着它没有父节点,但孤块是构建在前一区块的基础上并通过 H(Tx_prev)引用,这确实意味着孤块有父节点但没有子节点。

  • 也许这更像是 “孤” 一词引发的问题,可是我们为什么要用 “孤” 来形容一个有前身的区块?当然,关键特征是此类区块没有后继者?*

比特币:点对点电子现金系统[9]

  • 在任何情况下,我都坚持使用上图所示的边方向惯例——即 Bi→Bi+1 代表相继区块。*

  • 在我看来,这种做法更合乎逻辑,因为较新区块是较老区块的后代(或子代),这也秉承了原始 * 比特币白皮书 * 中的使用惯例。*

无需深究技术细节,我们就可以看到区块链是一幅图(即由节点和边组成),是有向的(即每条边都是 Bi→Bi+1 方向),而且是无环的。“区块 DAG”之所以是无环的,原因在于加密哈希函数的抗冲突属性。从本质上讲,要形成一个循环,我们必须找到两个各自区块标题的哈希值相同的不同区块,才可以破除这项属性。

因此,我们可以断定,区块链中的区块具备区块链作为 DAG 所需的全部属性。值得注意的是,区块链虽说的确是一幅 DAG,但它只限于简单的线性结构。

那么,交易呢?

交易 DAG

区块链的每个区块中都有一组交易,这些交易以各区块的区块标题中包含的二进制哈希树根(Merkle root)共同表示。换句话说,区块中的交易实际上也是加密哈希值的输入,用于在区块链的区块之间创建边。

出于同样的原因,有人可能会认为我们刚才讨论的 “区块 DAG” 与接下来要讨论的 “交易 DAG” 是相互关联的。但是,如果只是将区块视为一种不同类型的节点,从而形成区块 DAG,那么同样可以将区块链的交易视为另一种不同类型的节点,从而形成交易 DAG。

我们可以运用在推敲区块形成 DAG 时应用的相同逻辑来理解交易 DAG。以下可能就是这里要讨论的交易图形:

区块链基于 UTXO 模型运行,其中 “UTXO” 是指“未使用交易输出”。在这里不展开太多细节,重点了解:

  • 交易消耗(即使用)先前交易的 UTXO。*

实际上,这句话意味着每笔新交易都将包含对先前交易的引用。这种引用其实是交易标识(交易 ID),只不过是前一交易的加密哈希值,代码可以写作 H(Tx_prev)。

因此,正如区块通过哈希值引用前一区块形成区块 DAG 一样,交易也通过哈希值引用先前交易形成交易 DAG。

主要区别在于:这里 “区块” 是单数概念,“交易”是复数概念;区块只能引用前一区块,因为它们一个接一个地附加到区块链上,而交易则可以引用许多的先前交易,作为许多不同交易输入的资金来源。

因此,我们发现,相比较为单纯的区块 DAG,交易 DAG 的形式要复杂得多。区块 DAG 是一个连接节点简单线性序列;交易 DAG 则可以扩展成复杂的结构,其中交易引用许多其他交易(同时也被许多其他交易引用)。这里一并介绍有向图的最后几个术语,即节点的入度和出度:

  • 入度——指进入某节点的边的条数。
  • 出度——指从某节点出发的边的条数。

借助这些新术语,不难看出区块 DAG 非常简单,因为底层区块链协议规定区块的入度和出度必须始终为 1。相反,区块链协议允许交易有任意入度和出度。这就是为什么交易 DAG 看起来比区块 DAG 要复杂得多。

为了简单起见,我向来对这里的 “1” 和“任意”二词持宽容态度。对于短暂的区块链分叉,分叉起始的区块的出度会暂时 >1;但对于深度 “稳态” 区块,入度和出度会始终为 1。同样,交易的出入度实际上受限于(而非“任意”)规定的交易规模约束,但原则上是不受限的。

DAG 的入度和出度对相应图形可表示的结构的影响,这一概念留待下次考察 Metanet 图时再探讨。

别只听我说,您可以运用某某高能提供的奇妙的交易图可视化工具,自行验证这些概念,然后迷失在交易 DAG 的无底洞里。

Metanet 图

我们看到一个规则集(即区块链协议的规则集)可以描述两幅不同的 DAG:一个用于区块,另一个用于交易。

Metanet 协议只是在区块链协议之外应用的另一组规则,它允许我们定义另一幅 DAG:Metanet 图。

下一篇文章将研究 Metanet 协议描述的规则集细节,以及我们可以如何实施其规则来形成链上数据的有向图。但眼前,我想简单解释一下该协议以特定方式构建链上数据的一些动机。

为什么要使用 DAG?

有向图结构有许多固有的属性,非常适合类互联网数据的用例。下一次我们再详细介绍,这里只列举其中一部分:

  • 高效;
  • 可检索;
  • 灵活;
  • 基于本地。

今天,我想真正强调的一点是本地属性——使用 DAG 作为数据结构直接兼容区块链的底层数据结构。

为什么今天大部分的篇幅用在建立有向图的概念,并解释了其对于区块链各层面功能的基本作用,现在原因已经很清楚了。通过使用 DAG 构建链上的类互联网数据,我们直接利用了现有的区块链基础设施来实现目标。

换句话说,我们可以结合区块链作为点对点电子现金系统的基本用例来构建 Metanet。我们正在利用基层区块链的有用属性,以一种既支持使用微支付又能真正拥有正在商品化的数据的方式,实现链上价值网络的目标。

共存图

最后,请您注意交易 DAG 与 Metanet 图是如何相辅相成和共存的。

下次我们会发现,构成 Metanet 图的节点也是交易。因此,Metanet 图中的任何节点也必然是前述交易 DAG 的一部分。

上图有效地说明了 Metanet 图如何能够与交易 DAG 同时共存。图形之间的关系可以概括为:

  • 所有 Metanet 节点都是交易,但并非所有交易都是 Metanet 节点。*

那么,Metanet 图有什么规则,它又是如何实现的?

  • 敬请关注本系列,下一期将研究用于创建 Metanet 图的节点与边结构的细节以及有利属性。*

原文链接:https://metanet.press/rebirth/chapter-metanet/specification

你可能感兴趣的:(邱少闲聊Metanet,邱少贤撩Metanet)