Skip to main content

程序罐(容器)和代码

程序罐(容器)和代码#

要记住的一个最重要的原则是,互联网计算机主要是一个运行软件的分布式和去中心化的平台。

当你为一个在互联网计算机上运行的应用程序编写源代码时,你把源代码编译成WebAssembly模块。当您在 Internet 计算机副本上部署包含您的程序的 WebAssembly 模块时,该程序在一个被称为软件罐的概念性计算单元内执行。

一旦部署,终端用户可以通过浏览器等前端客户端访问你为该程序罐定义的入口点功能,与软件程序罐互动。

容器包括程序和状态#

软件罐类似于容器,两者都是作为一个软件单元部署的,其中包含应用程序或服务的编译代码和依赖关系。

容器化允许应用程序与环境解耦,允许轻松和可靠的部署。然而,罐与容器的不同之处在于,它还存储了关于当前软件状态的信息,并有前面事件和用户互动的记录。

容器化的应用程序可能包括关于应用程序运行的环境状态的信息,而软件罐能够持久地记录应用程序的功能被使用后的状态变化。

查询和更新方法#

这个由程序和状态组成的程序罐的概念是很重要的,因为当一个程序罐函数通过向它的一个入口点发送消息而被调用时,只有两种类型的调用:非提交的查询调用和提交的更新调用。

程序罐(容器)和代码

作为一个开发者,认识到查询程序罐的调用和改变程序罐状态的调用之间的这种关系很重要。特别是,你应该记住安全和性能之间同样重要。

如何为互联网计算机开发应用程序#

  • 对于程序员和软件开发人员来说,互联网计算机平台在一个简化你如何设计、构建和部署应用程序的框架内提供了独特的能力和机会。这个框架的一个关键部分是一种新的、通用的编程语言--Motoko。Motoko是一种编程语言,是专门为充分利用互联网计算机提供的独特功能而设计的,包括:

    • 直接使用行为者对象和类来定义程序的能力。
    • 使用async和await语法,使异步消息的编程如同同步处理一样。
    • 自动支持消息的序列化和反序列化。
    • 利用数据结构的正交持久性的能力,无需外部数据库或存储量。
  • 作为一种现代的高级编程语言,Motoko提供了它自己的一些关键特性,包括。

    • 支持大整型操作和溢出保护。
    • 一个健全的类型系统,静态地检查每个程序,以确保它能在所有可能的输入上无类型错误地执行。
    • 支持函数抽象、用户定义的类型定义和用户定义的角色。

关于Motoko编程语言本身的更多详细信息,包括句法惯例和支持的功能,请参见Motoko编程语言指南

下图提供了作为互联网计算机生态系统一部分的开发环境的简化深入视图。

程序罐,actors方法,和你写的代码#

在准备使用Motoko编程语言编写程序时,最重要的原则之一是Motoko使用基于角色的编程模型。

行为体(Actor)是一种特殊的对象,它在一个隔离状态下处理消息,使消息能够被远程和异步处理。互联网计算机平台的许多关键功能都依赖于这种安全和高效的异步消息处理。

一般来说,每个软件罐包括一个行为者对象的编译代码。每个程序罐还包括一些附加信息,如接口描述或前端资产。你可以创建包括多个程序罐的项目,但每个程序罐只能包括一个actor。

为什么你的代码会被编译成WebAssembly?#

当你编译Motoko代码时,其结果是一个WebAssembly模块。WebAssembly是一种低级别的计算机指令格式,它具有可移植性,并能在大多数现代计算机硬件上清晰地抽象出程序的执行。它被广泛支持用于在互联网上运行的程序,并且自然适合于部署打算在互联网计算机平台上运行的应用程序。

有了Motoko,开发人员可以编译成可移植的WebAssembly,同时还可以使用一种简单的高级语言提供安全的应用程序。

Motoko语言提供了许多其他高级现代语言所共有的功能,如类型安全和模式匹配。此外,Motoko提供了内置的支持,可以使用actors来定义消息服务,这种方式特别适合于互联网计算机平台,无论你是新的还是有经验的程序员,都很容易学会。

本指南在使用SDK编写程序的背景下,介绍了Motoko编程语言的基本功能。有关Motoko编程语言本身的更多详细信息,请参阅Motoko编程语言指南

身份和授权#

用户发起的程序罐操作和程序罐之间的操作之间的主要区别之一是,程序罐在[IC]上有一个明确的注册身份。

没有为用户委托人建立中央登记册。相反,用户标识与每个用户通过一个或多个公钥-私钥对访问的程序罐具体相关。用户的私钥被用来签署信息,这些信息与他们的公钥一起被发送到一个程序罐里。IC对用户进行认证,并将本金传递给程序罐以授权其操作。

在高层次上,首次使用的用户在与互联网计算机的第一次互动中产生一个未签署的密钥对,并从公钥中得出他们的主标识符。返回的用户使用由用户代理安全存储的私钥(或密钥)进行认证。可以访问多个程序罐的用户可以管理与每个程序罐相关的用于认证的密钥和设备。

一个用户可以有多个公钥-私钥对,用于从不同的设备--如在不同的电脑、手机或平板电脑上运行的浏览器--访问程序罐,但这些派生的密钥都映射到一个主标识符。

资源消耗和Cycles(类似以太坊的gas和theta的tfuel,属于消耗资源)#

一般来说,所有的程序罐都会以CPU周期的形式消耗资源,用于执行,用于路由信息的带宽,以及用于持久数据的内存。寄存器保持一个周期的账户余额,以支付其应用程序所消耗的通信、计算和存储的成本。

  • Cycles旨在以稳定或通缩的方式反映操作的实际成本,包括物理硬件、机架空间、能源、存储设备和带宽,从而使程序执行的成本保持不变或随着操作效率的提高而降低。
    • 程序必须能够支付完整的执行(全部或没有),但与一个单位周期相关的成本将使高效的程序具有成本效益。
    • 通过对一个程序罐所能消耗的Cycles设置限制,平台可以防止恶意代码消耗资源。

运营成本的相对稳定性使得更容易预测处理所需的Cycles,例如,一百万条消息。

可用于程序执行的周期被保存在钱包罐中。对于本地部署,钱包罐被自动创建并发放周期。然而,要在外部节点和子网运行的互联网计算机网络上部署你的应用程序,你需要提供一个委托人,并被授予一个钱包罐的标识符。

提示#

当你在本地或互联网计算机测试网络上部署程序罐时,程序执行会消耗Cycles,但没有与这些Cycles相关的资金。然而,在计算要执行的操作时,执行程序有可能导致 "超出Cycles"的异常,因为这些操作会超过预定的阈值。如果你在测试中看到这种异常,你可以通过设置一个命令行选项临时配置一个更高的Cycles限制。

想了解更多吗?#

如果你正在寻找关于程序罐的更多信息,请查看以下相关资源:

介绍程序罐 - 智能合约的演变(视频)

什么是DFINITY Canister SDK?(视频)

部署您的第一个应用程序 (视频)