查看原文
其他

仔细研究软件容器-智能合约的发展

Dfifans DFINITY 2022-07-07




互联网计算机-通过运行一个先进的分散协议的独立数据中心网络创造了一个革命性的区块链计算机-实现了无缝的软件生态系统,不同的应用程序和程序通信,并使用对方的API。

通过容器(由代码和数据组成的计算单元)使之成为可能,容器可以部署在互联网计算机上,并可以通过互联网访问。

软件容器是开放式协作互联网的基础,并且是互联网计算机的关键概念。初次听说容器时,背景不同的人会建立不同的关联:

  • 以太坊开发人员可能会考虑智能合约

  • 博士学位学生可能考虑actor模型

  • 系统工程师可能会像在操作系统中一样考虑进程

  • 虚拟机专家可能会想到WebAssembly模块


尽管每个比较都是正确的,但它们也不完整。但总的来说,它们描绘了一幅完整的图画。

容器作为智能合约

容器就像智能合约一样,因为其执行受安全协议互联网计算机协议(ICP)的支配。

因此,容器是防篡改的,这意味着只能通过由协议控制的区块链中包含的消息来修改其状态。

此外,由于容器代码的执行是完全确定性的,因此可以通过检查区块链中的消息以加密安全的方式审核容器的状态。

容器具有传统智能合约的所有功能。但是,与智能合约相反,容器具有性能特征,因此可以使用它们来构建可扩展的软件服务。

容器作为actor

现在,让我们退后一步,从更抽象的角度考虑“容器”。从这个角度看,容器更象是一个actor在由计算机科学家卡尔·休伊特和其他捐助者开创的角色模型。

参与者模型是并发计算的数学模型,其中参与者响应一条消息,可以修改其本地或私有状态,发送消息并创建更多参与者。

在许多方面,容器都像actor一样。例如,actor有:

  • 只能由容器本身修改的私有状态

  • 一个执行线程,因此不需要基于锁的同步

  • 通过异步消息与其他容器通信的能力

  • 创建新容器的能力


传统actor和容器之间的重要区别是互联网计算机上的容器具有双向消息传递。

邮件分为请求和响应,可以在其中答复请求,并且互联网计算机会跟踪响应的回调。

用actor的术语来说,每个参与者都有一个用于接收消息的邮件地址。容器还具有一个邮寄地址,该邮寄地址看起来类似于IPv6地址。

单个容器只有一个执行线程进行更新,但是互联网计算机会并行执行可能数量庞大的容器。

这就是互联网计算机克服某些早期智能合约平台性能的限制的方式。此外,我们区分了需要更新容器状态的请求和不能修改容器状态的查询。

尽管容器的更新吞吐量受到区块链和单执行线程的限制,但容器可以同时服务数百个查询,从而实现每秒数千个查询的吞吐量,并以毫秒为单位测量延迟。

为了完善此图,必须补充一点,即最终用户至少在某种程度上也要作为参与者参与模型。这意味着浏览器和移动应用程序可以直接在容器上执行更新和查询操作。

由DFINITY基金会开发的Motoko编程语言受actor模型的启发。

容器作为进程

容器非常类似于Linux、MacOS或Windows等操作系统中的进程。操作系统跟踪进程的有效内存范围,而容器在其线性内存上有一个边界,该边界由互联网计算机强制执行。

当有工作要做时,操作系统调度程序会唤醒进程,而互联网计算机会调度容器的执行。

操作系统代表进程维护状态,例如打开文件描述符和父进程。

同样,互联网计算机代表容器来维护状态,但是代替文件描述符之类的东西,它会跟踪容器的令牌和cycles的余额、未完成的调用和权限等等。

正如进程无法直接修改其文件描述符表一样,容器也无法直接修改其令牌余额。

操作系统为进程提供功能,使它们能够执行特殊操作,例如处理文件和与外围设备通信。

同样,互联网计算机向容器提供API,以便它们可以:

  • 付款

  • 呼唤其他容器

  • 创建和管理容器

  • 管理权限

  • 获取系统时间(分布式系统中的重要功能)


互联网计算机的一个独特功能是它提供对安全随机性的访问。将来,容器还可以通过此类API签署比特币和以太坊合约。

在幕后,进程和容器之间的最大区别在于,容器在子网中的所有节点上复制。

当进程发生故障时,它崩溃,但是由于WebAssembly中的陷阱导致容器发生故障时,它不会崩溃。而是将其状态回滚到开始执行当前消息之前的状态,以便容器可以继续执行新消息。

当然,如果容器在接收到的所有消息上崩溃时,这都没有什么帮助,但是对于容器逻辑中的意外丢失案例,这是非常有用的保护措施。

实际上,容器无法与进程可以相同的方式终止-因为没有exit()或abort()系统调用。只能由其控制器通过管理命令从互联网计算机中删除容器。

容器的控制器是允许执行管理命令(例如删除或更新容器)的用户或其他容器。在互联网计算机上构建自治服务时,控制另一个容器的容器是关键要素。

容器作为WebAssembly模块实例

容器非常类似于WebAssembly模块实例。这不仅仅是一个类比-这是在互联网计算机上实际实现容器的方式。

从技术上讲,容器的代码部分是一个WebAssembly模块,该模块可导入系统API。

也就是说,互联网计算机提供给容器的功能。而且,容器可以导出自己的API,其他容器也可以调用该API。

根据WebAssembly规范:“模块实例是模块的动态表示,具有其自己的状态和执行堆栈。”

因此,容器是WebAssembly模块的实例,而不仅仅是WebAssembly模块的一个重要区别。

容器使用正交持久性来使模块实例看起来永远存在,从而使数据库或文件IO变得过时。要持久存储变量,开发人员只需将变量写入内存即可。

持久化数据的操作对开发人员是完全透明的,并且在某种意义上讲,正交化是指开发人员不必执行任何特殊的操作即可持久化数据。

跟踪到容器的线性内存的所有“写入”有两个原因。

首先,这样就可以回滚失败的计算或WebAssembly陷阱。

接下来,如果子网中的一个副本由于断电等不可预见的事件而崩溃,则当该副本恢复联机时,它将请求其他副本的已修改页面,从而可以恢复操作。

这就是互联网计算机保持给WebAssembly模块实例提供无限期生命的错觉。

拥抱WebAssembly可为互联网计算机带来以下好处:

  • 容器可以用可以编译成WebAssembly的任何语言(例如Motoko、Rust)编写,并且以不同语言编写的容器可以完全互操作。


  • WebAssembly是确定性的,除了一些容易排除的边缘情况。


  • WebAssembly具有形式语义,在更长的时间内,我们期望看到端到端经过正式验证的WebAssembly执行环境,以提高安全性。


此外,我们将随着WebAssembly规范的发展而发展,在新功能变得足够成熟时增加对新功能的支持。例如,在我们的路线图上可以在单个容器中支持多个模块。

软件容器是互联网计算机的基础,互联网规模的服务将由许多合作伙伴共同实施。拥有十亿用户的服务可能需要数千个容器才能存储用户数据。

但这不是问题。容器抽象旨在按比例缩放,非常直接,通过随着时间的推移变得更强大来实现,但主要是通过水平缩放,或使用大量协作实现单个服务的容器来向外扩展。

互联网计算机极大地简化了编写和部署代码的过程,访问官网开始使用容器在互联网计算机上进行构建。

在dfinity.org/sodium上注册以访问互联网计算机的Sodium开发者网络。

加入我们的开发人员社区,并在forum.dfinity.org开始构建。

撰文:DFINITY工程总监Johan Granström


作者:Johan Granström
翻译:Catherine


互联网计算机的钠发布使其更接近完成
互联网计算机的代币经济学:概述
Join the Developer Community
What is the Internet Computer?
A Technical Overview
互联网计算机从铜到钠的演变


进Dfinity官方社群,请添加小助手微信:

comiocn




长按关注

Dfinity官方微信

给你第一手资讯和项目信息

更可随时答疑解惑



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

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