以太坊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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangliang_f

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值