如何使用Cadence在Flow上创建和部署智能合约

  • QuickNode
  • 发布于 2025-01-30 18:26
  • 阅读 25

这篇文章是关于如何在Flow区块链上创建和部署智能合约的详细指南。它介绍了Flow的架构特点、Cadence编程语言的基本使用,以及如何通过Flow CLI进行操作。文章包含设置项目、创建钱包、编写和部署智能合约的逐步说明,适合初学者和开发者。

概述

在以太坊上进行开发可能会变得很昂贵,但如果有一种更易于访问和更高效的替代方案呢?

Flow 是一种运行在 Layer-1 协议上的区块链技术,使其能够在不分片的情况下实现高扩展性。其独特的多角色架构使其有别于其他区块链,并允许其进行垂直扩展。虽然可升级智能合约和内置日志支持等功能对开发者具有吸引力,但智能用户账户功能,使用户可以消除丢失种子短语的问题,这对于改善用户体验和提高安全性至关重要。

在本指南中,你将了解 Flow,这一创新的区块链平台重新定义了简单性和可扩展性。在这里,你将发现如何使用 Flow 直观的编程语言 Cadence 和强大的工具 QuickNode 及 Flow CLI 创建 HelloWorld 智能合约并与之互动。

虽然我们的探索之旅发生在 Flow Testnet 的沙箱中,但请放心,你获得的技能都是完全可迁移到 Flow Mainnet 的。让我们一起转变潮流,将复杂化为简单!

你需要准备什么

你可以通过点击上面的链接并按照说明来下载和安装每个依赖项。

本指南中使用的依赖项

依赖项 版本
node.js 18.16.0
flow-cli 1.1.1

你将要做什么

  • 了解 Flow 区块链
  • 了解 Cadence 编程语言
  • 使用 Flow CLI 创建一个 Flow 钱包
  • 构建一个简单的 HelloWorld 智能合约
  • 在 Flow 区块链上部署智能合约
  • 与智能合约进行交互

Flow 有什么不同?

管道化

Flow 提出了一个新的解决方案,以在不增加开发者复杂性的情况下,提高可扩展性、去中心化和安全性。得益于其多节点架构,这可以通过处理交易管道中不同任务的专业节点类型来实现。

Flow 采用管道化技术,通过将验证节点的任务分为四个独特角色——收集、共识、执行和验证。

Flow 管道化管道化,图片来源:斯坦福大学计算机系

可升级性

大多数智能合约是不可变的,除非在部署时使用复杂的可升级代理设计模式。但是,Flow 区块链有一个名为 beta 状态 的选项,允许开发者轻松更新他们的智能合约。在与合约交互时,用户会被告知它处于 beta 状态,并可以选择等待代码完成。合约在 beta 状态后将变得不可变。

智能合约编程语言 - Cadence

Cadence 是一种资源导向的编程语言,用于在 Flow 中部署智能合约。

如果你是一名 Solidity 开发者,你可能会对 Cadence 在智能合约创建中的新颖方法感到不适。一些平台、态度和某些 Solidity 不支持的新语言特性有显著差异。审查 Solidity 开发者指南 可能会对 Solidity 开发者入门 Flow 区块链有帮助。

开发者设置

使用 QuickNode 访问 Flow

在本指南中,使用了 gRPC API 端点。然而,当使用 REST API 时,强烈建议使用 QuickNode 的端点。

要在 Flow 上开发,你需要一个 API 端点以连接到网络。你可以使用公共节点或部署和管理自己的基础设施;然而,如果你希望获得8倍的响应速度,你可以将繁重的工作交给我们。了解为什么超过50%的 Flow 项目选择 QuickNode,并在 这里 注册一个免费账户。

QuickNode 端点

设置项目

你需要一个终端模拟器(即 终端,Windows PowerShell)和代码编辑器(即 Visual Studio Code)来设置项目。

在你的终端中运行以下代码来设置项目。我们的项目文件夹名称将为 helloWorld,但你可以根据需要修改该名称。--scaffold 标志用于使用提供的搭建模板,即可以用于启动开发的项目模板。

flow setup helloWorld --scaffold

如果终端需要你输入 scaffold number,你可以选择第一个选项 [1] 空的 Cadence 项目。它会创建一个基本的文件夹结构和 flow.json 配置文件,该配置文件在 helloWorld 文件夹内包含 networksaccountsdeploymentscontracts 属性。

运行命令以更改目录。

cd helloWorld

创建项目文件夹后,你现在可以继续创建 Flow 钱包。

创建 Flow 钱包

你必须通过 Flow CLI 在 Flow 区块链上创建一个帐号以部署智能合约。幸运的是,Flow CLI 有一个方便的命令可以创建钱包并自动资助它。

要设置钱包,请在你的终端中运行以下代码。

flow accounts create

然后,输入一个帐户名称并选择网络。我们输入“testnet-account”作为帐户名称,并选择“Testnet”作为网络。

控制台输出应如下所示。

🎉 在测试网创建的新账户地址是 0x66105514db20bf0d,名称为 testnet-account。

以下是所有已采取的操作的摘要:
 - 将新帐户添加到 flow.json。
 - 将私钥保存到 testnet-account.pkey。
 - 将 testnet-account.pkey 添加到 .gitignore。

正如输出中提到的,该命令执行了这些操作:

  • 将新账户添加到 flow.json 文件
  • 将私钥保存到 pkey 文件
  • pkey 文件添加到 .gitignore 文件

经过这一步,你的帐户已创建并获得资金。

检查配置文件

Flow 配置文件 ( flow.json) 用于定义网络( 即,mainnet、testnet)、账户、部署目标和将要部署的合约。因此,以下属性应包含在配置文件中:

  • networks 预定义 Flow 模拟器、测试网和主网连接配置
  • accounts 预定义 Flow 模拟器账户和你新创建的账户
  • deployments 所有部署目标可以在此定义
  • contracts 所有将在项目中使用的合约都可以在此定义

文件的默认状态可能并不包含上述所有属性。如果是这样,你可以按照下面的示例添加缺失的属性。 此外,如果 contracts 属性中已经有一些合约定义,你可以将其删除,因为在本指南中不使用这些合约定义。

使用你的文本编辑器打开 flow.json 文件,并确保你将其修改为类似于下面的示例文件。

{
  "networks": {
    "emulator": "127.0.0.1:3569",
    "mainnet": "access.mainnet.nodes.onflow.org:9000",
    "testnet": "access.devnet.nodes.onflow.org:9000"
  },
  "accounts": {
    "emulator-account": {
      "address": "f8d6e0586b0a20c7",
      "key": "6d12eebfef9866c9b6fa92b97c6e705c26a1785b1e7944da701fc545a51d4673"
    },
    "YOUR_ACCOUNT_NAME": {
      "address": "YOUR_ACCOUNT_ADDRESS",
      "key": {
        "type": "file",
        "location": "YOUR_WALLET_PKEY_FILE"
      }
    }
  },
  "deployments": {},
  "contracts": {}
}

当我们使用 flow accounts create 命令创建一个钱包时,我们的账户已经自动添加到该配置文件中。但是,如果你有要导入的钱包凭据,你可以在这里添加它们。(有关详细信息,请参见 Flow CLI 配置 文档。)

下面你将看到你在 accounts 对象中列出的账户凭据。

占位符 YOUR_ACCOUNT_NAMEYOUR_ACCOUNT_ADDRESSYOUR_WALLET_PKEY_FILE 代表你的账户名称、账户地址和私钥(pkey)文件。

  • YOUR_ACCOUNT_NAME 是你在创建账户时选择的账户名称。

  • YOUR_ACCOUNT_ADDRESS 是创建账户后给定的地址。帐户地址在你的文件中会有所不同。

  • YOUR_WALLET_PKEY_FILE 是包含你的账户私钥的私钥文件。私钥从 pkey 文件中导入。如果你的帐户名称不同,文件名可能会有所不同。

一旦 HelloWorld 智能合约创建完成,你必须配置 flow.json 中的 deploymentscontracts 对象。这将在接下来的部分中解释。

创建智能合约

在本指南中,将使用一个简单的 Hello World 智能合约。编码部分已在 这里 详细介绍并解释。

进入 ./cadence/contracts 目录,使用以下命令创建一个名为 HelloWorld.cdc 的文件。

cd cadence/contracts
echo > HelloWorld.cdc

到目前为止,文件夹结构应如下所示。

├── README.md
├── cadence
│   ├── contracts
│   │   └── HelloWorld.cdc
│   ├── scripts
│   ├── tests
│   └── transactions
├── flow.json
└── testnet-account.pkey

然后,用你的代码编辑器打开 HelloWorld.cdc 文件。复制下面的代码并粘贴到文件中。

智能合约声明了一个名为 greetingString 类型的公共字段,并在智能合约初始化时将其定义为“Hello, World”。此外,hello 函数返回问候值。

// HelloWorld.cdc
//
pub contract HelloWorld {

    // 声明一个类型为 String 的公共字段。
    //
    // 所有字段必须在 init() 函数中初始化。
    pub let greeting: String

    // 如果合约包含任何字段,则需要 init() 函数。
    init() {
        self.greeting = "Hello, World!"
    }

    // 返回我们友好问候的公共函数!
    pub fun hello(): String {
        return self.greeting
    }
}

准备部署

如你所见,deploymentscontracts 属性在 示例配置 中至今为空。你需要根据智能合约进行修改。

contracts 属性中,定义所有智能合约的名称和路径。

  • HelloWorld 是智能合约的名称,
  • ./cadence/contracts/HelloWorld.cdc 是智能合约的路径。

deployments 属性中,定义账户名称和所有智能合约。

  • testnet 是网络名称,它指我们在 network 对象中配置的 testnet
  • testnet-account 是你在创建 Flow 钱包时选择的账户名称,指 account 对象中的 testnet-account
  • [HelloWorld] 是包括要部署的智能合约名称的数组,这些名称在 contract 对象中定义

你可以查看最新的配置文件和图像以澄清所有定义。查看图像中的箭头以了解引用。

此外,请确保账户名称、账户地址和 pkey 文件名称与你的账户相关联。下面的图像显示了我们的账户凭据。

模拟器账户的私钥是公开的,仅应用于本地开发。因此,它的密钥是不公开的。

配置文件配置文件

{
  "networks": {
    "emulator": "127.0.0.1:3569",
    "mainnet": "access.mainnet.nodes.onflow.org:9000",
    "testnet": "access.devnet.nodes.onflow.org:9000"
  },
  "accounts": {
    "emulator-account": {
      "address": "f8d6e0586b0a20c7",
      "key": "6d12eebfef9866c9b6fa92b97c6e705c26a1785b1e7944da701fc545a51d4673"
    },
    "YOUR_ACCOUNT_NAME": {
      "address": "YOUR_ACCOUNT_ADDRESS",
      "key": {
        "type": "file",
        "location": "YOUR_WALLET_PKEY_FILE"
      }
    }
  },
  "deployments": {
    "testnet": {
      "YOUR_ACCOUNT_NAME": ["HelloWorld"]
    }
  },
  "contracts": {
    "HelloWorld": "./cadence/contracts/HelloWorld.cdc"
  }
}

部署

现在一切准备就绪,可以将智能合约部署到 Flow testnet。确保你在终端的主目录 ( helloWorld) 中。如果你在 cadence/contracts 文件夹中,请运行以下代码以更改目录。

cd ../..

在终端中运行以下代码以部署 HelloWorld 智能合约。

flow project deploy --network=testnet

如果一切顺利,控制台输出应如下所示。

正在为账户部署 1 合约:testnet-account

HelloWorld -> 0x66105514db20bf0d (3b601c2d8eba20f7066f10d69208a13463d2a5e97488dae55940edbfae87e5a7)

🎉 所有合约成功部署

你可以在 Flow 区块浏览器上检查你的账户余额、智能合约和交易记录。

与智能合约互动

现在,让我们学习如何使用 Flow CLI 与智能合约进行交互。

cadence/scripts 文件夹下创建一个名为 getHello.cdc 的脚本文件,运行以下命令。

cd cadence/scripts
echo > getHello.cdc

将以下代码粘贴到脚本文件中。该脚本调用 HelloWorld 智能合约的 hello() 函数。

import "HelloWorld"

pub fun main(): String {
    return HelloWorld.hello()
}

运行以下代码以返回主目录 ( helloWorld)。

cd ../..

运行下面的命令以执行脚本文件。

flow scripts execute ./cadence/scripts/getHello.cdc --network=testnet

控制台的输出应如下所示。正如你所注意到的,当调用 HelloWorld 智能合约的 hello 函数时,返回了 greeting 的值。

结果: "Hello, World!"

恭喜你!你刚刚在 Flow Testnet 上部署了你的第一个智能合约,并学习了如何与之互动!

Flow 生态系统

查看以下链接以获取有关 Flow 的更多信息:

结论

到此为止!现在,你应该对如何使用 Cadence 在 Flow 上创建和部署智能合约有一个清晰的理解。我们在每一步都为你提供了指导。首先,我们帮助你了解 Flow 和 Cadence 的基础知识。然后,我们转向创建和资助一个钱包。最后,我们详细介绍了编写智能合约和将其部署到 Flow 网络的过程。

请记住,学习是一个过程,实践对于掌握任何新技能至关重要。因此,不要止于理解;开始创建和部署你的智能合约吧!

如果你遇到任何问题或有任何疑问,我们很乐意帮助你!你可以在 DiscordTwitter 找到我们。

我们 ❤️ 反馈!

让我们知道 你有任何反馈或新主题的请求。我们很想听到你的声音。

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

0 条评论

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