MỚI: Helius mua lại Light Protocol
Giới thiệu: Lệnh gọi getProgramAccounts (gPA) nhanh hơn
Blog/Cập nhật

Giới thiệu: Lệnh gọi getProgramAccounts (gPA) nhanh hơn

Developer Experience Engineer0xIchigo trên X0xIchigo trên LinkedIn0xIchigo trên GitHub
Đọc trong 3 phút

Các lệnh gọi getProgramAccounts (gPA) vốn nổi tiếng với nhiều vấn đề. Phương thức RPC này là một thao tác tốn kém và kém hiệu quả, truy vấn một node để tìm nạp tất cả tài khoản thuộc sở hữu của một public key nhất định. Các lệnh gọi này thường chậm và bị giới hạn tốc độ nghiêm ngặt. Đôi khi, chúng thậm chí còn bị chặn hoàn toàn (ví dụ: khi thực hiện lệnh gọi gPA trên chương trình của Serum) nếu kết quả chưa được lưu vào bộ nhớ đệm. Những vấn đề này buộc các nhà phát triển phải tìm đến các giải pháp thay thế phức tạp và kém hiệu quả hơn. 

Điều đó sẽ thay đổi từ hôm nay.

Tại Helius, chúng tôi ra mắt các lệnh gọi getProgramAccounts nhanh hơn dành cho mọi nhà phát triển Solana. 

Dưới đây là những điểm mới:

  • Chúng tôi đã cải thiện đáng kể khả năng lập chỉ mục tài khoản
  • Các lệnh gọi gPA có thể nhanh hơn trước từ 2 đến 10 lần, đặc biệt khi sử dụng bộ lọc cho các chương trình lớn hơn
  • Chúng tôi tự động lập chỉ mục một chương trình sau một lệnh gọi duy nhất từ bất kỳ nhà phát triển nào, giúp cải thiện hiệu suất cho tất cả mọi người

Bắt đầu

Để bắt đầu, hãy đăng ký trên Bảng điều khiển dành cho nhà phát triển Helius và lấy API key trong mục “API Keys”. 

Ví dụ về getProgramAccounts

Hãy truy vấn tất cả tài khoản thuộc sở hữu của chương trình Ore V2 bằng JavaScript:

Mã
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;

const getProgramAccounts = async () => {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "test",
        method: "getProgramAccounts",
        params: [
          "oreV2ZymfyeXgNgBdqMkumTqqAprVqgBWQfoYkrtKWQ",
          {
            "encoding": "base64",
          },

        ],

      })
    });

    const data = await response.json();

    console.log(`All Accounts Owned By The Ore v2 Program: ${JSON.stringify(data, null, 2)}`);
  } catch (error) {
    console.error(error);
  }
};

getProgramAccounts();

Hãy cùng phân tích cách mã này hoạt động:

  1. Cấu hình URL: Chúng ta tạo một URL trỏ đến endpoint RPC của Helius và cung cấp API key
  2. Cấu trúc yêu cầu RPC
    • method: “getProgramAccounts” chỉ định rằng chúng ta muốn truy vấn các tài khoản thuộc sở hữu của chương trình
    • params là một mảng chứa hai phần tử: ID chương trình mà chúng ta muốn truy vấn (trong trường hợp này là chương trình V2 của Ore) và một đối tượng cấu hình cho truy vấn
  3. Mã hóa: Chúng ta yêu cầu dữ liệu tài khoản ở định dạng mã hóa base64
  4. Xử lý lỗi: Chúng ta xử lý mọi lỗi phát sinh bằng khối try/catch

Khi chạy, mã này sẽ ghi tất cả tài khoản thuộc sở hữu của chương trình Ore V2 vào console. 

Tuy nhiên, đây chỉ là ví dụ cơ bản—thông thường, bạn nên sử dụng các bộ lọc để thu hẹp kết quả và cải thiện hiệu suất.

Ví dụ về getProgramAccounts có bộ lọc

Hãy xem một ví dụ thực tế hơn, trong đó chúng ta dùng bộ lọc để truy vấn tất cả tài khoản token thuộc sở hữu của một địa chỉ cụ thể:

Mã
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;

const getTokenAccounts = async () => {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "token-accounts",
        method: "getProgramAccounts",
        params: [
          "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",  // Token Program address
          {
            "encoding": "jsonParsed",  // Get parsed token data
            "filters": [
              {
                "dataSize": 165,  // Size of token account data
              },
              {
                "memcmp": {
                  "offset": 32,  // Location of owner address in the token account
                  "bytes": "YOUR_WALLET_ADDRESS"
                }
              }
            ]
          }
        ]
      })
    });
    const data = await response.json();

    data.result.forEach((account, i) => {
      const parsed = account.account.data.parsed.info;

      console.log(`-- Token Account ${i + 1}: ${account.pubkey} --`);
      console.log(`Mint: ${parsed.mint}`);
      console.log(`Amount: ${parsed.tokenAmount.uiAmount}`);
    });
  } catch (error) {
    console.error("Error fetching token accounts:", error);
  }
};

getTokenAccounts();

Ví dụ này phát triển từ ví dụ cơ bản để minh họa hai kỹ thuật lọc quan trọng: sử dụng bộ lọc dataSize và memcmp.

dataSize

Bộ lọc dataSize kiểm tra kích thước dữ liệu chính xác của một tài khoản nhất định. Trong trường hợp này, chúng ta quan tâm đến các tài khoản token có kích thước 165 byte. Bộ lọc này sẽ ngay lập tức loại bỏ mọi tài khoản khác thuộc sở hữu của ví được cung cấp nhưng không phải là tài khoản token.

Bộ lọc memcmp (So sánh bộ nhớ)

Bộ lọc memcmp, hay bộ lọc so sánh bộ nhớ, cho phép chúng ta so sánh dữ liệu được lưu trữ tại một vị trí cụ thể trong bộ nhớ. Chúng ta sử dụng offset để chỉ định vị trí bắt đầu so sánh dữ liệu. 

Trong ví dụ này, chúng ta sử dụng offset là 32 để bỏ qua địa chỉ mint được lưu trong 32 byte đầu tiên của bộ nhớ, vì chúng ta chỉ quan tâm đến địa chỉ chủ sở hữu. Bộ lọc này sẽ chỉ trả về các tài khoản thuộc sở hữu của địa chỉ ví đã chỉ định.

Khi chạy, mã này sẽ ghi danh sách tất cả tài khoản token cùng số dư của chúng cho địa chỉ ví được cung cấp vào console. Nhờ khả năng lập chỉ mục được cải thiện của Helius, các truy vấn có bộ lọc này nhanh hơn đáng kể so với truy vấn của các nhà cung cấp RPC truyền thống khác.

Trợ giúp thêm

Bạn đã sẵn sàng giảm bớt phiền toái và trải nghiệm các lệnh gọi getProgramAccounts nhanh hơn chưa? 

Đăng ký trên Bảng điều khiển dành cho nhà phát triển Helius và bắt đầu xây dựng với hiệu suất tốt hơn ngay hôm nay. Bạn cần trợ giúp? Hãy truy cập Helius Discord nếu có bất kỳ câu hỏi nào hoặc cần hỗ trợ!

Nếu đã đọc đến đây, cảm ơn bạn, anon! Hãy nhớ nhập địa chỉ email bên dưới để không bao giờ bỏ lỡ thông tin cập nhật về những điểm mới trên Solana. Đang say mê học hỏi? Khám phá các bài viết mới nhất trên blog của chúng tôi và đẩy nhanh hành trình Solana của bạn.

Đă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