欢迎光临
我们一直在努力

Canister DFINITY系列解读之:四个角度全面解读Canister

Canister作为DFINITY中的一个重要概念,通常被理解为智能合约。为了将并行计算带入到区块链,解决可扩展性的难题,引入了Actor的概念。

此外,为了实现Canister的内存管理和互操作性,将Canister作为网络计算机系统(IC)中的进程进行更新、移除等操作。最后,为了打破区块链中虚拟机的瓶颈,引入WebAssembly来支持多种语言的高效编译。

可以说DFINITY中的Canister是继承、吸纳并优化了以上这四个概念中的元素,满足了它大规模网络服务的可扩展、可互操作的需求。

本文将会通过比较这四种理解与Canister的异同,来全面阐释Dfinity中Canister的概念。

网络计算机(DFINITY——Internet Computer)是由运行着去中心化协议(ICP)的各个独立的数据中心节点组成的区块链网络。

不同的应用和程序之间能够进行通信,调用对方的API接口,由此打造了一个无缝的软件生态。

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

图片

DFINITY如此定义Canister:它作为DFINITY上的智能合约,被部署在网络计算机(IC)的数据中心上,是为大规模网络服务设计的,可扩展、可互操作的计算单元。

不同技术背景的人对Canisters都有自己的理解:

以太坊开发人员:这就是智能合约
计算机科学:Canister类似于Actor Model中的Actor
系统工程师:它就像操作系统中的进程(Process)
虚拟机专家:让我想到了WebAssembly modules

这些理解都没有错,相对不那么完整。但如果把它们凑到一起,就可拼出了DFINITY中Canister的完整概念。

1、智能合约

Canister非常像一个智能合约,合约都要在DFINITY的安全协议(ICP)管控下执行。注意,这里ICP不是指ICP的治理代币,而是Internet Computer Protocol的缩写,也就是DFINITY的区块链协议。就像以太坊中的智能合约一样,Canister状态的改变必须也只能通过区块链中达成共识的消息触发。因此,Canister是防篡改的。

另外,由于Canister代码的执行机制是确定性的(Deterministic),通过检查链上的消息,可以以一种安全加密的方式对Canister的状态进行审查。

Canister不仅拥有传统智能合约的全部功能特性,更重要的是它能为软件服务提供更好的可扩展性。这就带出了Canister背后的另一个概念:Actor。

2、Actor

DFINITY引入Actor的概念主要是为了将并行计算引入区块链,解决可扩展性的难题。

如果我们退一步,从一个更抽象的角度去看Canister,它就类似Actor Model中的Actor(某个行动的发起、实施的人)。就像面向对象的语言中“一切皆是对象”的理念一样。在Actor模型中,一切都是Actor。这里简单解释一下,Actor Model是并行计算领域一个数学模型,而Actor就是模型中不可再分的计算单元。

Canister和传统Actor很重要的一点不同可以进行双向信息传递。消息分为请求和响应,在请求得到应答后,IC会跟踪响应的回调。当Actor接收到一条消息,它可以做出这样几种响应:

做出本地决策
创建更多的Actor
给其它Actor发送消息(来改变其它actor的状态)
决定如何响应下一条收到的消息

注:上述操作均没有一个假定的顺序,它们可以并行执行。

Canister对消息的响应也大致如此。另外,Canister也继承了Actor的一些特性:

Canister的私有状态只能由该Canister自己更改
每个Canister的执行都是单线程的,因此不需要基于锁的同步性
可以通过异步消息与其他Canister通信

在Actor模型中,一条消息的接收者是由地址(有时也被称为邮寄地址)识别的。因此,Actor只能在知道对方地址的情况下和其它Actor进行通信。

图片

例如,电子邮件可以被建模为一个Actor系统。用户的帐户被建模为Actor,电子邮件地址被建模为Actor地址。而Canister也有一个类似于IPv6地址的邮寄地址。

单个Canister在更新状态时只拥有一个执行线程,但IC可以同时并行执行大量的Canister。这就是IC如何克服智能合约的一些早期平台的性能限制。

此外,IC还将请求分为两类:一类是需要更新Canister状态的请求,另一类是查询,不能改变Canister状态。

这样一来,虽然单个Canister更新请求的吞吐量受到单线程和区块链性能的限制,但查询请求却可以达到每秒上千的吞吐量和毫秒级延迟。也就是说,更新是需要上链的消息(请求),而查询的消息是不需要经过区块链的。

为了让浏览器和移动端App能够直接在Canister进行更新和查询,终端用户也必须作为一个Actor参与到模型中来。

补充一点,DFINITY特有的Motoko语言正是受到了Actor模型的启发设计出来的。

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

3、进程

在一个系统工程师眼中,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就成了一个关键因素。

4、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

原文链接:https://mp.weixin.qq.com/s/IMJFeXgNnMx8Rdt5AC0tMg

赞(0)
微信号:tucaodcom QQ:2570730399免费手机挖矿APP下载 » Canister DFINITY系列解读之:四个角度全面解读Canister
分享到: 更多 (0)
免费最好的手机挖矿app推广 手机挖矿微信群联系方式

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

手机App挖矿

联系我更多手机挖矿项目注册