当前位置: 首页 > 科技观察

使用Python制作NFT区块链(上篇)_0

时间:2023-03-13 22:26:42 科技观察

在本文中,我们将学习如何使用Brownie、Python和Chainlink制作非同质NFT作品,并在OpenSeaNFT市场上展示和销售我们的成果。什么是NFT?NFT的英文全称是Non-FungibleToken,中文翻译为:非同质代币,具有不可分割、不可替代、独一无二的特点。NFT由于其非同质化、不可分割的特性,可以与现实世界中的一些商品进行绑定。也就是说,它其实是一种发行在区块链上的数字资产。该资产可以是游戏道具、数字艺术品、门票等,并且是独一无二的、不可复制的。由于NFT具有天然的收藏属性且易于交易,因此加密艺术家可以使用NFT创作独一无二的数字艺术品。ERC20和ERC721NFT是类似于ERC20的区块链令牌标准,例如AAVE、SNX和LINK(技术上是ERC677)。ERC20是一种“可替代”令牌,意思是“可替换”或“可互换”。例如,无论您使用何种美元钞票,您的美元钞票都将价值1美元。美元钞票上的序列号可能不同,但这些钞票是可以互换的,无论如何它们都值1美元。另一方面,NFT是“不可替代的”,它们遵循自己的代币标准ERC721。例如,蒙娜丽莎是“不可替代的”。即使有人能复制它,也永远只有一个蒙娜丽莎。如果蒙娜丽莎是在区块链上创建的,那将是NFT。NFT有什么用?NFT让创作者、艺术家、游戏设计师等通过在链上永久部署合约来创造价值。你将永远知道谁创造了NFT,谁拥有它,它来自哪里等等。这种独特性使它们比传统艺术更有价值。在传统艺术中,理解什么是“赝品”可能很棘手,而链上历史很容易追溯。由于智能合约和NFT是100%可编程的,因此NFT还可以添加内置版税和任何其他功能。补偿艺术家一直是一个问题,因为艺术家的作品经常在没有任何归属的情况下被传播。越来越多的艺术家和工程师开始利用这种巨大的附加值,因为它最终成为艺术家获得工作报酬的好方法。不仅如此,NFT还是一种展示您的创造力并成为数字世界收藏家的有趣方式。NFTs的价值NFTs已经取得了长足的进步,我们不断看到NFTs的销售记录,例如下面这幅名为“每一天:最初的5,000天”的画作以6930万美元的价格售出。NFT也是一种有趣、动态和引人入胜的方式来创造艺术和了解数字世界中的智能合约创建。所以现在我将教你制作NFT所需的一切知识。如何制作NFT现在,制作NFT最简单的方法是转到Opensea、Rarible或Mintible等平台,并按照他们的分步指南在他们的平台上进行部署。你可以100%走这条路,但你可能会被平台束缚。你无法实现无限定制,也无法真正发挥NFT的任何优势。如果你想在代码中实现,学习一些扎实的知识,并有能力创造出无限创意的东西,那么请继续阅读!如何制作无限定制的NFT首先介绍一下NFTBrownieMix。这是一个包含大量样板代码的工作仓库。https://github.com/PatrickAlphaC/nft-mix先决条件我们需要安装一些东西才能开始:PythonNodejs和npmMetamask如果您不熟悉Metamask,可以按照下面的教程进行设置。https://docs.chain.link/docs/install-metamask/Rinkeby测试网ETH和LINK我们也将部署在Rinkeby以太坊测试链上!测试链是测试我们的智能合约在现实世界中表现如何的好方法。我们需要RinkebyETH和RinkebyLINK,我们可以从Chainlink文档中最新水龙头的链接免费获得它们。我们还需要将rinkebyLINK的令牌添加到元掩码中,我们可以按照LINK文档进行操作。https://docs.chain.link/docs/acquire-link/请务必使用Rinkeby而不是Ropsten。在使用像以太坊这样的智能合约平台时,我们需要支付一点ETH,而在链下获取数据时,我们需要支付一点LINK。这就是为什么我们需要在测试链上获得LINK和ETH。下图是我们要部署到OpenSea的NFT。https://testnets.opensea.io/assets/0x8acb7ca932892eb83e4411b59309d44dddbc4cdf/0gitclone快速入门https://github.com/PatrickAlphaC/nft-mixcdnft-mix现在我们需要安装ganache-cli和eth-brownie。pipinstalleth-brownienpminstall-gganache-cli现在我们可以设置我们的环境变量。如果您不熟悉环境变量,只需将它们添加到您的.env文件中,然后运行:source.env.env一个示例应该在您刚刚克隆的repo中,环境变量被注释掉。确保取消注释以使用它们!您需要一个WEB3_INFURA_PROJECT_ID和一个PRIVATE_KEY。WEB3_INFURA_PROJECT_ID可以在注册免费的Infura帐户时找到。这将为我们提供一种将交易发送到区块链的方法。我们还需要一个私钥,您可以从Metamask中获取。单击3个点,然后单击帐户详细信息和导出私钥。如果您存入现金,请不要与任何人分享此密钥!exportPRIVATE_KEY=YOUR_KEY_HEREexportWEB3_INFURA_PROJECT_ID=YOUR_PROJECT_ID_HERE现在我们可以部署我们的NFT合约并使用以下两个命令创建我们的第一个收藏品。brownierunscripts/simple_collectible/deploy_simple.py--networkrinkebybrownierunscripts/simple_collectible/create_collectible.py--networkrinkeby第一个脚本将我们的NFT合约部署到Rinkeby区块链,第二个脚本创建我们的第一个收藏品。您刚刚部署了您的第一个智能合约!它根本不执行任何操作,但请放心-我将在本教程的高级部分向您展示如何在OpenSea上渲染它。首先,让我们看一下ERC721令牌标准。ERC721TokenStandard让我们看一下我们刚刚在SimpleCollectible.sol文件中部署的合约。//SPDX-License-Identifier:MITpragmasolidity0.6.6;import"@openzeppelin/contracts/token/ERC721/ERC721.sol";contractSimpleCollectibleisERC721{uint256publictokenCounter;constructor()publicERC721("Dogie","DOG")=0;tokenCounter}functioncreateCollectible(stringmemorytokenURI)publicreturns(uint256){uint256newItemId=tokenCounter;_safeMint(msg.sender,newItemId);_setTokenURI(newItemId,tokenURI);tokenCountertokenCounter=tokenCounter+1;returnnewItemId;}}我们将OpenZeplin包C21用于导入这个令牌。包允许我们使用典型ERC721令牌的所有功能。这定义了我们的代币将具有的所有功能,例如transfer-将代币转移给新用户,safeMint-创建新代币等。您可以通过查看OpenZepplinERC721代币合约找到赋予我们合约的所有功能。我们的合约在以下行中继承了这些功能:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.solcontractSimpleCollectibleisERC721{Solidity就是这样继承的。当我们部署一个合约时,构造函数会被自动调用,它需要一些参数。constructor()publicERC721("Dogie","DOG"){tokenCounter=0;}我们也使用了ERC721的构造函数,在我们的构造函数中我们只需要给它一个名字和一个token。在我们的例子中,它是“Dogie”和“DOG”。这意味着我们创建的每个NFT都将是Dogie/DOG类型。就像每张口袋妖怪卡仍然是口袋妖怪,或者交易卡上的每个棒球运动员仍然是棒球运动员。每个棒球运动员都是独一无二的,但他们仍然都是棒球运动员。我们只使用DOG类型。我们在顶部有tokenCounter来计算我们创建了多少这种类型的NFT。每个新的token都会根据当前的tokenCounter得到一个tokenId。NFT实际上可以使用createCollectible函数创建。这是我们在create_collectible.py脚本中写的。functioncreateCollectible(stringmemorytokenURI)publicreturns(uint256){uint256newItemId=tokenCounter;_safeMint(msg.sender,newItemId);_setTokenURI(newItemId,tokenURI);tokenCountertokenCounter=tokenCounter+1;返回new_safeMint;调用createdCollectible的,也就是msg.sender,使用从tokenCounter派生的newItemId。这就是我们通过检查tokenId的所有者来跟踪谁拥有什么的方式。您会注意到我们还调用了_setTokenURI。让我们来看看。什么是NFT元数据和TokenURI?在创建智能合约和创建NFT时,人们很快意识到将大量数据部署到区块链是非常昂贵的。小至1KB的图像的存储成本很容易超过100万美元。这显然是NFT的问题,因为拥有创意艺术意味着你必须将这些信息存储在某个地方。他们还想要一种轻量级的方式来存储有关NFT的属性——这就是tokenURI和元数据发挥作用的地方。TokenURINFT上的tokenURI是令牌“外观”的唯一标识符。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,并为我们的狗加油!