主页 > 放imtoken钱包安全吗 > 以太坊实战——创建并运行最简单的 NFT 合约
以太坊实战——创建并运行最简单的 NFT 合约
以太坊实战——创建并运行最简单的NFT合约NFT理论部分
NFT,全称Non-Fungible Token,非同质化货币。 在了解非同质化货币之前,首先需要了解同质化货币与非同质化货币的区别。
语言框架
同质货币
功能类似于我们现实生活中使用的1元。 虽然面号不同,但价值是一样的。
非同质货币
功能类似于我们现实生活中的车牌。 不同的车牌号不同,数值不同以太坊合约怎么玩,价格相差很大。
非同质代币的产生是实现区块链的一种方式。 非同质代币为促进艺术品尤其是虚拟艺术品的流通提供了极大的支持。
非同质代币的典型应用项目:
恋猫癖:CryptoKitties | 目录
从理论上讲,在同质化货币 ERC-20 的基础上,区块链可以通过确保其发行的所有代币具有唯一编号来创建非同质化货币。 目前,以太坊提出了ERC-721合约接口来支持上述功能。
创建一个通用的 NFT 合约
针对非同质化货币以太坊合约怎么玩,以太坊组织制定了ERC-721接口规范。
虽然没有提供ERC-721接口规范的官方实现,但是网上已经有很多很好实现的通用实现可供我们参考或者直接继承。
例如,以下开源项目提供了 ERC-20 和 ERC-721 合约接口的通用实现。 地址:
项目已经将实现的合约打包上传到npm仓库,我们可以通过以下命令给项目引入依赖:
$ yarn add @openzeppelin/contracts
使用以下命令创建塔罗牌合约TarotCard.sol
$ truffle create contract TarotCard
创建的合约如下所示:
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
contract TarotCard {
constructor() public {
}
}
介绍ERC-721的通用实现,让TarotCard合约继承已经实现的ERC-721合约。
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract TarotCard is ERC721 {
constructor() ERC721("Tarot","TAROT") {
}
}
至此,我们创建了一个NFT合约,合约名称为Tarot,合约的token为TAROT。 在这个NFT合约的基础上,我们可以编写业务代码来构建领域相关的NFT合约。
创建 NFT 项目
哔哩哔哩·卡罗品牌项目
项目将发布以下26张卡牌合集,每张卡牌编号从0到25。
每张卡片只能为一个账户所拥有,该账户有权将收藏转移至其他账户,或销毁。
项目合同
关于ERC-721的一般实现是如何工作的,可以参考第6章,分析了ERC-721的一般实现。
任何合约中的代币都有三个生命阶段,这三个阶段的代码如下所示。
...
contract TarotCard is ERC721 {
uint8[] public tarots;
constructor() ERC721("Tarot","TAROT") {
}
function mint() public {
require(tarots.length <= 0, "only can mint once");
for (uint8 i = 0; i < 26; i++) {
tarots.push(i);
_mint(msg.sender, i);
}
}
}
...
使用以下命令创建测试文件 tarot_card.js:
$ truffle create test TarotCard
以下是测试文件的基本内容,可以用来测试TarotCard合约是否正常发布。
const TarotCard = artifacts.require("TarotCard");
contract("TarotCard", function (/* accounts */) {
it("should assert true", async function () {
await TarotCard.deployed();
return assert.isTrue(true);
});
});
接下来补充测试内容,验证铸币功能的正确性。
const TarotCard = artifacts.require("TarotCard");
contract("TarotCard", function (/* accounts */) {
// 测试合约是否正常发布
it("should assert true", async function () {
await TarotCard.deployed();
return assert.isTrue(true);
});
// 测试合约铸币函数逻辑是否正确
it("verify mint call", async function () {
await TarotCard.deployed();
return assert.isTrue(true);
});
});