Пример кода для анализа метаданных для Solana NFT и обновления метаданных

В Solana метаданные NFT хранятся в учетных записях, которые принадлежат программе метаданных токенов общего контракта по адресу metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s.

Мне нужен четкий и лаконичный пример кода, показывающий, как я могу использовать существующую библиотеку для получения метаданных для конкретного NFT. Давайте использовать этот NFT, например: SolStone 4itgFt6tSotypyVAaUkLJzpGQ5KXsJNhwpKBANMv49mf

Самое дальнее, что я получил до сих пор, - это копирование библиотеки метаплексов и использование такого вызова

       await getProgramAccounts(connection, METADATA_PROGRAM_ID, 'finalized');

однако это загрузит метаданные для всех существующих NFT. Вместо этого мне нужно использовать какой-то фильтр вместо 'finalized' как аргумент приверженности.

В кодовой базе метаплекса, я думаю, есть пример фильтрации по адресу создателя.

      filters: [
    {
        memcmp: {
            offset:
            1 + // key
            32 + // update auth
            32 + // mint
            4 + // name string length
            MAX_NAME_LENGTH + // name
            4 + // uri string length
            MAX_URI_LENGTH + // uri
            4 + // symbol string length
            MAX_SYMBOL_LENGTH + // symbol
            2 + // seller fee basis points
            1 + // whether or not there is a creators vec
            4 + // creators vec length
            i * MAX_CREATOR_LEN,
            bytes: whitelistedCreators[j].info.address,
        }
    }
]

Так что теоретически я должен иметь возможность обновить этот фильтр, чтобы вместо него фильтровать по собственному адресу NFT, но я не уверен, как получить здесь правильное битовое смещение, чтобы фильтр был точным.

После того, как я смогу прочитать метаданные nft, мне понадобится пример кода для обновления метаданных. В частности, поле URI.

1 ответ

Вы почти у цели!

Адрес 4itgFt6tSotypyVAaUkLJzpGQ5KXsJNhwpKBANMv49mfна самом деле монетный двор, как видно в проводнике: https://explorer.solana.com/address/4itgFt6tSotypyVAaUkLJzpGQ5KXsJNhwpKBANMv49mf

Это означает, что вы будете использовать вызов, очень похожий на тот, который вы нашли, но вместо фильтрации по whitelistedCreators массив, вы отфильтруете позицию монетного двора, которая находится в байтах 1 + 32, предполагая, что мы можем доверять комментарию в коде. Это дает вызов функции:

      getProgramAccounts(connection, METADATA_PROGRAM_ID, {
  filters: [
    {
      memcmp: {
        offset:
          1 + // key
          32 // update auth
        bytes: mintAddress.toBytes(),
      },
    },
  ],
})

Для обновления метаданных вы, вероятно, захотите использовать UpdateMetadataинструкция. Похоже, в библиотеке Metaplex JS есть служебная функция для этого: https://github.com/metaplex-foundation/metaplex/blob/9d5a5c6d668cd9c597cff8c63dfba00dee2f72f0/js/packages/common/src/actions/metadata.ts#

Другие вопросы по тегам