Solana DEV #01: 올바른 방식으로 온체인 데이터 가져오기
필터링된 프로그램 계정 가져오기
가장 중요한 모범 사례는 필터와 함께
getProgramAccounts
를 사용하는 것입니다. getProgramAccounts
패키지의 이 @solana/web3.js
메서드는 제공된 프로그램 ID의 모든 계정을 가져오는 데 매우 유용합니다. 그러나 스마트 계약에서와 같이 여러 유형의 계정이 있으므로 최상의 성능을 위해 필터링이 필요합니다./**
* A filter object for getProgramAccounts
*/
export type GetProgramAccountsFilter = MemcmpFilter | DataSizeFilter;
이제 우리는 소스 코드를 약간 가지고 놀았습니다.
MemcmpFilter
및 DataSizeFilter
를 참조할 수 있는 두 가지 필터링 유형이 있습니다.데이터 크기 필터
/**
* Data size comparison filter for getProgramAccounts
*/
export type DataSizeFilter = {
/** Size of data for program account data length comparison */
dataSize: number;
};
DataSizeFilter
는 선언된 데이터 크기와 일치하는 프로그램의 계정을 필터링하는 데 사용됩니다. 간단하죠? 이 필터링 유형은 데이터 크기가 고정된 계정에 유용합니다. 계정에는 vector
또는 str
와 같은 동적 크기 필드가 포함됩니다.Memcmp 필터
/**
* Memory comparison filter for getProgramAccounts
*/
export type MemcmpFilter = {
memcmp: {
/** offset into program account data to start comparison */
offset: number;
/** data to match, as base-58 encoded string and limited to less than 129 bytes */
bytes: string;
};
};
두 가지 필터링 유형 중에서 이 접근 방식을 사용하면 보다 동적이고 선택적인 방식으로 계정을 필터링할 수 있으므로 더 많이 사용됩니다.
MemcmpFilter
또는 Memory comparison filter
에는 offset
및 bytes
라는 두 개의 필드가 있습니다. 모든 계정 데이터는 바이트 집합이며 오프셋을 사용하여 비교할 특정 데이터 필드를 선택할 수 있으며 바이트는 비교의 후반 부분입니다.예를 들어 특정 계정 구분자가 있는 모든 프로그램 계정을 가져오려는 경우 오프셋을 0으로 설정하고 비교된 계정 구분자의 바이트를 가져올 수 있습니다. 이것은 Anchor를 사용하지 않고 특정 유형의 프로그램 계정을 얻는 트릭입니다(프레임워크가 이미 내부에서 이 프로세스를 처리하므로).
저는 보통 이 필터링 유형을 사용하여 특정 지갑이 소유한 계정을 필터링합니다. 이를 위해서는 Rust 프로그램에서 소유자의 지갑 주소를 계정에 저장해야 합니다. 예를 들어 다음 계정 데이터가 있습니다(Anchor 사용).
#[account]
pub struct WalletAddressContainer {
pub address: PubKey
}
특정 지갑 주소의 모든 WalletAddressContainer 계정을 가져오려면
// using Anchor
await program.account.flow.all([
{
memcmp: {
offset: 8,
bytes: publicKey.toBase58(),
},
}
]);
// without Anchor
await connection.getProgramAccounts(
programID,
{
...,
filters: [
{
memcmp: {
offset: 0,
bytes: /** Account discriminator bytes of WalletAddressContainer **/,
}
},
{
memcmp: {
offset: 8,
bytes: publicKey.toBase58()
}
}
]
}
);
언급한 바와 같이 Anchor 방식으로 Anchor 프레임워크는 내부적으로 계정 판별자를 비교하므로 다시 비교할 필요가 없습니다. 그런 식으로 우리는 지갑의 공개 키를 비교하기 위해 하나의 필터
memcmp
만 필요하지만 오프셋은 여전히 8이어야 합니다.반면 Anchor가 없는 getProgramAccounts는 두 가지 비교가 필요합니다. 첫 번째는 계정 구분자이고 두 번째는 지갑 주소입니다.
Reference
이 문제에 관하여(Solana DEV #01: 올바른 방식으로 온체인 데이터 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chungquantin/solana-dev-01-fetching-onchain-data-in-a-right-way-23da텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)