#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 по умолчанию, который вы можете переопределить и выполнить генерацию и хранение данных для токена, который чеканится.