Non Fungible Tokens (NFTs)

Làm thế nào để tạo một NFT

Để tạo một NFT bạn phải:

  1. Đăng tải ảnh lên IPFS ví như Arweave
  2. Đăng tải json metadata lên IPFS ví như Arweave
  3. Gọi metaplex để tạo một account cho NFT

Đăng tải lên Arweave

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);
#  1. Load your arweave wallet
your_ar_wallet = Wallet('wallet.json')

#  2. Upload image to Arweave
with open('./code/nfts/arweave-upload/lowres-dog.png', 'rb') as f:
    img_in_bytes = f.read()

transaction = Transaction(your_ar_wallet, data=img_in_bytes)
transaction.add_tag('Content-Type', 'image/png')
transaction.sign()
transaction.send()

image_url = API_URL+"/"+transaction.id

#  3. Upload metadata to Arweave
meta_transaction = Transaction(your_ar_wallet, data=json.dumps(metadata))
meta_transaction.add_tag('Content-Type', 'text/html')
meta_transaction.sign()
meta_transaction.send()

metadata_url = API_URL+"/"+meta_transaction.id

Đúc NFT

Nếu bạn đã đăng tải ảnh và metadata, bạn có thể đúc NFT với đoạn mã bên dưới.

Press </> button to view full source
const mintNFTResponse = await metaplex.nfts().create({
  uri: "https://ffaaqinzhkt4ukhbohixfliubnvpjgyedi3f2iccrq4efh3s.arweave.net/KUAIIbk6p8oo4XHRcq0U__C2r0mwQaNl0gQow4Qp9yk",
  maxSupply: 1,
});

Lưu ý

Bạn không thể đúc một NFT với một địa chỉ khác ngoài ví của bạn. Nếu bạn gặp phải vấn đề địa chỉ người tạo, bạn nên đảm bảo rằng metadata liệt kê bạn là người tạo hợp lệ.

Làm thế nào để truy vấn NFT Metadata

Các Metaplex NFT có metadata được lưu trên Arweave. Để có thể truy vấn được Arweave metadata, bạn phải thông qua Metaplex PDA và giải mã dữ liệu trong account đó.

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 mint = new PublicKey("Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK");

const nft = await metaplex.nfts().findByMint(mint);

console.log(nft.metadata);

Làm thế nào để truy vấn chủ sở hữu của một NFTs

Nếu bạn có địa chỉ mint của một NFT, bạn có thể tìm được chủ sở hữu hiện tại của nó bằng truy vấn token account lớn nhất của địa chỉ mint đó.

Nhớ rằng vì tổng cung của NFT là 1, và chúng không thể chia nhỏ hơn, nên chỉ có duy nhất một token account sẽ chứa token đó ở mọi lúc. Tất cả các token account khác sẽ có số dư là 0.

Một khi token account lớn nhất được xác định, chúng ta có thể truy vấn chủ sỡ hữu của nó.

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);

Làm thế nào để truy vấn địa chỉ mint của NFT

Nếu bạn biết khoá công khai của Candy Machine, bạn có thể truy vấn được tất cả địa chỉ NFT mint được sinh ra từ Candy Machine đó bằng cách sử dụng đoạn mã bên dưới. Chú ý rằng chúng ta có thể sử dụng bộ lọc memcmp bên dưới bởi vì, trong v1, người tạo đầu tiên luôn là địa chỉ của 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

Nếu bạn đang sử dụng Candy Machine v2, bạn sẽ cần truy cập vào địa chỉ "Candy Machine Creator" của nó. Địa chỉ này đơn giản là một PDA với seeds là candy_machine và địa chỉ Candy Machine v2. Một khi bạn có địa chỉ người tạo, bạn có thể sử dụng nó tương tự như cách mà chúng ta đã làm ở v1.

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]);

Làm thế nào để truy vấn tất cả NFT từ một ví?

Khi truy vấn tất cả NFT từ một ví, bạn sẽ cần đọc tất cả token account và sau đó suy ra từng NFT một. Tất cả có thể thực hiện chỉ bằng hàm findDataByOwneropen in new window từ thư viện Metaplex JS.

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);
Last Updated: 8/3/2022, 6:51:04 AM