逐步创建 NFT 集合的教程
👋 引言
非同质化代币(NFT)已成为数字艺术和收藏品世界中最热门的话题之一。NFT是使用区块链技术验证所有权和真实性的独特数字资产。它们为创作者和收藏家提供了将数字艺术、音乐、视频和其他形式的数字内容货币化和交易的新可能性。近年来,NFT市场爆炸性增长,一些高调的销售额达到了数百万美元。在本文中,我们将逐步在TON上构建我们的NFT集合。
这是你在本教程结束时将创建的鸭子集合的精美图片:
🦄 你将会学到什么
- 你将在TON上铸造NFT集合
- 你将理解TON上的NFT是如何工作的
- 你将把NFT出售
- 你将把元数据上传到pinata.cloud
💡 必要条件
你必须已经有一个测试网钱包,里面至少有2 TON。可以从@testgiver_ton_bot获取测试网币。
:::info[如何打开我的Tonkeeper钱包的测试网版本?] 要在tonkeeper中打开测试网网络,请转到设置并点击位于底部的tonkeeper logo 5次,之后选择测试网而不是主网。 :::
我们将使用Pinata作为我们的IPFS存储系统,因此你还需要在pinata.cloud上创建一个帐户并获取api_key & api_secreat。官方Pinata 文档教程可以帮助完成这一点。只要你拿到这些api令牌,我就在这里等你!!!
💎 什么是 TON 上的 NFT?
在开始我们教程的主要部分之前,我们需要了解一下通常意义上TON中NFT是如何工作的。出乎意料的是,我们将从解释ETH中NFT的工作原理开始,为了理解TON中NFT实现的特殊性,与行业中常见的区块链相比。
ETH 上的 NFT 实现
ETH中NFT的实现极其简单 - 存在1个主要的集合合约,它存储一个简单的哈希映射,该哈希映射反过来存储此集合中NFT的数据。所有与此集合相关的 请求(如果任何用户想要转移NFT、将其出售等)都特别发送到此1个集合合约。
在 TON 中如此实现可能出现的问题
在TON的上下文中,此类实现的问题由TON的NFT标准完美描述:
-
不可预测的燃料消耗。在TON中,字典操作的燃料消耗取决于确切的键集。此外,TON是一个异步区块链。这意味着,如果你向一个智能合约发送一个消息,那么你不知道有多少来自其他用户的消息会在你的消息之前到达智能合约。因此,你不知道当你的消息到达智能合约时字典的大小会是多少。这对于简单的钱包 -> NFT智能合约交互是可以的,但对于智能合约链,例如钱包 -> NFT智能合约 -> 拍卖 -> NFT智能合约,则不可接受。如果我们不能预测燃料消耗,那么可能会出现这样的情况:NFT智能合约上的所有者已经更改,但拍卖操作没有足够的Toncoin。不使用字典的智能合约可以提供确定性的燃料消耗。
-
不可扩展(成为瓶颈)。TON的扩展性基于分片的概念,即在负载下自动将网络划分为分片链。流行NFT的单个大智能合约与这一概念相矛盾。在这种情况下,许多交易将引用一个单一的智能合约。TON架构为分片的智能合约提供了设施(参见白皮书),但目前尚未实 现。
简而言之,ETH的解决方案不可扩展且不适用于像TON这样的异步区块链。
TON 上的 NFT 实现
在TON中,我们有1个主合约-我们集合的智能合约,它存储它的元数据和它所有者的地址,以及最重要的 - 如果我们想要创建("铸造")新的NFT项目 - 我们只需要向这个集合合约发送消息。而这个集合合约将为我们部署新NFT项目的合约,并提供我们提供的数据。
如果你想更深入地了解这个话题,可以查看TON上的NFT处理文章或阅读NFT标准
⚙ 设置开发环境
让我们从创建一个空项目开始:
- 创建新文件夹
mkdir MintyTON
mkdir MintyTON
- 将以下配置复制到tsconfig.json中
cd MintyTON
- 向package.json添加脚本以构建并启动我们的应用程序
yarn init -y
- 安装所需的库
yarn add typescript @types/node -D
- 创建
.env
文件并根据此模板添加你自己的数据
tsc --init
- 将以下配置复制到tsconfig.json中
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"lib": ["ES2022"],
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": "src",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"strict": true,
"esModuleInterop": true,
"strictPropertyInitialization": false
},
"include": ["src/**/*"]
}
- 在
package.json
中添加脚本以构建和启动我们的应用程序
"scripts": {
"start": "tsc --skipLibCheck && node dist/app.js"
},
- 安装所需的库
yarn add @pinata/sdk dotenv @ton/ton @ton/crypto @ton/core buffer
- 创建
.env
文件并根据此模板添加你自己的数据
PINATA_API_KEY=your_api_key
PINATA_API_SECRET=your_secret_api_key
MNEMONIC=word1 word2 word3 word4
TONCENTER_API_KEY=aslfjaskdfjasasfas
最后打开我们的钱包:
太好了!现在我们准备好开始为我们的项目编写代码了。