在本文中,我们将学习如何使用 Brownie、Python 和 Chainlink 来制作非同质化的 NFT 作品,并在 OpenSea NFT 市场上展示和销售我们的成果。

什么是 NFT?

NFT英文全称为Non-Fungible Token,翻译成中文就是:非同质化代币,具有不可分割、不可替代、独一无二等特点。NFT由于其非同质化、不可拆分的特性,使得它可以和现实世界中的一些商品绑定。换言之,其实就是发行在区块链上的数字资产,这个资产可以是游戏道具、数字艺术品、门票等,并且具有唯一性和不可复制性。由于NFT具备天然的收藏属性和便于交易,加密艺术家们可以利用NFT创造出独一无二的数字艺术品。

ERC20 与 ERC721

NFT 是类似于 ERC20 的区块链token标准,如 AAVE、SNX 和 LINK(技术上为 ERC677)。ERC20 是“可替代”的代币,意思是“可替换”或“可互换”。

例如,无论您使用什么美元纸币,您的美元纸币都将值 1 美元。美元钞票上的序列号可能不同,但钞票是可以互换的,无论如何它们都值 1 美元。

另一方面,NFT 是“不可替代的”,它们遵循自己的代币标准 ERC721。例如,蒙娜丽莎是“不可替代的”。即使有人可以复制它,但永远只有一个蒙娜丽莎。如果蒙娜丽莎是在区块链上创建的,它将是 NFT。

NFT 有什么用?

NFT 通过将合约永久地部署在链上,让创作者、艺术家、游戏设计师等创造价值。

你将永远知道谁创造了 NFT,谁拥有 NFT,它来自哪里等等,这种独特性让他们比传统艺术更有价值。在传统艺术中,理解什么是“假货”可能很棘手,而链上的历史很容易追溯。

由于智能合约和 NFT 是 100% 可编程的,NFT 还可以添加内置的版税和任何其他功能。补偿艺术家一直是一个问题,因为通常艺术家的作品在没有任何归属的情况下四处传播。

越来越多的艺术家和工程师开始利用这一巨大的附加值,因为这最终成为艺术家获得工作报酬的好方法。不仅如此,NFT 还是一种展示您的创造力并成为数字世界收藏家的有趣方式。

NFT 的价值

NFT 已经走过了漫长的道路,我们不断看到 NFT 的销售额创下纪录,例如下面这幅名为“每天:前 5,000 天”的画作售价为 6930 万美元。

NFT也是在数字世界中创造艺术和了解智能合约创建的一种有趣、动态和引人入胜的方式。所以现在将教你制作 NFT 所需的一切知识。

如何制作 NFT

现在,制作 NFT 的最简单方法就是前往 Opensea、Rarible 或 Mintible 等平台,并按照他们的分步指南在他们的平台上进行部署即可。

你可以 100% 走这条路,但是你可能会被平台绑定。你无法实现无限的定制,或者真正利用 NFT 的任何优势。

如果你想用代码来实现,学习一些扎实的知识,并有能力以无限的创造力创造出一些东西,那么请继续阅读!

如何进行无限定制的 NFT

首先介绍NFT Brownie Mix。这是一个包含大量样板代码的工作仓库。

https://github.com/PatrickAlphaC/nft-mix

先决条件

我们需要安装一些东西才能开始:

  • Python

  • Nodejs 和 npm

  • Metamask

如果您不熟悉 Metamask,您可以按照下面教程进行设置。

https://docs.chain.link/docs/install-metamask/

Rinkeby Testnet ETH 和 LINK

我们还将部署在 Rinkeby 以太坊测试链上!

测试链是测试我们的智能合约在现实世界中表现的好方法。我们需要 Rinkeby ETH 和 Rinkeby LINK,我们可以从 Chainlink 文档中最新水龙头的链接中免费获得它们。

我们还需要将 rinkeby LINK 的token添加到metamask中,我们可以按照 LINK 文档进行操作。

https://docs.chain.link/docs/acquire-link/

注意一定要使用 Rinkeby 而不是 Ropsten。在使用像以太坊这样的智能合约平台时,我们需要支付一点 ETH,而从链下获取数据时,我们需要支付一点 LINK。这就是我们需要获取测试链上的LINK 和 ETH 的原因。

下面这件作品就是我们要部署到 OpenSea 的 NFT。

https://testnets.opensea.io/assets/0x8acb7ca932892eb83e4411b59309d44dddbc4cdf/0

快速上手

git clone https://github.com/PatrickAlphaC/nft-mix
cd nft-mix

现在我们需要安装 ganache-clieth-brownie

pip install eth-brownie
npm install -g ganache-cli

现在我们可以设置我们的环境变量。如果您不熟悉环境变量,只需将它们添加到 .env 文件中,然后运行:

source .env

.env的示例应该在你刚刚克隆的 repo 中,并注释掉了环境变量。请确保取消注释以使用它们!

您需要一个 WEB3_INFURA_PROJECT_ID和一个 PRIVATE_KEYWEB3_INFURA_PROJECT_ID 可以在注册免费 Infura 帐户时找到。这将为我们提供一种将交易发送到区块链的方法。

我们还需要一个私钥,您可以从您的 Metamask 中获取。点击 3 个小点,然后单击帐户详细信息和导出私钥。如果您投入现金进去,请不要与任何人分享此密钥!

export PRIVATE_KEY=YOUR_KEY_HERE
export WEB3_INFURA_PROJECT_ID=YOUR_PROJECT_ID_HERE

现在我们可以部署我们的 NFT 合约并使用以下两个命令创建我们的第一个收藏品。

brownie run scripts/simple_collectible/deploy_simple.py --network rinkeby
brownie run scripts/simple_collectible/create_collectible.py --network rinkeby

第一个脚本将我们的 NFT 合约部署到 Rinkeby 区块链,第二个脚本创建了我们的第一个收藏品。

您刚刚部署了第一个智能合约!

它根本没有什么作用,但别担心——我将在本教程的高级部分向您展示如何在 OpenSea 上渲染它。首先,让我们看看 ERC721 代币标准。

ERC721 代币标准

我们来看看我们刚刚部署的合约,在 SimpleCollectible.sol 文件中。

// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;
import"@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract SimpleCollectibleis 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;
}
}

我们将 OpenZeplin 包用于 ERC721 token。导入的这个包允许我们使用典型 ERC721 token的所有功能。这定义了我们的代币将具有的所有功能,例如 transfer——将代币转移给新用户, safeMint——创建新代币,等等。

您可以通过查看 OpenZepplin ERC721 代币合约找到赋予我们合约的所有功能。我们的合约在下面一行继承了这些功能:

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

contract SimpleCollectibleis ERC721 {

这就是 Solidity 继承的方式。当我们部署一个合约时,构造函数会被自动调用,它需要一些参数。

constructor () public ERC721 ("Dogie", "DOG"){tokenCounter = 0;
}

我们还使用了 ERC721 的构造函数,在我们的构造函数中,我们只需要给它一个名称和一个符号。在我们的例子中,它是“Dogie”和“DOG”。这意味着我们创建的每个 NFT 都将是 Dogie/DOG 类型。

这就像每张口袋妖怪卡仍然是口袋妖怪,或者交易卡上的每个棒球运动员仍然是棒球运动员。每个棒球运动员都是独一无二的,但他们仍然都是棒球运动员。我们只是使用 DOG 类型。

我们在顶部有 tokenCounter 来计算我们创建了多少这种类型的 NFT。每个新token都会根据当前的 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

NFT 上的 tokenURI 是token“外观”的唯一标识符。URI 可以是通过 HTTPS 的 API 调用、IPFS 哈希值或任何其他独特的东西。

它们遵循显示元数据的标准,如下所示:

{
"name": "name",
"description": "description",
"image": "https://ipfs.io/ipfs/QmTgqnhFBMkfT9s8PHKcdXBn1f5bG3Q5hmBaR4U6hoTvb1?filename=Chainlink_Elf.png",
"attributes": [
{
"trait_type": "trait",
"value": 100
}
]
}

这些显示了 NFT 的外观及其属性。图像部分指向 NFT 外观的另一个 URI。这使得 Opensea、Rarible 和 Mintable 等 NFT 平台可以轻松地在其平台上呈现 NFT,因为它们都在寻找这种元数据。

链下元数据与链上元数据

现在你可能会想“等等......如果元数据不在链上,这是否意味着我的 NFT 可能会在某个时候消失”?你是对的。

您认为链下元数据意味着您不能使用该元数据让您的智能合约相互交互也是正确的。

这就是为什么我们要专注于链上元数据,以便我们可以对 NFT 进行编程以相互交互。

但是,我们仍然需要链下元数据的图像部分,因为我们没有一种很好的方法来在链上存储大图像。但是别担心,我们仍然可以通过使用 IPFS 在去中心化网络上免费做到这一点。

这是来自 IPFS 的 imageURI示例,它显示了在龙与地下城教程中创建的 ChainlinkElf

https://blog.chain.link/build-deploy-and-sell-your-own-dynamic-nft/

我们没有为简单的 NFT 设置 tokenURI,因为我们只想展示一个基本示例。

下一篇将讲解 NFT 进阶知识,这样就可以看到我们用链上元数据实现的一些惊人功能,在 opeansea 上渲染 NFT,并让我们的狗狗振作起来!

欢迎添加下方二维码加入社群

一起探讨Python与区块链开发技术

点击下方阅读原文加入社区会员

用 Python 制作 NFT 区块链作品(上)相关推荐

  1. 解密NFT区块链游戏和收藏品市场

    近年来,基于区块链技术的NFT(Non-Fungible Token, 即非同质化代币)市场正在悄然兴起.目前,全球众多企业和资本纷纷入局NFT,激发了NFT的市场活力. 近期,贝恩针对NFT区块链游 ...

  2. 贝恩解密NFT区块链游戏和收藏品市场

    近年来,基于区块链技术的NFT(Non-Fungible Token, 即非同质化代币)市场正在悄然兴起.目前,全球众多企业和资本纷纷入局NFT,激发了NFT的市场活力. 近期,贝恩针对NFT区块链游 ...

  3. 用Python从零开始创建区块链

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 前言 如果你还没有听说过 3 点钟区块链群,说明你还不是链圈的人:如果你还没有加入 3 点钟区块链群,说明你还不是链圈的 ...

  4. 看完此文再不懂区块链算我输:手把手教你用Python从零开始创建区块链

    导读:如果你还没有听说过 3 点钟区块链群,说明你还不是链圈的人:如果你还没有加入 3 点钟区块链群,说明你还不是链圈的大佬:如果你还没有被 3 点钟区块链群刷屏,说明你还体会不到什么是"币 ...

  5. 如何用Python快速实现区块链?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! [编者按]区块链自诞生那天起就是互联网业界最富有争议与分歧的技术之一.它是比特币和其他加密货 ...

  6. 通过python构建一个区块链来学习区块链

    了解区块链Blockchains如何工作的最快方法就是构建一个区块链.你来到这里是因为,和我一样,你对加密钱币的崛起感到很兴奋.而且你想知道区块链是如何工作的,想了解它们背后的基本技术. 但理解区块链 ...

  7. python实现简单区块链

    python实现简单区块链 import hashlib import json from time import time from typing import Any, Dict, List, O ...

  8. 菜鸟日记day3(结束篇):用Python实现基于区块链的食堂农产品溯源管理信息系统大作业

    经过两周的课程设计,终于完成了整个报告的书写.有必要总结一下书写的顺序等,对毕业论文会有帮助. 1,写作逻辑 目录 第一章 选题论证 2 第二章 信息系统分析 3 一.食品溯源管理信息系统需求分析 3 ...

  9. 区块链python还是c_区块链要学什么编程语言?

    1.C/C++ C/C++语言基本上是所有代码技术工程师的新手入门语言,在区块链应用构架中的协议层之中,必须编写许多的数学运算,其中加密解密的哈希函数.高精度的数值运算,并且还规定代码防反编译,防窜改 ...

最新文章

  1. “利他主义者”乔治·普莱斯的一生(全文翻译自Independent)
  2. 华为服务器HBA卡在哪个位置,服务器hba 设置
  3. tengine 调用php,nginx 或tengine 访问日志分割处理
  4. DM368开发 -- Bootloader 开发(转毕设)
  5. python 取名字_python 获取如何获取类的名称?
  6. 程序员如何用糖果实现盈利 - [别人家的程序员01]
  7. 关于Django综述
  8. python如何在exel中编程_如何使用Python以编程方式将行添加到现有Excel表中
  9. 亲身试验 pycharm 下载 并 安装 pygame包
  10. 设计一个安全对外的API接口,需要考虑哪些方面?
  11. [置顶] Android之Handler用法总结
  12. activeMQ的基本使用
  13. 通过配置IP SLA跟踪静态路由
  14. 史上最全的美国留学资料,从此不用找中介
  15. python大神的成长之路普通话三分钟_我的成长之路普通话考试讲话三分钟范文
  16. 超难打地鼠 【安卓游戏】
  17. php 豆瓣api_豆瓣申请API Key教程
  18. 背单词App开发日记1
  19. 中国象棋AI在线对弈游戏源码
  20. linux新建用户和目录权限设置密码,用户创建及权限管理

热门文章

  1. 第16周实践项目三——点结构体(2)
  2. CMMI(软件能力成熟度集成模型)
  3. 从阿尔法磁谱仪在国际空间站的最新结果
  4. PCIe实用调试工具MindShare Arbor一直用
  5. 透视人工智能教育伦理问题
  6. 高等数学精选题汇总(持续更新中~)
  7. python 通达信上传云端_python模拟登录通达信
  8. AQR: 二十年告诉你,造就成功的,不仅仅是专业
  9. 看完3d打印机类型及优缺点,再决定选哪款stratasys3D打印机
  10. 巾粉世家消毒毛巾能对美发店脏毛巾进行统一回收