链眼社区:专注于区块链安全,区块链数据分析, 区块链信息整合,区块链技术服务和区块链技术咨询。

Nervos 设计理念,项目架构和项目细节
扫地僧
2022-06-19 17:35:42

概述

Nervos 是一个分层的加密经济网络。Nervos 将加密经济的基础设施分为两层:用作信任根和智能保管人的验证层(第 1 层)和用于高性能交易和隐私保护的生成层(第 2 层)。

本文档概述了 Nervos 通用知识库 (CKB),这是一个公共的无需许可的区块链和 Nervos 的第 1 层。CKB 生成信任并将这种信任扩展到上层,使 Nervos 成为一个信任网络。它也是 Nervos 网络的价值存储,为网络中创建的资产、身份和其他常识提供公共、安全和抗审查的托管服务。

内容

一.动机

我们想要一个点对点的加密经济网络。

在这样的网络中,人们不仅可以协作,而且有这样做的动力。我们需要在点对点网络中定义、发行、转移和拥有资产的能力来创建这样的激励措施。区块链技术为我们带来了最后一块拼图。

比特币是第一个公共的无需许可的区块链,旨在仅用作点对点现金。以太坊扩展了区块链的用例,创建了一个通用的信任计算平台,人们在该平台上构建了各种去中心化的应用程序。比特币和以太坊网络上蓬勃发展的应用已经证明了未来加密经济的概念。然而,这些网络也存在着臭名昭著的可扩展性问题,它们的交易处理能力无法随着网络中参与者的数量而扩展,这严重限制了它们的潜力。

近年来,区块链社区提出了许多可扩展性解决方案。一般来说,我们可以将这些解决方案分为两类,链上扩容和链下扩容。链上扩展解决方案是那些试图在共识运行的同一层进行扩展的解决方案。共识过程是区块链协议的核心,节点交换网络消息并最终达成一致。从定义上看,共识几乎是缓慢的,因为公共和开放网络上的消息交换是缓慢且不确定的,节点必须等待并重试才能在共识过程中达成协议。要在这一层进行扩展,我们可以通过增加节点的处理能力和网络带宽来“扩展”(但由于硬件和基础设施成本高昂而牺牲了去中心化),或者通过分片“扩展”。分片的想法是将节点分成许多小的“分片”,并要求每个分片只处理一小部分网络事务。分片被互联网巨头广泛采用,因为它们在为数百万用户提供服务时面临同样的可扩展性问题。然而,分片以分片协调和跨分片事务的复杂性而闻名,即使在可信环境中,随着分片数量的增加,性能也会下降。

相比之下,链下扩展解决方案承认共识过程的固有复杂性。他们认识到不同范围内的共识会产生不同的成本,而由公共无许可区块链创建的全球共识是最昂贵的共识。虽然很难扩大全球共识,但我们可以明智地使用它。两方或多方之间的大多数交易不需要网络中的每个节点都知道,除非它们是安全结算的;换句话说,当用户想要将他们的交易变成网络的常识时。该网络通过将大部分工作卸载到上层来扩展,对可扩展性没有限制。在链下处理交易还带来了额外的好处,例如更低的延迟和更高的隐私。

虽然我们同意链下扩展的一般想法,但我们发现没有为它设计的现有区块链。例如,虽然闪电网络是链下扩容最早的探索之一,但它的测试网启动需要数年时间,并且由于底层比特币协议的限制,距离大规模采用还很远。以太坊提供了强大的编程能力,但其以计算为导向的经济模型并不适合链下扩容。由于链下参与者处理了大部分计算,因此需要一个能够将其资产安全保管并根据其计算的最终状态移动资产的区块链。以太坊面向计算的设计也使得并行执行交易变得困难,这是可扩展性的障碍。

当前区块链的经济模型也面临挑战。随着越来越多的用户和应用程序迁移到区块链平台,存储在区块链上的数据量也在增加。当前的区块链解决方案更关注共识和计算的成本,并允许用户支付一次,并且他们的数据永远占用整个节点的存储。加密货币价格也非常不稳定,随着加密货币价格的上涨,用户可能会发现难以支付高额交易费用。

我们提出了 Nervos CKB,这是一个为分层加密经济网络设计的公共无许可区块链。

二. 概述

Nervos CKB(Common Knowledge Base)是第 1 层区块链,是一个去中心化的安全层,为网络提供公共知识托管。常识是指经过全球共识验证的状态。加密资产是常识的一个例子。

在 Nervos 中,CKB 和所有第 2 层协议协同工作,为加密经济服务。CKB(或第 1 层)是存储和定义状态的地方,第 2 层是处理大多数事务并生成新状态的生成层(或计算层,这两个术语可以互换)。Layer 2 参与者最终在他们认为必要的时候将新生成的状态提交给 CKB。如果这些状态通过了全球网络中节点执行的相应验证,CKB 会将它们安全地存储在对等节点中。

分层架构将状态和计算分离,为每一层提供更大的灵活性和可扩展性。例如,生成层(第 2 层)上的区块链可能使用不同的共识算法。CKB 是共识最广泛的最低层,在 Nervos 网络中提供最安全的共识。但是,不同的应用程序可能偏好不同的共识范围,强制所有应用程序使用 CKB 的共识是低效的。应用程序可以根据其特定需求选择适当的生成方法。这些应用程序需要将状态提交给 CKB 以获得更广泛的协议的唯一时间是当它们需要使这些状态成为已被 CKB 全球共识验证的公共知识时。

可能的状态生成方法包括(但不限于)以下:

  • 客户端上的本地生成器:生成器直接在客户端的设备上运行。开发人员可以用任何编程语言实现生成器。
  • Web 服务:用户可以使用传统的 Web 服务来生成新的状态。当前所有的 Web 服务都可以通过这种方式与 CKB 一起工作,从而为生成的状态获得更多的信任和流动性。例如,游戏公司可能将游戏内物品定义为 CKB 中的资产,游戏本身作为 Web 服务,生成游戏数据,然后验证并存储在 CKB 中。
  • 状态通道:两个或更多用户可以使用对等通信来生成新状态。
  • 生成链:生成链是生成新状态并将其存储在 CKB 中的区块链。生成链可能是无许可的区块链或许可的区块链。在每一代链中,节点在更小的范围内达成共识,提供更好的隐私和性能。

CKB 由基于工作量证明的共识、基于 RISC-V 指令集的虚拟机、基于单元的状态模型、面向状态的经济模型和点对点网络组成。基于工作量证明的共识使 CKB 成为公共和抗审查的服务。CKB VM 和 Cell 模型的结合为开发人员创建了一个有状态的图灵完备的编程模型,使 CKB 上的状态生成(或第 2 层)变得实用。CKB 经济模型是为公共知识托管和长期可持续性而设计的。CKB 点对点网络在不同类型的节点之间提供安全和最优的通信。

三. 共识

CKB 共识是基于 Proof-of-Work 改进的 Nakamoto 共识,旨在在存在网络延迟和拜占庭节点故障的分布式环境中实现开放性、正确性和高性能。

无许可区块链在开放网络中运行,节点可以自由加入和退出,没有活跃度假设。这些都是传统 BFT 共识算法需要解决的严重问题。中本聪引入了经济激励和概率共识来解决这些问题。比特币中的 Nakamoto 共识使用区块作为投票,这需要更长的时间(长达 10 分钟到一个小时)来确认交易并导致较差的用户体验。

CKB 共识是 Nakamoto 共识的变体,这意味着它允许节点自由加入和退出网络。每个节点都可以通过挖掘(运行特定算法以找到工作量证明)来产生新块,或者通过验证新块的有效性来参与共识过程。CKB 使用 ASIC 中立的工作量证明功能,目标是尽可能均匀地分配代币,并使网络尽可能安全。

正确性包括最终的一致性、可用性和公平性。最终一致性保证每个节点都能看到相同的状态副本。可用性确保网络在合理的时间内响应用户的请求。公平性可确保采矿节点为保持网络安全运行所做的努力获得公平的回报。

高性能包括事务延迟、从提交请求到确认执行结果之间的时间,以及事务吞吐量,即系统每秒能够处理的事务数。这两种度量都取决于块时间,即两个连续块之间的平均时间。

四.编程模型

CKB 提供了基于 CKB VM 和单元模型的有状态的图灵完备编程模型。

比特币 以太坊 CKB
指令系统 脚本 虚拟机 RISC-V
密码原语 操作码 预编译 集会
有状态的 是的 是的
状态类型 账本 一般的 一般的
状态模型 UTXO 帐户 细胞
状态验证 链上 链上 链上
状态生成 链下 链上 链下

CKB 编程模型由三部分组成:

  • 状态生成(链下)
  • 状态验证(CKB VM)
  • 状态存储(Cell 模型)

在这个模型中,去中心化的应用逻辑被分成两部分(生成和验证),运行在不同的地方。状态生成逻辑在客户端脱链运行;新状态被打包成交易并广播到整个网络。CKB 交易具有类似于比特币的基于输入/输出的结构。交易输入是对先前输出的引用,以及解锁它们的证明。客户端包含生成的新状态作为交易输出,在 CKB 中称为单元格。Cells 是 CKB 中的主要状态存储单元,是用户拥有的资产,必须遵循脚本指定的相关应用程序逻辑。CKB VM 执行这些脚本并验证输入中包含的证明,以确保允许用户使用引用的单元格,并且状态转换在指定的应用程序逻辑下是有效的。这样,网络中的所有节点都会验证新状态是否有效,并将这些状态保管起来。

CKB 中的状态是一等公民,状态包含在交易和区块中,并直接在节点之间同步。虽然编程模型是有状态的,但在 CKB VM 中运行的脚本是纯函数,没有内部状态,这使得 CKB 脚本具有确定性,有利于并行执行,并且易于编写。

1. 状态生成和验证

Nervos 上的去中心化应用程序将状态的生成和验证分开。虽然这些过程发生在不同的地方,但 CKB 提供了额外的灵活性,可以利用不同的算法进行状态生成和验证。

在生成端和验证端使用相同的算法是解决一般问题的直接选择。在这个模型中,相同的算法有两种实现,一种在应用程序所针对的任何执行环境中脱链运行,另一种在 CKB VM 中链上运行。使用该算法(基于先前的状态和用户输入)在链下生成新状态,打包为交易,然后广播到网络。CKB 节点在链上运行相同的算法,为其提供相同的先前状态和用户输入,然后验证结果与交易指定的输出匹配。

  • 确定性交易:交易执行的确定性是去中心化应用的核心追求之一。如果交易仅包含用户输入,而新状态是节点计算的结果(如以太坊中所见),则交易创建者无法确定链上计算上下文,这可能会导致意外结果。在 CKB 中,用户在客户端生成新的状态。他们可以在将其状态转换广播到网络之前确认新状态。交易结果是确定的:要么交易通过链上验证并接受新的状态,要么交易被视为无效且未对 CKB 进行状态更改(图 1)。
  • 并行性:如果交易只包含用户输入,而新的状态是由节点生成的,那么节点将不知道验证过程将要访问什么状态,也无法确定交易之间的依赖关系。在 CKB 中,由于交易明确地包含了先前的状态和新的状态,节点可以在验证之前看到交易之间的依赖关系,并且可以并行处理交易。
  • 更高的资源利用率:由于应用程序逻辑被拆分并运行在不同的地方,网络可以在节点和客户端之间更均匀地分配计算工作量,从而更有效地利用系统资源。
  • 灵活的状态生成:即使使用相同的算法,开发人员也可以以不同的方式实现生成和验证。在客户端,可以灵活选择提供更好性能和快速开发的编程语言。

在某些情况下,状态验证可以使用一种不同的(但相关的)算法,该算法比用于状态生成的算法效率更高。最典型的例子是比特币交易:比特币交易构建主要包括搜索过程以识别合适的 UTXO 以使用,而验证是添加数字和简单的比较。其他有趣的例子包括排序和搜索算法:快速排序的计算复杂度是平均情况下最好的排序算法之一,它是 O(Nlog(N)),但验证结果的算法只是 O(N)。使用二分查找在有序数组中查找元素的索引是 O(log(N)),但其验证只需要 O(1)。业务规则越复杂,

通过利用状态生成和验证之间的不对称性,可以提高系统吞吐量。将计算细节转移到客户端对于算法保护和隐私也很有价值。随着零知识证明等技术的进步,我们可能会找到针对一般问题的高效生成和验证解决方案,而 CKB 天然适合这些类型的解决方案。

我们将生成新状态和创建新单元的程序称为生成器。生成器在客户端本地运行(链下)。他们利用用户输入和现有单元作为程序输入,以创建具有新状态的新单元作为输出。生成器使用的输入和它们产生的输出一起形成交易。

2 Cell

Cell 是 CKB 中的主要状态单元,用户可以在其中包含任意状态。一个单元格具有以下字段:

  • capacity- 单元格的大小限制。单元格的大小是其中包含的所有字段的总大小。
  • data- 状态数据存储在此单元格中。它可以是空的,但是一个单元(包括数据)使用的总字节数必须始终小于或等于其容量。
  • type:状态验证脚本。
  • lock:代表单元格所有权的脚本。单元格的所有者可以将单元格转让给其他人。

单元格是一个不可变的对象,创建后没有人可以修改它。每个单元格只能使用一次,不能用作两个不同交易的输入。单元格“更新”将以前的单元格标记为历史记录,并创建具有相同容量的新单元格来替换它们。通过构建和发送交易,用户为新单元提供了其中的新状态,并使以前以原子方式存储旧状态的单元无效。所有当前(或活)单元的集合代表 CKB 中所有公知的最新版本,历史(或死)单元的集合代表公知的所有历史版本。

CKB 允许用户一次性转移一个 cell 的容量,或者只转移一个 cell 的一小部分容量,这反过来会导致创建更多的 cell(例如,一个容量为 10 字节的 cell 可以变成两个容量为 5 的 cell每个字节)。

在 CKB VM 中执行两种脚本(类型和锁)。CKB VM 在交易输出中创建单元格时执行type脚本,以保证单元格中的状态在特定规则下是有效的。当交易输入引用单元格时,CKB VM 执行锁定脚本,将证明作为参数,以确保用户具有更新或转移单元格的适当权限。如果锁定脚本的执行返回 true,则允许用户根据type脚本指定的验证规则传输单元格或更新其数据。

这type和lock脚本对允许各种可能性,例如:

  • 可升级的密码学——任何人都可以部署用 C 或 C++ 等语言编写的有用的密码学库,并在脚本中使用type它们lock。在 CKB VM 中,没有硬编码的加密原语,用户可以自由选择他们想用来签署交易的任何加密签名方案。
  • 多重签名 - 用户可以轻松创建 M-of-N 多重签名或更复杂的lock脚本。
  • 借出 - 单元所有者可以将单元借给其他人使用,同时仍保持其对单元的所有权。

与 UTXO 或 Account 模型相比,Cell 模型是更通用的状态模型。UTXO 和 Account 模型都可以表达资产与其所有者之间的关系。UTXO 模型定义了资产的所有权(使用锁定脚本),而 Account 模型定义了所有者对资产的所有权(使用账户余额)。UTXO 模型使账本历史更加清晰,但它缺乏通用的状态存储,使得它已经没有表达力的脚本更难使用。Account 模型易于理解并且可以很好地支持授权和身份,但它对并行处理交易提出了挑战。lock带有和脚本的 Cell 模型type充分利用了这两种模型来提供更通用的状态模型。

3.虚拟机

CKB VM 是一个基于 RISC-V 指令集的 VM,用于执行类型和锁定脚本。它仅使用标准 RISC-V 指令,以维护符合标准的 RISC-V 软件实施,该实施可以包含最广泛的工业支持。CKB 将加密原语实现为在其 VM 上运行的普通程序集,而不是自定义指令。它支持系统调用,脚本可以通过系统调用从 CKB 读取元数据,例如当前交易和一般区块链信息。CKB VMcycles为每条指令定义,并提供在交易验证期间执行的总周期,以帮助矿工确定交易费用。

现有的区块链在协议中硬编码密码原语。例如,比特币具有特殊的加密操作码,例如OP_CHECK*,而以太坊使用位于特殊地址(例如0000000000000000000000000000000000000001)的特殊“预编译”合约来支持加密操作,例如ecrecover. 为了向这些区块链添加新的加密原语,我们只能软分叉(因为比特币重用操作码来支持新的原语)或硬分叉。

CKB VM 是一个加密无关的虚拟机。CKB VM 中没有硬编码的特殊加密指令。新的密码原语总是可以像普通库一样被脚本部署和使用。作为一个符合 RISC-V 标准的实现意味着现有的用 C 或其他语言编写的密码库可以很容易地移植到 CKB VM 并被单元脚本使用。CKB 甚至以这种方式实现了交易验证中使用的默认哈希函数和公钥加密。与加密无关,Nervos 上的去中心化应用程序开发人员可以在不影响其他用户的情况下使用他们想要的任何新加密(例如 Schnorr 签名、BLS 签名和 zkSNARKs/zkSTARKs),并允许 CKB 用户即使在后量子时代。

CKB VM 选择针对 ISA 的硬件,因为区块链是类似硬件的软件。虽然它的创建像软件一样容易,但它的升级却像硬件一样困难。RISC-V作为一个专为芯片设计的ISA,非常稳定,其核心指令集在未来难以改变。在不需要硬分叉的情况下保持与生态系统的兼容性的能力是像 CKB VM 这样的区块链虚拟机的一个关键特性。RISC-V 的简单性还使运行时成本建模变得容易,这对于交易费用计算至关重要。

4 交易

事务表示状态转换,导致单元传输、更新或两者兼而有之。在单个事务中,用户可以更新一个或多个单元格中的数据或将他们的单元格转移给其他用户。事务中的所有状态转换都是原子的,它们要么全部成功,要么全部失败。

一笔交易包括以下内容:

  • deps:依赖单元集,提供事务验证所需的只读单元。这些必须是对活细胞的引用。
  • inputs: 细胞参考和证明。单元格引用指向在事务中传输或更新的活单元格。证明(例如,签名)证明交易创建者有权转移或更新引用的单元格。
  • outputs:在此状态转换中创建的新单元格。

CKB 单元模型和交易的设计对轻客户端友好。由于所有状态都在块中,因此块同步也完成了状态同步。轻客户端只需要同步块,不需要额外的状态同步或状态转换计算。如果仅将事件存储在块中,则状态同步将需要完整节点。跨大型网络的状态同步可能很困难,因为同步的动机很弱。这与区块同步不同,后者激励矿工尽可能广泛地广播区块。该协议无需额外的状态同步,使轻节点和全节点成为更平等的对等点,从而形成更健壮和去中心化的系统。

CKB 交易中的depsandinputs使节点更容易确定交易依赖关系并执行并行交易处理(图 3)。不同类型的单元格可以混合并包含在单个事务中,以实现跨类型的原子操作。

五.经济模型

精心设计的经济模型应激励所有参与者为加密经济的成功做出贡献,并最大限度地发挥区块链的效用。

CKB 经济模型旨在激励用户、开发者和节点运营者朝着共同知识托管的共同目标努力。CKB 经济模型的主题是状态而不是计算,通过使用单元容量和交易费用作为对利益相关者的激励。

1. 状态成本和电池容量

在 CKB 上创建和存储状态会产生成本。新状态的创建需要全节点验证(这会产生计算成本),并且状态的存储需要全节点持续提供磁盘空间。目前的无许可区块链只收取一次性交易费用,但允许状态存储在所有全节点上,无限占用存储空间。

在 CKB 中,cell 是状态的基本存储单元。单元所有者可以使用单元来存储自己的状态或将其借给他人。因为一个 cell 的容量一次只能由一个用户使用,所以使用该容量的所有者自己会放弃通过借出容量(给 CKB 或其他用户)来赚取利息的机会。有了这个机会成本,用户支付的存储成本与空间和时间成正比——容量越大,占用的时间越长,他们产生的机会成本就越高。CKB 隐式状态成本模型的优势,与预付费模型(例如以太坊社区讨论的存储租金)相比,

单元元数据(capacity和type)lock是状态,它会占用用户的单元容量并产生状态成本。这种元成本将激励用户在可能的情况下创建更少的单元,从而提高容量效率。

2. 计算成本和交易费用

更新单元格的数据或转移单元格所有权会产生交易费用。矿工可以根据使用的 CKB VM 周期和交易验证中的状态变化来设置他们愿意接受的交易费用水平,让市场来确定交易费用。使用上述编程模型,单元所有者还可以代表其用户支付交易费用。

由于 Cell 容量是 CKB 中唯一的原生资产,是用户支付交易费用最方便的资产。但是,只要矿工接受,用户也可以使用任何其他用户定义的资产;CKB 交易中没有硬编码的支付方式。这在 CKB 中是允许的,因为它的经济模型和原生资产不以计算为中心,而是以状态为中心。虽然单元容量可以用作支付交易费用的手段,但其主要功能是安全的公共知识存储,可以存储状态并长期保存。收费市场的支付方式竞争并没有损害其价值。

将交易费用支付方式限制为区块链的原生资产是阻碍区块链大规模采用的重大障碍。这要求用户在使用任何区块链服务之前获得原生资产,从而提高了新用户的进入门槛。通过允许 Cell Owner 代表其用户支付费用并允许使用任何用户定义的资产进行支付,CKB 可以为用户提供更好的体验,并为开发者提供更广泛的商业模式选择。

六. 节点类型

我们可以将 CKB 节点分为三种类型:

  • 挖矿节点:他们参与 CKB 共识过程。挖矿节点收集新交易,将它们打包成块,并在找到工作量证明时生成新块。挖矿节点不必存储整个交易历史,只需存储当前单元集。
  • 全节点:他们验证新的区块和交易,中继区块和交易,并选择他们同意的链分叉。全节点是网络的验证者。
  • 轻节点:他们信任完整节点,只订阅和存储他们关注的单元子集。他们使用最少的资源。用户越来越依赖移动设备和移动应用程序访问互联网,轻节点旨在运行在移动设备上。

统一的区块链网络(其中每个节点具有相同的角色并执行相同的功能)目前面临着严峻的挑战。全节点验证所有区块和交易数据,需要最小的外部信任,但它们会产生更高的成本并且运行不方便。轻客户端以最小的信任换取交易验证成本的大幅降低,从而带来更好的用户体验。在成熟的加密经济网络中,最大的节点群是轻节点,其次是全节点和挖矿节点。由于轻节点依赖全节点进行状态和状态验证,大量轻节点将需要大量全节点来为它们服务。借助 CKB 的经济模型,全节点所需的计算和存储资源都可以保持在合理的水平,

七、总结

我们设想一个分层的加密经济,CKB 是它的基础层。CKB 是这种加密经济的去中心化信任根,它确保了上层去信任活动的安全性。这是一个公共知识托管网络,其中状态通过全球共识进行验证并存储在高度可用的点对点网络中。CKB 是从零开始设计的,以满足分层架构的需求,其设计侧重于状态而不是计算。在 CKB 中,用户和开发者可以定义、发行、转让和存储加密资产,他们还可以创建数字身份并在加密经济中使用这些身份。只有我们的想象力是它的使用范围。

原文链接:https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0002-ckb/0002-ckb.md#1-motivation