신규: Helius가 Light Protocol을 인수했습니다
더 빨라진 getProgramAccounts(gPA) 호출을 소개합니다
블로그/업데이트

더 빨라진 getProgramAccounts(gPA) 호출을 소개합니다

Developer Experience EngineerX의 0xIchigoLinkedIn의 0xIchigoGitHub의 0xIchigo
읽는 데 3분

getProgramAccounts(gPA) 호출은 여러 문제로 악명이 높습니다. 이 RPC 메서드는 주어진 공개 키가 소유한 모든 계정을 가져오기 위해 노드를 쿼리하는 고비용·저효율 작업입니다. 호출 속도가 느리고 엄격한 요청 제한이 적용되는 경우가 많습니다. 결과가 이미 캐시되어 있지 않으면 호출 자체가 완전히 금지되기도 합니다(예: Serum 프로그램에 대한 gPA 호출). 이러한 문제 때문에 개발자는 효율성이 떨어지는 번거로운 대안을 찾아야 했습니다. 

오늘부터 달라집니다.

Helius는 모든 Solana 개발자를 위해 더 빨라진 getProgramAccounts 호출을 선보입니다. 

새롭게 달라진 점은 다음과 같습니다.

  • 계정 인덱싱을 대폭 개선했습니다
  • gPA 호출 속도가 이전보다 2~10배 빨라집니다. 특히 대규모 프로그램에 필터를 사용할 때 더욱 빠릅니다
  • 어떤 개발자든 한 번만 호출하면 해당 프로그램을 자동으로 인덱싱하므로 모든 사용자의 성능이 향상됩니다

시작하기

먼저 Helius Developer Dashboard에 가입하고 “API Keys” 섹션에서 API 키를 발급받으세요. 

getProgramAccounts 예제

JavaScript에서 Ore V2 프로그램이 소유한 모든 계정을 쿼리해 보겠습니다.

코드
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();

코드가 어떻게 작동하는지 살펴보겠습니다.

  1. URL 구성: Helius RPC 엔드포인트를 가리키는 URL을 만들고 API 키를 제공합니다
  2. RPC 요청 구조
    • method: “getProgramAccounts**”**는 프로그램 소유 계정을 쿼리하도록 지정합니다
    • params는 쿼리할 프로그램 ID(여기서는 Ore V2 프로그램)와 쿼리 구성 객체라는 두 요소를 포함하는 배열입니다
  3. 인코딩: 계정 데이터를 base64 인코딩으로 요청합니다
  4. 오류 처리: try/catch 블록으로 발생하는 모든 오류를 처리합니다

이 코드를 실행하면 Ore V2 프로그램이 소유한 모든 계정이 콘솔에 기록됩니다. 

다만 이는 기본적인 예제입니다. 일반적으로는 필터를 사용해 결과 범위를 좁히고 성능을 개선하는 것이 좋습니다.

필터를 사용한 getProgramAccounts 예제

필터를 사용해 특정 주소가 소유한 모든 토큰 계정을 쿼리하는 실용적인 예제를 살펴보겠습니다.

코드
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();

이 예제는 기본 예제를 확장해 두 가지 중요한 필터링 기법인 dataSize 및 memcmp 필터 사용법을 보여줍니다.

dataSize

dataSize 필터는 주어진 계정의 정확한 데이터 크기를 확인합니다. 여기서는 크기가 165바이트인 토큰 계정을 찾습니다. 따라서 제공된 지갑이 소유한 계정 중 토큰 계정이 아닌 계정은 즉시 필터링됩니다.

memcmp 필터(메모리 비교)

memcmp 필터, 즉 메모리 비교 필터를 사용하면 메모리의 특정 위치에 저장된 데이터를 비교할 수 있습니다. 오프셋으로 데이터 비교를 시작할 위치를 지정합니다. 

이 예제에서는 소유자 주소만 필요하므로 오프셋을 32로 설정해 메모리의 첫 32바이트에 저장된 민트 주소를 건너뜁니다. 이 필터는 지정된 지갑 주소가 소유한 계정만 반환합니다.

이 코드를 실행하면 제공된 지갑 주소의 모든 토큰 계정과 잔액 목록이 콘솔에 기록됩니다. Helius의 향상된 인덱싱을 사용하면 이러한 필터링 쿼리가 기존의 다른 RPC 제공업체보다 훨씬 빠르게 처리됩니다.

추가 지원

이제 번거로움은 줄이고 getProgramAccounts 호출 속도는 높여보세요. 

Helius Developer Dashboard에 가입하고 지금 바로 더 나은 성능으로 개발을 시작하세요. 도움이 필요하신가요? 질문이나 지원이 필요하면 Helius Discord를 방문하세요!

끝까지 읽어주셔서 감사합니다, 익명의 독자님! 아래에 이메일 주소를 입력하고 Solana의 새로운 소식을 빠짐없이 받아보세요. 더 많은 내용을 배우고 싶으신가요? 블로그에서 최신 글을 살펴보고 Solana 여정에 속도를 더하세요.

Helius 구독하기

최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요