声明:本文来自于微信公众号蓝狐笔记(ID:lanhubiji ),授权转载发布。
在现实商业的应用场景,所涉及的计算是巨大,甚至有数万亿的逻辑步骤计算,要处理大量的数据,这在区块链上几乎是不可能完成的。
区块链的扩展问题是行业关注的焦点之一。因为,只有解决了扩展性问题,才能为区块链走向主流铺平道路。只有解决了扩展性问题,才能让dApp的用户体验达到App的用户体验水平,才能推动普通用户进来使用。
区块链是一个去中介化的无须许可网络,任何人都可以参与,这意味着区块链要达成共识,共识带来安全,但同时也带来了极高的成本:交易吞吐量小,交易处理时间长、费用高。
为了解决这些问题,目前有一层扩展和二层扩展的方案。一层(layer1)是横向扩展,目前主要有分片、共识机制的优化(如DPoS)等。二层(layer2)是纵向扩展,包括Plasma、状态通道、侧链等方式。迄今为止,有一些进展,但还不足以让扩展性发生根本性的改变。尤其是考虑到它们还无法满足dApp的扩展性需求,如游戏、社交网络等。这些dApp都无法真正一展拳脚,尤其是涉及到大规模计算时。
那么,有没有方案能够解决这些问题?能够让dApp达成App的体验?能够让普通用户真正使用上dApp,享受到dApp带来的好处?
蓝狐笔记最近关注到Cartesi项目的解决方案,让人印象深刻。它在二层(layer 2)上的扩展方案有自己非常独特的切入点,值得dApp开发者和整个区块链行业的关注。
Cartesi试图成为区块链的计算层
区块链主链上计算和存储的成本非常高,像游戏、社交、视频等领域的应用都无法在主链上直接运行。大规模的计算必须在链下进行。
那么,如果不是基于区块链运行应用,跟传统的App有什么区别?
这里的解决思路是,从实际场景的需求本质出发,而不是在技术上进行死磕,陷入死胡同。我们没有办法就所有事情都达成全局共识,而实际上,我们也没有必要就所有事情达成全局共识。
大多数情况下,我们只需达成局部共识。只有极其重要的数据才需要达成全局共识。大多数事情,往往都是小部分参与者之间才真正感兴趣的,只要这小部分参与者之间达成共识就可以了。比如,我们去超市买一瓶水,我们没有必要跟律师打电话,也没有必要让地球上的所有人都知道你买了一瓶水。只有在发生纠纷时才需要进行仲裁。
基于这种思路,产生了layer2 的解决方案,而Cartesi就是其中的一种解决方案。Cartesi不是公链,它是去中心化的通用计算平台,试图成为区块链的计算层,旨在为公链和dApp开发者提供通用计算服务。
Cartesi作为区块链的计算层,它将底层链智能合约执行所需的大量计算接手过来,让底层链发挥其安全特性,专注于价值存储和转移,专注于结算结果的存储;与此同时,dApp开发者基于Cartesi,可以使用熟悉的编程语言、工具、库、软件以及服务来开发dApp。dApp的大多数复杂计算逻辑都通过链下来解决,开发者只须专注于业务逻辑的构建,但与此同时,能够开发出类似于App体验的dApp应用。
有了其他layer2,为什么还需要Cartesi
Layer2 分担了layer1 的扩展性压力。layer2 的存在不仅是为了解决layer1 中全局共识资源高昂成本的问题,更是为了顺应这样的一种事实:并非所有的事情都需要达成全局共识。
只有跟该共识相关的群体才需要达成一种共识。部分参与者的协作可以在链下进行,但为了防止出现纠纷,一般情况下,layer2 的参与者需要在链下交互时存入押金,如果是以太坊链,一般会存入ETh。
通过质押资产,所有参与者在链下进行互动,然后将其互动操作的重要结果提交到主链,主链完成全局状态的更新。如果这个过程中,有任何参与者产生恶意行为,其他相关方可以向主链发起申诉以寻求解决。恶意行为一旦得到确认,恶意行为者的抵押资产可能会被扣除。
Layer2 的模式将layer1 不仅看作为价值存储和转移的地方,也视作为具有最高安全性的共识仲裁法院。而layer2 是各种局部参与者之间进行互动的地方,大家都受制于奖惩机制,受制于具有公信力的layer1 的制约。
Cartesi也有类似的思路,只须参与方才需要执行大量的链下计算,计算结果提交到链上合约进行验证,确保执行结果的可信。
虽然基本上layer2 都是这种思路,但Cartesi也针对layer2 的一些不足进行了改进。
比如layer2 方案要求主链可以解决可能出现的纠纷。有时候会出现糟糕的情况,比如需要在通道开启时,把大量计算传到主链,这些交易的关闭机制会限制最大计算量。Cartesi则允许Plasma或状态通道利用Cartesi的计算能力,也就是将计算通过Cartesi来解决,而不是转移到主链。在这些layer2 的解决方案中,如双方都需要密集计算才能完成争议处理,而主链很难解决这样的大量计算问题。
此外,Cartesi跟其他layer2 解决方案不同,它不一定要求dApp应用的各相关方同时在线。
这就是Cartesi相对于其他layer2 方案的不同之处,从本质上来说,它不仅是layer2 的解决方案,更是去中心化的通用计算平台,连接了公链和dApp的开发者,为双方提供计算服务。
Cartesi如何运作?
从整体的思路上,Cartesi跟多数layer2 方案有相似之处,不过在具体的解决方案上,Cartesi有它的独特之处。
Linux的开发环境
Cartesi推动了一种dApp的开发模式,它将dApp的开发环境提到了新的高度:转向了Linux开发环境。
Cartesi虚拟机旨在为dApp的大规模运行提供支持,所以,它要考虑解决当前智能合约虚拟机的问题。现有的智能合约虚拟机运算相对简单,比如执行账户余额的运算、计算哈希值或调用合约等。
而现实的商业应用需要能响应设备、分配内容、跟其他程序复杂交互、海量的计算执行等。有了操作系统的支持,这些应用可以有序运行。指令集体系结构和操作系统相互支持,硬件可以为操作系统提供硬件功能,操作系统通过这些功能来协同所有程序的运行。
当前的智能合约虚拟机还无法实现类似功能,它们并没有操作系统的支持。
为了解决这个问题,Cartesi引入了开源的RISC-V指令集体系结构,Linux内核已经移植到RISC-V上,RISC-V有成熟的编译器。
也就是说,Cartesi准备通过这种方式,将链外的计算能力引入链上。
同时,Cartesi节点还可以让dApp开发者在本地运行代码。在本地执行代码和在Cartesi虚拟机系统内执行代码,都会在Linux操作系统下运行。Linux可以提供复杂计算所需要的完整生态系统。
Cartesi虚拟机
基于Cartesi上开发的dApp包括链上和链下模块。其中链下模块在Cartesi节点内运行。当然,也可以在本地执行代码,但本地计算不可重现。要实现重现,必须运行在Cartesi虚拟机中,在Cartesi节点中执行代码。那么重点来了,这是Cartesi项目中需要关注的重点之一,它就是Cartesi虚拟机。
Cartesi虚拟机有两点值得关注:一是完全独立。二是计算可重现。它的独立性意味着可以实现确定性,无须担心外部输入以非确定性方式来改变机器的状态(键盘、时钟中断等)。它的计算可重现意味着其具有可信的特点。Cartesi虚拟机从相同的初始状态开始运行经过相同的处理器周期,最终会达完全相同的状态。
也就是说,Cartesi中的可重现计算运行在确定性的RISC-V虚拟机上。它受Cartesi节点控制,且自包含了Linux系统,节点通过一些确定的主机接口与Cartesi虚拟机进行交互。
对于Cartesi的dApp开发者来说,他们可以指定链下计算采用可重现的方式,Cartesi的节点会根据指定执行。dApp开发者可以请求节点提交计算结果,并在链上进行验证。在这种情况下,主链处理争议结果无须占用太多资源。
同时,Cartesi虚拟机需要考虑区块链的验证要求。为了实现可信,整体架构的实施必须容易审计和开放。这也是Cartesi采用RISC-V的重要原因。
RISC-V有很多社区开发者支持。他们搭建了软件的基础底层,如Linux操作系统的端口和GNU工具链。Cartesi虚拟机以确定性方式将其整个状态映射到物理内存。
Cartesi虚拟机的链下执行除了完成计算执行之外,还支持解决有关计算结果的争议。为了提供这些服务,Cartesi虚拟机的链下执行有可编程的接口。
Cartesi虚拟机也是透明的,任何人通过任一时刻的虚拟机状态,都可以预测下一个处理器周期指令完成后的状态。Cartesi的这种设计机制保证了可信计算。获得Cartesi虚拟机初始状态的不同各方在各自的Cartesi节点中运行Cartesi虚拟机都会获得完全一致的结果。Cartesi虚拟机的状态可以通过默克尔树表达,也意味着可以通过链上实现仲裁。
Cartesi虚拟机的链上和链下
其中链下Cartesi虚拟机主要由内存和各种驱动器组成。其中,Linux内核被加载到内存中,其中有的驱动器会包含Linux文件系统。驱动器被看作为Cartesi节点中的普通文件,Cartesi虚拟机将普通文件当作设备给Linux内核挂载,这些设备被挂载后,对于Linux下运行的程序来说,就相当于能读写文件和目录的文件系统。
通过默克尔树的状态哈希,Cartesi虚拟机将其状态在链上呈现。状态包括内存和驱动器、以及其他Cartesi虚拟机运行所需的内容。通过默克尔树的根哈希,可以判定局部的子状态是否正确。
争议的解决机制
当dApp的参与方相互之间产生纠纷时,怎么办?首先,挑战方会存入抵押资产发起诉讼,如果被挑战方想要进行自我辩护,也需要存入同样价值的抵押资产。
然后双方陈述过程,链上通过根哈希状态的对比,进行判决。智能合约会查出双方在运行Cartesi虚拟机第一次产生不一致结果的指令。之后,智能合约通过在链上执行此条RISC-V指令,从而获得状态的根哈希,智能合约将其与双方的根哈希进行对比,这样可以判定谁的结果是正确的。
为了惩罚作恶者,获胜一方将获得对方的抵押资产。这可以防止作恶的行为。此外,在链上运行单个RISC-V指令相对轻松,因为查出第一次不一致的指令相对容易。链上的工作主要是保持哈希的更新,不用关心dApp的逻辑,也用不存储dApp的操作。同时,由于作恶存在成本,且也能被发现,这导致作恶行为会比较少见。
Cartesi与TrueBit
之前有个项目叫TrueBit,它也有类似的思考架构,将密集计算移至链下,并在链上进行验证来解决争议。虽然基本的思考架构类似,Cartesi跟TrueBit的具体解决方案存在不同。
TrueBit基于WebAssembly做的虚拟机,而Cartesi是基于RISC-V的指令集架构。前者是应用级别,后者是操作系统级别。WebAssembly会带来外部性,也就是不确定性,因为它用于应用间的协同、应用和用户或节点的操作系统的交互。而RISC-V更加底层,具有确定性。
此外,TrueBit更专注于智能合约计算能力的扩展,对运行环境更有约束,而真实场景的应用存在交互,Cartesi选择支持Linux的运行环境,RISC-V能提供更好的服务。
此外,在链下计算的动力方面,TrubeBit跟Cartesi存在很大差异。Cartesi的链下计算是依赖于智能合约背书,所有参与者都有责任执行链下计算,一旦出现争议,需要提交到链上解决。而TrueBit需要通过激励层的设计来解决纠纷。在TrueBit上,智能合约将计算的需求提交到由不可信方构成的市场,由其中的参与者执行链下计算并返回结果。为了保持成员的参与度,带有错误结果的计算诱饵会被投放到激励市场,这是相对低效的激励。
此外,Cartesi也考虑了应用中可能出现的大存储问题,通过Cartesi虚拟机,将代码和数据状态的哈希值提交到链上,计算只需在相关参与者节点中执行即可,这也使得Cartesi能够做到链下计算的跨链。这些是Truebit没有设计的。
Cartesi对于dApp开发者意味着什么?
Cartesi将密集计算从底层区块链中解放出来,将复杂的逻辑放到链下进行可重现计算。Cartesi虚拟机是确定性的计算模型,可以托管现代操作系统。Cartesi虚拟机上的标准工具链和操作系统是可用的。这为开发者提供了很多方便。
对于dApp 开发者来说,Cartesi意味着新的dApp开发范式。如果Cartesi能顺利落地,dApp的开发者们可以专注于业务本身的构建,而不用担心是否懂区块链的底层,因为dApp的开发者可以使用熟悉的编程语言和工具来开发dApp,这大大减轻了dApp开发者的研发成本。
与此同时,Cartesi节点为dApp开发者提供了大规模可信计算,开发者们可以使用可重现计算的Cartesi虚拟机。可信计算通过原语集成到公链智能合约,原语能够提供灵活性和复杂逻辑的计算能力。在Cartesi虚拟机计算中如出现有争议的结果,可以通过主链进行仲裁。
此外,由于大规模的链下计算,基于Cartesi构建的dApp可以实现在多个链上运行。
总言之,Cartesi对于dApp 开发者来说很友好,这将解锁去中心化应用的潜力,开发者能在熟悉环境下利用dApp的优势,构建出跟之前完全不同的应用。
结语
要想dApp达成App的用户体验,公链需要存储层和计算层的帮忙。关于存储层的项目,蓝狐笔记之前也提到过,这里不做赘述。而计算层方面也是值得关注的部分。
Cartesi的目标旨在成为区块链的计算层,为公链和dApp开发者提供去中心化的通用计算平台。
对于公链来说,Cartesi可以帮助其专注于底层链的安全和价值存储,帮助其构建更大的开发者生态;而对于dApp 开发者来说,基于Cartesi开发dApp,可以使用熟悉的编程语言和工具来进行开发,既能享受到dApp的优势,同时还能有App级别的用户体验。
随着区块链行业的深入发展,整个行业的生态拼图将会日趋完善,不仅有公链、dApp,也有为公链和dApp服务的存储层、计算层等。这些拼图相互补充和协作,最终推动区块链行业发生质变,从而将区块链的影响力提升到新的高度。