不可替代的代币,通常称为 NFT,是加密和区块链行业的新大趋势。在过去的几个月里,NFT 到处都是新闻,使用该技术的数字艺术故事以数百万美元的价格出售。
通过 NFT,我们可以使用区块链唯一地识别和表示资产的所有权。我们还可以使用 NFT 来交易这些资产并实施复杂的合同,例如特许权使用费。我们仍处于这项技术的早期阶段,但我们已经看到在虚拟世界、域名、收藏品和艺术中的广泛适用性。
抛开围绕其中一些数字资产价格的所有炒作,本教程的目标是为您提供 NFT 的实用介绍。为此,我们将从第 1 部分开始,简要介绍区块链、以太坊和智能合约。在第 2 节中,我们将深入探讨涵盖其历史、景观和工具的技术;并了解在以太坊区块链上制作 NFT 的步骤。在第 3 节中,我们将亲自创建数字资产并部署代表我们在以太坊区块链上的创建的 NFT。在第 4 节中,我们将创建一个代表我们资产的物理对象,我们将研究 NFT 的一些限制。
遵循使用“Hello, World!”的传统 节目在节目引进新的课题,我创建了下面的文字动画,说的GIF:“你好,的NFT”。我们将创建一个代表我们新创建的 GIF 的 NFT,并将其部署在以太坊区块链上。为了使本教程更有趣并了解 NFT 的局限性,我在下面创建了一个物理对象,它是一个基于乐高的二维码,它链接到一个网页,该网页显示了有关我们的 NFT 和我们的新数字资产的信息。

您可以在此github 存储库中找到本教程的源代码。
1. 区块链、以太坊和智能合约简介
1.1. 什么是区块链技术?
区块链是一种不可变的分布式账本,允许两方之间进行直接交易,而无需中央机构。
- “不可变”是指区块链可以以仅附加的方式进行更改。换句话说,交易只能添加到区块链中,而不能删除或修改。这意味着一旦添加了一笔交易,就没有人可以篡改它。
- “分布式”是指账本在多台计算机上复制,而不是存储在中央服务器上。任何具有互联网连接的计算机都可以下载区块链的完整副本。这意味着任何人都可以检查已在区块链上执行的所有交易。
区块链上的交易通过称为:加密货币的数字货币进行。区块链使用密码学和复杂的共识机制来确保交易和分类账的安全。如果你想更深入地了解区块链的技术细节,我推荐这篇博文。
第一个也是最受欢迎的区块链是比特币区块链。比特币区块链上使用的加密货币是比特币。自 2009 年 1 月推出以来,比特币在撰写本文时的市值已超过 1 万亿美元,使其成为最有价值的加密货币。
比特币是一种令人难以置信的产品,可以说是自互联网诞生以来最具颠覆性的技术之一。话虽如此,它主要被设计为一种数字货币,这限制了其对某些金融用例的适用范围。
1.2. 以太坊和智能合约
2013 年底,一位名叫Vitalik Buterin 的程序员发布了一份白皮书,介绍了一种名为以太坊的新区块链的想法. 以太坊背后的主要思想是超越数字货币用例,成为可用于更广泛应用的通用区块链。为此,以太坊引入了智能合约的概念。智能合约是一种计算机程序,旨在根据合同或协议的条款[1]自动执行、控制或记录法律相关的事件和动作。以太坊智能合约旨在在以太坊区块链之上编程和执行,因此可以受益于区块链的主要优势:无需可信中间人即可在两方之间进行直接交易的能力。要设定智能合同中,复仇队引进一个新的名为编程语言的密实度. 自 2015 年 7 月以太坊网络推出以来,已有多个利用智能合约的用例。例如:
- 在以太坊之上开发新的加密货币
- 首次代币发行 (ICO)
- 去中心化应用程序 (DApps)
- DeFi 应用
- 不可替代的代币 (NFT)
2. 深入研究 NFT
在本节中,我们将深入研究 NFT。我们将首先定义 NFT 是什么。然后,我们将介绍该技术的历史及其一些流行应用。我们还将介绍在以太坊区块链上制作和部署 NFT 的步骤,我们将通过研究 NFT 环境和工具来结束本章。
2.1. 什么是 NFT?
NFT 代表不可替代的代币。可替代商品是其各个单位基本上可以互换的商品 [2]。例如,货币是可互换的,因为任何货币的每 2 个单位都可以互换。不可替代的商品是独一无二的,不能被其他东西取代的商品。不可替代的代币是区块链上的一个数据单元,代表一个独特的项目。NFT 可以代表任何数字文件或数字资产,例如虚拟世界中的物品、域名、收藏品和数字艺术,仅举几例。NFT 也可以表示物理世界中的对象,但实现起来比表示数字资产更复杂。以太坊区块链是用于 NFT 的最流行的区块链,但它不是唯一的。

为什么围绕 NFT 大肆宣传?
NFT 的核心是存储在区块链上的所有权证明。这个简单而强大的概念使创建具有以下属性的数字资产成为可能:
- 真实性证明:通过查看将 NFT 铸造到区块链的交易,我们可以轻松验证谁是 NFT 的创建者。
- 所有权证明:我们可以通过查看所有关联交易轻松验证 NFT 的所有权历史。
- 不变性:一旦将 NFT 添加到区块链中,我们就无法删除或篡改与之相关的任何交易。
- 稀缺性:由于 NFT 代表一种独特的资产,我们可以创建独特或供应有限的数字资产。
- 可转移性:将 NFT 从区块链地址转移到另一个地址非常容易。
- 效用:我们可以为 NFT 添加一些效用,例如给 NFT 持有者一些特权。
通过利用上述所有特征,首次有可能创建数字收藏品、轻松将数字艺术货币化并创建新的数字资产交易市场。一些创作者和公司充分利用了这项技术,创造了售价数百万美元的 NFT。其中一些故事遍布新闻,并将 NFT 引入了主流。
2.2. NFT 的简短历史
2012 年,Yoni Assia发表了一篇题为“比特币 2.X(又名彩色比特币)——初始规格”的文章。在文章中,他介绍了彩色硬币的概念,它是与真实资产相关的代币,由比特币区块链管理。尽管他在文章中没有使用“不可替代的代币”这个词,但彩色硬币被认为是第一个 NFT。
2014 年,3 位开发者(Robby Dermody、Adam Krellenstein 和 Ouziel Slama)推出了 Counterparty,这是一个金融平台,用于在比特币区块链上创建点对点金融应用程序。[3][4] Counterparty 可用于创建代表任何资产的新数字代币。在顶级 Counterparty 上构建了一些有趣的 NFT 应用程序,最著名的是:
- Spells of Genesis 2015: Spells of Genesis 是一款手机游戏,融合了集换式卡牌游戏的收集和策略方面与街机游戏的吸引力。该游戏使用比特币区块链来促进应用内外的游戏物品交易。[3]
- 2016 年的 Rare Pepes:人们开始使用 Counterparty 来发布和交易 Rare Pepes,它们是 Pepe the Frog [5] 的插图,这是一个由 Matt Furie 在 2005 年创建的非常受欢迎的模因。 [6]

2017 年 6 月,由 Matt Hall 和 John Watkinson 组成的两人团队Larva Labs发布了 CryptoPunks。CryptoPunks 是 10,000 个独特的收藏字符,其所有权证明存储在以太坊区块链上。该项目是最具影响力的 NFT 项目之一,也是 NFT 的 ERC-721 标准和现代加密艺术运动的灵感来源。[7][8]
2017 年 10 月,加拿大工作室 Dapper Labs 推出了CryptoKitties的测试版本。CryptoKitties 是一款基于区块链的虚拟游戏,允许玩家购买、收集、繁殖和出售虚拟猫。
从 2018 年开始,用于创建、购买和销售 NFT 的基础设施和市场有了很多发展。这一发展降低了进入门槛,并允许具有不同技术技能的创作者轻松创建数字资产,并将其作为 NFT 在这些新市场上进行交易。因此,从 2020 年底和 2021 年初开始,NFT 市场出现了繁荣。
2019年7月,NBA与Dapper Labs成立合资公司,打造NBA Top Shot。NBA Top Shot 是一个基于区块链的平台,允许球迷购买、出售和交易特定的、官方授权的视频集锦的编号版本。[10] 自该平台于 2020 年 10 月向公众开放以来,其销售额已超过 4 亿美元。
2021 年 3 月,作为历史最悠久、最负盛名的拍卖行之一,佳士得以 6930 万美元的以太币出售了其首件 NFT,其代表了一种名为“每天:前 5000 天”的数字艺术。这种数字艺术是由专业人士称为 Beeple 的 Mike Winkelmann 创作的。[11]
2.3. 在以太坊区块链上制作 NFT 的步骤
向以太坊区块链添加资产的过程称为铸造 NFT。我们可以通过使用 Solidity 编程语言编写智能合约并将其部署在以太坊区块链上,或者使用促进铸造过程的多个平台之一来铸造 NFT。其中一些平台还提供了一个我们可以用来销售我们的 NFT 的市场。创建和交换 NFT 的以太坊标准是ERC-721和ERC-1155。尽管 ERC-1155 有一些额外的好处,但在撰写本文时,ERC-721 仍然是最受欢迎的标准。所有 NFT 都应遵循这些标准之一,以确保创建的 NFT 与不同的市场和 NFT 生态系统兼容。
创建 NFT 的过程如下:
- 第 1 步(一次性):设置以太坊钱包
- 第 2 步:向您的以太坊钱包添加一些以太币
- 第 3 步:创建或选择要链接到 NFT 的资产
- 第 4 步:铸造 NFT。这可以通过以下任一方式完成:
- 将遵循 ERC-721 ERC-1155 标准的智能合约编码并部署到以太坊区块链
- 使用铸造平台之一
- 第 5 步(可选):将您的 NFT 放入其中一个市场
2.4. NFT 景观和工具
随着新工具、平台和市场以非常快的速度发布,NFT 格局非常动态。跟踪所有新版本并了解每个产品提供的细微差别是非常具有挑战性的。话虽如此,在本节中,我们将关注最受欢迎和最重要的:
- 以太坊钱包:
- Metamask : Metamask 是最受欢迎的以太坊钱包。它既可以用作网络浏览器扩展程序,也可以用作移动应用程序。安装后,您可以使用 MetaMask 与以太坊区块链交互、访问 DApp 以及存储您的加密货币和 NFT。还有其他以太坊钱包,但 Metamask 是迄今为止最受欢迎的钱包。
- 铸币平台和市场:
- 开放平台:这些平台对所有人开放,允许您铸造 NFT 并直接在市场上出售。最流行的开放平台是:Rarible和OpenSea。
- 独家平台:这些平台仅限受邀者,并与选定的创作者合作。其中一些平台允许用户使用法定货币购买 NFT。最受欢迎的独家平台是:Nifty Gateway、SuperRare和Foundation。
- 狭窄市场:这些市场仅限于特定的 NFT 用例。最受欢迎的狭义市场是:Cryptopunks、Cryptokitties和NBA Top Shot。
- 分析平台:这些平台用于分析、发现和排名来自不同市场的 NFT 集合。我建议您使用:DappRadar和Etherscan。
- 开放平台:这些平台对所有人开放,允许您铸造 NFT 并直接在市场上出售。最流行的开放平台是:Rarible和OpenSea。
3. 动手教程
在本节中,我们将构建和部署可用于铸造 NFT 的以太坊智能合约。我们将首先生成一个以太坊钱包并设置我们的本地环境,然后我们将在本地开发和测试我们的智能合约,然后将其部署到以太坊测试网和主网。我们将通过展示如何铸造 NFT 并将其在OpenSea 上出售来结束本章
3.1. 用例
遵循使用“Hello, World!”的传统 节目在节目引进新的课题,我们将创建一个NFT表示下面的GIF动画。我使用 Google Drawings 和GifMaker创建了这个 GIF 。

为了使本教程更有趣并理解 NFT 的局限性,我在下面创建了一个物理对象,它是一个基于乐高的二维码,它链接到一个网页,该网页显示了有关我们的 NFT 和我们新的数字“艺术品”的信息。

3.2. 工具
对于本教程,我们将需要以下工具:
- MyEtherWallet:MyEtherWallet 是一个用于生成以太坊钱包和与以太坊区块链交互的网站。
- Metamask : Metamask 是一个以太坊钱包。
- VSCode with Solidity Extension:使用 Solidity 编程语言开发智能合约的 IDE。
- Node.js:Node.js 是一个 JavaScript 运行时环境,用于在 Web 浏览器之外执行 JavaScript 代码。
- Truffle:Truffle 是以太坊最受欢迎的开发框架。
- Ganache : Ganache 是个人以太坊区块链,可用于本地开发和测试智能合约。
- OpenZeppelin 合约:OpenZeppelin 合约是标准的、经过测试的、经过社区审查的智能合约。我们将使用 ERC-721 OpenZeppelin 实现。
- Infuria:Infura API 套件提供通过 HTTPS 和 WebSockets 对以太坊网络的即时访问。
3.3. 创建以太坊钱包
首先,我们需要一个以太坊钱包和一些以太币。有不同类型的钱包和创建新帐户的方法。在本教程中,我提出了两种方法:
- MyEtherWallet (MEW)
- 元掩码
要使用 MEW 创建钱包,请转到此链接并按照说明进行操作。MyEtherWallet 提供了 3 种创建以太坊钱包的方法:
- MEW钱包(移动应用程序)
- 按密钥库文件
- 按助记词
第一个选项是最安全的,但它最不灵活,因为我们无法直接访问钱包的私钥。第三种选择是最灵活的,因为我们可以在开发环境中使用助记词将智能合约部署到主网上。
要使用 Metamask 创建钱包,请转到此链接,安装 Web 浏览器扩展并按照说明创建新钱包。安装 Metamask 后,您还可以导入以前生成的钱包,包括 MyEtherWallet 钱包。
了解钱包、私钥和助记词的工作原理非常重要。请遵循所有安全建议并确保您的私钥安全。如果您丢失了密钥或您的帐户被黑客入侵,您将无法取回您的资金。您还应该使用不同的钱包,例如,一个硬件钱包来存储您的大部分资金,而 MyEtherWallet 只包含部署智能合约所需数量的 Ether。
设置好钱包后,您应该向其中添加一些以太币。您可以从Coinbase或Binance等平台之一购买以太币并将其转移到您的钱包中。将智能合约部署到以太坊区块链的成本取决于使用情况。您可以查看此网站以获取成本的实时估算。
3.4. 设置本地开发环境
我们首先安装 Node.js、Truffle、Ganache 和带有 Solidity 扩展的 VSCode:
- 要安装 Node.js,请转到此链接并按照安装说明进行操作。一旦安装,你可以打开一个终端,执行以下命令来检查Node.js的版本:
node -v
。我在本教程中使用了 v14.16.0。 - 要安装松露,从终端执行以下命令:
npm install -g truffle@5.1.65
。 - 要安装 Ganache,请转到此链接并将相应版本下载到您的操作系统。安装后,您可以打开应用程序并检查 Ganache 的 GUI。
- 要安装 VSCode,请转到此链接并将相应版本下载到您的操作系统。安装后,您应该添加Solidity 扩展。
3.5. 开发智能合约
现在我们已经准备好了我们的开发环境,我们可以开始我们的项目了。从终端,我们通过执行以下命令来创建我们的项目文件夹:
mkdir hello-nfts-tutorial cd hello-nfts-tutorial
接下来,我们通过执行以下操作来启动我们的 Truffle 项目:
松露初始化
这将创建用于开发和部署我们的智能合约的所有必要文件夹和文件:
- 合同/:Solidity 合同目录
- 迁移.sol
- migrations/:脚本化部署文件的目录
- 1_initial_migration.js
- test/:用于测试应用程序和合约的测试文件目录
- truffle-config.js:松露配置文件
接下来,我们做一些清洁工作。我们删除Migrations.sol
文件,为智能合约添加一个新文件HelloNFTContract.sol
,git
为版本控制进行初始化并添加一个.gitignore
文件。
rm 合同/Migrations.sol 触摸合约/HelloNFTContract.sol 混帐初始化 触摸 .gitignore
接下来,我们安装 OpenZeppelin Contracts:
npm install @ openzeppelin /合同@3.4.0
接下来,我们将 hello-nfts-tutorial 文件夹添加到 VSCode。
在开始编码之前,让我们打开 OpenZeppelin 的 ERC721 并了解实现。您可以在 下找到 ERC721 源代码node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol
。
- 第 93 行:我们有初始化合约的构造函数。它需要一个名称和一个用于令牌集合的符号。
- 第 308 行:我们有铸币功能
_safeMint
。它以以太坊地址和代币 ID 作为输入,并安全地铸造新代币并将其转移到指定地址。 - 第 411 行:我们有设置令牌 URI 的函数。URI 应指向一个 JSON 文件,该文件包含有关我们链接到 NFT 的资产的信息。例如:名称、描述和位置。
- ERC721 还实现了多种功能,可用于检查代币并将其转移到新地址。
现在我们了解了 ERC721 标准的基础知识,我们可以开始实施我们的智能合约。我们打开文件contracts/HelloNFTContract.sol
并将下面的代码复制到其中。下面的代码改编自 [12]。
// SPDX-License-Identifier: MIT pragma solidity \ 0.6.2 ; 导入 "../node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol" ; 导入 "../node_modules/@openzeppelin/contracts/utils/Counters.sol" ; 合同 HelloNFTContract 是 ERC721 { 使用 Counters for Counters 。计数器; 计数器。计数器 私有 _tokenIds ; 构造函数() public ERC721 ( "Hello NFT" , "HNFT" ) {} 函数 mintNFT (字符串 内存 令牌URI ) 公共 返回 (uint256 ) {_ tokenIds 。增量(); uint256 newItemId = _tokenIds 。当前(); _safeMint ( msg . sender , newItemId ); _setTokenURI ( newItemId , tokenURI ); 返回 newItemId ; } }
以下是理解我们代码的要点:
- 我们首先声明我们将用于智能合约的 Solidity 版本。
- 我们从 OpenZeppelin 导入我们需要的文件:
ERC721.sol
:OpenZeppelin 的 ERC721 实现。Counters.sol
:OpenZeppelin 的计数器实现。这将帮助我们跟踪我们的令牌 ID。
- 我们定义我们的智能合同,我们的名字:
HelloNFTContract
。我们还指定我们的合约是 ERC721 合约。 - 里面的
HelloNFTContract
合同:- 我们定义了一个变量
_tokenIds
。 - 我们调用 ERC721 的构造函数。我们需要为我们的令牌集合指定名称和符号。在这种情况下,我们选择:
Hello NFT
作为名称,HNFT
作为符号。 - 最后,我们定义了铸币功能。该函数定义
newItemId
了我们将铸造的新项目的 id,设置令牌 URI 并安全地铸造我们的令牌。
- 我们定义了一个变量
3.6. 在本地编译和部署智能合约
现在我们有了智能合约的代码,我们可以在本地编译和部署我们的智能合约。
编译智能合约
我们首先指定松露应该用来编译我们的智能合约的 Solidity 版本。为此,打开truffle-config.js
并修改第 82 至 95 行,如下所示。
// 配置你的编译 器编译器: { solc : { version : "0.6.2" , // 从 solc-bin 中获取确切版本(默认:truffle 的版本) // docker: true, // 使用 "0.5.1" you'已使用 docker 本地安装(默认:false) // 设置:{ // 有关优化和 evmVersion 的建议,请参阅 Solidity 文档 // 优化器:{ // 启用:false, // 运行:200 // }, // evmVersion :“拜占庭” // } } }
为了编译我们的智能合约,我们truffle compile
从终端执行命令。如果一切顺利,我们应该会收到以下消息和一个名为的新文件夹build
,该文件夹包含编译的工件以及每个编译的智能合约的 JSON 文件。


启动本地区块链
Truffle 带有一个内置的本地区块链,我们可以使用它在本地测试我们的智能合约。我们执行命令truffle develop
在端口 9545 上启动开发区块链。 一旦我们的区块链启动,我们可以在控制台上看到 truffle 创建了一个测试帐户列表,其中包含相应的私钥和用于创建这些帐户的助记符。


现在我们有一个松露本地区块链,我们可以将它连接到 Ganache GUI。为此:
- 启动 Ganache 并点击:New Workspace – Ethereum。
- 单击“服务器”选项卡并确保端口号为 9545
- 单击 Accounts & Keys 选项卡:将 truffle 区块链生成的助记词复制并粘贴到助记符文本框中。
- 单击保存工作区按钮。
如果我们转到 Ganache 中的 Accounts 选项卡,我们可以看到地址与 truffle 本地区块链中的地址相同。


在本地部署智能合约
我们首先指定要部署的智能合约。为此,我们打开migrations/1_initial_migration.js
并修改它如下:
const HelloNFTContract = artifacts 。要求(“HelloNFTContract” ); 模块。出口 = 功能 (部署者) { 部署者。部署(HelloNFTContract ); };
从终端和松露内开发控制台,我们执行以下命令:migrate
。如果一切顺利,我们应该会收到与新部署的合约相关的以下消息。我们可以看到部署合约的以太坊地址、合约地址和其他有关交易的信息。


如果我们在 Ganache 中打开交易选项卡,我们可以看到与部署我们的智能合约相关的交易。


3.7. 在本地与智能合约交互
现在我们已经在本地部署了我们的智能合约,我们可以与它进行交互。例如,从终端和 Truffle Develop 控制台内,我们可以尝试以下命令:
- 打印我们作为本地区块链的一部分创建的以太坊账户的地址。
帐户
- 启动 HelloNFTContract 智能合约的新实例。
const helloNFT = 等待 HelloNFTContract 。部署();
- 铸造 NFT。为此,我们需要指定 JSON 文件的 url,其中包含有关我们要链接到 NFT 的资产的信息。
你好NFT 。mintNFT (“ HTTPS :// someurl 。的COM /数字_资产。JSON ” )
- 从特定帐户(在本例中为第 4 个以太坊帐户)创建 NFT。
你好NFT 。mintNFT (“ HTTPS :// someurl 。的COM /另一_数字_资产。JSON ” , {从: 帐户[ 3 ]})
- 使用 tokenId 检查令牌的所有者:1
你好NFT 。所有者( 1 )
- 使用 tokenId 检查令牌的 URI:1
你好NFT 。令牌URI ( 1 )
- 将 tokenId 为 1 的代币从地址
0xc169BcDbaCBCb5e633b53cddC3AD6c486B33dcA2
转移到地址0x24952e99e381a72a1938d96B0128f9cEF086d5e8
你好NFT 。transferFrom ( "0xc169BcDbaCBCb5e633b53cddC3AD6c486B33dcA2" , "0x24952e99e381a72a1938d96B0128f9cEF086d5e8" , 1 )


3.8. 将智能合约部署到测试网
以太坊有多个称为测试网的公共测试网络,其运行方式与以太坊主网类似。这些测试网允许我们免费测试智能合约。我们将使用 Rinkeby 测试网来部署和测试我们的HelloNFTContract.sol
智能合约。
添加测试以太
要使用 Rinkeby 测试网,我们应该将 Rinkeby 测试以太币添加到我们的帐户中。为此,我们从 Metamask 获取我们的公共以太坊地址,并按照这些说明进行操作。完成后,我们可以转到 Metamask,选择 Rinkeby Test Network,我们可以确认我们的帐户中有一些 Rinkeby test Ether。


获取 Infuria API 密钥
如果您没有 Infuria 帐户,请前往Infuria 的网站并创建一个。创建帐户后,单击以太坊/新项目。为您的项目选择一个名称,然后单击“创建”按钮。


您可以通过转到项目的设置页面并选择 Rinkeby 端点来找到您的 API 密钥。


安装 HDWalletProvider 并编辑 truffle-config.js 文件
HDWalletProvider 是一个松露模块,它允许我们连接到以太坊网络并通过 infura.io 执行交易。要安装 HDWalletProvider,请执行以下命令:npm install @truffle/hdwallet-provider@1.2.2
.
接下来,我们需要创建一个名为的新文件.secret
,并将用于生成以太坊钱包的助记词存储在其中。这样,我们就不必在truffle-config.js
. .secret
文件应添加到.gitignore
.
接下来,我们打开truffle-config.js
,我们取消注释以下几行:
const HDWalletProvider = require ( '@truffle/hdwallet-provider' ); const fs = 要求( 'fs' ); const 助记符 = fs 。readFileSync ( ".secret" )。toString ()。修剪();
我们将网络配置修改为:
网络: { rinkeby : { 提供商: () => 新 HDWalletProvider (助记符, `的https ://设有通往Ropsten 。infura 。IO / V3 / YOUR - PROJECT - ID ` ), NETWORK_ID : 3 , //设有通往Ropsten的id 气体: 5500000 , // Ropsten 的区块限制低于主网 } }
我们应该替换YOUR-PROJECT-ID
为您的 Infuria 项目 ID。
部署到 Rinkeby 网络
从终端执行以下命令将我们的智能合约部署到 Rinkeby 网络。
松露迁移 --network rinkeby
如果一切顺利,我们应该会收到下面的消息。我们应该保留合约地址,以便能够与我们新部署的智能合约进行交互。


与我们的智能合约交互并在 Rinkeby 网络上创建 NFT
现在我们已将智能合约部署到 Rinkeby 网络,我们可以与其进行交互。为此,我们需要 2 条信息: 我们从终端复制的合约地址 智能合约的 ABI。ABI 代表应用程序二进制接口。它是 JSON 格式的合约函数和参数列表。
我们智能合约的 ABI 存储在./build/contracts/HelloNFTContract.json
.
要获取 ABI,我们可以直接从 JSON 文件中复制它,也可以通过执行以下命令从终端获取它:node
,进入节点 shell 和下面的代码来打印 ABI。
const fs = 要求( 'fs' ); const 合同 = JSON 。解析(FS 。readFileSync ('./build/contracts/HelloNFTContract.json' , 'UTF8' )); 控制台。日志(JSON 。字符串化(合同。ABI ));


接下来,我们访问MEW 的网站,我们选择Access My Wallet
并使用 Metamask 和 Rinkeby 测试网络登录。连接后,我们从左侧菜单中进行选择Contract/Interact with Contract
。我们将智能合约地址和 ABI 复制到 2 个框中,然后单击Continue
。


如果一切顺利,我们应该会看到一个下拉菜单,其中包含我们智能合约中的所有可用功能。我们选择mintNFT
,输入TokenURI
要链接到 NFT 的资产的 ,然后单击Write
按钮。我们应该得到一个 Metamask 弹出窗口,要求确认交易。我们点击Confirm
按钮。


我们刚刚铸造了我们的 NFT!
我们可以通过Etherscan确认交易细节。


3.9. 将智能合约部署到以太坊主网
在本节中,我们将使用 truffle 将我们的智能合约部署到以太坊主网。我们需要真正的 ETH 来进行部署,这需要花钱。在撰写本文时,以太坊的 gas 费用非常高,在这一步中你应该非常小心。
我们首先在 truffle-config.js 中编辑网络配置。
网络: { rinkeby : { 提供商: () => 新 HDWalletProvider (助记符, `的https :// rinkeby 。infura 。IO / V3 / YOUR - PROJECT - ID ` ), NETWORK_ID : 4 , // Rinkeby的id 气体: 5500000 , // Rinkeby 的区块限制低于 主网}, main : { provider : () => 新 HDWalletProvider (助记符, `的https :// mainnet 。infura 。IO / V3 / YOUR - PROJECT - ID ` ) NETWORK_ID : 1 , // Mainnet ID 气体: 4000000 , gasPrice : 400亿, 确认: 2 / / # 在部署之间等待的 confs。(默认: 0) } }
Gas 和 gasPrice 参数在这一步中非常重要。请查看此链接以获取详细说明。
Gas 参数是我们愿意在此交易上花费的最大天然气量。我们可以通过查看 testnet 部署摘要来了解所需的 gas 量。
Gas 价格取决于以太坊网络的繁忙程度。我们可以查看Etherscan 的 Gastracker以了解我们在部署时需要的 gasprice。


接下来,我们运行以下命令将我们的智能合约部署到主网上。
松露迁移 --network main


如果一切顺利,我们应该将智能合约部署在主网上。我们可以使用交易哈希和合约地址来检查交易的详细信息和有关智能合约的信息。


3.10. 将我们的 NFT 铸造到主网
现在我们已经部署了 NFT,我们可以创建 NFT。我们首先创建一个 JSON 文件,其中包含“Hello, NFTs!”的元数据。动图。然后我们将 GIF 文件和 JSON 存储在所有人都可以访问的服务器上。IPFS是存储链接到 NFT 的数字资产的流行选项。
在本教程中,我将在我的网站上存储这两个文件。
- 链接到元数据文件-> 这将是 TokenURI
- 链接到“你好,NFT!” 动图
接下来,我们转到MEW 的网站,我们选择Access My Wallet
并使用 Metamask 和 Mainnet Test Network 登录。连接后,我们从左侧菜单中进行选择Contract/Interact with Contract
。我们将智能合约地址和 ABI 复制到 2 个框中,然后单击Continue
。


如果一切顺利,我们应该会看到一个下拉菜单,其中包含我们智能合约中的所有可用功能。我们选择mintNFT
功能我们输入TokenURI
我们的GIF:http : //adilmoujahid.com/files/hello-nfts-rgb.json 我们点击Write
按钮


我们应该得到一个 Metamask 弹出窗口,要求确认交易。我们点击Confirm
按钮。


我们刚刚将 NFT 铸造到主网!我们可以通过Etherscan确认交易细节。


3.10. 在 OpenSea 上出售 NFT
现在 NFT 是在以太坊主网上铸造的,我们可以从OpenSea 网站看到它的内容。
作为 NFT 的所有者,我可以使用我的 Metamask 钱包登录 OpenSea,并设定出售 NFT 的价格。你好 NFT你好,NFT!2购买此商品❯
4. NFT 和物理对象
在前面的部分中,我们了解了 NFT 如何使用区块链唯一标识和表示数字资产的所有权。在本节中,我们将介绍 NFT 和物理对象。我们将研究将物理对象表示为 NFT 的局限性,以及一些艺术家如何使用 NFT 来构建结合数字和物理对象的新体验。
我个人觉得这个话题很有趣,我想创建一个代表“你好,NFTs!”的物理对象。NFT。在经历了多个想法之后,我最终决定创建一个基于乐高的二维码,该二维码链接到一个网页,该网页显示有关“你好,NFTs!”的信息。项目。
4.1. 将物理对象表示为 NFT 的限制
正如我们在 3.10 节中看到的,要创建代表资产的 NFT,我们需要将包含 JSON 格式的资产元数据的 URI 传递给智能合约。例如,您可以在此链接中看到“Hello, NFTs!”的元数据。动图。
对于数字资产,在线存储资产及其相应的元数据很容易。我们甚至可以使用像IPFS这样的系统来确保我们无法更改链接到 NFT 的数据。
在物理对象的情况下,事情变得有点复杂。以数字方式表示物理对象的最佳方法是为该对象提供一个唯一标识符。例如,序列号或身份验证证书。即使有认证证书,我们也不能 100% 确定实物是真实的。还存在可转移性的挑战。一旦代表物理对象的 NFT 从用户 A 转移到用户 B,就不能保证用户 A 会将对象交付给用户 B。
一个极端的例子说明了将 NFT 与物理对象联系起来的挑战,是一个名为BurntBanksy的团体的故事,他们以 95,000 美元的价格购买了正宗的 Banksy,然后在 YouTube 视频中将其烧掉,并以 NFT 的形式出售了该艺术品的高分辨率图片. 在他们的 Twitter 账户上,这个团体声称“肩负着将物理艺术世界与 NFT 联系起来的使命”。
4.2. 结合数字资产和实物
第一个结合数字资产和物理对象的直接 NFT 用例是在比计算机屏幕更好的媒体中查看 NFT 的数字内容。例如,Beeple 创建了定制的数字屏幕,除了显示所有者的信息外,还用于显示他的数字艺术。Beeple 将这些数字屏幕称为物理令牌。


来源:https : //www.beeple-collect.com/faq
其他艺术家和技术人员正在创建物理对象的数字孪生并将它们铸造为 NFT。例如,美国平面设计师 Kii Arens 创作了一件 NFT 支持的艺术品,用于在加利福尼亚州千橡市出售一栋实体房屋。
4.3. 构建基于乐高的二维码
在本节中,我们将看到我如何构建一个基于乐高的二维码,该二维码链接到一个网页,该网页显示有关“你好,NFTs!”的信息。GIF 和 NFT。
技术要求
我对我的二维码有 3 个主要要求:
- 它必须适合32×32 的乐高底板。
- 它必须在中间包含“NFT”这个词。
- 它必须对“Hello, NFTs!”的 URL 进行编码。项目页面。
二维码具有纠错能力 (ECC),可在代码损坏时恢复数据。我需要拥有最高级别的 ECC(H 级),以便从 QR 码中间取出像素并将它们替换为“NFT”一词的像素化版本。
看二维码的规格,我选择了ECC级别为H的版本3。这个版本可以编码一个长度不超过35个字符的字母数字串。
“你好,NFT!”的 URL 项目页面 长度为 43 个字符。我使用bitly将 URL 缩短为 23 个字符长的 URL:http://bit.ly/hellonfts。
生成二维码
为了生成二维码,我使用python
了qrcode
python 库。以下是用于创建 QR 码并将其保存为 PNG 文件的源代码。您可以在此 github 存储库中找到相同的内容。
#制作一个二维码,对url qr = qrcode的值进行编码。QRCode的(版本= 3 , error_correction = QRCode的。常量。ERROR_CORRECT_H , box_size = 1 , 边界= 0 ) q或r 。add_data工具(“ HTTP ://位。LY / hellonfts ” ) q或r 。制作(适合=真) #制作二维码图片 img_qr = qr . make_image ( fill_color = "black" , back_color = "white" ) #将 img_qr 转换为 numpy 数组 img_qr_array = np . 数组(img_qr ) #将单词“NFT”的像素化版本创建为 numpy 数组 nft = np 。数组([[真、 真、 真、 真、 真、 真、 真、 真、 真、 真、 真、 真、 真、 真、 真]、 [真、 假、 真、 真、 假、 真、 假, 假, 假, 假, 真, 假, 假, 假, 真], [真, 假, 假, 真, 假, 真, 假, 真, 真, 真, 真, 真, 假, 真, 真], [真, 假, 真, 假, 假, 真, 假, 假, 假, 真, 真, 真, 假, 真, 真], [真, 假, 真, 真, 假, 真, 假, 真, 真, 真, 真, 真, 假, 真, 真]、 [真、 假、 真、 真、 假、 真、 假、 真、 真、 真、 真、 真、 假、 真、 真]、 [真、 真、 真、 真、 真、 真、 真、 真、 真、 真、 真, True , True , True , True ]]) # 用“NFT” 字样的像素化版本改变二维码的中间位置img_qr_array [ 12 : 19 , 7 : 22 ] = nft nft_qr_img = 我。fromarray ( img_qr_array ) nft_qr_img 。保存('nft_qr.png' )


构建基于乐高的二维码
我使用32×32 乐高底板和标准黑色 1×1 和 1×2 乐高积木来构建上一节中生成的二维码的乐高版本。乐高二维码运行良好,并与“你好,NFTs!”相关联。项目页面。



结论
在这篇博文中,我们介绍了 NFT 的基础知识、它们的历史和生态系统。我们还学习了如何在以太坊主网上开发和部署 NFT 智能合约。NFT 仍处于成熟和采用的早期阶段,但该技术具有很大潜力,我相信我们将在中短期内看到更多 NFT 用例。
参考
[1]智能合约 – 维基百科
[2]可替代性 – 维基百科
[3] 交易对手 – Bitcoinwiki
[4] 交易对手 – 维基百科
[10]什么是NBA Top Shot?解释区块链 NBA 亮点收藏品
[12] OpenZeppelin ERC721
http://xzh.i3geek.com