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

  • QuickNode
  • 发布于 2024-10-17 22:52
  • 阅读 51

本文介绍了Flow区块链及其智能合约编程语言Cadence,通过QuickNode和Flow CLI工具,引导读者创建一个简单的HelloWorld智能合约,并将其部署到Flow测试网络上。文章还讲解了Flow与其他区块链的不同之处,如Pipelining和可升级性。

概述

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

Flow 是一种在 Layer-1 协议上运行的区块链技术,使其能够在不分片的情况下实现高可扩展性。其独特的多角色架构使其与其他区块链区分开来,并允许其垂直扩展。虽然可升级智能合约和内置日志支持等功能对开发人员很有吸引力,但智能用户账户功能(消除了丢失助记词的问题)对于改善和保障用户体验至关重要。

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

虽然我们的探索之旅发生在 Flow 测试网的沙箱中,但请放心,你将获得的技能可以完全转移到 Flow 主网。让我们一起扭转局面,将复杂转化为简单!

你将需要什么

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

本指南中使用的依赖项

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

你将做什么

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

Flow 的不同之处?

流水线

Flow 提出了一种新的解决方案,以提高可扩展性、去中心化和安全性,而不会增加开发人员的复杂性。由于其多节点架构,这是通过专门的节点类型来实现的,这些节点类型处理事务流水线中的不同任务。

Flow 采用流水线技术,将验证器节点的任务分为四个不同的角色——收集 (collection)、共识 (consensus)、执行 (execution) 和验证 (verification)。

Flow 流水线流水线, Image Sources: Stanford CS Department

可升级性

大多数智能合约是不可变的,除非在部署中使用复杂的可升级代理设计模式,否则无法更改。但是,Flow 区块链有一个称为 beta state (测试状态) 的选项,允许开发人员轻松更新他们的智能合约。在与合约交互时,用户会得知它处于测试阶段,并且可以选择等待代码完成。合约在测试状态后是不可变的。

智能合约编程语言 - Cadence

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

如果你是 Solidity 开发人员,你可能会对 Cadence 创建智能合约的新颖方法感到不舒服。在平台、态度和一些 Solidity 不支持的新语言特性方面存在显着差异。查看 Solidity 开发人员指南 (Guide for Solidity developers) 可能会有所帮助,因为它旨在引导 Solidity 开发人员加入 Flow 区块链。

开发者设置

使用 QuickNode 访问 Flow

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

要在 Flow 上构建,你需要一个 API 端点来连接网络。 欢迎使用公共节点或部署和管理你自己的基础设施;但是,如果你想要快 8 倍的响应时间,你可以将繁重的工作交给我们。了解为什么 Flow 上超过 50% 的项目选择 QuickNode 并在此处注册一个帐户这里

QuickNode 端点

设置项目

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

在终端中运行以下代码来设置项目。我们的项目文件夹的名称将是 helloWorld,但你可以根据需要修改名称。 --scaffold 标志用于使用提供的 scaffolds,这些 scaffolds 是你可以用来引导你的开发的项目模板。

flow setup helloWorld --scaffold

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

运行命令来更改你的目录。

cd helloWorld

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

创建 Flow 钱包

你必须使用 Flow CLI 在 Flow 区块链上创建一个帐户才能部署智能合约。幸运的是,Flow CLI 有一个有用的命令来创建钱包并自动为其提供资金。

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

flow accounts create

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

控制台输出应如下所示。

🎉 New account created with address 0x66105514db20bf0d and name testnet-account on Testnet network.

Here's a summary of all the actions that were taken:
 - Added the new account to flow.json.
 - Saved the private key to testnet-account.pkey.
 - Added testnet-account.pkey to .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 文件。复制下面的代码并将其粘贴到该文件中。

智能合约声明一个 String 类型的公共字段,称为 greeting,并在智能合约初始化期间将其定义为 "Hello, World"。 此外,hello 函数返回 greeting 值。

// HelloWorld.cdc
//
pub contract HelloWorld {

    // Declare a public field of type String.
    //
    // All fields must be initialized in the init() function.
    pub let greeting: String

    // The init() function is required if the contract contains any fields.
    init() {
        self.greeting = "Hello, World!"
    }

    // Public function that returns our friendly greeting!
    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 测试网。 确保你在终端中的主目录 ( helloWorld) 中。 如果你在 cadence/contracts 文件夹中,请运行以下代码来更改你的目录。

cd ../..

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

flow project deploy --network=testnet

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

Deploying 1 contracts for accounts: testnet-account

HelloWorld -> 0x66105514db20bf0d (3b601c2d8eba20f7066f10d69208a13463d2a5e97488dae55940edbfae87e5a7)

🎉 All contracts deployed successfully

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

  • 转到 Flow Testnet Explorer
  • 将你的帐户地址 (0x...) 粘贴到表单中
  • 点击 Explore (浏览) 按钮

与智能合约交互

现在,让我们学习如何使用 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 值。

Result: "Hello, World!"

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

Flow 生态系统

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

结论

就这样! 到现在为止,你都应该清楚地了解如何使用 Cadence 在 Flow 上创建和部署智能合约。我们指导你完成了每一个步骤。 首先,我们帮助你了解 Flow 和 Cadence 的基础知识。 然后,我们继续创建和资助钱包。 最后,我们完成了编写智能合约并将其部署到 Flow 网络的过程。

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

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

我们 ❤️ 反馈!

如果你有任何反馈或新主题的请求,请 告诉我们。 我们很乐意听取你的意见。

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

0 条评论

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