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

Posted wangliang_f

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊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

以太坊 solidity 教程

以上是关于以太坊Solidity迁移Flow Cadence指南8-ERC721/NFT迁移的主要内容,如果未能解决你的问题,请参考以下文章

Flow 和 Cadence 开发工具概述

以太坊 Solidity 的划分

以太坊Solidity合约升级策略

第一行代码:以太坊-使用Solidity语言开发和测试智能合约

solidity开发以太坊代币智能合约

以太坊 solidity 教程