Flow 和 Cadence 开发工具概述

Posted wouderw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flow 和 Cadence 开发工具概述相关的知识,希望对你有一定的参考价值。

智能合约开发与其他类型的软件开发没有什么不同。编写代码是为了执行特定任务,并且有一些工具可以帮助简化此过程。以太坊生态系统包含许多成熟的工具来帮助构建 Web3 项目,但是像 Flow 这样的更新生态系统呢?

如果到目前为止您一直在关注本系列,您就会知道 Flow 区块链针对数字资产的创建和管理进行了优化。此外,其智能合约语言 Cadence 通过其基于资源的方法和强大的静态类型系统改进了其他语言的缺陷。

在本文中,我们将了解智能合约开发人员可以用来更轻松地在 Flow 上构建的基本工具——例如 CLI、IDE 扩展、客户端库、本地网络等工具。我们还将这些与您可能已经熟悉的以太坊工具进行对比,因此如果您切换到 Flow,您将确切地知道会发生什么。        

命令行界面

命令行界面 (CLI) 是软件开发的基础。它们对于大多数开发人员来说都很直观,并且可以轻松地与其他软件集成。

这种简单的集成也适用于智能合约开发。例如,如果您需要快速部署合约以对其进行测试或使用不同的帐户运行它,那么 CLI 可以提供极大的帮助。稍后,当您想将部署过程添加到 CI/CD 管道时,您会很高兴拥有一个简单的 CLI 工具,您可以使用 shell 脚本实现自动化。

在以太坊等与 EVM 兼容的网络上,Truffle 和 Hardhat 都为这些任务提供了强大的工具。Hardhat Runner用于几乎所有与 Hardhat 相关的操作,而Truffle Console使开发人员能够通过 javascript 快速与其智能合约交互,而无需编写脚本文件。

Flow CLI是用于开发、测试和部署以 Cadence 编写的智能合约到 Flow 网络的主要工具。此外,它是您与 Flow 区块链交互时使用的界面,例如创建和检查帐户、签署交易或使用脚本自动执行任务。

与以太坊不同,您将生成一个地址以与区块链交互,Flow 要求您拥有一个帐户。该账户持有您的智能合约、代币和密钥,是与区块链交互所必需的。您可以使用 Flow CLI 轻松创建帐户

IDE 扩展

接下来,您想编写一些代码,Cadence 和 Solidity 等语言提供静态类型检查,为您提供有关代码在编辑器中的行为方式的一些有用信息。 

虽然 Solidity 带有一个基本的类型系统,可以防止您混合不同的数字类型,但 Cadence 更进一步并引入了所有权的概念。你可能从 Rust 知道这一点,但基本思想是 Cadence 拥有只能由一个地址拥有的资源,例如 NFT。Cadence IDE 扩展将在您编写代码时立即通知您有关 NFT 交易的问题,同时还提供语法突出显示、代码完成和类型检查。

短绒

您可能知道来自 JavaScript 等语言的 linter,其中没有可用的静态类型。在这种情况下,linter 有助于防止常见错误并帮助开发人员遵循最佳实践。

Solhint也是如此,它是Solidity的一个 linter 工具。同样,Solidity 的静态类型系统非常初级,在使用该语言时并不能防止许多错误。Solhint 在这里提供帮助,并在类型系统之上提供提示以避免误用。 

Cadence 语言具有更复杂的系统类型,并且提供比 Solidity 更多的帮助。正确键入的 Cadence 智能合约比正确键入的 Solidity 合约更安全。

典型的 linter 功能通过其类型系统直接内置到 Cadence 语言本身中,但是如果您想对 CI/CD 管道中的多个 Cadence 文件运行类型检查,Cadence lint工具可以提供帮助。

本地网络

本地网络或网络模拟器是一种在您的开发计算机上运行区块链网络的工具,因此您可以在干净的环境中进行测试,而不必冒险将未完成的智能合约推送到实时区块链。本地网络还具有较低的延迟并允许您控制块的创建,因此您可以逐步完成智能合约执行时发生的所有事情。

在 EVM 上进行开发时,您可能知道并使用Hardhat Network或 Ganache 来完成此任务。这两种工具都在您的本地机器上模拟了一个区块链环境,并允许您分叉一个主网版本以与真实账户和合约进行交互。 

Flow 提供了一个类似的功能,称为Flow Emulator,它模拟真实的 Flow 网络,但为您提供了更多交互选项。它启用帐户存储限制,设置初始 FLOW 令牌供应,并在重启之间启用持久状态。这个强大的工具通过上面提到的 Flow CLI 使用,它们一起提供了开发人员构建功能齐全的 dapp 所需的所有功能以及测试它们的环境。

安装Flow CLI后,启动模拟器所需要做的就是在终端中输入命令 flow emulator。

测试网水龙头

在开发智能合约时,您通常需要加密代币来部署代码并与之交互。否则,你将如何测试交易?

Flow,就像以太坊一样,有一个带有水龙头的测试网,它可以为您提供免费的测试网 FLOW 或 FUSD 用于开发。

此外,Blocto Swap 是一种多用途工具,可让用户在 Flow 上轻松创建帐户。只需输入一个电子邮件地址。Blocto Swap 允许用户轻松地将他们的代币兑换成不同类型的代币以用于测试。如果该集合尚未在帐户中初始化,则此工具也是获取 FUSD 的便捷方式。

请记住:测试网上的代币在测试之外没有任何价值。

自动化测试

Cadence 和 Solidity 都有测试自动化工具,允许您使用 JavaScript 编写测试。

Hardhat 开发工具使用 Chai 测试运行程序,并为您提供用于 EVM 的智能合约匹配器网络助手。

Cadence 有自己的Jest为基础的工具,但它们与框架无关。因此,如果 Jest 不是你的菜,你可以使用不同的测试运行器。

区块链探索者

所有区块链网络的另一个重要部分是区块浏览器——一个允许你检查链上发生的一切的工具。 

对于以太坊网络,您可能知道Etherscan。它是一个 Web 应用程序,可让您浏览主网和测试网的交易和地址。

Flow 带有一个更强大的工具,Flowser

Flowser(流浏览器)是一个 Web 应用程序,但您可以在本地运行它。它允许您浏览 Flow 主网和使用 Flow Emulator 启动的任何本地网络。它甚至带有一个 GUI 来配置和启动模拟器并管理您的开发钱包。

但是,如果您需要做的只是检查交易或在 Flow 主网或测试网上浏览,那么传统的区块浏览器 Flowscan将满足您的需求。

此外,flow-view-source工具允许用户检查帐户及其各种属性,例如余额、密钥和它们可能包含的任何合同。

以太坊Solidity迁移Flow Cadence指南8-ERC721/NFT迁移

序言

本小节是本系列短文的核心章节,主要介绍如何将solidity标准的ERC721合约迁移到flow cadence,大家前面也学了这么多了,就看这一节了!!!

什么?前面几节都没看到。本来2022.5月就要写完的,结果5月笔者一直足不出户在家办公,主要在研究如下内容:

 

图 1 用做菜的思路迁移代码

笔者发现,有一种叫做“预制菜”的东西,不用开荒种地,不用掌握油盐酱醋配比,锅里一放,简单炒炒就是等级厨师的作品了。。。

嗯,solidity ----> cadence 迁移是否也能采用“预制菜”模式呢?

给你想要的!填写你的以太坊ERC721合约地址,然后你就能得到:

1 Solidity ERC721合约对应的cadence 合约代码。

2 Cadence 合约相关的transaction代码和script代码。

3 可以调用Cadence 的vue.js 模板代码。

4 登录flow钱包,即可将生成的cadence直接部署到flow测试网或正式网。

5 将已经铸造的NFT全部迁移到flow对应合约中,默认存放在合约地址内。

访问cook.flow.study  

本节。。。。。。。。。。完。

不写代码,才是有理想的码农的理想。能来看Flow合约的,肯定都是有理想的。那就继续看看怎么才能做到:)

标准ERC721合约分析

大部分的以太坊NFT合约大致是这样的:

pragma solidity ^0.8.2;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract WowNFT is ERC721 

  constructor() ERC721("WOW", "WOW")

也就是说,编写包含主要功能Solidity合约,只需要一行代码:

 constructor() ERC721("WOW", "WOW")  //定义nft的名称和简称

其他部分都是引用的标准代码,如果需要扩充功能,好比扩充燃烧功能,引用一个新模块即可:

import "@openzeppelin/contracts/token/ERC721/ERC721Pausable.sol";

目前openzeppelin等都开发了各种围绕ERC721的扩展,这些就是solidity的NFT合约开发“预制菜”。

对应的,如果要实现cadence NFT的“预制菜”,只需要找到或者实现类似openzeppelin开发的这些基础合约就行了。这个就是我们迁移的基本思路。

实际上,Cadence上已经有类似的基础标准合约,是以flow 参考元数据标准开发的。我们以openzeppelin对应实现的基础ERC721合约为准(https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol),对应的为Flow推荐的元数据标准合约实现(https://github.com/onflow/flow-nft),然后找到对齐关系,看需要修改的Cadence继承实现代码即可。这里暂时不考虑各种合约扩展功能。

数据结构

按照程序分析的一般套路,还是先分析数据结构,然后再看对应的增删改查功能函数。

ERC721和Flow推荐NFT标准合约数据结构对应关系如下图所示:

 

图2 ERC721和flow nft标准合约数据结构对应图

ERC721和Flow NFT合约定义NFT的基础都是一个唯一的数字id,对应的元数据则有所不同,由于Flow存储较为便宜,因此,标准合约还将具体的NFT名称、描述、缩略图链接也存放在链上,而ERC721则主要通过一个链接来存放更详细的元素局。

solidity指向元数据的链接内容要求为json格式,链接形式一般如:

https://opensea.mypinata.cloud/ipfs/QmYjhUCiQrYZCZNRk2wNbfuNgJF6Aan1dmnydPYjyS6DQ1/8686

也就是这样 “主链接+ nft id” 的形式

具体的数据格式标准,一般采用ERC721元数据标准 schema,或者扩展类型的ERC-1155元数据标准,具体如下:

    "title": "Token Metadata",

    "type": "object",

    "properties":

        "name":

            "type": "string",

            "description": "Identifies the asset to which this token represents"

        ,

        "decimals":

            "type": "integer",

            "description": "The number of decimal places that the token amount..."

        ,

        "description":

            "type": "string",

            "description": "Describes the asset to which this token represents"

        ,

        "image":

            "type": "string",

            "description": "A URI pointing to a resource with mime type image/*."

        ,

        "properties":

            "type": "object",

            "description": "Arbitrary properties. Values may be strings, numbers, object or arrays."

        

    

一个典型的NFT元数据例子如下所示:

  "id": 8686,

  "name": "Tidal Guiltless",

  "description": "Because a TPL Rig is wired directly...",

  "external_url": "https://cyberbrokers.io/",

  "image": "https://cyberbrokers-api-images.s3.amazonaws.com/41e3b1da4635764f4a9fb9a580414d792a4490cc2729176c635974659712b84b.svg",

  "attributes": [

    

      "trait_type": "Talent",

      "value": "Dealer"

    ,

    

      "trait_type": "Body",

      "value": 14

    

  ]

而Flow NFT的扩展元数据,链接格式一般也是:

"https://example-nft.onflow.org/".concat(self.id.toString())

和ERC721类似,也是“主链接+ nft id” 的形式,而链接存储的内容,目前flow社区暂时没有具体的标准,一般建议也使用ERC-1155元数据标准。但因为Flow的存储空间非常便宜,也1个Flow就能租用100M的存储空间,因此,很多Flow NFT合约是将全部的元数据都存在了链上,而扩展元数据只存储图片的链接。

功能函数

ERC721和Flow推荐NFT标准合约的功能函数对应关系如下图所示:

 

图3 ERC721和Flow功能结构对应图

和ERC20类似,Flow NFT合约并不提供Approve相关的三方托管功能,只需要编写mint/铸造,transfer/转移,getids/查询用户nft。

合约迁移

从数据结构和功能函数来看, Solidity ERC721标准合约和flow cadence NFT合约都存在完整的对应关系,具体迁移的时候,只需迁移核心的mint和transfer功能即可,approve的功能可以忽略,保留核心功能就行。Flow相关的approve托管合约,可通过solidity类似的中性化试试,也可以利用“能力”相关的功能实现,具体可参考NFT市场一节。

根据上的叙述,对于标准NFT合约的迁移,我们只需要对flow合约进行“字符串替换”即可,具体如下图所示:

 

图4 ERC721合约迁移具体流程

如上图所示,核心就是修改合约名称,代码中对应合约名称的引用部分,也进行对应的修改即可。包括合约、交易、脚本都按此修改即可。合约部分有资源集接口,也进行对应的字符串修改即可。另外还有包含NFT名称的资源路径和函数名称,替换成新的合约名称字符串即可。

熟悉linux shell脚本的同学,使用一句shell脚本即可完成上面所说的替换:

#!/bin/sh

nft_name="Wow" #NFT名称

find ./ -name "*.cdc"|xargs -i sed 's/Example/'''$nft_name'''/g'

物品迁移

ERC721的NFT物品迁移,只需要根据Solidity铸造的NFT id列表,使用flow NFT的铸造脚本进行铸造即可。

元数据方面,除了flow NFT标准元数据中包含的name, description,thumbnail 外,Solidity中扩展元数据部分,也可以放到flow NFT合约中即可,如存放attributes的属性例子:

 "attributes": [

    

      "trait_type": "Talent",

      "value": "Dealer"

    ,

    

      "trait_type": "Body",

      "value": 14

    

 ]

其包括Talent,Body两个属性,可以在flow合约中设置一个专门的结构体:

pub struct WowMetadata

        pub let Talent:String

        pub let Body: Int

然后在NFT资源中使用即可:

pub resource NFT: NonFungibleToken.INFT, MetadataViews.Resolver

pub let id: UInt64

    pub var metadata:WowMetadata? //使用自定义的结构体

case Type<WowNFT.WowMetadata>(): //解析部分

          if let meta = self.metadata

                return MagicWar.MagicWarMetadata(

                            Talent:meta.name,

                            Body:meta.Body

)

用户迁移

这个。。。,应该有神马跨链技术啥的,笔者不懂,感觉也没必要。目前大部分以太坊NFT应用的用户量,也就是flow nba top shot的零头,Flow元宇宙才是星辰大海。

BTW

目前cook.flow.study还只提供基础的Cadence NFT合约自动生成功能,就是按照上面说的,进行字符串替换,但大部分NFT应用也就够用了。后续会逐步拓展盲盒功能、多管理员功能等“预制菜”模块。因为笔者是专业是AI的,后续也会引入一些AI编程的功能,项目名字就叫 flow cook。有感兴趣的小伙伴可以来github上参与了:)

Playground: Flow Playground

Github(本节):GitHub - maris205/flow-is-best: flow cadence learning code. from solidity to cadence

Flow cook: https://github.com/maris205/flow-cook

以上是关于Flow 和 Cadence 开发工具概述的主要内容,如果未能解决你的问题,请参考以下文章

Flow区块链门票NFT开发实战含源码

官方:Filecoin 与 Dapper Labs 展开合作,共同推动 Flow 区块链上的 NFT 和游戏元宇宙发展

substrate 区块链框架 概述

区块链概述

《区块链技术与应用》学习笔记9——ETH概述和账户

以太坊Solidity迁移Flow Cadence指南8-ERC721/NFT迁移