Dfinity系列解读之:四个角度全面解读Canister(下)

共 2538字,需浏览 6分钟

 ·

2021-05-09 19:06

原力区原作

《Dfinity系列解读之:四个角度全面解读Canister》的上半部分从智能合约和Actor两个侧面解读了Dfinity中的Canister。


Canister中文是容器、罐子。它由代码和数据组成,Dfinity应用中的各个功能、组件的实现都要通过Canister——这个Dfinity中的计算单元来完成。


本文会继续从另外两个角度——进程和Webassembly继续展开:


ICP作为一个操作系统是如何管理其中的进程-Canister的?


Canister实际在IC上又是如何执行?





进程




在一个系统工程师眼中,Canister很像操作系统(Linux、macOS、Windows)中的进程。


操作系统会追踪进程的有效内存范围,而Canister在其线性内存上有一个由互联网计算机(IC)强制限定的边界。
 
当有任务需要完成时,操作系统的进程调度器会唤醒一个进程,而IC会帮我们统筹安排Canister们的执行。
 
操作系统负责维护着进程的状态(如文件描述符)。同样地,IC也在维护、追踪Canister的状态:Token(ICP)和cycle的余额、未完成的调用、权限等。这里解释一下cycle,它是Canister调用Dfinity系统资源(如计算、存储等)的产生服务费,类似于以太坊中的Gas Fee。
 
因此,我们把整个IC系统理解成一个超大的分布式系统的资源/进程管理器,通过ICP最大化资源的利用率,达到优化系统整体性能的目的。
 
 
由于进程无法直接更改自己的状态,操作系统给进程提供了一些功能,使其能够执行如操作文件和与外围设备通信这样的操作。同样,IC也以API的形式给Canister提供了一些功能:

  • 付款

  • 调用其它Canister

  • 创建和管理Canister

  • 对权限的管理

  • 获取系统时间


IC的一个独特的特点是它提供了安全随机的入口。在未来,Canister也有能力通过Canister的API签名比特币和以太坊合约(跨链)。

说完了相似点,我们再来谈谈Canister和传统进程不同点:Canister的副本遍布在子网的节点上。也就是说,当Canister在遇到WebAssembly的trap时,它不会像在进程中那样崩溃,而是会回滚到当前消息执行前的状态,这样Canister可以继续执行新消息,实现了消息的异步。

另外一点不同的是,Canister不像传统系统中的进程那样,有exit() abort()这样的系统命令,也就无法像进程那样被CPU从进程表中移除掉。

它只能被IC的控制器(Controller)通过管理员命令的方式从系统中移除或更新它的状态。这个控制器可以是用户也可以是其它Canister,当在IC上构建自治服务时,一个Canister控制、调用另一个Canister就成了一个关键因素。



 

Canister作为WebAssembly模块的实例




Canister对于Web工程师来说相当于WebAssembly模块的实例。这不仅仅是一个类比,而是Canister在IC上实际执行的方式。也就是说,你运行在IC上应用的Motoko代码(Motoko是一种为互联网计算机设计的编程语言,类似Solidity之于以太坊)需要被编译成一个WebAssembly模块后,才能被部署在Canister中执行。

WebAssembly(WASM)是一种能在现代计算机硬件上运行的低级计算机指令格式,它广泛支持运行在互联网上的应用,并原生支持互联网计算机(IC)平台上的应用。

它设计的目是为诸如C、C++和Rust等语言提供一个高效的编译目标。换句话说,开发者可以通过Motoko编译成可移植的WebAssembly,同时还能以一种简单的高级语言交付应用。

对于网络平台而言,这具有巨大的意义——这为客户端app提供了一种在网络平台以接近本地速度的方式运行多种语言编写的代码的方式;在这之前,客户端app是不可能做到的。

因此,WASM虚拟机也被看作解决区块链虚拟机瓶颈的既定方案,被波卡、以太坊 2.0 等项目采用。
 
从技术上讲,Canister的代码部分是一个加载系统API的WebAssembly模块;也就是由IC提供给Canister的方法。此外,Canister可以导出自己的API,其他Canister也可以调用该API。WebAssembly的文档中写到:“模块的实例是一个模块的动态表示,包含它自己的状态和执行堆栈。”因此,Canister不仅仅是WebAssembly模块,而是一个WebAssembly模块的实例。

为了Canister在部署时的简单和可靠,Canister包含编译过的代码和依赖(执行环境)。此外,它还存储了关于当前软件状态的信息,并记录了前面的事件和用户的交互。这个状态信息包含执行环境的状态和执行应用中的方法后导致的状态的改变。




小结




可以说Dfinity中的Canister是继承、优化并吸纳了智能合约、Actor、进程和Webassembly这四个概念中的元素,达到了它致力于大规模网络服务的可扩展、可互操作的需求。

Canister是互联网计算机的基石,也是组成网络服务的原子——大规模的互联网服务需要由众多Canister互相协作完成。


引用参考:

  • https://www.youtube.com/watch?v=LKpGuBOXxtQ&t=4s

  • https://en.wikipedia.org/wiki/Actor_model

  • https://webassembly.github.io/spec/core/intro/overview.html


end


声明:本文系原力区原创稿件,版权属原力区所有,未经授权不得转载,违者将依法追究责任。
提示:投资有风险,入市须谨慎。本文不作为投资理财的建议。


点个在看,让更多人看到原力区~

浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报