这篇文章详细介绍了如何在Stacks区块链上创建和部署Clarity智能合约,提供了从环境配置到代码编写及测试的完整指导。包括Clarinet工具的使用说明以及Hiro Web Wallet的设置,适合有一定基础的开发者学习掌握与Stacks生态相关的智能合约开发技能。
Stacks 是一个开源的第一层区块链,利用转移证明(Proof of Transfer,PoX)共识机制。Stacks 区块链利用比特币的安全性,并允许直接读取比特币链。Stacks 还非常令人兴奋,因为它支持智能合约,因此开发者可以构建去中心化应用(dApps),例如去中心化交易所、去中心化自治组织(DAOs)、NFT 市场等!本指南将演示如何使用 Clarinet(一个用于开发、测试和部署智能合约的命令行工具)在 Stacks 测试网上创建和部署 Clarity 智能合约。让我们开始吧!
在你的计算机上安装 Clarinet(按照链接中的说明进行安装)
IDE 或文本编辑器(我们推荐 VSCode)
Hiro Web 钱包(了解更多关于安装的信息 这里)
STX 测试网代币(你可以在这个 水龙头 获取一些代币)
了解 Clarity 和 Clarinet
设置 Clarinet 项目
使用 Clarity 创建一个存储智能合约
在本地环境中测试智能合约
将智能合约部署到 Stacks 测试网
Clarity 是一种 Lisp 风格的智能合约语言,专为 Stacks 区块链设计。它与其他智能合约语言不同,因为它是未编译的和非图灵完备的。这到底是什么意思呢?在大多数基于 EVM 的链上,你需要将 Solidity 合约代码编译成字节码,以便 EVM 能够理解它。Stacks 区块链则不同,你无需编译代码。相反,执行的代码是人类可读的,这使得审计变得容易。对用户的另一个好处是,当你在 Stacks 区块链上部署智能合约时,合约的源代码会自动可用,而在基于 EVM 的链上并不总是这样。
Clarity 的其他特性包括:
无重入攻击漏洞
无算术下溢或溢出
精确的气体估算
内置支持自定义代币
后条件(即帮助你验证所做操作的提示)
要了解 Clarity 语言,你可以查看以下 Clarity 语言书籍资源。在下一节中,我们将讨论一下智能合约开发工具 Clarinet。
现在你对 Stacks 和 Clarity 有了一些了解,让我们深入了解将用于构建智能合约的工具 Clarinet。Clarinet 是一个命令行工具,便于高效的智能合约开发。它可用于开发、测试、调试以及将合约部署到本地和生产环境。它类似于其他流行的 Web3 智能合约库,例如 Hardhat。
为了将我们的 Clarity 智能合约部署到 Stacks 测试网,我们需要安装 Hiro Web 钱包。设置好钱包后,你还需要将钱包的网络配置更改为测试网。你可以通过单击钱包主页上的省略号("...")按钮,然后点击 更改网络 来实现。
接下来,你需要确保拥有一些 STX 测试网代币。你可以在 Stacks Explorer 水龙头 页面请求一些代币。只需连接你的钱包,然后点击 请求 STX 按钮。
一旦你拥有了钱包和 STX 测试网代币,请继续下一节!
安装好所有先决条件后,打开终端并运行以下命令以创建一个新的 Clarinet 项目。
clarinet new storage-project && cd storage-project
上面的 clarinet 命令创建了一个名为 storage-project 的模板项目目录,我们可以用它快速开发智能合约。
接下来,我们需要创建一个智能合约文件来持有我们的存储逻辑。我们可以在同一终端窗口中运行以下命令,以创建一个 .clar 文件用于我们的智能合约,以及一个 .ts 文件用于我们的测试(我们暂时不考虑测试,但是在生产中,创建单元测试是最佳实践)。
clarinet contract new storage-contract
在你选择的代码编辑器中,打开 contracts 文件夹中的 storage-contract.clar 文件,然后删除模板注释。我们将使用自己的注释来完成本教程。然后,在文件中输入以下代码。
;; 定义变量
(define-data-var storage (string-utf8 500) u"initial value")
;; 定义公共获取函数
(define-read-only (get-storage)
(var-get storage)
)
;; 定义公共写入函数
;; #[allow(unchecked_data)]
(define-public (set-storage (message (string-utf8 500)))
(ok (var-set storage message))
)
上述代码的解释:
第 1-2 行:我们定义了一个以 ";;" 开头的注释,然后定义我们的公共字符串变量 storage(具有最大500个字符长度)。
第 4-7 行:我们定义注释和一个公共只读函数,该函数返回我们的 storage 变量的值。
第 9-13 行:一个公共写函数,接受一个字符串参数并设置我们的 storage 变量的值。
要验证我们的存储合约的语法和完整性,请在终端中运行命令 clarinet check:
合约检查完成后,运行命令 clarinet console 以打开 Clarinet REPL 控制台。Clarinet REPL 将帮助我们测试和执行我们的 Clarity 代码。启动时,Clarinet REPL 会自动列出可用合约和内存中的模拟钱包。我们的示例显示如下:
我们的智能合约的标识符(也称为合约地址)是 ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.storage-contract,公共函数是 get-storage 和 set-storage。
现在要与我们的存储合约的 get-storage 函数进行交互,我们可以使用以下语法:
(contract-call? .storage-contract get-storage)
响应应为我们设置的默认值 "initial value"。让我们通过 set-storage 函数在存储合约中设置一个新值。代码应如下所示:
(contract-call? .storage-contract set-storage u"new value")
响应应为 (ok true)。我们可以重新运行第一个函数(即 get-storage)以验证我们的 storage 变量是否已更新。
现在我们确认我们的存储合约按预期工作,可以继续进行测试网的部署!
在继续之前,请记得完成本指南 Hiro Web 钱包设置 部分中的钱包设置说明。
接下来,导航到 Stacks Explorer Sandbox 的 写入和部署 标签,并连接你的钱包。连接后,点击页面右上方的网络选项卡,确认你已选择测试网选项。
然后,将你的 storage-contract.clar 文件中的代码粘贴到 Clarity 代码编辑器中。
注意: 默认情况下,沙箱将为你的合约创建一个随机名称。如有需要,请随意调整。
接下来,点击 部署 按钮,然后在你的 Hiro 钱包中确认交易。交易验证可能需要几分钟。你可以在 Hiro 钱包的 活动 标签中查看交易状态,或通过 Stacks Explorer 搜索交易详情。
一旦你的交易被挖矿,前往 Stacks Sandbox Explorer 的 调用合约 标签(左侧边栏中的 f),输入你的存储智能合约的完整地址(例如 ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-factory)。合约名称字段会自动填充你合约的名称。现在只需点击 获取合约 按钮。
加载合约后,它应该看起来像这样:
Stacks Sandbox 会自动加载所有可用的公共函数。为了测试合约,我们可以遵循在本地环境中相同的流程。首先,我们通过点击 get-storage 函数并点击 调用函数 按钮来检查存储变量的值。输出值应该是 u"initial value"。
接下来,返回,点击 set-storage 函数并输入你想存储在 storage 变量中的字符串。在此测试中,我们将使用值 Stacks is gmi。沙箱将自动格式化我们的字符串,以使其符合我们合约的接受格式(即 u"Stacks is gmi")。输入字符串后,点击调用函数按钮并在你的 Hiro 钱包中签署交易。
回到交易挖矿后,你可以再次调用 set-storage 函数验证值。该值应与你输入的字符串匹配(即 Stacks is gmi)。
恭喜你成功完成了整个过程!你现在知道如何使用 Clarinet 创建和测试 Clarity 智能合约。要了解更多,请查看我们的 如何在 Stacks 上铸造 NFT 的指南 或其他的一些教程 这里。
如果你对本指南有任何反馈或问题, 请告诉我们。我们很乐意听取你的意见!
- 原文链接: quicknode.com/guides/oth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!