非同质化代币 (NFTs)

news/2024/11/22 4:00:56/

如何创建一个NFT

要创建一个 NFT,你需要:

  1. 将图像上传到像 Arweave 这样的 IPFS 网络上。
  2. 将 JSON 元数据上传到像 Arweave 这样的 IPFS 网络上。
  3. 调用 Metaplex 创建一个用于该 NFT 的账户。

上传到 Arweave

  • TS
  • Python

Press </> button to view full source

// 1. Upload image to Arweave
const data = fs.readFileSync("./code/nfts/arweave-upload/lowres-dog.png");const transaction = await arweave.createTransaction({data: data,
});transaction.addTag("Content-Type", "image/png");const wallet = JSON.parse(fs.readFileSync("wallet.json", "utf-8"))
await arweave.transactions.sign(transaction, wallet);const response = await arweave.transactions.post(transaction);
console.log(response);const id = transaction.id;
const imageUrl = id ? `https://arweave.net/${id}` : undefined;// 2. Upload metadata to Arweaveconst metadataRequest = JSON.stringify(metadata);const metadataTransaction = await arweave.createTransaction({data: metadataRequest,
});metadataTransaction.addTag("Content-Type", "application/json");await arweave.transactions.sign(metadataTransaction, wallet);await arweave.transactions.post(metadataTransaction);

铸造(Mint)该 NFT

如果你已经上传了图像和元数据,您可以使用以下代码铸造(Mint)该 NFT。

Press </> button to view full source

const mintNFTResponse = await metaplex.nfts().create({uri: "https://ffaaqinzhkt4ukhbohixfliubnvpjgyedi3f2iccrq4efh3s.arweave.net/KUAIIbk6p8oo4XHRcq0U__C2r0mwQaNl0gQow4Qp9yk",maxSupply: 1,
});

注意

你不能使用与你钱包不同的创作者信息来铸造(Mint) NFT。如果遇到创作者的问题,请确保你的元数据中将你列为创作者。

如何获取 NFT 元数据

Metaplex 的 NFT 元数据存储在 Arweave 上。为了获取 Arweave 的元数据,您需要获取 Metaplex PDA(程序派生账户)并对账户数据进行解码。

Press </> button to view full source

const connection = new Connection(clusterApiUrl("mainnet-beta"));
const keypair = Keypair.generate();const metaplex = new Metaplex(connection);
metaplex.use(keypairIdentity(keypair));const mintAddress = new PublicKey("Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK"
);const nft = await metaplex.nfts().findByMint({ mintAddress });console.log(nft.json);

如何获取NFT的所有者

如果你拥有 NFT 的铸币密钥,你可以通过查看该铸币密钥对应的最大代币账户来找到其当前所有者。

请记住,NFT 的供应量为 1,它们是不可分割的,这意味着在任何时刻只有一个代币账户持有该代币,而其他所有与该铸币密钥相关的代币账户的余额都为 0。

一旦确定了最大代币账户,我们可以获取它的所有者。

Press </> button to view full source

const connection = new Connection("https://api.mainnet-beta.solana.com");
const tokenMint = "9ARngHhVaCtH5JFieRdSS5Y8cdZk2TMF4tfGSWFB9iSK";
const largestAccounts = await connection.getTokenLargestAccounts(new PublicKey(tokenMint)
);
const largestAccountInfo = await connection.getParsedAccountInfo(largestAccounts.value[0].address
);
console.log(largestAccountInfo.value.data.parsed.info.owner);

如何获取 NFT 的铸币地址

如果你知道Candy Machine的公钥,你可以使用以下代码获取从该Candy Machine生成的所有 NFT 铸币地址的列表。请注意,我们可以使用以下的 memcmp 过滤器,因为在 v1 版本中,第一个创作者的地址总是Candy Machine的地址。

Candy Machine V1

Press </> button to view full source

const getMintAddresses = async (firstCreatorAddress: PublicKey) => {const metadataAccounts = await connection.getProgramAccounts(TOKEN_METADATA_PROGRAM,{// The mint address is located at byte 33 and lasts for 32 bytes.dataSlice: { offset: 33, length: 32 },filters: [// Only get Metadata accounts.{ dataSize: MAX_METADATA_LEN },// Filter using the first creator.{memcmp: {offset: CREATOR_ARRAY_START,bytes: firstCreatorAddress.toBase58(),},},],});return metadataAccounts.map((metadataAccountInfo) =>bs58.encode(metadataAccountInfo.account.data));
};getMintAddresses(candyMachineId);

Candy Machine V2

如果你正在使用Candy Machine v2,你首先需要访问其 "Candy Machine Creator" 地址,该地址是一个简单的 PDA,使用candy_machine和Candy Machine v2 地址作为种子生成。一旦你获得了创建者地址,你可以像对待 v1 版本一样使用它。

  • TS

Press </> button to view full source

const getCandyMachineCreator = async (candyMachine: PublicKey
): Promise<[PublicKey, number]> =>PublicKey.findProgramAddress([Buffer.from("candy_machine"), candyMachine.toBuffer()],CANDY_MACHINE_V2_PROGRAM);const candyMachineCreator = await getCandyMachineCreator(candyMachineId);
getMintAddresses(candyMachineCreator[0]);

如何从钱包获取所有 NFT?

当从钱包获取所有 NFT 时,你需要获取所有的代币账户,然后解析出其中的 NFT。你可以使用 Metaplex JS 库中的 findDataByOwneropen in new window 方法来完成这个过程。

  • TS

Press </> button to view full source

const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
const keypair = Keypair.generate();const metaplex = new Metaplex(connection);
metaplex.use(keypairIdentity(keypair));const owner = new PublicKey("2R4bHmSBHkHAskerTHE6GE1Fxbn31kaD5gHqpsPySVd7");
const allNFTs = await metaplex.nfts().findAllByOwner({ owner });console.log(allNFTs);

Candy Machine v2

Metaplex JS SDK 现在支持通过代码创建和更新Candy Machine v2。它使开发者能够与糖果机v2 程序进行交互,创建、更新和删除Candy Machine,并从中铸造(Mint) NFT。

如何创建Candy Machine

  • TS

Press </> button to view full source

const { candyMachine } = await metaplex.candyMachinesV2().create({sellerFeeBasisPoints: 5, // 0.05% royaltiesprice: sol(0.0001), // 0.0001 SOLitemsAvailable: toBigNumber(5), // 5 items available
});/*** #1 Candy Machine ID - HSZxtWx6vgGWGsWu9SouXkHA2bAKCMtMZyMKzF2dvhrR*/

如何删除Candy Machine

  • TS

Press </> button to view full source

// creating a candy machine
const { candyMachine } = await metaplex.candyMachinesV2().create({sellerFeeBasisPoints: 5, // 0.05% royaltiesprice: sol(0.0001), // 0.0001 SOLitemsAvailable: toBigNumber(5), // 5 items available
});console.log(`Candy Machine ID - ${candyMachine.address.toString()}`);// deleting the candy machine
const { response } = await metaplex.candyMachinesV2().delete({candyMachine,
});

如何通过权限查找Candy Machine

要查找所有权限为特定公钥的 Candy Machine,我们需要使用 findAllByopen in new window 函数,并将 type 参数设置为 authority。

  • TS

Press </> button to view full source

const candyMachines = await metaplex.candyMachinesV2().findAllBy({type: "authority",publicKey: authority,
});candyMachines.map((candyMachine, index) => {console.log(`#${index + 1} Candy Machine ID - ${candyMachine.address}`);
});/*** #1 Candy Machine ID - HSZxtWx6vgGWGsWu9SouXkHA2bAKCMtMZyMKzF2dvhrR*/

如何通过钱包地址查找Candy Machine

要通过钱包地址获取 Candy Machine 对象,我们需要使用 findAllByopen in new window 函数,并将 type 参数设置为 wallet。你可以从浏览器的 "Anchor data" 选项卡中获取 Candy Machine 的钱包地址。

  • TS

Press </> button to view full source

const candyMachines = await metaplex.candyMachinesV2().findAllBy({type: "wallet",publicKey: wallet,
});candyMachines.map((candyMachine, index) => {console.log(`#${index + 1} Candy Machine ID - ${candyMachine.address}`);
});

如何通过Candy Machine的地址查找它

要通过Candy Machine的地址查找Candy Machine,我们需要使用findByAddressopen in new window 函数。

  • TS

Press </> button to view full source

const candyMachine = await metaplex.candyMachinesV2().findByAddress({address: candyMachineId,
});

如何从Candy Machine找到铸造(mint)的 NFT

  • TS

Press </> button to view full source

const candyMachine = await metaplex.candyMachinesV2().findMintedNfts({candyMachine: candyMachineId,
});

如何将物品插入到Candy Machine

  • TS

Press </> button to view full source

await metaplex.candyMachines().insertItems({candyMachineId,items: [{ name: "My NFT #1", uri: "https://example.com/nft1" },{ name: "My NFT #2", uri: "https://example.com/nft2" },{ name: "My NFT #3", uri: "https://example.com/nft3" },],
});

如何从Candy Machine铸造(Mint)一个 NFT

默认情况下,铸造的 NFT 的所有者是metaplex.identity().publicKey。如果你希望将 NFT 铸造到其他钱包中,可以将新的钱包公钥与newOwner参数一起传递。

  • TS

Press </> button to view full source

// by default, the owner of the minted nft would be `metaplex.identity().publicKey`. if you want to mint the nft to some other wallet, pass that public key along with the `newOwner` parameter
const candyMachine = await metaplex.candyMachinesV2().mint({candyMachine: candyMachineId,// newOwner: new PublicKey("some-other-public-key");
});

大家如果有问题可以一起讨论, https://t.me/gtokentool


http://www.ppmy.cn/news/1548929.html

相关文章

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

C语言 蓝桥杯某例题解决方案(查找完数)

蓝桥杯原题&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点&#xff0c;与我们上一个解决的问题“质因数分解”不同&#xff0c;它不需要判断因数是否是质数&#xff0c;因此…

自监督强化学习:好奇心驱动探索(CDE)算法

自监督强化学习&#xff1a;好奇心驱动探索&#xff08;CDE&#xff09;算法 自监督强化学习&#xff08;Self-Supervised Reinforcement Learning&#xff0c;SSL-RL&#xff09;是一类特殊的强化学习方法&#xff0c;其核心思想是让智能体在没有明确外部奖励信号的情况下&am…

淘宝 NPM 镜像源

npm i vant/weapp -S --production npm config set registry https://registry.npmmirror.com 要在淘宝 NPM 镜像站下载项目或依赖&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 设置淘宝 NPM 镜像源 首先&#xff0c;你需要设置淘宝 NPM 镜像源以加速下载。可以通过…

vue3点击按钮el-dialog对话框不显示问题

vue3弹框不显示问题&#xff0c;控制台也没报错 把 append-to-body:visible.sync"previewDialogOpen" 改为 append-to-bodyv-model"previewDialogOpen" 就好了。

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型2 处理连接字符串

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Preamble puncture 信号处理技术

Preamble puncture 是一种用于通信系统中的信号处理技术&#xff0c;尤其是在 无线通信 和 5G 网络等系统中使用。它通常用于改善传输效率和减少干扰&#xff0c;尤其是在多用户共享同一频谱资源时。简单来说&#xff0c;preamble puncture 技术可以在特定条件下跳过某些信号序…