Articles
无结果
文章预览图

SDK 更新:部署有状态合约

可以说,最近 Algorand v2.1.3 发布中最受期待的功能当属有状态智能合约。已有很多文章讲述有状态智能合约将如何方便软件开发人员编写应用。本文可作为开发人员的寻宝图,提供各项链接,导引读者从了解基础知识迈向运用 SDK 文档进行高级智能合约应用部署。

基础知识:无状态智能合约与有状态智能合约

所有 Algorand 智能合约 (ASC1) 都是编译好的程序,由验证节点在共识评估期间执行。堆栈上须留有一个非零 unit64 值,程序执行才是有效的,从而将产生的状态转变追加到账本上。交易执行批准语言 (TEAL) 用于基于可用 OpCodes 及其定义的使用模式编写程序。

无状态智能合约能够批准交易,既可作为合约账户,也可作为委托账户

有状态智能合约能够存储数据或“维护”账本中以 bytesints 形式存在的“状态”。两个程序(批准清算)定义一个有状态智能合约,称为应用。用户广播应用调用交易来与这些程序交互。调用可能包含用户定义的参数(额外的数据),由程序逻辑在运行时加以评估。状态更改(值更新)仅在程序成功执行后生效。

信息

使用原子交易能够将无状态和有状态程序组合起来,这为应用设计提供了强大的功能集。在这个众筹解决方案中,一个原子交易包含两个交易:
– (txn0 - payment) 用户的捐款放入托管账户(无状态)
– (txn1 callNoOp) 更新用户本地存储的捐款值(有状态)
这样就能确保转移的捐款数额 (txn0) 都被有状态应用 (txn1) 记录下来。

基础知识:有状态存储

每个有状态智能合约都能访问定义键/值对的三个存储位置全局本地域外

全局存储,在应用创建者的账户内提供,表示特定于应用的数据。应用的全局存储向每个调用交易反映当前状态。应用可以读写自己的全局存储。

本地存储仅在用户发布 Opt-In 调用交易后在用户账户内为特定应用提供。本地值反映应用的当前状态,每个账户独有。读权限授予任何人,但写权限仅限应用的程序逻辑拥有。

域外存储分别指被引用的应用或账户的全局本地存储位置。程序逻辑可以读取这些存储位置,但仅在域外实体已成功确认此应用的 Opt-In 调用交易时才能写入。

信息

给定有状态智能合约在一个调用交易中可以引用的域外账户、资产和应用的数量存在存储限制。详细信息请参阅有状态智能合约指南。

前提条件:Developer API

智能合约开发环境的一个重要前提条件,是要在 algod 节点软件上启用 Developer API。只需稍微调整配置文件并重启这个节点软件即可。

注意

确保 algod 节点 config.json 文件里的“EnableDeveloperAPI”参数设置为 true。这是为了启用对编译测试节点的 SDK 访问权限。重启 algod 节点软件令更改生效。

构建有状态智能合约:SDK Walkthrough

了解基础知识并配置好开发环境后,请确保已更新您的 SDK(PythonJavaScriptJavaGo),并熟悉 PyTeal。然后就可以设计、开发、部署您的应用并与之交互了。SDK Walkthrough 通过添加全局存储和时间戳迭代 Hello World 计数应用。

设计

我们从评审这个样板有状态应用 TEAL 批准程序开始。此程序为每个调用交易设计了一系列处理程序,然后按类型进入各处理分支。有必要在 handle_updateapphandle_delete 代码段添加自定义逻辑,防止您的应用遭到未授权访问。初步设计可能会在这两个代码段定义对创建者地址的检查。经充分测试的去中心化设计可在这两个代码段定义零地址,从而防止未来的更新或删除。设计阶段将产出 handle_noophandle_optinhandle_closeout 代码段的程序逻辑。

SDK Walkthrough 注释了批准清算示例程序。

开发

您的 SDK 项目将遵循有状态智能合约程序源代码中定义的逻辑。您至少要定义编译、创建和调用已部署应用的方法。makeApplicationNoOpTxn 调用方法可能会花去您大量的时间。您将在这里规划应用逻辑,还可能会计算这些将包含在调用交易中的参数。调试是设计和开发阶段应该熟悉的重要工具(后续文章中会给出详尽的演示)。

部署

使用 Developer API 的编译接口将您的 TEAL 源代码转换为 SDK 要求的字节字符串。然后使用 makeApplicationCreate 方法类型部署初步应用。

交互

用户会先用 makeApplicationOptIn 方法与应用交互。此时使用 makeApplicationNoOpTxn 方法的调用会执行批准程序中 handle_noop 代码段内的逻辑。对其他 makeApplication 类调用方法的调用同样适用于 UpdateClearCloseOut,并会执行各自处理程序的 TEAL 代码。如果程序逻辑中定义并经共识评估实施,任意此类调用都可修改全局、本地和/或域外状态。

在 SDK 里从存储读取数据是对特定 app-id 任意用户账户的简单 API 调用。显示状态数据只需将 JSON 响应解析成其键/值对。

总结

这份指南旨在帮助您快速了解 Algorand 有状态智能合约,然后应用这些知识使用 SDK 构建您自己的应用。开发人员门户提供在 Algorand 上构建应用的诸多资源。一系列有状态智能合约解决方案详细说明了如何构建众筹应用许可投票应用无许可投票应用开发人员论坛仍是所有开发话题答疑的首选。现在就开始构建您的应用;我们将帮助指导您一路通关。

订阅开发者周报,关注我们的最新更新。

APIs

SDK

有状态智能合约

2020年12月04日