如何在 Solana 中查找主版 NFT 的所有版本

Ari*_*Ari 7 metaplex solana-web3js

我正在尝试获取来自大师版 NFT 的所有版本。根据文档,有一个 PDA 可以将该版本链接回主版本,但我无法通过 Metaplex/Solana sdk 以编程方式找到这种关系。

我当前的解决方案是解析主版本的所有交易并通过查找创建的版本进行过滤:

import {JsonMetadata, Metadata, Metaplex, TaskStatus} from "@metaplex-foundation/js";
import {Connection, PublicKey, ConfirmedSignatureInfo} from "@solana/web3.js";
import * as fs from "fs";

const RPC_URL = 'https://...';
const MASTER_EDITION_ADDRESS = '';

(async () => {
    const connection = new Connection(RPC_URL);
    const metaplex = new Metaplex(connection);

    const start = new Date().toISOString()

    // Paginate transactions from Master Edition

    const signatures: { signature: string; }[] = []
    let before: string | undefined = undefined;
    while (true) {
        const sigs: ConfirmedSignatureInfo[] = await metaplex.connection.getSignaturesForAddress(
            new PublicKey(MASTER_EDITION_ADDRESS),
            {
                before: before
            },
            'finalized'
        )
        if (!sigs.length) break
        signatures.push(...sigs)
        before = sigs[sigs.length - 1].signature
    }

    // Parse Transactions and find new edition mints

    const hashlist: string[] = []
    for (let i = 0; i < signatures.length; i++) {
        console.log(`${i}/${signatures.length}`);
        await metaplex.connection.getParsedTransaction(signatures[i].signature).then(tx => {
            if (!tx) return

            if (JSON.stringify(tx).toLowerCase().includes('error')) return

            if (JSON.stringify(tx).includes('Mint New Edition from Master Edition')) {
                console.log(JSON.stringify(tx, null, 4))
                hashlist.push(tx.transaction.message.accountKeys[1].pubkey.toString());
            }
        });
    }

    console.log('found:', hashlist.length, 'items')
})()

Run Code Online (Sandbox Code Playgroud)

然而,一旦交易达到一定规模,速度就会呈指数级下降。有没有一种快速可靠的方法来做到这一点。

假设:

  1. 第一个创造者并不是这个系列所独有的,因为它不是糖果机
  2. 更新权限不是唯一的,因为它也可以被其他集合使用