密码极客 | 国内最权威的区块链技术创投社群

Nervos:链外扩容 + Layer 2才是区块链的未来

VOBCVOBC 2019-08-13 16,684 次 收藏0

5月14日晚,密码极客邀请到了Nervos的联合创始人兼COO吕国宁先生做客“密码极客大咖直播间”,为大家详细讲述了Nervos的链外扩容与Layer 2设计。吕国宁先生曾是全球最大以太坊钱包imToken的CTO。

以下为吕国宁先生的分享全文。

 

非常感谢密码极客的邀请,也非常感谢能在这里跟大家分享。这次过来主要是想跟大家聊一聊在过去近一年的时间里,Nervos从立项到现在取得的一些进展,以及更进一步地跟大家探讨区块链链外扩容的一些相关话题。

我会着重跟大家讨论三个点:

1、重新回顾Nervos基于分层架构设计的链外扩容方案;

2、跟大家介绍一下,Nervos基于分层的架构设计所派生出的一套设计方法学;

3、介绍Nervos在链外扩容这方面取得的几个技术特点。

分层架构下的链外扩容方案

目前区块链的发展都面临着一个共同的问题,就是可扩展性的问题,整个行业内一直在尝试用很多的方法去解决这个问题。

比如说现在大家观察到区块链的性能瓶颈是共识算法不够高效,那么要不要去选择一个更高效的共识算法,于是就有了PoS 以及PoS 的变种共识算法。

还有一些项目方觉得采用链式数据存储的方式来存储区块,采用最常见的胜出模式不够高效,于是有些团队希望换用另外一种更高效的拓扑数据结构,让网络可以并行的去处理更多的交易,于是就有了DAG 方案。

另外有团队认为区块链的核心问题是单线程,这种处理方式的效率太低了,不够高效,能不能够把交易的处理并行起来,把处理的所有的节点分成若干个组,然后每个组并行的去处理交易,于是有了Sharding 技术。

以上,不管是用更好的共识算法,还是DAG 方案,还是Sharding,在我们看来,都可以归纳为链上扩容方案。所谓的链上扩容方案,都是基于大家对现有的链的性能觉得不够,希望能做出一条更强的链。然后在做更强链的方向基础之上所派生出的技术。

在我们看来,所有的链上扩容方案,不管是DAG、Sharding,还是换一种新的共识算法,背后想要在一条链上去解决性能问题,都需要做出一些其他方面的妥协。

比如说你换用一种PoS 共识算法,可能会要在网络的去中心化,甚至安全性方面做一些妥协,如果你使用了Sharding ,它其实带来了一定实现方面的复杂度,而这种实现的复杂度,在现实的场景当中其实并没有经过充分的验证,所以它还需要在工程方面做一些调整。

我们其实一直在问自己一个问题,我们需要做一条更强的链吗?或者说区块链的终极目标是大家去比较谁能把链做的更强吗?如果用一条链能够解决所有的问题,那么这条链会不会变得非常复杂和臃肿?

在思考这些问题的时候,我们觉得下一代的区块链如果朝着这种复杂、臃肿的甚至比较难以工程实现和验证的方向去发展的话,那它不是我们的追求目标,我们认为未来的区块链其实更大的机会在于链外扩容,所以我们提出了分层的方案。

这里插入比较有趣的一个观点,基于区块链的去中心化的分布式系统,如果它想要追求性能,它永远也不能追上中心化系统,这个说法叫做没有共识算法能比没有共识算法的共识算法更快。

什么意思呢?如果你想在去中心化的系统中得到最快的性能,最好的办法是不要共识。

一个Permission less 的区块链网络,节点之间无需信任,节点能够自由加入或退出,它的核心是要达成一个全球共识,并且这个共识人人可见,节点之间需要互相交互传递和验证数据,而这些每一个步骤加在一起,它的效率永远不会超过中心化的系统,所以区块链作为一个去中心化的系统,它只可能比中心化的系统更慢,而且你还需要让这套系统去做更多更复杂的事情,从我们的理解上来说,它很难在工程上面能够追平中心化系统。

基于分层思想的设计方法学

下面我们来分享Nervos 基于分层思想设计区块链的方法学。因为上述原因,我们认为单方面追求一条链的性能的提升是有问题的,我们其实应该把这个问题反过来想,如果区块链本身就很慢,这个共识就是有成本,它就是一件比较复杂的事情,那么我们应该接受事实,全球共识又慢又贵,所以全球共识就变成了一种稀缺的资源,我们应该用一种更巧妙的方式去利用这种稀缺的资源,把它的价值放大。

只要我们通过工程手段把区块链带来的价值放大出来,那么我们就可以让区块链去服务到更多的人和更多的系统,所以我们可以不用去考虑性能,更多去考虑怎么把区块链的价值放大。

因此,我们选择了链外扩容的思路,把比较复杂的计算任务放到链外去做,然后把数据的验证和真正需要全球共识的操作放到链上,剩下计算的部分全部放到链外,这是我们在设计分层的一个基本思路。

Nervos 设计的出发点不是为了做出一条更强的链,它的目标是去实现一个丰富的加密经济生态,并且通过去我们的区块链,为这个加密经济生态提供底层的基础设施服务。

基于我们的设计思想,Nervos 所承担的角色是一个加密经济生态的底层,也就是我们所说的Layer 1 ,Layer 1 只需要关注安全和去中心化;性能和用户体验、以及满足各类商业场景的应用需求的部分放到Layer 2 去做。

通过Layer 1 提供安全和信任来保护区块链应用的安全性,也就是说Layer 1 能把自己的信任传递到Layer 2 上。

如果我们认为分层是未来区块链发展的一个重要方向,我们就要考虑怎么去设计这个网络,在考虑设计这个网络的时候,我们更多要去考虑未来上层网络上的Layer 2 的应用,他们会对底层产生怎样的需求,然后我们通过充分的考虑这些应用对底层的需求,再去设计一个底层的网络,去充分的支撑上层的系统。

Layer 2 的特点是它不需要使用全局共识,通过一个局部共识,它就可以达到一个非常高的性能。所以Layer 1 的核心显然是不应该关注性能,因为Layer 2 才应该去关注性能。所以Layer 1 的核心是去保证能为Layer 1 的上层协议参与者提供一道防线,它更加应该关心的是安全性和去中心化,所以Layer 1 需要实现的是最大范围的一个共识协议。

Layer 1 需要去验证Layer 2 向Layer 1 提交的状态,所以Layer 1这一层需要一个强大的可编程能力的虚拟机,去支持各种状态的验证和逻辑,这意味着,在Layer 1 这一层需要有一个灵活强大的编程模型去支撑Layer 2 提交的各种密码学的证据,然后去完成验证。

因为Layer 2 是不断的发展的,所以我们需要让Layer 1 保证一定的灵活性,这样它可以灵活地去支持各种不同类型的密码学原语,这样才能够让Layer 1 始终去承担作为Layer 2 法院的这样一个角色。

当我们再把Layer 1 和Layer 2 放在一起合力考虑的时候,我们会发现我们必须要针对Layer 1 去设计一个合理的经济模型,并且需要考虑这个网络中每一个参与方的价值和利益对齐,才能保证这个网络长久安全可靠的运行。所以在考虑如何去设计我们的网络的时候,我们总结出了四个关键点:

1、Layer 1 提供一个最大范围的安全的共识;

2、灵活的可编程模型;

3、能够灵活的支持最新的密码学原理的加密算法;

4、针对其中的Layer 1 去设计一个匹配的经济模型。

以上谈到了Nervos 基于分层架构的体系,接下来我想介绍过去一年我们在Nervos 开发当中,针对Layer 1 我们在技术上取得的一些成绩。

技术进展:Cell Model

第一个我想介绍Nervos 的技术特点叫做Cell 模型,它的中文意思是细胞。所以Cell 模型用中文说就是细胞模型。

我们的网络是一个分层网络,它有Layer 1 和Layer 2,我们主要Focus 在Layer 1 这一层,在Nervos 当中Layer 1 这一层,它的名字叫做CKB。在CKB 中我们引入了Cell 模型的设计,这是因为我们去支持 Layer 2 的时候,一定要有能力去存储来自于Layer 2 提交到Layer 1 上的各种各样类型的数据,以及在存储数据的时候对这个数据进行验证,并且为这个验证的结果达成全局共识,所以我们需要Cell 模型拥有非常强的能力。

如果熟悉比特币底层协议和实现的朋友,一定知道比特币底层的账本模型是基于一种数据类型,叫做UTXO,而一个UTXO 就代表着一个比特币资产当前的状态。Cell 模型其实跟UTXO 模型有很多地方是比较接近的,我们一般说Cell 模型是对UTXO 模型泛化的设计。

比特币网络中一个UTXO 只有两个部分,第一个部分是记录UTXO (未花费的交易输出)的数额是多少,另外它还有一个部分叫做Lock,这个代表了谁可以去花费这个UTXO。

所以比特币的底层是由UTXO 的集合去构建的,当网络中的节点收到一笔新的交易的时候,节点只需要去验证这笔交易当中要被花费掉的那笔比特币是不是存在于这个UTXO 集合当中,如果是的话,就证明这个比特币没有被两次花费。

比特币的网络有一个问题,就是它只支持一种资产,它没有办法在比特币的网络上原生的去支持用户的自定义资产。

但是当你要去设计一个Layer 1 的时候,它非常重要的能力,就是除了这个网络的原生代币资产之外,你还必须允许用户可以发行自定义的资产,并且网络的安全性要去同时保护这个网络的原生资产和用户的自定义资产。

所以我们在考虑做Cell 模型设计的时候,要去考虑它如何去除了支持原生资产的同时,还要去支持用户自定义的资产,并且这个整个资产模型是受到矿工算力的保护的。

一个Cell 代表着用户的一份资产,这一份资产有自己的标识,也有自己的状态、并且也可以存储相对于这个资产的业务逻辑,同时我们还做到了资产的定义和资产的状态分离,也就是说,每一个Cell 可以单纯的只存储它的状态,并且能够把它围绕这个状态的业务逻辑存到另外一个Cell 当中去。

而ERC20 的这种记账方式,其实是对单一用户的单一资产,把它映射到了Layer 2上,这是非常不友好的。

通过资产的逻辑和状态分离这种机制的设计,我们可以让用户通过自己的Cell 去存储自己的资产的状态,同时可以让多个用户的资产指向同一个逻辑,这就实现了一种可以自定义用户的资产发行。这就实现了可以让用户在Layer 1 发行一种自定义资金资产,并且让这个资产可以分散存储在用户手中这样一种形式。

每一个用户可以用自己的Cell 去存储自己的资产,这带来的好处是用户和用户的资产之间互相是隔离的,这会对Layer 1 如何把一个用户的资产都映射到Layer 2 提供了一个非常大的便利性,如果大家了解以太坊的ERC 20 Token 就知道,一个以太坊的ERC 20 合约,其实就是一个第三方记账人,它通过一个合约去维持了所有用户的所有的资产的状态。

而这个关键特性完全是由Cell 的底层设计的灵活性带来的!

Cell 模型让每个用户在自己的Cell 当中存储了用户自己的资产,并且每个用户对于同样一个资产在每个用户的Cell 中互相隔离,实现了状态和逻辑分离的这样设计,最大限度地提供了一种资产操作的灵活性。而这样一种灵活性是真正的由内而外去Support Layer 2 的,这是Layer 2 中最关键的一个特性。

技术进展:CKB-VM

下面我想跟大家介绍一下Nervos CKB 的VM (虚拟机)设计。

在Nervos CKB 这一层, 我们不仅设计了基于Cell 的账本模型,我们还设计了一个全新的VM ,在设计CKB VM 之前,我们发现很多区块链项目并不会用真实的CPU 指令去设计自己的虚拟机,比如说我们知道的以太坊下一代虚拟机,会用WebAssembly 去实现。

我们觉得使用带有高级语言特性支持的虚拟机,虽然可以在虚拟机层面上提供更多的便利,但是这些便利其实也都是有一些代价的。

比如说任何一个功能复杂的带有高级语言特性的虚拟机,无论它多么的灵活,它都不可避免地会在设计层面上引入一些语义的约束,并且为了在性能上面做到一个比较好的优化,它会在不同的语言之间去引入一些相同的语义,这样比较容易优化,但是这样一来,这个虚拟机自身的灵活性就会受到一些限制。

我们在做Layer 1 虚拟机选型的时候,认为灵活性是一个非常重要的特性,我们不希望让虚拟机由于追求高级系统而去失去一些灵活性。与此同时,一个带有高级语言支持功能的虚拟机,通常也会去支持一些高级的数据结构和算法,而这样做最终会导致一个问题,这个虚拟机会容易偏向于某一类型的应用开发,这也是我们在考虑虚拟机对高级数据类型支持的时候看到的一个问题,所以我们希望虚拟机本身的数据结构或者是算法能够保持最大的兼容性。

还有一个显而易见的特性是,所有项目虚拟机的实现最后都要在冯诺依曼CPU 的架构之下才能运行,不管你是X86 还是ARM,所有高级虚拟机的这些特性,最后都要映射到现代冯诺依曼体系架构下CPU 汇编指令去执行。

所以我们在想我们的Layer 1,为什么要去追求实现一个高级语言功能支持的虚拟机,而不是通过真实CPU 指令集构建的虚拟机?

如果使用真实的CPU 指令集来构建我们的虚拟机,我们可以添加静态验证,也可以添加高级的数据结构,或者是加密算法支持,在不丢失这些高级特性的同时,我们还可以最大化这个VM 的灵活性,通过真实的CPU 指令集,可以最大限度的保持开发者利用这个虚拟机去写出程序的可能性。

使用基于CPU 指令集实现的虚拟机,还有一些在灵活性之外的其他优势。

第一个优势是稳定性。

与通常是软件实现的VM 指令集相比,硬件指令集显得非常稳定,我们在做Layer 1 的时候,稳定性也是我们考虑的一个非常重要的特性,所以硬件指令机的稳定性跟我们的需求非常契合。

第二个优势是运行期的透明性。

基于CPU 指令集实现的虚拟机,它在程序执行期间,可以非常方便地根据虚拟机的堆栈指针来获取堆栈空间的使用情况,从而我们可以比较容易的去分析这个虚拟机内部程序运行的状态,甚至可以让这个状态更具可变性。

第三个优势是可以准确的去计算运行时的开销。

因为虚拟机里面跑的是真实的CPU 指令集,所以每一个指令执行器的塞口数量是固定的,我们可以根据塞口数量来精确的测量出每一步计算所需要的真实的硬件开销,这个在经济模型和计算交易执行和验证的费率的时候,是一个非常重要的特性。

通过适度的优化,也可以在一些执行加密密码学和加密原语的计算上,引入一些即时编译,即Just In Time(JIT)的特性,这些特性也可以非常方便地让虚拟机能够在签名验证等这些比较复杂的计算场景下,做到一个非常好的优化。

所以Nervos 在虚拟机这一层,就使用了RISC-V 指令集实现了我们的虚拟机。

另外必须提一下,由于Cell 模型对任意类型数据存储的支持,再加上虚拟机的配合,我们可以去支持丰富类型的加密原语!

我们可以把密码学的函数,通过C 语言编译成可以在虚拟机上执行的一段代码,然后再把这段代码存在Cell 里,之后可以在虚拟机里去通过指令去调用Cell 里的这段代码,然后把它放到内存中去执行。

基于这种模式,我们可以不断的为系统增加新的密码原语,而不需要做Hard Fork,因为不管是比特币还是以太坊,如果你想要增加一种新的密码学的功能支持,就必须做一次Hard Fork,但是在我们的系统上这是不必要的。

这是我们所说的Crypto Friendly,你可以非常方便的去增加新的密码学原语。因为Layer 1 在分层架构中所扮演的重要角色就是去验证各种Layer 2 提交过来的密码学证据。这些密码学证据会涉及到各种加密算法。过去有一个比较通行的做法,就是把虚拟机里密码学的支持通过一个op_code,直接硬编码在虚拟机当中,然后通过底层去实现。

由于Cell 模型的这个特点,我们可以不增加任何的op_code, 仅仅把新的密码学功能编译好了以后,放到一个Cell 里,我们虚拟机马上就可以调用,我们觉得这样可以最大限度的避免未来的系统需要硬分叉去增加新功能、新的密码学功能的情况,这对于我们来说是一个非常重要的特性,也是我们的虚拟机带来的一个非常重要的特性。

技术进展:Token Economics

下面,我想跟大家分享的是在分层模型当中,我们针对Layer 1涉及的加密经济学,也就是我们的Token 经济模型。

在讨论经济模型之前,我想跟大家先讨论一个问题,大家觉得经济模型对于一个区块链项目来说,它的目标是什么?

我们可以观察到现在绝大部分区块链的主网络,它经济模型设计的主要目标都是为了帮助共识的达成。这个怎么解释?经济模型的设计会去激励网络中所有节点去达成共识,或者更高效地达成共识,从而去获得一笔奖励。如果有人在里面作恶,那么经济模型的作用就是惩罚作恶者,或者不给作恶者奖励,这种激励好人惩罚坏人的方式,就是现在所有经济模型在区块链网络当中所扮演的主要角色。

但如果我们在考虑下一代区块链经济模型设计的时候,经济模型设计的主要功能仅仅是为了帮助这个网络达成一次共识吗?

我们觉得Layer 1 经济模型设计的主要目标是去想办法通过经济模型和技术手段去帮助Layer 1 去支撑一个更加繁荣的加密经济生态。

所以它的经济模型不仅是帮助这个网络去完成共识,还需要在长久的运行过程中去激励网络所有参与方更好去给这个网络去贡献价值,并且可以去吸引到更多的用户、开发者和参与方参与进来,最后能够去达到一个繁荣的加密经济生态。

我们归纳一个好的经济模型,要有三个主要的目标:

1、保证这个网络长期的安全和持久稳定的运行;

2、协调所有的参与方,让大家的价值和利益能够对齐;

3、帮助这个网络完成价值的捕获。

先说第1 点,经济模型的设计如何能够保证主网络长久安全稳定的执行?

在这里,我想跟大家谈一个现有经济模型设计当中,在目前主网络中越来越重要的一个问题——状态爆炸问题。

不管是比特币还是以太坊或者其它的网络,其实都存在一个状态爆炸的问题,目前大家都会针对计算进行收费,但是不会对存储进行收费,不管是计算还是存储,都是网络当中的一种资源。

但计算资源和网络资源有一个明显的区别,计算资源是一种瞬时资源,或者可以说是可再生资源,而网络资源其实是一种不可再生的持久化资源。当你使用计算资源的时候,你只是为了这一秒的计算资源付费,到下一秒的话计算资源又会再生出来,但是如果你存储了数据之后,到了下一秒,这个数据是不会删除的。

这就导致了一个问题,在现在网络当中,我们每次产生一笔交易,并且要在主网络上写入一笔数据的话,我们只为这次数据的写入支付一次费用,然后网络就会长久地把这些数据存储下来,每个节点都会帮你存储一份这种数据,而且无论这个数据存储的时间有多长,你都不用再为这些数据去额外的付费,但是节点会长久的保存。

如果这个问题不加以控制的话,大家就会看到这个趋势,任何一个网络它的状态空间逐渐的增长,而且是无止境的增长。

从经济学角度去考虑区块链状态爆炸的问题,其实跟经济学当中公地的悲剧问题有关,即公共资源如果在不加以约束和管理的情况下,每一个参与方都会倾向于最大限度的去使用公共资源,最后就会导致这个资源非常快的消耗殆尽。

而在目前这一代区块链中,我们使用存储的资源的时候,只付一次性的费用,而不需要额外付费。

所以这个模型导致的问题随着时间的推移会越来越严重。而这个状态爆炸的问题,它会带来一个很明显的问题——去运行一个全节点的成本越来越高。

当运行全节点的成本越来越高,就会导致网络当中的全节点的数量越来越少。当网络中的全节点数量越来越少,这个网络的安全性和它的这个可持续的运行的特性是会下降的,所以在经济模型的设计的时候的话,你必须要去考虑状态存储的问题。

下面我想跟大家讨论一个关于价值对齐方面的问题,关于价值捕获。目前的智能合约平台都会有一个问题,就是智能合约上的Native Token,没有办法去捕获智能合约平台上所发出来的资产所带来的价值。

拿以太坊举例,其Native Token (以太币),它本身的核心作用是用来给这个交易和合约的调用去支付一定的交易手续费。

只有网络比较拥堵的情况下,才需要去支付更高的交易手续费。但网络所需要的交易手续费是非常少的,所以其实只需要很少的一点,以太币就可以去支撑这个网络上所有交易手续费的支出,以太坊上的矿工是通过收取出块奖励和交易手续费被激励的。

在以太坊上发行的ERC 20 Token 的价值跟以太坊的Native Token,其实并没有什么直接关系。

也就是说,在以太坊上,Token 价值无限的增长,也不会带来以太币价值的增长。因为以太币内生的价值属性,只是去支付矿工计算的成本,所以他们跟ERC 20 Token 价值的增长没有直接的关系。

如果这样去看的话,所有的以太坊上的ERC 20 Token,其实是变相的去共享了以太坊的安全模型,也就是以太坊上所有矿工提供的安全性。

如果以太坊上面所有的Token 享受了以太坊上矿工提供的安全性,而以太坊的矿工只能通过以太币来得到激励,这样是很难去保证这个网络长久安全性的。

因为当以太坊上Token 的价值越来越大的时候,如果这些Token 不会带来以太币价格的提升的话,这个网络会变得越来越非危险,或者越来越有被51% 攻击的可能。

当前主流的这些网络,都没有在用户Token 价值增加,进而提升Native Token 价值,从而进一步去激励矿工提供更好的安全性这个问题上给出比较好的答案。

从经济模型设计层面上来讲的话,我想谈的一个问题叫做饿死的Layer 1,是什么意思呢?

如果一个网络上的矿工除了出块奖励作为经济基激励之外,还要依赖于交易手续费的话,那么当这个网络产生的一些Layer 2 的方案,比方说闪电网络,它可以把主网络上大量的交易放到了Layer 2 的网络上去操作,而Layer 2 上大量交易所带来的价值,或者说交易手续费是跟Layer 1 上的矿工是没有太大关系的。

所以我们会预见到,在未来如果随着Layer 2 技术越来越成熟,Layer 1 的矿工将更难收到手续费。

基于上面这些关于状态爆炸问题、Native Token 如何捕获价值的问题,以及Layer 2 的发展会导致Layer 1上的矿工收不到手续费的这些问题,我们都有一些考量,并且提出了一套我们自己的经济模型设计。

我们对CKB 进行经济模型设计的时候,其实充分考虑了现有经济模型设计中的种种问题,包括但不限于上面提到的三个经济层面的问题。

当用户持有CKB,其实代表的是用户持有一定的存储空间,你可以用这些存储空间去开发你的应用,也可以交易。同时我们引入了非常新颖的一套机制,叫做Nervos DAO,,就是当用户要放弃掉自己CKB 的流动性,同时也不需要这些CKB 去换取存储空间的话,它可以把这个CKB 存到Nervos DAO 当中,而Nervos DAO 将会为存储CKB 的用户支付一定的利息。

通过一整套经济模型的设计,我们其实是把开发者、矿工以及用户每一种参与方,他们的价值和利益都进行了充分的考虑,并且对齐,所以如果大家有进一步了解我们经济模型的兴趣的话,欢迎大家去看一下我们前段时间发布的经济模型的提案,因为展开讲会有比较大的篇幅,我就不展开讲我们的经济模型设计了。(https://github.com/nervos-community/RFC-CN/blob/master/README.md)

NC-MAX

最后我想提的我们的底层技术——我们的共识算法。

前段时间我们的研究员张韧博士在IEEE S&P 发表了一篇关于共识算法定量分析的一篇论文,S&P 是一个国际的安全顶会,我们非常开心,也非常恭喜我们的张韧博士,Nervos CKB 的共识算法也是由张韧博士设计的。

我们的Layer 1 追求的是去中心化和和安全性,在考察了现有所有可选的共识算法之后,我们认为最符合Layer 1 的共识算法依然是PoW 共识算法。

所以 Nervos Layer 1的最底层所使用的共识算法依然是PoW 算法,我们给它起了一个名字叫做Nakamoto Consensus Maximum。简称NC-Max 算法。

NC-Max 共识算法的特点是在不牺牲安全性和去中心化的特点下,尽可能的去优化性能,去压榨底层硬件和带宽中的每一滴资源。

在这里面其实有几件事情可以做:

首先我们在设计共识算法的时候,我们非常强调的是带宽的利用率,从带宽利用率的角度去分析,达成共识算法过程消耗带宽会有三部分:

1、达成共识的计算所需要消耗的带宽;

2、节点之间互相传输数据所需要消耗的带宽;

3、未被使用浪费掉的带宽。

为了优化我们的共识算法,我们所采取的策略是使用更加高效的哈希函数去实现我们的共识算法,从而在不牺牲安全性的情况下,去降低计算部分的带宽消耗,同时我们可以让节点之间通过两段式提交和一些其他手段去降低节点之间传输的数据量,从而进一步的最大化去利用我们的带宽。

我们的共识算法是尽可能减少浪费掉的带宽消耗,而去把带宽充分的打满。为此我们的共识算法是基于孤块率来设计的模型,而不是基于固定的出块时间。

基于孤块率来设定我们的共识算法而不是基于固定的出块时间,是我觉得非常有趣的一点,值得跟大家简单说一说。

基于孤块率这种方式来动态调整我们出块时间的共识算法,最大的特点就是它可以尽可能的利用带宽。比如说如果我们认为当出块率低于5%,是一个比较安全的网络。当孤块率低于5% 的时候,我们可以减少出块时间,可以出更多的块。但如果我们的孤块率高于5% 的时候,我们认为这个网络可能变得不稳定,我们可以延长网络出块时间,这样就可以始终维持网络的孤块率在一个稳定的Level 上。

基于这一点会带来一个很大的好处,如果未来一年全球平均带宽比今天的带宽增加了1 倍,我们可以在不做任何的调整的情况下,自动让我们的共识算法的TPS 随着全球平均带宽的增长而增长。

今天针对Nervos 过去一年多所取得的技术进展的分享,大概要接近尾声了,最后总结一下。

在过去一年中,我们基于分层的架构设计了Nervos,实现了一个更加灵活和强大的基于Cell的账本模型,一个基于真实CPU 指令集,即RISC-V 指令集实现的一个非常灵活,非常适合Layer 1 的VM。同时我们为了让Layer 1可以长期的稳定的运行,我们设计了一个独特的经济模型,同时我们有了一个充分利用带宽的共识算法。

目前我们测试网已经上线,大家如果对挖矿感兴趣可以访问官方文档 (https://docs.nervos.org/getting-started/run-node)跑一下节点,挖矿过程中如果有疑问可以在我们论坛上随时提问。( https://talk.nervos.org/c/45-category/41-category)

问答环节

互动嘉宾

贺鹏飞

嘉宾介绍:Kaleido公有链技术合伙人,前迅雷技术总监,十余年互联网技术研发经验。任职迅雷期间打造会员离线下载业务,覆盖500万付费用户,后在网心科技基于百万级玩客云节点打造出分布式存储平台TCFS。

贺:刚才您提到一个思想,我觉得很有趣,就是关于以太坊上面的ERC 20的 Token 的价值并没有被以太坊的矿工所共享。那么Nervos 是怎么解决这个问题的?刚才吕国宁您发的资料里面,我看了有一点,是收取二级发行的状态租金来进行的一种利益共享,这一点可不可以请您再进一步的做一下说明?

吕:好的,这是一个好问题,也是一个关键问题。我觉得我可以稍微展开讲一下,在Nervos 所设计的Layer 1 底层网络当中,Layer 2 产生的价值如何捕获到Layer 1上去的。

你的这个问题当中提到了基础发行和二级发行,其实基础发行和二级发行,跟Token 价值的捕获应该分成两个问题来讨论和考虑。

Nervos 经济模型设计当中的基础发行,其实是一种激励模型,它会帮助网络在早期阶段让矿工可以获得比较大的出块奖励的收益,同时这个基础发行每四年会减半一次。

而二级发行是为了解决矿工的一个长期激励的问题,也就是说当有Layer 2 的网络参与的过程中,产生一个叫饿死的Layer 1的问题,当矿工不能够完全的依靠交易手续费来获得足够的经济激励的时候,我们必须让这个网络可以持续的给矿工激励,而二级发行就是去解决这个问题。

你前面的问题,最重要的部分是用户自定义Token 在Layer 2 上产生的价值该如何捕获?

为了解决这个问题,我们的核心设计的原则是:用户必须在Layer 1 上发行自定义的Token,当用户去发行它的Layer 1 Token 的时候,他必须要去使用我们的Native Token 去提供他的Layer 2 Token 的存储空间。也就是说用户发行的自定义Token 是对我们的原生Token 有一定的功能性需求的。

当用户把自己在Layer 1 发行的自定义Token 映射到Layer 2 上去交易的时候,这些Token 实际上还是锁定在Layer 1 上的,并且占有空间,而占用空间的这部分Token 实际上是享受了Layer 1 矿工的算力保护的,同时它也在不断的激励矿工。如果Layer 2 Token 数量持续的增加,交易持续增加,它对Layer 1上状态空间的需求也是持续增加的。而这部分持续增加的需求空间最后都会转化成对Layer 1 Native Token 的消耗,而Native Token的消耗最后都会转嫁到给矿工更多的收益上。

当Layer 2 上的Token 对Layer 1 的需求,最后能够转变成对矿工的激励,矿工是愿意去增加更多的投入,或者带来更多的算力去保护这个网络的。当网络的底层安全性持续的增加的时候,增加的网络安全性,实际上是Layer 2 对在Layer 1 安全边界进一步的扩张,也就是Layer 2 的经济规模在Layer 1 上所质押的这些空间的价值在增加。

基于这样的循环,在Layer 2 上的经济的增长,会拉动对Layer 1 空间存储的需求,空间的需求会让矿工的收益增加,而矿工的收益增加会带来安全性的增加,而安全性的增加会进一步的刺激Layer 2 上应用的安全的边界的增加,最后大家会发现利益是全部对齐的。

所以Layer 2 的价值增长的时候,最后会体现到Layer 1 上Token 的价值增长,矿工的算力的增加,最后Layer 2 上的价值会被捕捉到Layer 1 之上。

这个循环听起来像是:由Layer 2 创作的价值到矿工再到安全,最后再到Layer 1 的价值的增加。但它的核心是你一定要设计一种用户发行的Layer 2 的Token,对你的Native Token 既有一定的需求,而这个Native 的Token 的需求又跟矿工的价值正向联动的这样一种激励机制,这样就能保证Layer 2 的价值增长,会被捕捉到Layer1 上面去。

贺:非常感谢这么详细的讲解。这个逻辑确实是会较复杂。那么您刚才提到另一个想法,我觉得也非常棒,就是利用出块率去调整出块时间,从而充分的利用带宽,能使得我们的出块时间适配带宽的增长。对于区块链来说,带宽资源应该是比存储更奇缺,或者是更重要的一个资源。那么为什么会选择存储这个方向做 ,而不是针对带宽这个点去做呢?

吕:至于为什么选择基于存储空间作为资源的限定条件来完成Token 的定价,并且设计整套的Token Economic 其实我在前面在介绍经济模型的时候提到了一点点,那我就借这个问题展开讲。

其实现在我们知道比特币和以太坊两种主流链,其实就是利是在用带宽和CPU 资源在定价,而我们选择存储空间定价是跟这两种类型的资源完全不一样的。在我们看来,资源总共就分两种,一种叫做可再生资源,另外一种叫做不可再生资源。

CPU 和带宽其实都是可再生资源,而CPU 和带宽其实从某种意义上来说是有点等价的。拿比特币举例,比特币就是一个基于带宽资源定价的一个定价模型。大家知道比特币每十分钟会出一个块,这个块它的大小只有1 M,但是其实它的资源定价模型就是基于带宽的。

所有在比特币上交易的用户,其实本质上支付的手续费是一个叫做打包交易权的费用。就是如果有人愿意支付更高的费用,矿工会愿意去为更高的矿工费的交易去打包,而矿工费用比较低的交易,矿工就会倾向于不打包这种交易。

矿工每十分钟只能打包总量不超过1 M 的交易,其实最后就形成了费率的拍卖市场,大家拍卖的是打包交易权,就是说人为地限定了带宽只有1 M 这么小,然后围绕这个带宽,让资源变得足够稀缺,才能够有比较高的价格。

而以太坊限定的是每15 秒钟出一个块,但每个块里面只能包含800万 的Gas。而这800 万的Gas本质上是计算资源,而这个计算资源本质上也是对手续费形成了一个拍卖市场,愿意支付Gas 费用更高的交易会比较容易地打包。不管是CPU 还是带宽,这两种资源并不那么稀缺,也就是说每一个用户在这一秒钟所支付的带宽,或者说是CPU 资源到下一秒钟,都会再生出来可以继续使用。

现在,不管是比特币还是以太坊,比特币现在还好,他们存储资源的消耗量是非常巨大的。但如果你通过存储资源去限定的时候,你会发现你很难设计出既兼顾可再生资源,又同时兼顾存储这种不可再生资源的定价模型。意识到这种基于可再生资源和不可再生资源的定价模型,两种模型在一个经济系统中很难去兼顾的时候,我们就要问自己一个问题,到底应该对哪一种资源进行约束,并且基于这种约束去定价会更为合理?

这个没有优劣和对错之分,更关键的是取决于你的资源是被使用在什么地方,而我们所设计Layer 1 这层的核心是全局共识,并且把达成全局共识的状态存储下来,所以我们认为在达成全局共识并且存储在Layer 1 上,它的存储资源是要比可再生的计算和带宽资源更加稀缺的。而只有围绕真正更加稀缺的资源去设计的经济模型,才能够让经济模型更高效,并且对资源的使用更经济,或者说对资源的约束效用更明显。

所以我们最后认为真正适合Layer 1 经济模型的设计是:使用存储资源作为限定是最终的也是唯一的选择。

但围绕不可再生的存储资源的经济模型设计其实有很多的挑战,展开讲的话有很多点,其中有一个很核心的点是你需要用一个好的机制去让大家存储更高效的或者价值密度更高的数据。而且我们还让这个不可再生资源具有一定的自我协调能力。

这个自我协调能力简单地说,是假如Token 价格上升了,那么一些低价值的状态空间,即价值密度比较低的这些空间,是可以把这些数据删除掉,然后把Token 释放出来。当Token 释放出来以后,它重新的流入到了这个市场,增加了供给,那么这个时候价格的上升将会被抑制。当Token 的价格下降的时候,可能会有一些低价值密度的数据,会被低成本的存储下来,这样它减小了供给,会让价格有一定的上升。

所以基于存储空间的这种自适应机制会带来一些有趣的好处。

随着价格的上升,人们会倾向于去存一些高价值密度的数据,或者说释放出一些低价机密的数据,这样会平抑掉Token 价格的波动。当然Token 价格最终还是由供给和需求来决定的,但是在短期之内,让一个价格相对能够有机去平抑它的波动性,跟它相对稳定的话,对于开发是一件比较好的事情。

因为当价格巨大波动的时候,开发者是没有办法去做出一些中长期的规划的,而如果不能去做中长期的规划的情况下,其实是抑制了网络的经济体的发展。所以对于我们来说,设计一个好的经济模型去鼓励更高价值密度的数据存储,然后去维持这个资源的稀缺性和高效的使用是我们的目标。

社群提问

1、RISC-V VM 对比SGX 封装的WASM 有什么优点?Nervos 在Layer 2 友好兼容方面大概做了哪些设计?

吕:我认为不能脱离需求简单的评价SGX封装的WASM 跟RISC-V 的异同,对我们来说,我们需要的VM 设计必须满足我们自己的Nervos 作为Layer 1 的定位,包括:灵活性,运行期透明性,以及可以精确的计算运行期开销。除此之外我们希望VM 能尽可能的简单,基于RISC-V 指令集实现的VM 除了满足我们的需求的同时,还带来了一些额外的特性,包括精简性,模块化,支持广泛,成熟等特性,结合Nervos 的Cell 模型可以提供灵活强大的编程能力,并且能最大限度降低对通过硬分叉增加功能。

相比WASM,我们在选择VM 设计的时候充分考察并论证过,我们认为有几个点导致了我们最终选择了RISC-V 而不是WASM。首先WASM 无法满足我们需要一个合理的运行期计算开销的模型,这直接影响了我们的经济模型设计,因为经济模型设计中,我们必须对计算所消耗的开销精确计算并定价,而WASM 由于引入了JIT 的原因,无法实现运行时精确计算开销。

第二个关于WASM 的问题是成熟度,RISC-V 从2010 年开始设计,在2011 年发布第一版规范,2012 年出现基于RISC-V 构建的硬件;而WebAssembly 出现于2015 年,2017 年发布MVP,相对来说,RISC-V 会比WebAssembly 更加的成熟,所以至少在目前阶段,我们觉得使用WebAssembly 并不是CKB-VM 最好的选择。

关于Layer 2 方面友好兼容性的设计,我也简单回答一下。

在分享中我回答了Nervos 选择的技术方向时链外扩容,而非链上扩容,是因为我们看到未来区块链的主要技术发展方向是Layer 2,以及为Layer 2 设计的Layer 1。

而针对一个更好支持Layer 2 的Layer 1,我们做了以下设计:

一个安全的共识协议,而且范围尽可能的大, 因为Layer 2 放弃了共识范围换取性能,所以Layer 1 需要承担安全和去中心化的职能,基于PoW 的Nakamoto Consensus 正是这样一个协议,这是唯一一个在现实环境中经过验证的全球共识,于是我们针对Layer 1 设计了一套性能优化的给予PoW 的共识协议NC-Max,这套共识协议可以在不牺牲安全性的基础上,压榨出网络带宽的所有潜能。

Layer 1 需要验证各种Layer 2 的状态,需要拥有一个强大的可编程能力的虚拟机,以支持各种状态验证逻辑,这意味着我们需要一个强大的编程模型(状态模型+虚拟机),我们引入了基于RISC-V 指令集实现的虚拟机,来满足Layer 1 的各种需求。

在Layer 1 这一层,基于Cell 编程模型的灵活的状态存储能力,结合Nervos CKB-VM 虚拟机,可以方便的支持各种密码学证明,让Layer 1 充当Layer 2 的“法院”的角色,并且可以非常灵活的增加新的密码学算法而无需硬分叉。

一个合理设计的经济模型,对齐网络上参与的各方价值和利益,保证网络长久安全可靠运行。

2、如果Dapp 跑在与Nervos 合作的Layer 2 项目上(如Celer),那Dapp 中流通的代币是Layer 2的,还是Nervos 的呢?如果是Layer 2 的,在Nervos 上是如何结算的?

吕:首先这个问题的前半部分,我们之前提到过Nervos 上可以发行用户自定义资产,这一部分和以太坊是非常类似的。Token 是发行在Nervos 的Layer 1 上,由Layer 1 保证资产的安全性。在需要的时候,可以通过一定的方式映射到Layer 2 上获取更好的交易速度和用户体验,Layer 1 通过智能合约的机制设计保证Layer 2 出问题的时候能够做仲裁,保证资产安全性。所以我们会说Layer 1 for preservation,Layer 2 for transaction。

关于后半部分的问题,Layer 2 有很多种方案,如以Lightning Network、Celer Network 为代表的State Channel (状态通道)方案,Plasma 为代表的侧链方案,以及以Truebit 为代表的链下计算方案,当然现在有Plasma 和State Channel 混合的方案,如我们的合作伙伴Alacris。

我这里以State Channel 方案举例子。资产发行在Layer 1 上,然后存入到State Channel 在Layer 1 上的合约,映射到State Channel 上获得更好的用户体验。在State Channel 中交易是非常迅速的,每进行一步交易都会更新新的状态,如描述参与通道各方的资产余额。在交易结束,通道关闭的时候,最新的状态会被递交到Layer 1 上,根据这个状态进行结算。Layer 1 上的智能合约保证用户不会作恶,如提交错误的状态。

Plasma 也是类似的方案,但是由于Plasma 更加复杂,会设计更复杂的推出机制,但是本质是一样的:用户将Layer 1 上发行的资产映射到Layer 2 上获取更好的用户体验,结束的时候根据机制的设定将资产撤回Layer 1 进行结算,Layer 1 上的智能合约保证资产的安全性。

 

密码极客是一群来自前阿里、蚂蚁金服的技术人员与阿里创业帮一起发起的区块链技术创投社群,也是杭州最大的区块链技术创业社群,截止8月,社群技术人员超过2000位,社群成员超过10万,孵化合作阿里系区块链技术项目超过30个。扫描二维码加入我们。

 

 

本文系作者个人观点,转载请注明出处!
喜欢 0
支付宝扫码打赏
微信打赏

相关文章

更多

发布评论

共0条评论