MỚI: Helius mua lại Light Protocol
API NFT DAS của Solana
Blog/Cập nhật

Mọi điều bạn cần biết về DAS API mới của Solana

Trưởng bộ phận Quan hệ Nhà phát triểnHunter Davis trên LinkedIn
Đọc trong 15 phút

Tổng quan

Việc truy xuất NFT và token trên Solana giờ đây đã đơn giản hơn nhờ Digital Asset Standard (DAS) API. Là một bổ sung mới cho bộ công cụ dành cho nhà phát triển Solana, DAS API cung cấp một giao diện thống nhất để truy xuất tài sản kỹ thuật số trên Solana. Thay vì phải xử lý nhiều endpoint để tương tác với các loại tài sản khác nhau, giờ đây nhà phát triển có thể sử dụng một API duy nhất để lấy dữ liệu cần thiết cho ứng dụng của mình.

Hướng dẫn tương tác này sẽ trình bày:

  1. Kiến thức về các loại tài sản hiện có trên Solana.
  2. Tổng quan toàn diện về các phương thức do DAS API cung cấp.
  3. Minh họa các trường hợp sử dụng thực tế, dễ tùy chỉnh cho từng endpoint.

Hướng dẫn này cho phép bạn thực hành theo từng trường hợp sử dụng. Sau khi hoàn tất, bạn sẽ có thể sử dụng DAS thành thạo.

Điều kiện tiên quyết

  • Đã cài đặt Node.js (cần v18.0 để sử dụng fetch tích hợp sẵn)
  • Helius RPC
  • Kiến thức cơ bản về JavaScript

Thiết lập môi trường

  1. Tạo thư mục dự án có tên functions.
  2. Với mỗi ví dụ, hãy tạo một tệp mới trong thư mục này.

Các loại tài sản

Trong hệ sinh thái Solana, “tài sản” có thể là bất kỳ vật phẩm kỹ thuật số có giá trị nào tồn tại trên blockchain, chẳng hạn như token hoặc token không thể thay thế (NFT). Solana hỗ trợ nhiều loại tài sản như vậy. Việc hiểu loại dữ liệu mà DAS API trả về khi tương tác với các tài sản này là rất quan trọng.

Hãy xem xét kỹ hơn từng loại tài sản.

Không thể thay thế

Tài sản không thể thay thế tuân theo mô hình NFT tiêu chuẩn và lưu trữ siêu dữ liệu trong một tài khoản token. Dữ liệu này nằm trong Program Derived Address (PDA), tức địa chỉ do một chương trình sở hữu chứ không phải một người dùng cụ thể. Các tài sản này có một Metadata PDA và một Master Edition PDA trên blockchain Solana.

Có thể thay thế

Tài sản có thể thay thế là các token SPL với siêu dữ liệu giới hạn. Chúng có thể đại diện cho những token như USDC hoặc token của cộng đồng/dự án. Một token sẽ tuân theo tiêu chuẩn Fungible nếu giá trị thập phân của token lớn hơn 0 khi được tạo.

Tài sản có thể thay thế

Fungible Asset đại diện cho vật phẩm thay vì từng đơn vị riêng lẻ. Chúng có thể chứa nhiều siêu dữ liệu hơn một tài sản Fungible tiêu chuẩn. Nếu số thập phân được đặt thành 0 khi tạo một vật phẩm theo tiêu chuẩn Fungible, vật phẩm đó sẽ chuyển thành tiêu chuẩn Fungible Asset.

Không thể thay thế có thể lập trình

Tài sản không thể thay thế có thể lập trình tương tự tiêu chuẩn Non-Fungible nhưng vẫn nằm trong một tài khoản token bị đóng băng. Trạng thái này ngăn người dùng đốt, khóa hoặc chuyển tài sản có thể lập trình nếu không tương tác với chương trình Token Metadata. Tiêu chuẩn này ra đời để đáp lại cuộc tranh luận về tiền bản quyền trên Solana.

Các phương thức hiện có

DAS API cung cấp nhiều phương thức phù hợp với các trường hợp sử dụng khác nhau, bao gồm:

  1. getAsset: Truy xuất tài sản theo ID.
  2. searchAssets: Tìm tài sản bằng nhiều tham số khác nhau.
  3. getAssetProof: Lấy bằng chứng Merkle cho một tài sản nén theo ID.
  4. getAssetsByGroup: Lấy danh sách tài sản theo khóa và giá trị nhóm.
  5. getAssetsByOwner: Truy xuất danh sách tài sản thuộc sở hữu của một địa chỉ.
  6. getAssetsByCreator: Lấy danh sách tài sản do một địa chỉ tạo.
  7. getAssetsByAuthority: Tìm danh sách tài sản có một authority cụ thể.

Để biết thông tin chi tiết về từng phương thức, hãy tham khảo tài liệu của chúng tôi.

1. Lấy tài sản

Endpoint getAsset cho phép bạn truy xuất một tài sản cụ thể theo ID. ID này có thể đại diện cho địa chỉ token on-chain hoặc ID trên cây Merkle đối với tài sản nén.

Để biết thêm thông tin, hãy tham khảo tài liệu getAsset.

Ví dụ

Giả sử chúng ta muốn truy xuất siêu dữ liệu của tài sản Claynosaurz hạng 1. Trong trường hợp này, chúng ta cần tìm ID của tài sản, thiết lập hàm để gọi DAS và sắp xếp phản hồi nhằm phân tích chính xác đối tượng cần lấy từ kết quả.

Hãy làm theo các bước dưới đây:

  1. Bắt đầu bằng cách thiết lập hàm trong một tệp mới có tên “getAsset.js”:
Mã
const url = `https://rpc.helius.xyz/?api-key=`;

const getAsset = async () => {
// Code goes here
};
getAsset();

     2. Tiếp theo, thiết lập các thao tác fetch và await. Thêm tham số ID bắt buộc vào phần thân yêu cầu:

Mã
const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'getAsset',
      params: {
	// Rank 1 Claynosaurz #7392
        id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
      },
    }),
  });

Trong bước này, chúng ta gửi yêu cầu POST đến DAS API với ID duy nhất của tài sản trong phần thân yêu cầu.

    3. Phân tích kết quả và hiển thị thông tin siêu dữ liệu:

Mã
const { result } = await response.json();
console.log("asset: ", result);

Đoạn mã này phân tích phản hồi API thành định dạng JSON và ghi kết quả vào bảng điều khiển.

Sau đó, bạn có thể chạy tập lệnh bằng lệnh node getAsset.js.

Kết quả

Việc thực thi tập lệnh này sẽ hiển thị siêu dữ liệu của tài sản đã chỉ định:

Mã
asset:  {
  interface: 'Custom',
  id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
  content: {
    '$schema': 'https://schema.metaplex.com/nft1.0.json',
    json_uri: 'https://nftstorage.link/ipfs/bafybeig2dp7oyauxdkhwduh274ekbl3cixyvbnky444qfewz3vfcauos6m/7391.json',
    files: [],
    metadata: { name: 'Claynosaurz #7392', symbol: 'DINO' }
  },
  authorities: [
    {
      address: 'B7B2g3WbdZMDV3YcDGRGhEt5KyWqDJZFwRR8zpWVEkUF',
      scopes: [Array]
    }
  ],
  compression: {
    eligible: false,
    compressed: false,
    data_hash: '',
    creator_hash: '',
    asset_hash: '',
    tree: '',
    seq: 0,
    leaf_id: 0
  },
  grouping: [
    {
      group_key: 'collection',
      group_value: '6mszaj17KSfVqADrQj3o4W3zoLMTykgmV37W4QadCczK'
    }
  ],
  royalty: {
    royalty_model: 'creators',
    target: null,
    percent: 0.05,
    basis_points: 500,
    primary_sale_happened: true,
    locked: false
  },
  creators: [
    {
      address: 'AoebZtN5iKpVyUBc82aouWhugVknLzjUmEEUezxviYNo',
      share: 0,
      verified: true
    },
    {
      address: '36tfiBtaDGjAMKd6smPacHQhe4MXycLL6f9ww9CD1naT',
      share: 100,
      verified: false
    }
  ],
  ownership: {
    frozen: false,
    delegated: false,
    delegate: null,
    ownership_model: 'single',
    owner: '4zdNGgAtFsW1cQgHqkiWyRsxaAgxrSRRynnuunxzjxue'
  },
  supply: null,
  mutable: true
}

Kết quả này cung cấp thông tin chi tiết về tài sản, bao gồm loại giao diện, ID, siêu dữ liệu, người tạo, authority và quyền sở hữu.

Mã đầy đủ

Dưới đây là mã hoàn chỉnh để truy xuất một tài sản bằng ID:

Mã
const url = `https://rpc.helius.xyz/?api-key=`;

const getAsset = async () => {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'getAsset',
      params: {
        id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
      },
    }),
  });

  const { result } = await response.json();
  console.log("asset: ", result);
};

getAsset();

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Trong mã này, chúng ta định nghĩa một hàm bất đồng bộ là getAsset để gửi yêu cầu POST đến DAS API. Chúng ta truyền ID của tài sản trong phần thân yêu cầu. Sau khi yêu cầu hoàn tất, hàm sẽ phân tích phản hồi dưới dạng JSON và in dữ liệu tài sản ra bảng điều khiển. Cuối cùng, chúng ta gọi hàm getAsset để thực thi quy trình này.

2. Lấy bằng chứng tài sản

Endpoint getAssetProof được dùng để truy xuất bằng chứng tài sản cần thiết khi sửa đổi chương trình nén. Các sửa đổi này bao gồm những thao tác như chuyển, đốt, cập nhật người tạo, cập nhật bộ sưu tập và giải nén tài sản nén.

Để xem danh sách chi tiết các thao tác sửa đổi sử dụng bằng chứng tài sản, hãy tham khảo tài liệu.

Ví dụ

Để truy xuất bằng chứng tài sản cần thiết nhằm sửa đổi một tài sản nén, hãy làm theo các bước sau:

  1. Bắt đầu bằng cách thiết lập hàm trong một tệp mới có tên “getAssetProof.js”:
Mã
const url = `https://rpc.helius.xyz/?api-key=`;

const getAsset = async () => {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'getAsset',
      params: {
        id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
      },
    }),
  });

  const { result } = await response.json();
  console.log("asset: ", result);
};

getAsset();

      2. Tiếp tục thiết lập fetch và await. Thêm tham số ID bắt buộc vào phần thân yêu cầu:

Mã
const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
		body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'getAssetProof',
      params: {
        id: 'JDuAmJjiiNKCfK9SyW1aQCNvhL7krhVWZbeijVupAz4i'
      },
    }),
  });

     3. Phân tích kết quả và trích xuất root:

Mã
const { proof } = await response.json();
console.log("Asset Proof: ", result);
const root = decode(proof.root);
console.log(root)

‍Ở đây, chúng ta trích xuất root từ bằng chứng tài sản. Sau đó, root này có thể được dùng để thực hiện các sửa đổi khác đối với tài sản nén.

Chạy node getAssetProof.js trong terminal để nhận kết quả cho tài sản bạn đã thiết lập tại đây.

Kết quả

Đầu ra sẽ bao gồm thông tin bằng chứng tài sản:

Mã
Assets Proof:  {
  root: 'FCdCNPGauQp1NqZbs1f4DDAWawHLbBqfD9LYjMy1fqH4',
  proof: [
    'EmJXiXEAhEN3FfNQtBa5hwR8LC5kHvdLsaGCoERosZjK',
    '7NEfhcNPAwbw3L87fjsPqTz2fQdd1CjoLE138SD58FDQ',
    '6dM3VyeQoYkRFZ74G53EwvUPbQC6LsMZge6c7S1Ds4ks',
    '34dQBtcjnCUoPVzZEmVPAMH7b3b8aD6GUB9aYS11AaWJ',
    '2VG5cKeBZdqozwhHGGzs13b9tzy9TXt9kPfN8MzSJ1Sm',
    'r1o8vR5KFHJeER7A1K7kBCjceDHnUbSwiFEqqmeAQSd',
    '88sRtuz1QHWhYEKtx1VamwwrmtDkb8vyDyUuqWCJrxoa',
    '9Y8Xa2qwARx7Mg6deJwP37UEX9BA2tM75N4f6vaGyBDU',
    'CKWwHXAcqoTptkjZkuKqhQ9iuajC8dK6f8eGpknesqWS',
    '4n9Z4eSKNZa1a4oA3sbFGowA7go9BV9WopLpA4KqnYdD',
    '6MJKrpnK1GbYsnEzwMRWStNGkTjAZF23NhzTQSQVXsD3',
    'HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7',
    '4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq',
    'E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2'
  ],
  node_index: 16384,
  leaf: '6YdZXw49M97mfFTwgQb6kxM2c6eqZkHSaW9XhhoZXtzv',
  tree_id: '2kuTFCcjbV22wvUmtmgsFR7cas7eZUzAu96jzJUvUcb7'
}

Mã đầy đủ

Dưới đây là mã hoàn chỉnh để truy xuất bằng chứng tài sản bằng ID:

Mã
const url = `https://rpc.helius.xyz/?api-key=`;

const getAssetProof = async () => {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'getAssetProof',
      params: {
        id: 'JDuAmJjiiNKCfK9SyW1aQCNvhL7krhVWZbeijVupAz4i'
      },
    }),
  });
  const { result } = await response.json();
  console.log("Asset Proof: ", result);
	const root = proof.root;
	console.log(root)
};
getAssetProof();

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Trong tập lệnh này, chúng ta định nghĩa một hàm bất đồng bộ là getAssetProof để gửi yêu cầu POST đến Helius API. Chúng ta truyền ID của tài sản trong phần thân yêu cầu. Sau khi yêu cầu hoàn tất, hàm sẽ phân tích phản hồi thành JSON rồi in bằng chứng tài sản và root của bằng chứng ra bảng điều khiển. Cuối cùng, chúng ta gọi hàm getAssetProof để thực thi quy trình này.

3. Tìm kiếm tài sản

Phương thức searchAssets truy xuất tài sản kỹ thuật số dựa trên các tham số tìm kiếm đã chỉ định, mang lại cách truy xuất dữ liệu linh hoạt. Phương thức này cho phép người dùng tùy chỉnh tìm kiếm, qua đó kiểm soát chi tiết hơn các tài sản được trả về.

Các tham số chi tiết có trong tài liệu searchAssets.

Ví dụ

Hãy xem một ví dụ mà chúng ta muốn hiển thị hình ảnh và tên của các tài sản từ ví người dùng thuộc bộ sưu tập Drip Haus, đồng thời chỉ hiển thị các vật phẩm nén trong đó. Để hướng dẫn ngắn gọn, chúng ta sẽ ghi dữ liệu vào một tệp JSON chứa tên và hình ảnh của từng tài sản Drip trong ví mẫu.

  1. Bắt đầu bằng cách tạo tệp mới có tên searchAssets.js với hàm bất đồng bộ sau:
Mã
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;

const searchAssets = async () => {
	// Code goes here
};
searchAssets();

     2. Triển khai hàm để gửi yêu cầu POST với các tham số tìm kiếm đã chỉ định. Trong trường hợp này, chúng ta sử dụng các tham số compressed, địa chỉ chủ sở hữu và nhóm bộ sưu tập để đạt được kết quả mong muốn:

Mã
const response = await fetch(url, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      jsonrpc: "2.0",
      id: "my-id",
      method: "searchAssets",
      params: {
        // Returning only compressed items.
        compressed: true,
        // Example wallet
        ownerAddress: "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha",
        // Drip Haus collection ID.
        grouping: [
          "collection",
          "DRiP2Pn2K6fuMLKQmt5rZWyHiUZ6WK3GChEySUpHSS4x"
        ],
        page: 1,
      },
    }),
  });

    3. Phân tích phản hồi, nhóm tài sản theo ID và xử lý các mục có thể bị trùng lặp bằng cách xác định chính xác những mục cần lấy từ phản hồi của từng tài sản:

Mã
const { result } = await response.json();

  const groupedResults = [];

  for (let i = 0; i < result.items.length; i++) {
    const asset = {
      id: result.items[i].id,
      name: result.items[i].content.metadata.name,
      json_uri: result.items[i].content.json_uri,
    };

    4. Hàm tiếp theo sẽ tìm và loại bỏ mọi mục trùng lặp khỏi danh sách. Bạn có thể không dùng hàm này nếu muốn hiển thị các tài sản trùng lặp. Hàm cũng sẽ thêm tài sản vào một nhóm mới khi xác định đó không phải mục trùng lặp:

Mã
const existingGroup = groupedResults.find(group => group.id === asset.id);
		if (existingGroup) {
      // Add the asset to the existing group
      existingGroup.assets.push(asset);
    } else {
      // Create a new group for the asset
      const newGroup = {
        id: asset.id,
        assets: [asset],
      };
  // Add the new group to the grouped results
      groupedResults.push(newGroup);
    }
  }

   5. Lưu kết quả tìm kiếm vào tệp JSON có tên searchResults.json:

Mã
const json = JSON.stringify(groupedResults, null, 2);

// Write the JSON to a file
fs.writeFileSync('searchResults.json', json);

console.log('Results saved to results.json');

Để thực thi tập lệnh, hãy chạy node searchAssets.js. Thao tác này sẽ điền kết quả tìm kiếm vào tệp searchResults.json.

Kết quả

Mã
[
  {
    "id": "4XSuZ2JaCPYA76EomCd1mZCtrjkx4F4sdcepBgBF2LKE",
    "assets": [
      {
        "id": "4XSuZ2JaCPYA76EomCd1mZCtrjkx4F4sdcepBgBF2LKE",
        "name": "MOMENT",
        "json_uri": "https://arweave.net/3DniodKpcCTio-GlyB4GMjdA4c5epHzYQecdLZctt5s"
      }
    ]
  },
  {
    "id": "AJw2QNwWMLWTuUTiUWYpEyGjUQSPB5rYEcbn5uiBjQ2g",
    "assets": [
      {
        "id": "AJw2QNwWMLWTuUTiUWYpEyGjUQSPB5rYEcbn5uiBjQ2g",
        "name": "\"Kokoro\" (心)",
        "json_uri": "https://arweave.net/PyPo4Zr4iWH2iRROBDtZTFZv3qWw1dVcrYPq4A_6ttM"
      }
    ]
  }, ...
}

Mã đầy đủ

Mã
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');

const searchAssets = async () => {
  const response = await fetch(url, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      jsonrpc: "2.0",
      id: "my-id",
      method: "searchAssets",
      params: {
        // Returning only compressed items.
        compressed: true,
        // Example wallet
        ownerAddress: "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha",
        // Drip Haus collection ID.
        grouping: [
          "collection",
          "DRiP2Pn2K6fuMLKQmt5rZWyHiUZ6WK3GChEySUpHSS4x"
        ],
        page: 1,
      },
    }),
  });
  const { result } = await response.json();

  const groupedResults = [];

  for (let i = 0; i < result.items.length; i++) {
    const asset = {
      id: result.items[i].id,
      name: result.items[i].content.metadata.name,
      json_uri: result.items[i].content.json_uri,
    };

    // Find an existing group for the asset if it exists
    const existingGroup = groupedResults.find(group => group.id === asset.id);

    if (existingGroup) {
      // Add the asset to the existing group
      existingGroup.assets.push(asset);
    } else {
      // Create a new group for the asset
      const newGroup = {
        id: asset.id,
        assets: [asset],
      };

      // Add the new group to the grouped results
      groupedResults.push(newGroup);
    }
  }

  // Convert the grouped results to JSON
  const json = JSON.stringify(groupedResults, null, 2);

  // Write the JSON to a file
  fs.writeFileSync('searchResults.json', json);

  console.log('Results saved to results.json');
};

searchAssets();

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Trong tập lệnh này, chúng ta định nghĩa một hàm bất đồng bộ là searchAssets để gửi yêu cầu POST. Hàm sử dụng nhiều tham số tìm kiếm trong phần thân yêu cầu, chẳng hạn như trạng thái nén, địa chỉ chủ sở hữu và ID bộ sưu tập. Sau khi yêu cầu hoàn tất, hàm sẽ phân tích phản hồi thành JSON và trích xuất thông tin tài sản liên quan (ID, tên, JSON URI). Hàm nhóm các tài sản này theo ID và lưu dữ liệu đã sắp xếp vào tệp JSON có tên searchResults.json. Cuối cùng, chúng ta gọi hàm searchAssets để bắt đầu quy trình này.

4. Lấy tài sản theo chủ sở hữu

Endpoint getAssetsByOwner cung cấp danh sách tài sản kỹ thuật số thuộc sở hữu của một địa chỉ cụ thể. Hiện đây là cách nhanh nhất để truy xuất thông tin quyền sở hữu cụ thể của tài sản kỹ thuật số bằng Helius.

Ví dụ

Để truy xuất các tài sản thuộc sở hữu của một địa chỉ nhất định, hãy làm theo các bước sau:

  1. Bắt đầu bằng cách thiết lập hàm trong một tệp mới có tên “getAssetsByOwner.js”:
Mã
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;

const getAssetsByOwner = async () => {
  // Code goes here
};
getAssetsByOwner();
  1. Thiết lập fetch và await, sau đó thêm các tham số vào phần thân yêu cầu. Với endpoint này, chúng ta sử dụng ownerAddress:
Mã
const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'hunter-test',
      method: 'getAssetsByOwner',
      params: {
					// Example wallet
        ownerAddress: '2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha',
        page: 1
      },
    }),
  });
  1. Tiếp theo, phân tích phản hồi và trích xuất thông tin tài sản cần thiết để ghi vào JSON. Chúng ta sẽ sử dụng ID tài sản, tên và JSON URI để nhóm theo ví đang tìm kiếm:
Mã
const { result } = await response.json();
 const groupedResults = {};

  for (let i = 0; i < result.items.length; i++) {
    const ownerAddress = result.items[i].owner.address;
    const asset = {
      id: result.items[i].id,
      name: result.items[i].content.metadata.name,
      json_uri: result.items[i].content.json_uri,
    };

    if (groupedResults.hasOwnProperty(ownerAddress)) {
      // Add the asset to the existing group
      groupedResults[ownerAddress].assets.push(asset);
    } else {
      // Create a new group for the owner
      groupedResults[ownerAddress] = {
        assets: [asset],
      };
    }
  }
  1. Giờ đây, chúng ta có thể thiết lập hàm để ghi dữ liệu vào JSON:
Mã
// Convert the grouped results to JSON
  const json = JSON.stringify(groupedResults, null, 2);

  // Write the JSON to a file
  fs.writeFileSync('results.json', json);

  console.log('Results saved to results.json');

Kết quả

Đầu ra sẽ bao gồm các tài sản kỹ thuật số thuộc sở hữu của địa chỉ đã chỉ định:

Mã
{
  "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha": {
    "assets": [
      {
        "id": "7Qj3QGCqRChr3uBR4R756usz2eoPSisoWcPfeozY7Bo",
        "name": "",
        "json_uri": "https://nftstorage.link/ipfs/bafybeiewlaxjeredwgsboqqha2ww25g46dgrqs6lwn5cooq3evsvye33iy/3071.json"
      },
      {
        "id": "8W1Dx9vhyQ8fNyi6oVu2EFbZHo2kKpcRxMVbQ3em3ne",
        "name": "Compass Rose #2745",
        "json_uri": "https://shdw-drive.genesysgo.net/HqhFDmVhqqN23g4soMd8UzrfLEXT8GsjWtWaqxfm9A2x/2745.json"
      },
      {
        "id": "Ba5qsjq5LryLPZ1e6AVqwPzB5LBBBzGWvvRQww4KCiG",
        "name": "Foxy Pixel Demon #423",
        "json_uri": "https://cdn.secretsphinx.io/ml/1c22a51697c644a8e45f603ed884ade7.json"
      },
      {
        "id": "Hmid2Dhi3zLV7AxCAibQ8n4nviWdPv2ZvUeZq4N33oe",
        "name": "",
        "json_uri": "https://nftstorage.link/ipfs/bafybeiewlaxjeredwgsboqqha2ww25g46dgrqs6lwn5cooq3evsvye33iy/140.json"
      }, ...
}

Mã đầy đủ

Dưới đây là mã hoàn chỉnh để truy xuất các tài sản thuộc sở hữu của một địa chỉ cụ thể:

Mã
const url = `https://rpc.helius.xyz/?api-key=`;

const getAssetsByOwner = async () => {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'hunter-test',
      method: 'getAssetsByOwner',
      params: {
					// Example wallet
        ownerAddress: '2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha',
        page: 1,
      },
    }),
  });
 const { result } = await response.json();
 const groupedResults = {};

  for (let i = 0; i < result.items.length; i++) {
    const ownerAddress = result.items[i].owner.address;
    const asset = {
      id: result.items[i].id,
      name: result.items[i].content.metadata.name,
      json_uri: result.items[i].content.json_uri,
    };

    if (groupedResults.hasOwnProperty(ownerAddress)) {
      // Add the asset to the existing group
      groupedResults[ownerAddress].assets.push(asset);
    } else {
      // Create a new group for the owner
      groupedResults[ownerAddress] = {
        assets: [asset],
      };
    }
  }

  // Convert the grouped results to JSON
  const json = JSON.stringify(groupedResults, null, 2);

  // Write the JSON to a file
  fs.writeFileSync('results.json', json);

  console.log('Results saved to results.json');
};

getAssetsByOwner();

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Trong tập lệnh này, chúng ta định nghĩa một hàm bất đồng bộ là getAssetsByOwner để gửi yêu cầu POST đến Helius API. Chúng ta truyền địa chỉ của chủ sở hữu trong phần thân yêu cầu. Sau khi yêu cầu hoàn tất, hàm sẽ phân tích phản hồi thành JSON và in các tài sản thuộc sở hữu của địa chỉ đã chỉ định ra bảng điều khiển. Cuối cùng, chúng ta gọi hàm getAssetsByOwner để thực thi quy trình này.

5. Lấy tài sản theo nhóm

Endpoint getAssetsByGroup được dùng để truy xuất các tài sản kỹ thuật số liên kết với một ID bộ sưu tập cụ thể. Endpoint này rất quan trọng khi bạn cần truy xuất các vật phẩm thuộc một bộ sưu tập cụ thể hoặc cần liên kết một dApp giới hạn bằng token với một bộ sưu tập on-chain nhất định.

Ví dụ

Trong trường hợp này, chúng ta sẽ thiết lập một snapshot bộ sưu tập cho các SMB. Điều quan trọng là phải phân tích phản hồi để trích xuất chủ sở hữu tài sản từ đối tượng ownership, như mô tả chi tiết trong tài liệu của chúng tôi. Mục tiêu là lọc ra những người sở hữu nhiều SMB và chỉ hiển thị họ một lần trong JSON, qua đó tạo một “snapshot”.

  1. Bắt đầu bằng cách thiết lập hàm trong một tệp mới có tên “getAssetsByGroup.js”. Sử dụng Set để bảo đảm chúng ta chỉ lưu các chủ sở hữu duy nhất:
Mã
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');
const uniqueOwners = new Set();

const getAssetsByGroup = async () => {
		 // Code goes here
};
getAssetsByGroup();
  1. Tiếp tục thiết lập fetch và await. Đặt các tham số nêu trên vào phần thân yêu cầu. Thiết lập groupKey và groupValue trong yêu cầu. Khởi tạo page thành 1 và hasMoreResults thành true để chuẩn bị phân trang. Sau đó, một hàm phân trang sẽ được thiết lập để trả về false nếu số kết quả của trang nhỏ hơn 1000 (giới hạn tối đa cho mỗi yêu cầu):
Mã
let page = 1;
  let hasMoreResults = true;

  while (hasMoreResults) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'getAssetsByGroup',
        params: {
          groupKey: 'collection',
          groupValue: 'SMBtHCCC6RYRutFEPb4gZqeBLUZbMNhRKaMKZZLHi7W',
          page,
          limit: 1000,
        },
      }),
    });
  1. Phân tích kết quả để trích xuất chuỗi chủ sở hữu cần thiết nhằm tạo snapshot về các chủ sở hữu hiện tại:
Mã
const { result } = await response.json();
// Add each owner to the Set, automatically discarding duplicates
result.items.forEach(item => uniqueOwners.add(item.ownership.owner));
  1. Thiết lập phân trang bằng cách tăng tham số page nếu có 1000 kết quả. Nếu ít hơn, hãy đặt hasMoreResults thành false để dừng phân trang:
Mã
if (result.items.length < 1000) {
      hasMoreResults = false;
    } else {
      page++;
    }
  }
  1. Giờ đây, chúng ta có thể đặt các chủ sở hữu thành một mảng và thiết lập giá trị root để ghi vào JSON cùng với số lượng người nắm giữ và từng ví chủ sở hữu duy nhất:
Mã
const uniqueOwnersArray = Array.from(uniqueOwners);
  
  const root = {
    count: uniqueOwners.size,
    owners: uniqueOwnersArray
  };
  1. Chuyển Set gồm các chủ sở hữu duy nhất thành một mảng. Thiết lập giá trị root để ghi vào JSON cùng với số lượng người nắm giữ và từng ví chủ sở hữu duy nhất:
Mã
fs.writeFile('./ownerResults.json', jsonResult, 'utf8', (err) => {
    if (err) {
      console.error("Error writing JSON file:", err);
    } else {
      console.log("JSON file saved successfully.");
    }
  });
console.log("Total number of unique owners:", uniqueOwners.size);
};

Sau đó, bạn có thể chạy lệnh node getAssetsByGroup.js để điền kết quả vào tệp "ownerResults.json".

Kết quả

Kết quả sẽ là dữ liệu JSON tương đương một snapshot về người nắm giữ, bao gồm số lượng chủ sở hữu duy nhất và danh sách tất cả chủ sở hữu duy nhất:

Mã
{
  "count": 2785,
  "owners": [
    "6VqzFgtrJb33nhvbug4KZoUx8p65dD2iT1QuAeAQgYiw",
    "5Xeb43ASEa64b9i9owcLB4yrNbUw1oMiTpcWsAdXN8qG",
    "Cb355XH2WGPeQUGTTXWiQZT4nhnyHCPkhScDezUGhXQF",
    "Fuu7xpK3mWqpqPLTHaxF7pU2czkBESKyg3r2Lm2F3AWz",
    "1BWutmTvYPwDtmw9abTkS4Ssr8no61spGAvW1X6NDix",
    "86tCSKzryE5KvbTmMXN9tkxyn8GNr4z54DnNqrcZwYuy",
    "D2DYL5sdxBCpauvKs1oyQkkSm2B9rFzzGowMacv3Q58z",
		// Additional results ...
]
}

Mã đầy đủ

Mã
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');
const uniqueOwners = new Set();

const getAssetsByGroup = async () => {
  let page = 1;
  let hasMoreResults = true;

  while (hasMoreResults) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'getAssetsByGroup',
        params: {
          groupKey: 'collection',
          groupValue: 'SMBtHCCC6RYRutFEPb4gZqeBLUZbMNhRKaMKZZLHi7W',
          page,
          limit: 1000,
        },
      }),
    });

    const { result } = await response.json();
    // Add each owner to the Set, automatically discarding duplicates
    result.items.forEach(item => uniqueOwners.add(item.ownership.owner));

    if (result.items.length < 1000) {
      hasMoreResults = false;
    } else {
      page++;
    }
  }

  // Convert Set to Array for stringification
  const uniqueOwnersArray = Array.from(uniqueOwners);
  
  const root = {
    count: uniqueOwners.size,
    owners: uniqueOwnersArray
  };
  
  const jsonResult = JSON.stringify(root, null, 2);

  fs.writeFile('./ownerResults.json', jsonResult, 'utf8', (err) => {
    if (err) {
      console.error("Error writing JSON file:", err);
    } else {
      console.log("JSON file saved successfully.");
    }
  });
};
console.log("Total number of unique owners:", uniqueOwners.size);

getAssetsByGroup();

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Giờ đây, bạn đã biết cách truy xuất các tài sản kỹ thuật số liên kết với một ID bộ sưu tập cụ thể bằng endpoint getAssetsByGroup. Bằng cách sử dụng hiệu quả chức năng phân trang và cấu trúc dữ liệu Set để bảo đảm các mục chủ sở hữu là duy nhất, bạn có thể tạo snapshot về những người hiện đang nắm giữ bất kỳ bộ sưu tập nào có ID on-chain.

6. Lấy tài sản theo người tạo

Endpoint getAssetsByCreator được dùng để truy xuất các tài sản do một địa chỉ khóa công khai cụ thể tạo ra. Endpoint này hữu ích khi bạn muốn tìm các tài sản liên quan đến một nghệ sĩ hoặc dự án cụ thể trên Solana.

Ví dụ

Trong ví dụ này, chúng ta sẽ trả về các tài sản do Zen0 tạo. Chúng ta có thể sử dụng địa chỉ người tạo và đặt tham số onlyVerified thành true để chỉ truy xuất các tài sản do một ví đã xác minh tạo ra. Chúng ta sẽ phân tích kết quả để hiển thị ID và chủ sở hữu của từng tài sản.

  1. Bắt đầu bằng cách thiết lập hàm trong một tệp mới có tên "getAssetsByCreator.js". Chúng ta sẽ sử dụng mô-đun fs để ghi kết quả vào một tệp JSON:
Mã
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');

const getAssetsByCreator = async () => {
  // Code goes here
};
getAssetsByCreator();
  1. Giờ đây, chúng ta có thể thiết lập yêu cầu fetch và await phản hồi. Đặt các tham số cần thiết trong phần thân yêu cầu, bao gồm creatorAddress và onlyVerified:
Mã
let page = 1;
  let allResults = [];
  let hasMoreResults = true;

  while (hasMoreResults) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'getAssetsByCreator',
        params: {
          creatorAddress: 'zvrsoq2LbNxekPqLK1v8DsLgeC4LHxMQL52beX8Ktn8',
          onlyVerified: true,
          page,
          limit: 1000,
        },
      }),
    });

Đừng quên thay <creator-address> bằng địa chỉ thực tế của người tạo có tài sản mà bạn muốn truy xuất.

  1. Phân tích phản hồi để trích xuất kết quả và lưu vào một mảng:
Mã
const { result } = await response.json();
allResults = allResults.concat(result.items);

if (result.items.length < 1000) {
      hasMoreResults = false;
    } else {
      page++;
    }
  }
  1. Nhóm tài sản theo ID quyền sở hữu (vì một người có thể sở hữu nhiều tài sản) và hiển thị các tài sản thuộc sở hữu của từng ID. Nếu phát hiện chủ sở hữu mới, một nhóm mới sẽ được tạo trong tệp JSON:
Mã
const groupedResults = {};

  for (let i = 0; i < allResults.length; i++) {
    const ownershipId = allResults[i].ownership.owner;
    const asset = {
      id: allResults[i].id,
      ownershipId: ownershipId,
    };

    if (groupedResults.hasOwnProperty(ownershipId)) {
      // Add the asset to the existing group
      groupedResults[ownershipId].assets.push(asset);
    } else {
      // Create a new group for the ownership ID
      groupedResults[ownershipId] = {
        assets: [asset],
      };
    }
  }
  1. Bước tiếp theo là cấu trúc kết quả. Trong trường hợp này, chúng ta quan tâm đến địa chỉ NFT và chủ sở hữu của từng tài sản được trả về. Chúng ta sử dụng root để chỉ định độ dài của dữ liệu trả về và lưu các kết quả đã sửa đổi để xuất ra:
Mã
// Create new array to hold the desired properties
 const modifiedResults = totalResults.map(item => ({
    id: item.id,
    owner: item.ownership.owner
  }));
  // Create a root object to hold the count and the results
  const root = {
    count: modifiedResults.length,
    results: modifiedResults
  };
  1. Cuối cùng, chúng ta lưu kết quả vào một tệp có tên "creatorResults.json" bằng mô-đun fs:
Mã
// Convert the grouped results to JSON
  const json = JSON.stringify(groupedResults, null, 2);

  // Write the JSON to a file
  fs.writeFileSync('creatorResults.json', json);

  console.log('Results saved to results.json');

Cuối cùng, chạy lệnh node getAssetsByCreator.js để thực thi tập lệnh và điền kết quả truy xuất được vào tệp "creatorResults.json".

Kết quả

Tệp JSON kết quả chứa địa chỉ khóa công khai của từng chủ sở hữu và các tài sản tương ứng mà họ sở hữu. Mỗi tài sản được biểu diễn bằng ID, qua đó cung cấp snapshot rõ ràng về trạng thái quyền sở hữu của các tài sản do người tạo cụ thể này tạo ra.

Mã
{
  "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22": {
    "assets": [
      {
        "id": "KvbtDebCi6BGSFuafJWZpwV5mt1XYng13Pt2vh4G2Qa",
        "ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
      },
      {
        "id": "28bXCZaETv6ihBGbtavDkedzRcWZPbmDG5VYXxSdmZBc",
        "ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
      },
      {
        "id": "2H4txSfZwV3nX4fJ1D8dPNHiafn247iQ8vtq3y3UYdpe",
        "ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
      },
      {
        "id": "5oauJRPWbboJVUBms2mqBF2wMQGMSCFScgX18SawyKV3",
        "ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
      },
	"Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC": {
    "assets": [
      {
        "id": "2jLjf8Vmbisu5eac1NgSiDcqkcJfR8R9LSGjD6SExC99",
        "ownershipId": "Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC"
      },
      {
        "id": "2rVtLCHWp1hpUc7YVoAkFrSL3iwGQDcCzAvboCvrq5kT",
        "ownershipId": "Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC"
      },
      {
        "id": "6QXfTMwuaKTMZyFYoUwNWpaT692Z9Zqg94WE9MTi4J2p",
        "ownershipId": "Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC"
      }
    ]
  }, ...
}

'ownershipId' đại diện cho địa chỉ khóa công khai của chủ sở hữu trên blockchain Solana, còn assets là các NFT được liên kết với địa chỉ đó.

Mã đầy đủ

Mã
const fs = require('fs');

const url = `https://rpc.helius.xyz/?api-key=`;

const getAssetsByCreator = async () => {
  let page = 1;
  let allResults = [];
  let hasMoreResults = true;

  while (hasMoreResults) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'getAssetsByCreator',
        params: {
          creatorAddress: 'zvrsoq2LbNxekPqLK1v8DsLgeC4LHxMQL52beX8Ktn8',
          onlyVerified: true,
          page,
          limit: 1000,
        },
      }),
    });

    const { result } = await response.json();
    allResults = allResults.concat(result.items);

    if (result.items.length < 1000) {
      hasMoreResults = false;
    } else {
      page++;
    }
  }

  // Create an object to store the grouped results
  const groupedResults = {};

  for (let i = 0; i < allResults.length; i++) {
    const ownershipId = allResults[i].ownership.owner;
    const asset = {
      id: allResults[i].id,
      ownershipId: ownershipId,
    };

    if (groupedResults.hasOwnProperty(ownershipId)) {
      // Add the asset to the existing group
      groupedResults[ownershipId].assets.push(asset);
    } else {
      // Create a new group for the ownership ID
      groupedResults[ownershipId] = {
        assets: [asset],
      };
    }
  }

  // Convert the grouped results to JSON
  const json = JSON.stringify(groupedResults, null, 2);

  // Write the JSON to a file
  fs.writeFileSync('creatorResults.json', json);

  console.log('Results saved to results.json');
};

getAssetsByCreator();

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Trong ví dụ này, chúng ta gửi yêu cầu bất đồng bộ đến DAS API cho endpoint “getAssetsByCreator”. Sau đó, chúng ta truyền địa chỉ người tạo và cho biết đây là một người tạo đã được xác minh. Cuối cùng, chúng ta thiết lập phản hồi để phân tích chủ sở hữu của từng tài sản thuộc địa chỉ người tạo rồi ghi dữ liệu vào một tệp JSON bên ngoài.

Nhìn chung, đây là một công cụ hữu ích cho bất kỳ ai quan tâm đến việc theo dõi hoặc phân tích sự dịch chuyển của tài sản trên blockchain Solana, đặc biệt là các tài sản gắn với một người tạo hoặc dự án cụ thể.

7. Lấy tài sản theo authority

Hàm getAssetsByAuthority truy xuất các tài sản liên kết với một update authority cụ thể. Update authority là một địa chỉ có quyền sửa đổi bộ sưu tập. Tính năng này đặc biệt hữu ích khi bạn cần truy xuất một tập hợp tài sản trong trường hợp không tồn tại ID bộ sưu tập. Ngoài ra, tính năng còn cho phép truy xuất một tập hợp tài sản lớn hơn được liên kết với địa chỉ authority, vượt ra ngoài phạm vi của một ID bộ sưu tập duy nhất.

Ví dụ

Trong ví dụ sau, chúng ta sẽ truy xuất từng NFT thuộc các bộ sưu tập Taiyo Robotics, Pilots và Infants cùng chủ sở hữu tương ứng. Vì tất cả đều dùng chung một update authority, chúng ta có thể trả về mọi kết quả liên quan đến dự án.

Đây là một bước nâng cấp so với hàm getAssetsByGroup vì bạn có thể nhóm các tài sản liên kết với một authority đã đặt CDgbhX61QFADQAeeYKP5BQ7nnzDyMkkR3NEhYF2ETn1k.

  1. Bắt đầu bằng cách thiết lập hàm trong một tệp mới tạo có tên "getAssetsByAuthority.js":
Mã
const url = `https://rpc.helius.xyz/?api-key=`;

const getAssetsByAuthority = async () => {
  // Code goes here
};
getAssetsByAuthority();
  1. Cấu hình yêu cầu fetch và thêm các tham số cần thiết vào phần thân, chẳng hạn như authorityAddress, page và limit:
Mã
let page = 1;
let hasMoreResults = true;

while (hasMoreResults) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'getAssetsByAuthority',
        params: {
          authorityAddress: 'CDgbhX61QFADQAeeYKP5BQ7nnzDyMkkR3NEhYF2ETn1k',
          page,
          limit: 1000,
        },
      }),
    });

Hãy nhớ thay <authority-address> bằng địa chỉ authority thực tế có tài sản mà bạn muốn trích xuất.

     3. Giờ đây, chúng ta có thể sắp xếp dữ liệu trả về để duyệt qua các kết quả nếu có 1000 kết quả.

     Nếu số lượng kết quả ít hơn, cờ sẽ được đặt thành false và quá trình phân trang sẽ kết thúc, khi đó hasMoreResults sẽ trả về false.

Mã
const { result } = await response.json();
    totalResults.push(...result.items);

    if (result.items.length < 1000) {
      hasMoreResults = false;
    } else {
      page++;
    }
  }
  1. Xử lý các tài sản để lấy thông tin cần thiết. Ở đây, chúng ta muốn hiển thị ID của tài sản và chủ sở hữu. Chúng ta cũng sẽ tạo một đối tượng root để chứa số lượng tài sản và mảng tài sản đã xử lý:
Mã
// Create new array to hold the desired properties
 const modifiedResults = totalResults.map(item => ({
    id: item.id,
    owner: item.ownership.owner
  }));
  // Create a root object to hold the count and the results
  const root = {
    count: modifiedResults.length,
    results: modifiedResults
  };
  1. Giờ đây, chúng ta đã sẵn sàng thiết lập các mục trả về để ghi vào một tệp JSON có tên authorityResults.json, đồng thời ghi log khi quy trình hoàn tất.
Mã
const jsonResult = JSON.stringify(root, null, 2);

  fs.writeFile('./authorityResults.json', jsonResult, 'utf8', (err) => {
    if (err) {
      console.error("Error writing JSON file:", err);
    } else {
      console.log("JSON file saved successfully.");
    }
  });
console.log("Process completed.");
console.timeEnd("getAssetsByAuthority");

Cuối cùng, thực thi lệnh node getAssetsByAuthority.js để chạy tập lệnh và điền kết quả đã truy xuất vào tệp "authorityResults.json".

Kết quả

Đầu ra của endpoint getAssetsByAuthority bao gồm số lượng tài sản và một mảng đối tượng, trong đó mỗi đối tượng đại diện cho một tài sản và chứa ID cùng chủ sở hữu của tài sản đó. Dưới đây là một ví dụ:

Mã
{
  "count": 37330,
  "results": [
    {
      "id": "HmwL6uy7gQcXv74Mi8xF5G9mymZNd9rnUCpUFwSx1DX1",
      "owner": "5gt59Q14FEhT8LuETjLyiNHRkqCQf5hQsPP58ucBy5oC"
    },
    {
      "id": "HmztH56n4GD3p3EdgMKdzj8x21LjFQk4Bcp2YAQD8Urx",
      "owner": "H3AkHZHfcqGCcJpBn3FJWe52LcLxFMJQoZvZ6XyApFWf"
    },
    {
      "id": "Hn1NZXCaAxcr1btsaDm3eZRtLNbamy9FyrcVGLbZ2k5w",
      "owner": "AEqhqiQZBBa3dPTY1GwGsZJJnf5vzRKJpdXv6xzakfx8"
    }, ...
}

Mã đầy đủ

Mã
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;

const totalResults = [];

const getAssetsByAuthority = async () => {
  let page = 1;
  let hasMoreResults = true;

  while (hasMoreResults) {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'getAssetsByAuthority',
        params: {
          authorityAddress: 'CDgbhX61QFADQAeeYKP5BQ7nnzDyMkkR3NEhYF2ETn1k',
          page,
          limit: 1000,
        },
      }),
    });

    const { result } = await response.json();
    totalResults.push(...result.items);

    if (result.items.length < 1000) {
      hasMoreResults = false;
    } else {
      page++;
    }
  }  
  // Create new array to hold the desired properties
  const modifiedResults = totalResults.map(item => ({
    id: item.id,
    owner: item.ownership.owner
  }));
  
  // Create a root object to hold the count and the results
  const root = {
    count: modifiedResults.length,
    results: modifiedResults
  };
  
  // Stringify with 2 spaces indentation for readability
  const jsonResult = JSON.stringify(root, null, 2);

  fs.writeFile('./authorityResults.json', jsonResult, 'utf8', (err) => {
    if (err) {
      console.error("Error writing JSON file:", err);
    } else {
      console.log("JSON file saved successfully.");
    }
  });
console.log("Process completed.");
console.timeEnd("getAssetsByAuthority");
};
getAssetsByAuthority()

Hãy nhớ thay <api-key> bằng khóa API thực tế của bạn.

Trong ví dụ này, chúng ta sử dụng phương thức "getAssetsByAuthority" để trả về tất cả tài sản gắn với một địa chỉ authority trong 3 bộ sưu tập. Chúng ta chỉ sử dụng page và limit làm tham số bổ sung cho yêu cầu. Sau đó, chúng ta phân tích kết quả để trích xuất các tài sản thuộc authority và lưu chúng vào một tệp JSON bên ngoài.

Kết luận

Giờ đây, bạn đã hiểu toàn diện cách sử dụng Digital Asset Standard (DAS) API cùng một số ứng dụng thực tế cho từng phương thức. Đây là thay đổi đáng kể so với cách làm trước đây, khi phải dùng nhiều endpoint để truy xuất thông tin cụ thể của tài sản.

Các phương thức này hỗ trợ cả tài sản nén và tài sản thông thường, đồng thời cung cấp một giao diện thống nhất để thực hiện các yêu cầu theo nhiều cách khác nhau.

Để biết thêm thông tin, bạn luôn có thể tham khảo tài liệu chuyên sâu của chúng tôi về Digital Asset Standard (DAS) API và khám phá tiện ích Open API, nơi cung cấp thông tin chi tiết về các tham số yêu cầu và phản hồi.

Như thường lệ, chúng tôi mời bạn tham gia cộng đồng Discord của chúng tôi. Đừng ngần ngại nhắn tôi tại đó nếu bạn có bất kỳ câu hỏi nào!

‍

Đăng ký nhận tin từ Helius

Luôn cập nhật những thông tin mới nhất về phát triển Solana và nhận thông báo khi chúng tôi đăng bài