查看原文
其他

【Canisters】不好意思,我不只是智能合约

DfinitySZ 2022-03-21

The following article is from ICPLabs Author ICPLabs


文章来自于|ICPLabs

投稿、转载请联系|DfinitySZ小助手


"互联网计算机(Internet Computer)上的DAPP可以以Web速度运行, 并且能够去信任化的调用彼此公开的API。这得益于Canister(容器), 部署到互联网计算机上且可以通过互联网访问的智能合约。"

 


Canister综述


Canister(容器)是互联网计算机的基础设施, 也是核心之一。

 

关于Canister究竟是什么?不同的人有不同的看法:

 

  • 以太坊开发者可能认为Canister是个智能合约
  • 博士生可能认为Canister是actor模型
  • 系统工程师可能认为Caniser是一个系统进程, 像在操作系统中一样;
  • 虚拟机专家可能认为Cansiter是一个WebAssembly模块

 

图为4只爱吵架的可爱小鸟


这些观点并不完整,但是将他们结合起来, 就可以得到 “Canister是什么” 这个问题的答案。



Canister是智能合约


1. Canister中存储数据状态,数据状态只能通过区块链中的消息改变, 区块链遵守ICP协议。

 

2. Canister中代码的执行结果是确定性的, 可以通过审计区块链中消息的方式来审查Canister中的数据状态正确与否。

 

3. Canister拥有所有传统智能合约的特性, 并且与传统智能合约相比, Canister在构建软件服务的能力上更为出色。




Canister是Actor模型


Actor模型是并行计算领域中的数学模型:在响应消息时,actor可以维护自身状态并响应消息,创建更多的actor。由Dfinity主导开发的motoko语言就受到了actor模型的启发。


Actor模型

Canister与Actor模型的相似之处


1. 私有状态 :仅由Canister本身维护的数据状态;


2. 单独线程 :一个单独执行的线程, 无需基于锁的同步;


3. 通信 :与其他Canister进行异步通信;


4. 动态创建 :可以创建新的Canister;


5. 消息邮箱 :在Actor模型中, 每个actor都有一个邮箱地址来接受消息。Canister同样也有一个邮箱地址来接受消息, 这个地址看起来像一个IPV6的地址。

Canister与Actor模型不同的是


1. Canister具有双向的消息传递。在Canister中,消息被分为请求消息与响应消息,请求消息可以被回复。


2. 一个独立的Canister只有一个执行线程用于升级数据状态,但是互联网计算机可以并行执行大量的Canister。这也是互联网计算机在性能上比大多数公链更好的原因。

请求消息划分


互联网计算机对请求的消息进行进一步区分, 分为Update数据改变请求和Query数据访问请求。

 

  • 数据访问请求不改变数据状态。Canister可以同时处理成千上万的数据访问请求, 数据访问请求的响应速度可以达到毫秒级。

  • 数据改变请求会改变数据状态,需要节点达成共识。Canister对数据改变请求的处理速度受到区块链和单线程执行的限制。



Canister是进程

Canister与进程的相似之处


1. 内存边界:操作系统跟踪一个进程的有效内存范围,Canister的内存边界也受到互联网计算机控制。


2. 执行任务:当有任务需要执行时,操作系统的调度器开启一个进程来执行任务,互联网计算机则开启一个Canister来执行任务。


3. 数据状态:操作系统维护进程的数据状态,互联网计算机则是维护Canister的数据状态,比如Canister的token,cycles余额,未完成的反馈,权限等等。


4. 功能支持:操作系统为进程提供功能支持,互联网计算机也提供了一些API给Canister:

  • 支付功能支持

  • Canister间通信与调用支持

  • 创建和管理Canister支持

  • 获取系统时间

Canister与进程不同的是


1. 随机数:互联网计算机的特性是它提供了随机性来源。在未来, Canister将有能力通过API来对比特币/以太坊智能合约进行签名。

 

2. 崩溃容错:一个Canister将被下载到一个子网的所有节点, 由这些节点共同维护。一个进程出现故障时, 它会崩溃, 而Canister遇到故障时则不会崩溃, 而是会回滚数据状态到故障前, 并且处理新的消息。


3. 中止:Canister不能像进程一样中止, 它没有像exit()或者abort()这样的函数。Canister只能被它的控制者通过命令行或者其他管理工具移除(Canister控制者是一个用户或者具有管理权限的Canister)。Canister可以控制其他的Canister是在互联网计算机上建立自治服务的基础。



Canister是WASM模块


Canister与一个WebAssembly模块实例十分相似, 因为互联网计算机就是使用WebAssembly来实现Canister的。

 

从技术上讲, Canister的代码部分就是一个引入系统API的WebAssembly模块。并且Canister可以暴露自己的API,其他Canister可以调用这些API。

 

根据WebAssembly规范 :一个模块实例是一个模块的动态表现, 通过它自身的状态和执行栈来完成。因此,一个Canister是一个WebAssembly实例, 而不仅仅是一个WebAssembly模块,这是一个重要的区别。

 

Canister使用正交持久性让数据状态永久保存,正交的意思是开发者无需主动保留,维护数据状态不被改变。

所有写入Canister线性内存的的数据都会被追踪:

 

  • 为了可以让崩溃的WebAssembly模块回滚数据;

  • 当Canister从故障中恢复时, 它将从别的canister中获取数据状态来恢复自己的数据状态。


使用WebAssembly给互联网计算机带来了许多好处:

 

  • Canister可以用任意可以编译为WebAssembly的语言编写(Motoko,Rust等),且可以互操作;

  • WebAssembly是确定性的(除了少数易排除的边缘情况);

  • WebAssembly拥有形式化的语义。


官方表示,未来将与WebAssembly规范一起发展,在新特性足够成熟时添加对他们的支持。




Canister结语


软件Canister是互联网计算机的组成部分,互联网计算机的服务将由许多合作的Canister实现,未来一项拥有10亿用户的服务将可能需要数千个Canister来存储用户数据。

 

但这不是问题,Canister是为了拓展而设计的,随机时间的推移,Canister将随着拓展变得越来越强大,可以使用大量的Canister来实现服务。




必看周刊


生态精选


寻宝回顾


精彩活动


联系我们

 电报 

        t.me/DfinitySZ

 官方网站

        dfisz.com

 英文推特 

        twitter.com/DfinitySZ

 中文推特 

        twitter.com/DfinitySZCN

 英文论坛 

        reddit.com/user/DfinityShenZhen


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存