非同质代币(NFT)市场正在进入一个狂热时期[4]。回顾NFT的早期发展和cryptokitties暴露的挑战是很有趣的[5]。Cryptokitties由dapper labs团队创建[6],是第一个“大规模”使用以太坊的案例。
从那时起,NFT开始增长,像RaRable(7)、OpenSa[ 8 ]、基金会(9)、SARARE(10)这样的平台已经兴起。这些平台每月有几百万元的流量。尽管有这些坎坷,但大多数坎坷仍发生在以太坊区块链上。然而,在经历了cryptokitties之后,dapper实验室的团队开始构建一个非常适合NFT场景的新的通用区块链[11]。他们的目标是解决他们在以太坊上看到的许多NFT问题,同时为该领域的开发者和收藏者提供更好的体验。他们新的区块链流程[12]证明了他们可以登陆并吸引一些大品牌。例如,NBA[13]、UFC甚至Seuss博士都在使用flow。
我们最近写了一篇关于使用存储在IPFs上的基础资产创建NFT的文章[14],并讨论了NFT领域的职责[15],以及IPFs如何提供帮助。现在,本文讨论如何在流上创建支持IPFs的NFT。流区块链的主要早期应用之一是NBA top shot[16]。我们需要重新建立一个非常基本的NFT生成过程,然后跟踪IPFs上的NFT元数据和底层资产。
因为我们喜欢pi nianatas,我们的NFT将不再是一个精彩的NBA视频,而是一个可交易的pi nianatas视频。
本教程中有三篇文章
创建合同和代币
创建一个应用程序来查看通过合同创建的NFT。
创建一个市场,将非金融工具转让给其他人,并转让知识产权基金的基础资产。
环境设置
我们需要安装flow cli。flow文档[17]中有一些很好的安装说明:
马科斯
brew安装flow cli
Linux操作系统
sh-ci“$(卷曲-fsSL);https://storage.googleapis.com/flow-cli/install.sh)quot;
窗户
iex“{irm$”https://storage.googleapis.com/flow cli/install.ps1#39;)}”
我们将在IPFs上存储资产文件。我们使用Pinata[18]来简化操作,我们可以在这里注册一个免费帐户[19],并获得一个API密钥[20]。我们将在本教程的第二篇文章中使用PinataAPI,但在本文中我们将使用Pinata网站。
我们还需要安装node和文本编辑器来帮助突出显示flow智能合约代码的语法,该代码是用一种称为cadence的语言编写的[21]。VisualStudio代码有一个支持cadence语法的插件[22]。
让我们为项目创建一个目录:
mkdir皮纳塔派对
输入目录并初始化新的流项目:
cd pinata party
flow项目初始化
现在,在您喜爱的代码编辑器中打开项目(如果您使用visualstudio代码,您可以安装cadence插件),让我们开始吧。
你会看到的流.on文件。我们很快就会用的。首先,创建一个名为cadence的文件夹。在此文件夹中,添加名为contracts的文件夹。**,在contracts文件夹中,创建一个名为;PinataPartyContract.cdc网站我不确定。
举例来说,我们在流区块链上所做的所有工作都将在模拟器上完成。但是,要将项目部署到测试网络或主网络,只需对其进行更新流.on文件中的配置非常简单。我们现在将这个文件设置为一个模拟器环境,然后我们就可以开始编写我们的合同了。
更新流.on合同标的代码如下:
quot;合同quot;:{
私人合同quot;:/cadence/contracts/PinataPartyContract.cdcquot;版本
}
然后,更新文件中的deployments对象,代码如下:
quot;部署A66035:{
仿真quot;:{
仿真quot;:{
仿真quot;账户quot;:[quot;私人合同quot;]
}
这是告诉flowcli使用模拟器来部署我们的契约。它也指的是我们要写的合同
合同
Flow有一个关于创建NFT合同的**教程。这是一个很好的参考,但是正如flow自己指出的[23],他们并没有解决NFT元数据的问题。他们希望在链上存储元数据。这是个好主意。他们会想出一个合理的办法。但是,我们现在想用元数据强制转换一些代币,并将它们与相应的媒体文件相关联。元数据只是其中的一部分。我们还需要指出代币最终代表的媒体文件。
如果您熟悉以太坊区块链上的NFT,您可能知道代币的许多底层资产存储在传统云服务器上。这是可能的,但也有缺点。我们已经写过IPFs的内容寻址能力[24]和在传统云平台上存储区块链数据的缺点[25],可以概括为两个要点:
资产应该是可核查的
维护责任的转移应该很容易
IPFs[26]解决了这两点。Pinata以一种简单的方式将内容长期保存在IPFs上。这就是我们NFT相关数据需要的吗?我们要确保我们能够证明NFT的所有权,并且我们能够控制基础资产(IPFs)-媒体文件或其他内容,并且它不是副本。
考虑到这一点,让我们编写一个契约来强制转换NFT,将元数据与NFT相关联,并确保元数据指向存储在IPFs上的底层资产。
打开PinataPartyContract.cdc网站,编写以下代码:
pub合约PinataPartyContract{
;pub资源NFT{
;pub let id:UInt64
init(initID:UInt64){
;自我识别码;=初始ID
}
;}
}
第一步是定义契约,稍后将添加更多内容,但我们首先定义Pinata party契约并在其中创建一个资源。资源存储在用户帐户中,并通过访问控制措施进行访问。在这里,NFT资源最终被用来表示NFT拥有什么。NFT必须是唯一的,ID属性允许我们识别代币。
接下来,我们需要创建一个资源接口,用它来定义哪些功能对其他人可用(也就是说,不是契约所有者)。
pubresourceinterfaceNFTReceiver{
pubfun存款(代币:@NFT,metadata:)
pub-fun-getIDs():[UInt64]
pub-fun-idExists(id:UInt64):Bool
pub-fun-getMetadata(id:UInt64);:
}
将此代码置于NFT资源代码下。此nftreceiver资源接口用于定义有权访问资源的人员。可以调用以下方法:
存款
获取ID
理想主义者
获取元数据
接下来,我们需要定义代币收集接口。把它想象成所有NFT用户的钱包。
pub资源集合:NFTReceiver{
pub var拥有nft:@
pub var metadataOb:}
init;(){
自有NFT;lt;-{}
;(b)安全措施;self.metadataOb;={}
}
酒吧娱乐撤销(撤销ID:UInt64):@NFT;{
出租代币lt;-;自拥有nft.remove(键:撤销ID)!
返回lt;-代币
}
酒吧娱乐存款(代币:@NFT,元数据:){
;自有的[ 代币id]lt;-!代币
}
pub-fun-idExists(id:UInt64):Bool{
返回;自有的[id];!=无
}
pub fun getIDs():[UInt64]{
返回;自拥有的NFT密钥
}
酒吧娱乐更新元数据(id:UInt64,元数据:);{
;self.metadataOb[id]=元数据
}
pub-fun-getMetadata(id:UInt64):{
返回;self.metadataOb[id]!
}
销毁(){
销毁;自有的
}
}
这个资源里有很多东西。请解释一下。首先,有一个名为ownednft的变量。这很直接。它可以跟踪此合同中用户拥有的所有NFT。
接下来是一个名为metadataob的变量。这有点特殊,因为我们扩展了flow NFT contract函数来存储每个NFT的元数据映射。这个变量将代币ID映射到它的相关元数据,这意味着我们需要在设置代币ID之前将其设置为元数据。
然后我们初始化变量。必须初始化流中资源中定义的变量。
**,我们有了NFT集合资源的所有可用函数。应该注意的是,并不是所有这些函数都可以调用。您还记得,nftreceiver资源接口定义了任何人都可以访问的函数。
我想特别指出存款功能。正如我们扩展了默认的flow NFT契约以包含元数据ob映射一样,我们也扩展了默认的deposit函数以接受其他元数据参数。你为什么在这里这么做?因为您需要确保只有代币的Minter可以将元数据添加到代币中。为了保持这种隐私,元数据的初始添加仅限于铸币的执行。
合同代码几乎完成了。因此,在“集合”资源下,添加以下内容:
pubfuncreateEmptyCollection():@集合;{
return lt;-创建集合()
}
发布资源NFTMinter{
发布var idCount:UInt64
init(){
;(b)在;自我识别号码;=1
}
酒吧娱乐:@NFT;{
var新NFT lt;-创建NFT(初始ID:;自身ID计数)
; 自我识别号码;=;自我识别号码;+;1作为UInt64
返回lt;-新NFT
}
}
首先,我们有一个函数,在调用时创建一个空的NFT集合。这就是第一次与合约交互的用户创建映射到已定义集合资源的存储位置的方式。
之后,我们创建一个资源。这很重要,因为没有它,我们就不能制造代币。nftminter资源包括一个idcount,它是增量的,以确保NFT没有重复的id。它还具有创建NFT的功能。
在nftminter资源下,增加主合同初始化功能;
初始化(){
;self.account.save保存(lt;-self.createEmptyCollection创建(),收件人:
;自身帐户链接(L);amp;gt;(/public/NFTReceiver,目标:存储/NFTCollection)
;self.account.save保存(lt;-createNFTMinter(),收件人:/storage/NFTMinter)
}
此初始化函数仅在部署协定时调用。它有三个功能。
为集合的部署者创建一个空集合,以便契约所有者可以从契约中强制转换和拥有NFT。
集合资源发布在公共位置,并引用在开始时创建的nftreceiver接口。这样,契约被告知nftreceiver上定义的函数可以被任何人调用。
Nftminter资源存储在帐户存储中,供合同创建者使用。这意味着只有契约的创建者才能制造代币。
完整的合同代码可以在这里找到[27]。
既然合同准备好了,我们就部署它,对吗?也许我们应该在流动操场上测试一下。去那里,点击左边边栏的第一个帐号。用我们的合同代码替换示例合同中的所有代码,然后单击deploy。如果一切顺利,您应该在屏幕底部的日志窗口中看到这样的日志。
16:48:55部署已部署合同收件人:0x01
现在我们已经准备好将契约部署到本地运行的模拟器。在命令行上,运行:
流程项目启动模拟器
如果模拟器运行正常流.on有了正确的文件配置,我们就可以部署契约了。只需运行以下命令:
流程项目部署
如果一切顺利,您应该看到以下输出:
为帐户部署1个合同:emulator accountPinataPartyContract—gt;0xf8d6e0586b0a20c7
现在我们有一个在线的流量模拟器合同,但我们想投一个NFT代币。
铸造NFT
在本教程的第二篇文章中,我们将通过一个应用程序和用户界面使铸币过程更加友好。要查看强制转换的内容并显示元数据如何与流上的NFT一起工作,我们将使用cadence脚本和命令行。
在Pinata party项目的根目录下创建新目录。我们称之为交易。创建一个文件夹并创建一个名为MintPinataParty.cdc公司的新文件。
为了编写事务,需要为NFT的元数据提供一个引用文件。为此,我们将通过Pinata向IPFs上传一个文件。在本教程中,我将上传一个孩子在生日聚会上砸皮纳塔的视频。你可以上传任何你想要的视频。你真的可以上传任何你喜欢的资产文件,并将其与你的NFT相关联,期待本教程系列的第二篇文章中的视频内容。一旦你准备好你的视频文件,上传到这里[29]。
上传文件时,会得到一个IPFs散列(通常称为内容标识符或CID)。**这个散列值,因为我们将在生成过程中使用它。
现在,在你的MintPinataParty.cdc公司文件中,添加以下内容:
从0xf8d6e0586b0a20c7
事务导入PinataPartyContract{
letreceiverRef:
letminterRef:PinataPartyContract.NFTMinter公司
准备(账户:AuthAccount){
;自我接管人;=;帐户获取能力(L);gt;(/public/NFTReceiver)
.borrow()
;??恐慌(quot;不能借用接收人参考6035)
;self.minterRef=;借出科目(L);amp;pinatapartycontract.nftmintergt;(发件人:存储/NFTMinter)
;??惊慌失措(quot;couldnotborrowminterreferencequot;)
}
执行{
letmetadata:={
命名quot;:quot;大Swingquot;,
摆动速度quot;:quot;29quot;、
摆动角度quot;:quot;45quot;、
比率quot;:quot;5quot;、
;quot;6035:quot;ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6quot;
}
新NFT;self.minterRef.mintNFT()
;自动收款人参考存款(代币:lt;-newNFT,元数据:元数据)
日志(quot;NFT铸币并存入账户23539;s集合6035)
}
这是一个非常简单的事务代码,这在很大程度上取决于工作流,但是让我们来看看它。首先,您将注意到顶部的import语句。如果您还记得的话,我们在部署合同时收到了一个帐户地址。这是这里引用的。因此,用部署的帐户地址替换0xf8d6e0586b0a20c7。
接下来,让我们定义事务。在我们的事务中,首先需要定义两个引用变量receiverref和minderref。在这种情况下,我们既是NFT的接受者也是挖矿者。这两个变量指的是我们在合同中创建的资源。如果执行事务的人没有访问资源的权限,事务将失败。
接下来,我们有一个prepare函数。此函数获取试图执行事务的人员的帐户信息并执行一些验证。它将尝试借用两个资源nftminter和nftreceiver上的可用功能。如果执行事务的人没有访问这些资源的权限,验证将无法通过,这就是事务失败的原因。
**是execute函数。这个函数是为我们的NFT创建元数据,cast NFT,然后在将NFT存入帐户之前关联元数据。如果你注意到了,我创建了一个元数据变量。在这个变量中,添加了一些关于代币的信息。因为我们的代币代表一个事件,也就是说,一个PI NIA ATA在一个聚会上被破坏了,而且因为我们试图**你在NBA热门镜头中看到的大部分内容,所以我在元数据中定义了一些统计信息。孩子摆动的速度、角度和水平。我只是觉得统计数据很有趣。您可以用类似的方式为您的代币定义任何有意义的信息。
您会注意到,我还在元数据中定义了一个URI属性。这将指向IPFs散列,它保存与NFT相关的基础资产文件。在这种情况下,这是一个皮涅塔被击中的真实视频。您可以将其替换为上载文件后收到的哈希值。
我们用IPFs作为哈希的前缀有几个原因://。这是IPFs上文件的标识符。您可以使用IPFs的桌面客户端和浏览器扩展。它也可以直接粘贴到brave browser(brave browser现在为IPFs内容提供本机支持[30])。
调用mintnft函数来创建代币。然后我们调用存款函数将其存入我们的帐户。这就是我们传递元数据的地方。如果您还记得,我们在deposit函数中定义了一个关联变量,将元数据添加到关联的代币ID中。
**,我们只需要记录代币已被强制转换并存入帐户的信息。
现在我们差不多可以执行代码发送事务了。但首先,我们需要准备好我们的账户。在项目根目录的命令行上,创建一个新的签名私钥。
运行以下命令。
流键生成
这将返回一个公钥和一个私钥,请始终保护您的私钥。
我们需要一个私钥来签署交易,这样我们就可以将它粘贴到流.on文件。我们还需要指定签名算法。事情是这样的流.on文件中的帐户内容:
quot;账户quot;:{
-quot;emulator-accountquot;:{
-quot;地址quot;:quot;您的账户地址quot;,
-quot;PrivateEYquot;:quot;您的私人钥匙quot;,
-quot;chainquot;:;quot;flow-emulatorquot;、
算法quot;:quot;ECDSAP256quot;、
算法quot;:quot;SHA3u256quot;
},
如果您计划将此项目的任何内容存储在GitHub或任何远程git存储库中,请确保不包含私钥。你可能想。你可以忽略你的一生流.on. 虽然我们只使用本地仿真器,但保护您的密钥是个好主意。
现在您可以发送事务并运行以下命令:
流程交易发送——代码/交易/MintPinataParty.cdc公司;--签名者仿真器帐户
留下来流.on中引用了交易代码文件和签名帐户。如果一切顺利,您应该看到以下输出:
正在获取地址为0xf8d6e0586b0a20c7的帐户的信息;。。。
提交ID为4A79102747A450F65B6AAB06A77161AF196C3F7151B2400B3D09AD3B69823的交易;。。。
已成功提交交易,ID为4A79102747A450F65B6AAB06A77161AF196C3F7151B2400B3B3D09AD3B69823
**,验证代币是否在我们的帐户中,并获取元数据。为此,我们需要编写一个非常简单的脚本并从命令行调用它。
在项目根目录中,创建一个名为scripts的新文件夹。在里面,创建一个CheckTokenMetadata.cdc我不确定。在文件中,添加以下内容:
从0xf8d6e0586b0a20c7
pubfunmain()导入PinataPartyContract:{
letnftOwner;=getAccount(0xf8d6e0586b0a20c7)
//log(quot;NFTOwnerquot;)
letcapability=nftOwner.getCapability和lt;amp;gt;(/public/NFTReceiver)
让接收者参考=能力.借用()
;??恐慌(quot;不能借用接收者参考6035)
返回;receiverRef.getMetadata(编号:1)
}
这个脚本可以被认为类似于以太坊智能合约调用只读方法。他们是免费的,只返回合同中的数据。
在脚本中,导入部署的协定地址。然后定义一个main函数(这是运行脚本所需的函数的名称)。在这个函数中,我们定义了三个变量:
NFT所有者:拥有NFT帐户。因为NFT是在部署了契约的帐户中强制转换的,所以在我们的示例中,这两个地址是相同的。它不必依赖于你未来的合同设计。
能力:需要从已部署合同中借用的能力(或功能)。请记住,这些功能是受访问控制的,因此如果某个功能不适用于试图借用它的地址,则脚本将失败。我们正在从nftreceiver资源借用功能。
Receiverref:这个变量只是记录我们的能力。
现在我们可以调用(available)函数。在这种情况下,我们需要确保相关地址确实收到了我们的转换NFT,然后我们需要查看与代币相关的元数据。
让我们运行脚本,看看我们得到了什么。在命令行上运行以下命令:
流程脚本执行/scripts/CheckTokenMetadata.cdc
您应该看到这样的元数据输出。
{quot;名称quot;:quot;大回转6035、quot;回转速度quot;:quot;29quot;、quot;回转角度quot;:quot;45quot;、quot;比率quot;:quot;5quot;、quot;URquot;:quot;ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6quot;}
祝贺 你!您成功地创建了流智能合约、强制转换代币、将元数据与代币关联,并将代币的底层数字资产存储在IPFs上。作为教程的第一部分,它相当不错。
接下来,我们有一个关于构建前端react应用程序的教程,它允许您通过获取和解析元数据来显示NFT。
此翻译由cell network[31]赞助。
资料来源:
https://medium.com/pinata/how-to-create-nfts-like-nba-top-shot-with-flow-and-ipfs-701296944bf
标准物质
[1]
邓连翻译计划:https://github.com/lbc-team/Pioneer
[2]
翻译团队:https://learnblockchain.cn/people/412
[3]
小熊:https://learnblockchain.cn/people/15
[4]
进入疯狂状态:https://www.cnbc.com/2021/02/25/nfts-why-digital-art-and-sports-collectibles-are-through-so-popular.html
[5]
加密猫:https://www.cryptokitties.co/
[6]
整洁实验室:https://www.dapperlabs.com/
[7]
稀有:https://rarible.com/
[8]
开放海:https://OpenSea.io/
[9]
基础:HTTPS://Fastual.APP/
[10]
排序:https://sorare.com/
[11]
着手构建一个非常适合NFT使用场景的新通用区块链:https://medium.com/dapperlabs/introduction-flow-a-new-blockchain-from-the-creators-of-cryptokitties-d291282732f5
[12]
流量:https://www.onflow.org/
[13]
NBA:https://www.nbatopshot.com/
[14]
写下如何通过在IPF上保存基础资产来创建NFT:https://learnblockchain.cn/article/2247
文章标题:NFT教程:使用流和IPFs创建NFT
文章链接:https://www.btchangqing.cn/212417.html
更新时间:2021年06月12日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。