Как добавить пользовательские атрибуты (on-chain) в токен ERC721?

#ethereum #solidity #smartcontracts

#ethereum #надежность #smartcontracts

Вопрос:

я изучаю solidity, используя Openzeppelin Framework.

В настоящее время я использую предустановленный контракт ERC721 (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol)

Я хотел бы добавить пользовательские атрибуты для каждого отчеканенного токена, чтобы хранить некоторые важные данные в блокчейне (я бы не стал использовать для определенных атрибутов REST API, но я предпочитаю записывать их в цепочке).

Каждый токен будет иметь разные данные.

 string: Name
string: Surname
bytes32: 0x63383a61613a62323a30373a63383a323020
 

Можно ли сделать это, создав некоторые новые функции (без редактирования функции mint), разрешив только те адреса, которые имеют роль minter?

Ответ №1:

ДА.

Вы можете создать сопоставление между идентификатором токена и тем, что вы хотите, чтобы он имел. Давайте назовем это name .

mapping(uint256 => string) name;

Если у вас много атрибутов, вы можете выполнить сопоставление структуры.

     struct Character {
        uint256 strength;
        uint256 dexterity;
        uint256 constitution;
        uint256 intelligence;
        uint256 wisdom;
        uint256 charisma;
        uint256 experience;
        string name;
    }

    Character[] public characters;

    mapping(uint256 => uint256) tokenIdToCharacterIndex;
 

Затем просто убедитесь, что обновили свой tokenURI, включив в него атрибуты on-chain, чтобы они отображались на торговых площадках NFT.

Комментарии:

1. Большое спасибо @patrick-collins за ваш ответ. Я просто добавляю ваш код в свой контракт, но я не вижу, как добавить данные в эту структуру после того, как я создам новый токен.

2. Это отдельный вопрос, не стесняйтесь задавать его дальше.

3. Для других, кто может прийти сюда — я. Это прямо там, в коде, но не повредит наставничеству здесь. Существует метод _beforeTokenTransfer(адрес (0), to, tokenId); который вызывает метод mint по умолчанию, который вы можете переопределить и выполнить генерацию и хранение данных для токена, который чеканится.