如何在 Stacks 区块链上创建和部署 Clarity 智能合约

  • QuickNode
  • 发布于 2024-11-17 23:13
  • 阅读 57

本文介绍了如何在 Stacks Testnet 上使用 Clarity 和 Clarinet 创建和部署 Clarity 智能合约。内容包括 Clarity 语言的介绍、Clarinet 工具的设置、Storage 合约的创建与测试,以及如何将合约部署到 Stacks Testnet。

概述

Stacks 是一个开源的 layer-1 区块链,它利用了 PoX (Proof of Transfer) 共识机制。Stacks 区块链利用比特币的安全性,并允许直接读取比特币链。Stacks 同样令人兴奋,因为它支持智能合约,因此开发者可以构建 dApp,例如去中心化交易所、DAO、NFT 市场等等!本指南将演示如何在 Stacks 测试网上使用 Clarinet(一个用于开发、测试和部署智能合约的命令行工具)创建和部署 Clarity 智能合约。让我们开始吧!

你需要的

  • 在你的机器上安装 Clarinet(按照链接中的说明进行安装)

  • IDE 或文本编辑器(我们推荐VSCode

  • Hiro Web 钱包 (在此处了解更多关于安装的信息 here)

  • STX 测试网代币(你可以在这个 faucet 获取一些)

你将要做什么

  • 了解 Clarity & Clarinet

  • 设置一个 Clarinet 项目

  • 使用 Clarity 创建一个 Storage 智能合约

  • 在本地环境中测试智能合约

  • 将智能合约部署到 Stacks 测试网

Clarity 101

Clarity 是一种 Lisp 风格的智能合约语言,专为 Stacks 区块链设计。它与其他智能合约语言的不同之处在于,它不是编译型的,也不是图灵完备的。这到底意味着什么?好吧,在大多数基于 EVM 的链上,你需要将你的 solidity 合约代码编译成字节码,以便 EVM 能够理解它。Stacks 区块链是不同的,因为你不需要编译你的代码。相反,执行的代码是人类可读的,这使得它易于审计。这为用户带来的另一个好处是,当你在 Stacks 区块链上部署智能合约时,合约的源代码会自动可用,而在基于 EVM 的链上并非总是如此。

Clarity 的其他属性包括:

  • 没有重入攻击漏洞

  • 没有算术下溢或溢出

  • 精确的 gas 估算

  • 内置自定义代币支持

  • 后置条件(即,帮助你验证你正在做什么的提示)

要了解 Clarity 的语言,请查看以下 Clarity language book resource。在下一节中,我们将简单介绍一下智能合约开发工具 Clarinet。

什么是 Clarinet?

既然你对 Stacks 和 Clarity 有了一些了解,让我们深入了解我们将用来构建智能合约的工具 Clarinet。Clarinet 是一种命令行工具,有助于高效的智能合约开发。它可用于开发、测试、调试以及将合约部署到本地和生产环境。它类似于其他流行的 web3 智能合约库,例如 Hardhat。

Hiro Web 钱包设置

为了将我们的 clarity 智能合约部署到 Stacks 测试网网络,我们需要安装 Hiro Web Wallet。设置好钱包后,还需要将钱包的网络配置更改为 Testnet。你可以通过单击钱包主页上的省略号(“...”)按钮来执行此操作,然后单击 Change Network(更改网络)。

接下来,你需要确保你有一些 STX 测试网代币。你可以在 Stacks Explorer Faucet 页面上请求一些代币。只需连接你的钱包,然后单击 Request STX(请求 STX)按钮。

拥有你的钱包和 STX 测试网代币后,请随时进入下一节!

设置 Clarinet 项目

安装完先决条件后,打开你的终端并运行以下命令以创建一个新的 Clarinet 项目。

clarinet new storage-project && cd storage-project

上面的 clarinet 命令创建一个名为 storage-project 的样板项目目录,我们可以使用它来快速开发智能合约。

接下来,我们需要创建智能合约文件,该文件将保存我们的存储逻辑。我们可以在同一个终端窗口中运行以下命令,为我们的智能合约创建一个 .clar 文件,为我们的测试创建一个 .ts 文件(我们现在将忽略测试,但在生产中,最好创建单元测试)。

clarinet contract new storage-contract

创建和定义 Clarity 智能合约

在你选择的代码编辑器中,打开位于 contracts 文件夹中的 storage-contract.clar 文件,然后删除样板注释。为了本教程的目的,我们将使用我们自己的注释。然后,在文件中输入以下代码。

;; define variables
(define-data-var storage (string-utf8 500) u"initial value")

;; define public get function
(define-read-only (get-storage)
    (var-get storage)
)

;; define public write function
;; #[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 check command

检查完你的合约后,运行命令 clarinet console 以打开 Clarinet REPL 控制台。Clarinet REPL 将帮助我们测试和执行我们的 Clarity 代码。Clarinet REPL 将在启动时自动列出可用的合约和内存中的模拟钱包。这是我们的外观:

Contract Identifier Stacks Contract

我们的智能合约的标识符(也称为合约地址)是 ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.storage-contract,公共函数是 get-storageset-storage 函数。

现在要与我们的存储合约的 get-storage 函数交互,我们可以使用以下语法:

(contract-call? .storage-contract get-storage)

get-storage function call

响应应该是我们设置为“initial value”的默认值。让我们通过 set-storage 函数在我们的存储合约中设置一个新值。代码应如下所示:

(contract-call? .storage-contract set-storage u"new value")

set storage function call

响应应为 (ok true)。我们可以重新运行第一个函数(即 get-storage)以验证我们的 storage 变量是否已更新。

get storage function call

现在我们确认我们的存储合约按预期工作,我们可以继续进行 Testnet 部署!

将智能合约部署到 Testnet

在继续之前,请记住完成本指南的 Hiro Web 钱包设置 部分中的钱包设置说明。

接下来,导航到 Stacks Explorer Sandbox 上的 Write and Deploy(写入和部署)选项卡并连接你的钱包。连接钱包后,单击页面右上角的 Network(网络)选项卡,并验证你是否选择了 Testnet 选项。

然后,将 storage-contract.clar 文件中的代码粘贴到 clarity 代码编辑器中。

Write & Deploy tab Stacks Explorer Sandbox

注意: 默认情况下,Sandbox 将为你的合约创建一个随机名称。如果需要,可以随意调整。

接下来,单击 Deploy(部署)按钮,然后在你的 Hiro 钱包中确认交易。交易可能需要几分钟才能验证。你可以通过搜索交易详细信息,在 Hiro 钱包的 activity (活动)选项卡或通过 Stacks Explorer查看交易状态。

挖出你的交易后,转到 Stacks Sandbox Explorer 上的 Call a Contract(调用合约)选项卡(左侧边栏中的 f)并输入你的存储智能合约的完整地址(例如,ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-factory)。合约名称字段应自动填充你合约的名称。现在剩下的就是单击 Get Contract(获取合约)按钮。

加载合约后,它应如下所示:

Call contract tab Stacks Explorer Sandbox

Stacks Sandbox 会自动加载所有可供我们使用的公共函数。为了测试合约,我们可以按照与本地环境相同的过程进行操作。首先,我们将通过单击函数 get-storage,然后单击 Call function(调用函数)按钮来检查存储变量的值。输出值应为 u"initial value"

接下来,返回,单击 set-storage 函数并输入你要存储在 storage 变量中的字符串。对于此测试,我们将使用值 Stacks is gmi。Sandbox 将自动格式化我们的字符串,使其采用我们的合约接受的格式(即,u"Stacks is gmi")。输入字符串后,单击调用函数按钮并在你的 Hiro 钱包中签署交易。

挖掘交易后,你可以通过再次调用 set-storage 函数来验证该值。该值应与你输入的字符串匹配(即,Stacks is gmi)。

结论

祝贺你一路走来!你现在知道如何使用 Clarinet 创建和测试 Clarity 智能合约。要了解更多信息,请查看我们的 How to Mint NFTs on Stacks guide 或我们其他的教程 here

我们 ❤️ 反馈!

如果你对此指南有任何反馈或问题,请 let us know。我们很乐意听取你的意见!

  • 原文链接: quicknode.com/guides/sta...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。