2021-04-09 18:02 | 出处: ECN以太坊中文社区
来源 | freecodecamp.org
作者 | Patrick Collins
在这篇文章里,笔者将展示如何在没有软件公共技术背景下制作 NFT。然后,我们将学习如何用 Brownie、 Python、和 Chainlink 制作无限制可自定义的 NFT。以及我们也会看到如何在 OpenSea 的 NFT 市场上部署和销售我们的创作。
如果你在找使用 Truffle、JavaScript 和有趣的中世纪人物的教程,可以看看如何《构造、部署、和出售你的NFT》 。
什么是 NFT?
NFTs (Non-Fungible Tokens,不可置换代币) 可以用一个词来总结:唯一性。这些是部署在区块链上的智能合约,代表着某种东西的唯一性。
ERC20 vs ERC721
NFT 是一种区块链代币标准,与 ERC20 相似,像 AAVE、SNX、和LINK (准确来说是 ERC677)。ERC20 是“可置换”代币,这意味着那些代币是可被替换的 (replaceable) 和可互相兑换 (interchangeable)。
例如,无论你使用的是哪种美元钞票,你的美元钞票都将价值 1 美元。美元钞票上的序列号可能不一样,但钞票间是可以互相兑换的,而且它们仍然价值1美元。
另一方面,NFT 是“不可置换的”,它们遵守的是它们自己的代币标准 ERC721。例如,蒙罗丽莎是“不可置换的”。即使有人可以制作一个副本,永远也只会有一幅蒙罗丽莎。如果蒙罗丽莎是在区块链上创造的,那么它就是个 NFT。
原始图像来自 Wikipedia
NFT 是做什么的?
NFT 给创作者、艺术家、游戏设计师和其他职业者提供价值,保存在链上的部署还能永久保存。
你总能知道是谁创作了 NFT、谁拥有了 NFT、NFT 的来源,等等,它们给这些创作者带来的价值比传统艺术更大。在传统艺术里,分辨赝品会有点难,但链上历史是很容追踪到的。
由于智能合约和 NFT 是100%可编程的,NFT 还可以添加内置的版税和其他功能。给艺术家补助一直是一个问题,因为情况经常是艺术家的作品广泛传播而人们不知道作品是谁的。
越来越多的艺术家和工程师正在跃跃欲试,参与到这个有巨大价值的领域,因为这最终是让艺术家获得作品报酬的好途径。不止于此,NFT 是展示你的创造力以及在数字世界成为收藏者的有趣方式。
NFT 的价值
NFT 已经走了很长一段路了,并且我们不断看到有拍卖价格破纪录的 NFT,比如“Everyday:The First 5,000 Days” 以 6930 万美元售出。
图像来自 Twitter
因此,这里蕴含着很多价值,它也是在数字世界创作艺术和学习创建智能合约的有趣、动态、和很有魅力的方式。那么,现在我将教你如何制作 NFT 。
如何制作 NFT ?
文章不会涉及的内容
现在,制作 NFT 最简单的方法是到像 Opensea、 Rarible 或 Mintible 这些平台,跟着它们的逐步指引在它们平台部署。
你可以完全采用这个方法,但你可能会被绑定在平台上,受限于平台提供的功能。你不能实现无限制的自定义制作,或真正使用 NFT 的优势。但如果你是一个初级软件工程师,或没有非常丰富的技术知识,这是适合你的方法。
如果你想成为一名很强的软件工程师,学习一些 solidity 的知识,且有能力可以用无限的创造力创造一些东西,请继续往下看吧!
如果你刚接触 solidity,不用担心,我们会从基础讲起。
如何用无限制的定制制作一个 NFT
我将用这个 NFT Brownie Mix 让你快速入门。这是一个工作代码库,有非常多样板代码。
准备要求
我们需要安装下列内容才能开始:
Python
Nodejs 和 npm
Metamask
如果你不熟悉 Metamask,你可以按着这个教程设置。
Rinkeby测试网上的ETH和LINK
我们还需要在 Rinkeby 以太坊测试网上工作,因此我们能免费把我们的合约部署到一个真正的区块链网络上。
测试网是用来测试我们的智能合约在现实世界运行得如何的好方法。我们需要有 Rinkeby 网络的 ETH和 LINK 测试币,我们可以在 Chainlink 文档中最新的水龙头链接里免费获得。
我们还需要添加 Rinkeby 的LINK测试币到我们的 metamask 里,我们可以跟着这个获取 LINK 文档的步骤。
如果你还是很疑惑,你可以跟着这个视频去做,只是要注意是用的 Rinkeby 而不是 Ropsten。
当在像 Ethereum 这样的智能合约平台上工作时,我们需要支付少量的 ETH,在需要从链下获取数据时,我们需要支付少量的 LINK。这就是为什么我们需要测试网的 LINK 和 ETH 测试币。
正式开始吧!这是我们准备部署到 OpenSea 的 NFT。
快速开始
git clone https://github.com/PatrickAlphaC/nft-mixcd nft-mix
现在我们需要安装ganache-cli和eth-brownie
pip install eth-brownienpm install -g ganache-cli
现在我们可以设置环境变量。如果你对环境变量不熟悉,你可以只把它们添加到你的.env文档,然后运行:
source .env你刚刚克隆的代码库里应该有一个.env (环境)样本,它是加了环境变量注释的。取消注释就可以使用它们了!
你将需要一个WEB3_INFURA_PROJECT_ID(Web3 Infura 项目 ID) 和一个 PRIVATE_KEY(私钥)。注册一个免费 Infura 账号就会有这个 WEB3_INFURA_PROJECT_ID。它会使我们可以发送交易到区块链上。
你还需要一个密钥,你可以在你的 Metamask 里获得。点一下那三个小点,然后点击Account Details(账户详情)和Export Private Key(导出私钥)。如果你准备把真钱放进去的话,不要把私钥告诉别人。
export PRIVATE_KEY=YOUR_KEY_HEREexport WEB3_INFURA_PROJECT_ID=YOUR_PROJECT_ID_HERE
.env
现在我们可以用以下两个命令部署我们的 NFT 合约和创建我们第一件收藏品了。
brownie run scripts/simple_collectible/deploy_simple.py --network rinkebybrownie run scripts/simple_collectible/create_collectible.py --network rinkeby
第一行命令用来把我们的 NFT 合约部署到 Rinkeby 区块链,第二行命令用来创建我们第一件收藏品。
你刚已经部署了我们第一份智能合约了!
它不做什么事,但不用担心。我将在这份教程的高级部分展示你可以如何把它部署到 OpenSea 上。但首先,让我们看看 ERC721 代币标准吧。
ERC721 代币标准
让我们在SimpleCollectible.sol文档里看看刚部署的合约吧。
// SPDX-License-Identifier: MITpragma solidity 0.6.6;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";contract SimpleCollectible is ERC721 {uint256 public tokenCounter;constructor () public ERC721 ("Dogie", "DOG"){tokenCounter = 0;}function createCollectible(string memory tokenURI) public returns (uint256) {uint256 newItemId = tokenCounter;_safeMint(msg.sender, newItemId);_setTokenURI(newItemId, tokenURI);tokenCounter = tokenCounter + 1;return newItemId;}}
我们采用的是 OpenZepplin 的 ERC721 代币标准。我们导入的这个包 (package) 允许我们使用一个典型 ERC721 代币的全部功能。这定义了我们的代币将具有的所有功能,例如transfer意味着把我们的代币转移给新用户,safeMint表示创建新的代币,等等。
在 OpenZepplin 的ERC721 代币合约里,你可以找到赋予我们合约的所有功能。我们的合约是通过这个命令行承继这些功能的:
contract SimpleCollectible is ERC721 {solidity 的承继就是这样工作的。当我们部署合约时,constructor会被自动调用,它还需要一些参数。
constructor () public ERC721 ("Dogie", "DOG"){tokenCounter = 0;}
我们的构造函数也使用了ERC721的构造函数,我们只需要给它取一个名字和一个符号。在我们的例子中,是"Dogie"和"DOG"。这意味着每个我们创造的 NFT 都是 Dogie/DOG 类。
这就像每张 Pokemon 卡片都是一个 pokermon,或每个在集换式卡片上的棒球手都是一名棒球手。每个棒球手是独一无二的,但他们全部是棒球手。我们只是在用DOG类。
在顶部我们有tokenCounter,用来计数我们创建了多少这个类型的 NFT。每个新代币都会获得一个基于当前 tokenCounter 的 tokenId。
实际上,我们可以用 createCollectible 函数创建一个 NFT。这就是在我们的create_collectible.py脚本里调取的函数。
function createCollectible(string memory tokenURI) public returns (uint256) {uint256 newItemId = tokenCounter;_safeMint(msg.sender, newItemId);_setTokenURI(newItemId, tokenURI);tokenCounter = tokenCounter + 1;return newItemId;}
_safeMint 函数创建新的 NFT,并把它分给任何调用了createdCollectible 的账户,即msg.sender,且会有一个从tokenCounter派生的 newItemId。这就是我们追踪谁拥有什么的方法——查看所有者的 tokenId。
你会发现我们还调用 _setTokenURI。
什么是 NFT 元数据和 TokenURI
当智能合约被创建了,NFT 就被创建了,人们很快会发现把大量数据部署到区块链真的超级超级贵。试想一下,储存1 KB 的数据可能就需要100万美元。
对于 NFT 来说,这显然是一个问题,因为拥有创意艺术意味着你必须把这个信息储存在某处。他们还想要一种轻量方法储存 NFT 的属性信息——这就是需要 tokenURI 和元数据的地方。
TokenURI