介绍 Motoko Playground,一个互联网计算机的在线开发环境
为简化开发人员使用互联网计算机的体验,DFINITY 基金会的语言团队宣布开源版 Motoko Playground,这是一个在互联网计算机区块链上运行的集成开发环境 (IDE)。
使用 Motoko,一种旨在无缝支持互联网计算机编程模型的编程语言,Motoko Playground 允许用户直接在 Web 浏览器中构建和部署容器智能合约,而无需下载 DFINITY Canister SDK 或设置一个钱包。
因为开发人员不需要设置他们自己的开发环境,这种完整的浏览器内体验使任何人都可以探索和学习 Motoko,同时从任何地方在互联网计算机上尝试编程。
Motoko Playground 入门
一旦进入 DAPP,你可以选择你想要与之工作和部署到互联网计算机的项目。以下是使用 Motoko Playground 的示例工作流程。
第 1 步:选择一个示例项目。
为了帮助新开发者快速上手,从 DFINITY 示例 repo 中预先选择了几个 Motoko 项目,例如计数器、电话簿、随机迷宫和发布者/订阅者服务。您还可以从 Github 导入任何 Motoko 代码。
假设计数器示例是从上面的列表中选择的,在导航中的“Main.mo”链接下,您可以查看代码。
第 2 步:选择一个项目后,点击右上角的“部署”按钮,在互联网计算机上构建和部署容器。
单击“部署”后,指定要部署的容器的名称。在这种情况下,您要部署的容器的名称是“Main”。部署需要几秒钟的时间,因为它需要从互联网计算机获取一个免费的容器 ID 并安装已编译的 WebAssembly (Wasm) 模块。
第 3 步:部署容器后,可以使用右侧的 Candid UI 测试代码。
使用 Candid UI,您可以通过浏览器与容器通信 - 您可以查询初始值、增加计数器等等。(如果您愿意,也可以使用命令行界面工具,例如 dfx 或 ic-repl,与容器交互。)
第 4 步:如果您想对代码进行任何更改,您可以在编辑器中进行。例如,下面我们将方法更改为 get2()。
第 5 步:要重新部署,请再次按“部署”按钮。因为系统已经知道您有一个名为“Main”的容器,所以您必须指定是要升级现有容器还是完全安装新容器。在下面的示例中,我们将升级现有的容器。
第 6 步:因为计数器在稳定内存中,升级后,当你调用新的 get2 方法时,会返回上次的计数器(而不是 0)作为初始值。
第 7 步:Motoko playground 支持安装参数。在下面的示例中,您可以为计数器添加一个 actor 类型。
第 8 步:当您尝试部署您的容器时,系统知道存在安装参数,并会询问计数器的起始值。在示例中,起始值现在是 42,您可以重新安装容器。
第 9 步:现在,一旦您查询初始值,计数器将返回值 42,正如您在部署期间指定的那样。
对于大型项目,开发人员通常需要使用第三方 Motoko 库。Motoko Playground 支持容器包集,这是一组由社区维护的 Motoko 库。您可以通过单击左列包部分中的“+”按钮导入这些库,例如解析、SHA256 和各种数据结构库。
Motoko Playground 支持与本地开发环境相同的功能,例如容器间调用、容器升级、使用初始化参数安装 actor 类型和第三方库。作为一个有趣的练习,我们鼓励开发人员导入 CanCan 存储库,从包部分添加“序列”库,并在网络浏览器中在 Motoko Playground 中构建后端容器。
除了 Motoko Playground 的独立版本,还有 Motoko 语言手册中使用的嵌入式版本。它是 Motoko Playground 的轻量级版本,用户可以在其中交互式更改文档中的代码并立即在浏览器中运行(解释)代码,而无需在互联网计算机上安装代码。
Motoko Playground 的运作方式
Motoko Playground 的所有源代码现已公开。浏览代码的开发人员会发现一个全栈 web dapp,它有一个 JavaScript 前端和一个后端容器,来管理用于 Motoko 和 Rust 编写的免费 Cycles。
与大多数在线 IDE 相比,Motoko 编译器托管在前端,这要归功于 js-of-ocaml 编译器。这会自动解决安全性和可扩展性问题,因为编译器在用户浏览器中运行,而不是在远程服务器中运行。具体来说,前端由以下几部分组成:
由 js-of-ocaml 生成的 Motoko 编译器,在 Web Worker 中运行。
支持 Motoko 语法高亮和验证的 Monaco (VSCode) 编辑器。
一个从容器包集中加载第三方库的容器包管理器。
集成了容器安装/升级、actor 类型和 Candid UI 的部署模块。
一个代码导入模块,允许从 Github 导入任何 Motoko 代码。
免费的 Cycles 和后端
为了支持开发人员采用,DFINITY 为从 Motoko Playground 部署的容器提供免费的 Cycles,以便新用户不必设置 Cycle 钱包来探索 Motoko 和互联网计算机。
后端容器是用 Motoko 编写的,并管理已部署的容器使用的免费 Cycles。为保证这些免费 Cycles 的公平使用,对已部署的容器有一些限制:每个容器的初始 Cycle 余额为 0.5 T,并且只能运行 10 分钟,也不允许跨容器转移 Cycle。
具体来说,当前端请求一个新的容器时,后端在它的容器池中找到一个空闲的容器,将它的 Cycles 加满,并设置这个容器的过期时间。过期时间后,后端可以将此容器交给其他请求部署的用户。为防止一个人占用过多的容器,用户在申请新的容器时需要提供工作证明。
为了确保资源公平,我们希望避免用户将大量 Cycles 转移到自己的容器中。例如,通过调用 deposit_cycles 管理容器的方法,可以轻松地将 Playground 部署的容器中的所有可用 Cycles 转移到目标容器。
为了防止这种攻击,我们检查了所有提交的 Wasm 模块并删除了 Wasm 级别的 Cycles 传输指令。由于 Motoko 目前没有 Wasm 解析库,因此使用 Rust 容器来实现此目标。
每次 Motoko 后端收到安装请求时,它都会将 Wasm 模块转发到 Rust 容器进行检查。这实际上是一个有趣的模式,它模仿了 Motoko 中的 FFI 支持。
未来,当用户提供自己的钱包进行部署时,这些限制将放宽,从而实现更高级的用例。
我们计划添加更多功能,使 Motoko Playground 成为适用于互联网计算机的全功能 Web IDE。非常欢迎社区贡献!
同时,我们希望您可以直接在网络浏览器中方便地探索互联网计算机的母语 Motoko,而无需下载 SDK。还鼓励有兴趣的开发人员查看 Motoko Playground 的开源代码:
https://github.com/dfinity/motoko-playground
开始在 sdk.dfinity.org 上构建并加入我们的开发者社区 forum.dfinity.org。
作者:DFINITY 高级软件工程师 Yan Chen
翻译:Catherine
长按关注 DFINITY 微信公众号
随时答疑解惑
*添加小助手微信 comiocn 进交流社群