用Sui JS SDK铸造NFT
我发现唯一缺少的是关于如何在 Sui 上铸造 NFT 的一些基本解释以及你可能需要解决的一些问题,所以我想分享一下这种经验并演示一下!
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK
我最喜欢的消遣方式之一就是尝试新的区块链,看看它们是什么样子,它们提供什么,以及在这些区块链上构建有多容易。最近,我偶然发现了 Sui 及其一些独特功能,例如动态元数据和帮助日常用户加入的目标。在亲自试用之后,我对它的速度和流畅度印象深刻,这说明了一些问题,因为它仍在开发中!
我发现唯一缺少的是关于如何在 Sui 上铸造 NFT 的一些基本解释以及你可能需要解决的一些问题,所以我想分享一下这种经验并演示一下!
要开始使用,你只需要 NodeJS 和 VSCode 等文本编辑器等基础知识,以及一些关于 Javascript 的基本知识。
1、使用 Pinata 设置你的 NFT
虽然 Sui 具有动态元数据,但你仍然需要使用服务来存储图像、视频或你想要转换为 NFT 的任何其他类型的内容! Pinata 非常理想,因为它使用 IPFS,可以防止篡改内容。
开始使用 Pinata 非常简单!只需访问此处的注册页面,然后开始使用免费帐户。现在您要做的就是上传要使用的图像。访问主文件页面并单击“上传”和“选择文件”即可。
之后,只需按照选择文件、命名然后上传的步骤操作即可!完成后,它应该会显示在你的文件页面中,如下所示,我们将要复制 CID 以备后用。
2、使用 Sui JS SDK 设置代码
首先,让我们使用以下终端命令创建一个新目录,项目将存放在该目录中:
mkdir sui-nft && cd sui-nft
现在让我们安装 Sui Javascript SDK:
npm init -y && npm install @mysten/sui.js
我们需要对 package.json 文件进行一个小改动,即添加模块类型,因此请确保您的 package.json 如下所示。
{
"name": "sui-nft",
"type": "module",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@mysten/sui.js": "^0.26.1"
}
}
最后,我们要创建一个文件来运行我们的代码,我们将其称为 mint-nft.js
touch mint-nft.js
现在我们可以开始做点好事了——编写代码来铸造我们的 NFT!
3、铸造 NFT
继续在你选择的文本编辑器中打开你的 mint-nft.js 文件,我们要做的第一件事是在页面顶部导入以下方法。
import { Ed25519Keypair, JsonRpcProvider, Network, RawSigner } from '@mysten/sui.js';
我们真正需要的只有四样东西,在我们开始构建时,你会看到它们是如何发挥作用的。接下来我们需要做的是创建一个钱包并获取该钱包的公共地址,我们可以这样做。
import { Ed25519Keypair, JsonRpcProvider, Network, RawSigner } from '@mysten/sui.js';
const keypair = new Ed25519Keypair()
const address = "0x" + keypair.getPublicKey().toSuiAddress().toString()
console.log(address)
访问 keypair
对象可以非常轻松地获取公钥或私钥,然后将其转换为可用数据。公钥中的 Sui 地址不包含前导“0x”,因此我在这里手动添加它。如果你现在进入终端并运行“node mint-nft.js”,那么你应该会看到这样的地址!
0x8f7671eedff42d6dde8c365a6b641bb9769ea02e
现在我们有了钱包地址,是时候连接到 Sui 网络并获取一些测试 Sui 币了!首先,我们将声明一个新的提供程序并使用 JsonRpcProvider,并传入网络“DEVNET”。
import { Ed25519Keypair, JsonRpcProvider, Network, RawSigner } from '@mysten/sui.js';
//Create keypair
const keypair = new Ed25519Keypair()
const address = "0x" + keypair.getPublicKey().toSuiAddress().toString()
console.log(address)
//Create network connection
const provider = new JsonRpcProvider(Network.DEVNET);
然后我们将使用提供程序从 Devnet 水龙头请求一些测试 Sui,并使用我们的新地址作为接收器。
import { Ed25519Keypair, JsonRpcProvider, Network, RawSigner } from '@mysten/sui.js';
//Create keypair
const keypair = new Ed25519Keypair()
const address = "0x" + keypair.getPublicKey().toSuiAddress().toString()
console.log(address)
//Create network connection
const provider = new JsonRpcProvider(Network.DEVNET);
// Get Sui from faucet
const fund = await provider.requestSuiFromFaucet(address)
console.log(fund)
现在让我们运行 node mint-nft.js 命令,看看我们得到了什么!
0xf64640227ff94ba762252c15f2adbcedb6d3aaab
{
transferred_gas_objects: [
{
amount: 10000000,
id: '0x39c25c3885c2cccea957c26219de9c7e58a33a21',
transfer_tx_digest: '4ETS2rGNzRYZ95SsLrUsQf8ckfZWQSSqTEpGi32RqKbk'
},
{
amount: 10000000,
id: '0x3bdad5c729495d9d152cfd03b0e44e8549972d53',
transfer_tx_digest: '4ETS2rGNzRYZ95SsLrUsQf8ckfZWQSSqTEpGi32RqKbk'
},
{
amount: 10000000,
id: '0x4a748f4e928b974dd46913e2cc069a21fecaad86',
transfer_tx_digest: '4ETS2rGNzRYZ95SsLrUsQf8ckfZWQSSqTEpGi32RqKbk'
},
{
amount: 10000000,
id: '0x66d601ef1811cbdea82d2eb97a0994afdbbc888a',
transfer_tx_digest: '4ETS2rGNzRYZ95SsLrUsQf8ckfZWQSSqTEpGi32RqKbk'
},
{
amount: 10000000,
id: '0xee8668e7c2fcd60047992f170da075dafd955f48',
transfer_tx_digest: '4ETS2rGNzRYZ95SsLrUsQf8ckfZWQSSqTEpGi32RqKbk'
}
],
error: null
}
太棒了!通过这个我们可以看到我们收到的 Sui,相当于 0.05 Sui。你可能想知道为什么这里有 5 个不同的项目,它们有不同的 ID,而这实际上是 Sui 模型中非常重要的一部分,并不自然。Sui 中的每个币都有自己独特的对象 ID。这些都是同一种货币类型,即默认的 Sui 类型,但我们的五个项目属于自己的阵营。当我们尝试使用 Sui 铸造 NFT 时,这可能会导致问题,因为它会尝试从其中一个对象中提取数据,而理想情况下我们希望像普通区块链一样从所有对象中提取数据。
可以这样想。假设你有一个农场,里面有五个奶牛场,每个奶牛场都按奶牛的类型分开:短毛、长毛等。每个奶牛场有 10 头奶牛,所以你从技术上讲有 50 头奶牛,但为了换取一些山羊,你需要 20 头奶牛。你必须清空其中两个奶牛场并将它们合并起来进行交易。这基本上就是我们在 Sui 中用硬币做的事情。
话虽如此,为了铸造,我们需要合并一些我们最近获得的 Sui 空投。我们将使用以下代码执行此操作。
// Merge two of the Sui coin objects
const coin1 = fund.transferred_gas_objects[0].id
const coin2 = fund.transferred_gas_objects[1].id
const signer = new RawSigner(keypair, provider);
const mergeTxn = await signer.mergeCoin({
primaryCoin: coin1,
coinToMerge: coin2,
gasBudget: 1000,
});
console.log('MergeCoin txn', mergeTxn);
这里有很多事情要做,让我们分解一下。
首先,我们通过从基金结果中访问这些对象 ID,从我们刚刚收到的空投中声明 coin1 和 coin2。然后我们需要声明我们的签名者!这就是让我们使用密钥对中的私钥在链上进行传输或铸造的原因,我们通过声明一个新的 RawSigner
并传入我们之前制作的密钥对和提供程序进行连接来实现这一点。最后,我们使用 mergeCoin
方法并传入我们的两个硬币以及 gas 预算。
在运行此代码之前,我们遗漏了一件小事。如果你现在尝试运行此代码,可能会收到一个错误,提示它找不到硬币的对象 ID。这是因为它刚刚创建,而我们正试图访问一个尚未完全发现的对象 ID。为了解决这个问题,我们将像这样创建一个名为 wait
的小辅助函数。
// Pause function
const wait = async (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, time)
});
}
这真的很简单,只需让我们传入在继续我们的功能之前我们想要等待多少毫秒即可!让我们在获得空投并传入 3 秒后使用它。你的代码现在应该看起来像这样。
import { Ed25519Keypair, JsonRpcProvider, Network, RawSigner } from '@mysten/sui.js';
// Generate a new Keypair
const keypair = new Ed25519Keypair();
const address = "0x" + keypair.getPublicKey().toSuiAddress().toString()
console.log(address)
// Create Network Connection and receive airdrop
const provider = new JsonRpcProvider(Network.DEVNET);
// Get Sui from faucet
const fund = await provider.requestSuiFromFaucet(address)
console.log(fund)
// Pause function
const wait = async (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, time)
});
}
await wait(3000)
// Merge two of the Sui coin objects
const coin1 = fund.transferred_gas_objects[1].id
const coin2 = fund.transferred_gas_objects[2].id
const signer = new RawSigner(keypair, provider);
const mergeTxn = await signer.mergeCoin({
primaryCoin: coin1,
coinToMerge: coin2,
gasBudget: 1000,
});
console.log('MergeCoin txn', mergeTxn);
如果运行此代码,应该会看到空投的结果、合并币之前的暂停以及成功的币合并!现在我们把所有的牛都放在一个头里,我们可以成功铸造一个 NFT。让我们来看看吧!
// Call to Mint NFT
const mintTxn = await signer.executeMoveCall({
packageObjectId: '0x2',
module: 'devnet_nft',
function: 'mint',
typeArguments: [],
arguments: [
'gm',
'A nice gm brought to you by Pinata and Sui',
'ipfs://QmZhnkimthxvL32vin2mrQvnhN8ZbWFMvKMxRqHEq7dPz3',
],
gasBudget: 10000
});
console.log('mint transaction:', mintTxn);
我们的 minting
函数只是访问一个名为 devnet_nft
的预构建智能合约,我们正在使用`mint”函数。我们要传递的参数是 NFT 的名称、描述,然后是资产链接!
在我们铸造之前,我将做最后一个控制台日志,让我们在浏览器中查看 NFT。为此,我们需要访问 NFT 铸造的结果并获取 NFT 的对象 ID,然后将其传递到 Sui 浏览器链接中,如下所示。
// View NFT
const nftId = mintTxn.effects.effects.created[0].reference.objectId.toString()
console.log(`View NFT: https://explorer.sui.io/object/${nftId}?network=devnet`)
现在让我们看看我们的完整代码,确保一切正常,然后运行它!
import { Ed25519Keypair, JsonRpcProvider, Network, RawSigner } from '@mysten/sui.js';
// Generate a new Keypair
const keypair = new Ed25519Keypair();
const address = "0x" + keypair.getPublicKey().toSuiAddress().toString()
console.log(address)
// Create Network Connection and receive airdrop
const provider = new JsonRpcProvider(Network.DEVNET);
// Get Sui from faucet
const fund = await provider.requestSuiFromFaucet(address)
console.log(fund)
// Pause function
const wait = async (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, time)
});
}
await wait(3000)
// Merge two of the Sui coin objects
const coin1 = fund.transferred_gas_objects[1].id
const coin2 = fund.transferred_gas_objects[2].id
const signer = new RawSigner(keypair, provider);
const mergeTxn = await signer.mergeCoin({
primaryCoin: coin1,
coinToMerge: coin2,
gasBudget: 1000,
});
console.log('MergeCoin txn', mergeTxn);
// Call to Mint NFT
const mintTxn = await signer.executeMoveCall({
packageObjectId: '0x2',
module: 'devnet_nft',
function: 'mint',
typeArguments: [],
arguments: [
'gm',
'A nice gm brought to you by Pinata and Sui',
'ipfs://QmZhnkimthxvL32vin2mrQvnhN8ZbWFMvKMxRqHEq7dPz3',
],
gasBudget: 10000
});
console.log('mint transaction:', mintTxn);
// View NFT
const nftId = mintTxn.effects.effects.created[0].reference.objectId.toString()
console.log(`View NFT: https://explorer.sui.io/object/${nftId}?network=devnet`)
如果一切正常,你将获得一个链接,然后应该会看到最终的 NFT!
你做到了!!🎉
你成功在 Sui 上铸造了一个 NFT!!当然,这只是可能的开始。也许下一步是将 NFT 转移到另一个钱包,或者甚至尝试建立一个 Sui 市场👀
原文链接:How to Mint an NFT on Sui using Pinata and the Sui JS SDK
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。