“代码即服务”:DFINITY 互联网计算机的架构解析

什么是互联网计算机?
互联网计算机是一种网络计算的基础设施,你可以从这几个角度来看:
-无缝共享的虚拟化计算平台
-使用原则上,类似于 TCP 协议的开放式骨干网协议
-拥有通用运算能力的网络,具备存储、运算、验证的能力
过去,以太坊也设想过“世界计算机”,但实质上它仅处理转账与合约运算。以太坊作为一个智能合约平台是非常成功的,但严格来说以太坊上的服务并不是由合约驱动的,只有部分逻辑被写入智能合约以高可信性运行,实际上都需要额外搭建前后端服务器,运行一些通用计算并挂载前段。
这导致一些金融属性不强,但对安全可信有高度要求的服务,如社交网络、数据接口服务等,处于一个非常鸡肋的境地,在此情景下创造一个 token 来激励是不切实际的。并且实际情况告诉我们,依赖的服务器以及网页的连接点都是极其脆弱的。
互联网计算机作为一个具备通用计算能力的网络基础架构,提供了一种构建和运行防篡改软件的新方法。分布式的共识架构为软件提供了智能合约级别的安全性,在这个开放协议下,软件就像运行在本地虚拟机上一样简洁,不再需要依靠服务器与基础组件(如,数据库、防火墙等)就可以永不宕机、安全高效地提供服务。
“代码即服务”
互联网计算机平台不是由任何私人企业所有的,它也不存在于任何物理计算机上,协议把世界各地的数据中心和个人电脑的计算资源,聚合成一台强大的虚拟机,在网络中安全且持续性地提供通用计算能力。
虚拟化的、协议化的服务,让通用计算基础真正做到了打开水龙头就能用的地步。这让“代码即服务”变得现实,开发者不会再有启动、运维与后期扩容的概念,只需要像使用 github 一样上传代码,包含前后端的完整服务就能直接在互联网计算机上运行,并且有近乎无限扩容的能力。
互联网计算机的费用按需产生,可以由服务的调用者支付,而不需要在启动服务之前先租赁或购买一台服务器。以 token 结算的协议让代码具备了直接盈利能力(“数字税收”),互联网计算机将成为开发者的游乐园,这将激励大量的创新,产生丰富多样的开放服务。开放服务之间还能互相调用融合(实际上都在一台虚拟机上运行),组合出更优的服务,这种多赢博弈为网络创造了巨大的“互助网络效应”,让它有能力与垄断的互联网巨头竞争。
重新设计软件模型
基于互联网计算机的特性,我们得以重新思考软件的搭建、部署和使用方式,进而对复杂度做出 优化:
-代码即服务,服务不再运行在定制的操作系统上,降低开发复杂度和成本;
-不用考虑数据的安全性与存储问题,无需数据库等组件,简化了编程,缩短了开发周期;
-多个服务能像运行一台计算机中那样做到相互通信,且不需要获取网络拓扑或端口信息;
-软件可以“自洽运行”,就像一个开源项目一样,任何人都能自发地进行创新、贡献和改进。
基本框架
互联网计算机平台的架构主要由四个层组成:
-执行环境层
-信息路由和分发层
-基于共识的安全验证层
-p2p通信和复制层

以上每一层都包含了执行特定任务的组件和服务,以确保所有参与节点之间的安全通信,与网络性能。

对开发者来说这些结构与组件都是无感的。但是,如果要在本地部署测试网,开发和部署过程中的某些步骤会与图中的组件交互,这主要因为互联网计算机带来的变化较大,这样能让开发者在工作时更有流程感与真实感。
怎么开发互联网计算机上的软件?
对开发者来说,互联网计算机的框架极大地简化了软件的设计、搭建和部署。Motoko 是框架中一个重要的组成部分,这是专门为这个系统设计的通用编程语言,它能帮助开发者充分地利用互联网计算机提供的独特功能,包括:
-直接使用 actor 对象和类定义程序;
-使用 async 和 await 语法来处理异步消息传递,让它近似于同步处理;
-自动支持消息的序列化和反序列化;
-“正交持久性”:无需维护或管理外部数据库或存储卷。
Motoko 作为高级编程语言,提供了一些关键特性,包括:
-支持大整数操作和溢出保护;
-具备类型检测系统,能静态地检查每个程序,以确保它在任何输入下都可以执行,而没有类型错误;
-支持函数抽象、用户自定义的类型、用户自定义 actors。

容器、actor 与代码的关系
在使用 Motoko 语言编码程序时,要记住的一个最重要的原则:Motoko 是基于 actor 模型的。actor 是一种特殊的对象,它以隔离状态来处理消息,允许远程和异步地处理消息。互联网计算机的许多关键特性都依赖于这种安全高效的异步消息处理。
通常,每个 actor 对象都包含了一个应用程序的代码。程序的 Motoko 代码被编译并部署为 WebAssembly 模块,还包括一些环境配置信息和接口说明,这些内容以一个软件容器的形式被发布。
为什么使用 WebAssembly 运行代码?
WebAssembly 是一个通用的低级计算机指令格式。它定义了一种可移植的、开放的标准二进制格式,这样格式兼容范围很广,非常适合用来部署在互联网计算机上运行的软件。
但是现在支持编译 WebAssembly 的主要编程语言(如,C 或 C++)还不够安全,或者像 Rust 那样学习起来非常困难。使用 Motoko ,开发者可以在得益于简单且高级的语言同时,将程序编译成 WebAssembly 格式,安全地部署应用程序。
Motoko 提供了许多其他高级现代语言所共有的特性,比如类型安全和模式匹配等。除此之外,Motoko 还默认支持了使用 actors 类型定义消息传输服务,这种方式特别适用于互联网计算机。
包括程序与状态的软件容器
“软件容器”和编程中常说的”容器“相似,它包含了运行一个服务需要的已编译代码和相关文件。比如,容器包含了接口描述,终端用户可以使用这个接口向程序发送请求。而有一个重要的区别在于,这里说的软件容器还包含了程序关联的状态值。
由程序和状态组成了软件容器,这一点非常重要,因为当通过向接口发送消息来调用容器功能时,只有两种类型的调用:
-查询调用:允许用户查询容器的当前状态,或调用对状态进行操作但不更新状态的函数。
-更新调用:会更改容器的状态,或控制该容器对一个或多个其他容器进行更新调用。
我们可以通过任何托管了该容器的节点进行查询调用,该调用可以瞬时响应。因为需要更改容器的状态,更新调用可能会花费一些时间,使用基于 actor 的模型编程(具有状态隔离)可以进行并发和异步处理。
在更新调用中,当状态更改完成时,会把响应消息写入一个循环日志中。用户可以通过任何托管了该容器的节点查询,从循环日志中读取数据获得最新状态。响应消息的大小是受限的,并且只能存储有限的时间。
容器中包含了程序的状态值,每个 actor 对象都在隔离状态下,对部署在异步处理网络上的容器执行更新操作。理解这个过程,是用好互联网计算机的关键。
可以把互联网计算机看作一个托管软件容器的分布式计算平台。一但软件容器部署到互联网计算机上,用户就可以通过前端与软件进行交互,从而享受软件的服务。
资源使用
通常,所有的容器都以 CPU 周期的形式计算消耗资源,用于逻辑执行、消息路由、数据存储。为了防止作恶者通过耗尽资源攻击网络,互联网计算机对容器进行弹性扩容,使其适应当前的网络负载。这让软件总能获得运行所需的资源,而不必开发者自己去操心未来的可扩展性。