首页 > 其他分享 >非同质化代币 (NFTs)

非同质化代币 (NFTs)

时间:2024-11-18 19:47:49浏览次数:3  
标签:const NFTs 代币 await Candy Machine 同质化 NFT metaplex

如何创建一个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 Arweave

const 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% royalties
  price: sol(0.0001), // 0.0001 SOL
  itemsAvailable: 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% royalties
  price: sol(0.0001), // 0.0001 SOL
  itemsAvailable: 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

标签:const,NFTs,代币,await,Candy,Machine,同质化,NFT,metaplex
From: https://blog.csdn.net/2408_87746709/article/details/143815990

相关文章

  • 理解 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:以太坊和 BSC 中的原生代币占位符
    在区块链开发中,我们经常需要处理原生代币,如以太坊(ETH)或BinanceSmartChain(BNB)。这些代币在区块链网络中充当了重要角色,它们不仅是交易的媒介,还是支付交易费用(gas)的主要手段。但在与智能合约交互时,我们如何表示这些代币呢?特别是当这些代币没有合约地址时,如何统一处理?0xEeeeeEee......
  • 什么是非同质化代币(NFT)?
    非同质化代币(NFT)是区块链技术上的一种独特代币,代表了与之相关的独特信息或资产。不同于像比特币或以太坊这样的同质化代币,每个NFT都是独一无二的,无法被替代。近年来,NFT在艺术、音乐、收藏品等领域获得了广泛关注和应用,为数字所有权和物品真实性提供了一个去中心化的解决方案。1......
  • SUI Move官方示例合约实践——FT类:篮子代币(basket)
    SUIMove官方示例合约实践——FT类:篮子代币(basket)1合约说明1.1功能介绍本合约是一个由一篮子代币合成的同质化代币合约,本示例中一篮子代币是由SUI和MANAGED代币1:1组成,但这种方法适用于创建任意资产和比例的篮子。提供了2个写入接口mint:铸造篮子代币,通过存入特定比例......
  • 区块链代币发稿怎么写?如何让金融财经新闻媒体报道包发?
    【本篇由言同数字区块链发稿原创】随着区块链技术的迅猛发展,金融区块链媒体的发稿变得尤为重要。要确保发稿内容合规,本文将探讨如何规避国内法规、适合发布的媒体种类以及有效的合作方法。**如何规避国内法规**1.**避免非法活动和虚假宣传**  -确保发稿内容真实准确,不涉及未经......
  • 【漏洞分析】OSN 代币攻击事件:一笔资金伪造多个分红大户
    背景OSN是一种feeontransfer代币,会根据用户分红账户的余额对用户发放分红。攻击者利用漏洞增发分红账户的余额,随后触发分红机制完成获利。OSN:https://bscscan.com/address/0x810f4c6ae97bcc66da5ae6383cc31bd3670f6d13#code攻击由三笔交易组成:https://app.blocksec.com/......
  • 【文档智能 & RAG】浅看开源的同质化的文档解析框架-Docling
    前言RAG的兴起,越来越多的人开始关注文档结构化解析的效果,这个赛道变得非常的同质化。关于文档智能解析过程中的每个技术环节的技术点,前期文章详细介绍了很多内容:下面我们简单的看看Docling这个PDF文档解析框架里面都有什么技术。方法布局分析模型首先,Docling使用一......
  • OPENAI 调用中代币定价的计算
    我正在尝试对调用OPENAI时使用的代币进行定价。我有一个纯文本的txt文件,已上传到Qdrant。当我问以下问题:谁是迈克尔·乔丹?并使用get_openai_callback函数来跟踪代币数量和操作价格时,输出中的信息关键之一并没有对我来说很有意义。TokensUsed:85......
  • Meme币总市值突破630亿美元 以太坊ETF获批意味着代币化资产“完全安全”
    近日,数字货币市场再次掀起轩然大波。一方面,Meme币总市值突破了630亿美元,令人瞠目结舌;另一方面,以太坊ETF的获批也引发了市场的广泛关注,被视为代币化资产的“完全安全”标志。Meme币总市值飙升Meme币,作为数字货币市场的一种特殊品类,一直以其独特的特性和高度的市场波动性吸引......
  • 智能合约NFT代币系统的开发:构建数字资产生态
    随着区块链技术的迅速发展和数字资产市场的不断壮大,智能合约NFT(非同质化代币)代币系统成为了吸引眼球的焦点之一。本文将深入探讨智能合约NFT代币系统的开发,以及它如何构建数字资产生态。引言数字资产市场的迅速发展和区块链技术的日益成熟,为智能合约NFT代币系统的开发提供了......
  • ERC314协议代币开发及合约开发详解
    ERC314是一种新的代币标准,旨在为BASE链上的代币提供更便捷、高效的交易体验。它由DAPJ项目团队开发,并于2023年8月首次发布。ERC314的特点无需依赖DEX或SWAP进行交易: ERC314代币可以像原生代币一样直接转账,无需借助DEX或SWAP进行交易。这使得交易更加......