Пример кода для анализа метаданных для 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#