用Sui JS SDK铸造NFT

我发现唯一缺少的是关于如何在 Sui 上铸造 NFT 的一些基本解释以及你可能需要解决的一些问题,所以我想分享一下这种经验并演示一下!

用Sui JS SDK铸造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翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。
通过 NowPayments 打赏