Организуйте коллекции NFT из минтинга DAO с помощью небольших прокси-контрактов.

Immutable Ecosystem DAO (или Immutable DAO) — это небольшой набор смарт-контрактов, созданный ImmutableSoft, некоммерческой организацией открытого общественного блага 501(c)(3). Участники, которые присоединяются к этой открытой DAO, могут защитить свое цифровое владение и лицензировать права конечных пользователей на свои творения для пользователей.

Записывая контрольную сумму файла своего цифрового творения (SHA256) в NFT, отчеканенном в сети, неизменяемая запись транзакции с отметкой времени, подписанная кошельком создателя цифрового, демонстрирует первое происхождение, жизненно важный шаг в подтверждении права собственности.

Первоначально разработанная для защиты общедоступных выпусков файлов / программного обеспечения, подделка и мошенничество привлекли традиционных создателей NFT в наш DAO. См. Creator Provenance Within NFTs для получения дополнительной информации об этом движении. Эта статья продолжает путешествие нашего DAO, описывая детали того, как наши участники могут развернуть свой собственный прокси-сервер смарт-контракта, чтобы различать определенные наборы своих NFT.

Для коллекций NFT проблема возникает при просмотре художественных NFT, отчеканенных с помощью Immutable DAO, за пределами нашего dApp (т. е. средств просмотра NFT и сторонних бирж). По историческим причинам (стандарт метаданных) name() функция смарт-контракта ERC721 становится именем коллекции. Каждый участник нашего DAO создает свои собственные уникальные NFT — идентификатор членства встроен в каждый созданный tokenId (см. Сериализация данных в больших целых числах).

Однако, поскольку все NFT всех членов DAO создаются одним и тем же смарт-контрактом, они появляются в одной и той же «коллекции» на сторонних биржах (OpenSea, Rarible и т. д.). Это может создать менее премиальный опыт (мягко говоря) для элитных художественных аукционов NFT и т. д.

Хотя было бы неплохо добавить необязательный параметр tokenId в функцию name() ERC721 или новую функцию collectionName(tokenId) Это, скорее всего, не произойдет в любое время, чтобы поддержать появление DAO чеканки NFT. В качестве срочной проблемы, требующей решения, мы подошли к проблеме, позволив членам Immutable DAO развернуть небольшой смарт-контракт, который переопределяет имя коллекции, но проксирует все другие вызовы смарт-контракта ERC721 на связанный смарт-контракт DAO (в данном случае Токен Создателя).

Затем третьи стороны, которые просматривают «коллекцию» через адрес прокси-смарт-контракта, увидят уникальное имя коллекции и только NFT, характерные для этой коллекции. Другие части реализации токена также могут быть переопределены. Этот прокси может быть основой для полного удаления NFT из DAO, если это необходимо (прокси с пунктом выхода).

Многое обсуждалось в отношении прокси-серверов и обновляемых смарт-контрактов; однако этот тип прокси менее сложен, поскольку основные данные всегда находятся в смарт-контрактах DAO, а не в прокси. Это означает, что, в отличие от обновляемых прокси, delegateCall() не используется.

Вместо этого инициализация прокси адресом основного контракта DAO (см. CreatorToken на Polygonscan) позволяет каждой функции интерфейса токена ERC721 проксировать вызов в смарт-контракт Immutable DAO. Это отношения один к одному по большей части.

Однократная инициализация требуется для настройки прокси-сервера с помощью смарт-контрактов Immutable DAO и идентификатора объекта и продукта (как определено в DAO), чтобы ограничить набор прокси-серверов. Однако ERC721 и связанный с ним перечисляемый интерфейс, такой как totalSupply(), tokenByIndex(), balanceOf() и tokenOfOwnerByIndex(), нельзя однозначно перевести. Эти стандартные функции ERC721 должны возвращать только подмножество NFT в неизменяемом DAO, соответствующем продукту конкретного создателя (т. е. этой коллекции). Чтобы выполнить это для всех четырех (4) основных функций, указанных выше, мы создали внутреннюю функцию для поддержки всех вариантов, от подсчета количества токенов до того, какой индекс соответствует какому токену.

Этот смарт-контракт прокси небольшой и недорогой в развертывании. Для расширения сам прокси может быть обновляемым смарт-контрактом. Этот двойной прокси предпочтителен для коллекций NFT, которые могут трансформироваться, изменяться или иным образом быть открытыми для дальнейшего развития. Вышеупомянутый прокси-сервер DAO для коллекций NFT потребует изменений инициализации, чтобы наследовать возможность обновления на основе OpenZeppelin.

Конечной целью этого прокси-сервера является преобразование идентификатора токена из DAO для использования только идентификатора выпуска, а не сериализации с идентификаторами объекта и продукта. Сериализованные токены DAO представляют собой очень большие целые числа и несовместимы или не понимаются с помощью средств просмотра NFT или бирж. Удаление сериализации позволяет идентификаторам прокси-токенов NFT начинаться с 1 и идти в хронологическом порядке, как и ожидается для собственного токена ERC721. Для этого мы добавляем вспомогательную функцию idToDAO() и используем ее для перевода из прокси в каждый последующий вызов DAO. Коллекция прокси NFT теперь неотличима на сторонних биржах от собственного токена.

  /// @notice Convert tokenID from this proxy to ImmutableSoft DAO
  /// @param tokenId The proxy identifier (only release id)
  /// @return The CreatorToken (ImmutableSoft) token Id
  function idToDAO(uint256 tokenId)
    public view returns (uint256)
  {
    return ((_entity << commonInterface.EntityIdOffset()) &
            commonInterface.EntityIdMask()) |
           ((_product << commonInterface.ProductIdOffset()) &
            commonInterface.ProductIdMask()) |
           ((tokenId << commonInterface.ReleaseIdOffset()) &
            commonInterface.ReleaseIdMask());
  }
  /// @notice Look up the release URI from the token Id
  /// @param tokenId The unique token identifier
  /// @return the file name and/or URI secured by this token
  function tokenURI(uint256 tokenId) public view
      returns (string memory)
  {
    return creatorToken.tokenURI(idToDAO(tokenId));
  }
...

Также возможно использование этого прокси для переопределения tokenURI(). Это полезно для юридических контрактов, где Immutable DAO NFT защищает частный файл (подписанный контракт и т. д.) с помощью хэша PoE. Тем не менее, смарт-контракт прокси-сервера возвращает общедоступный образ метаданных NFT сертификата, проверяющего частный файл третьей стороной. См. другую нашу статью Совместимость рикардианских контрактов для получения дополнительной информации об этом сценарии контрактного поставщика услуг.

Другим важным вариантом использования являются игровые элементы, где tokenURI() может быть перегружен, чтобы, например, разрешить динамическое изменение всего базового URI коллекции. С переопределением для tokenURI() можно добавить новую функцию setTokenBaseURI(), чтобы владелец прокси мог переместить все NFT своей игры в новый домен web2 одним вызовом, заимствуя эффективность стандарта ERC1155.

Через URI базовой коллекции идентификатор токена (или конечное имя файла из частного файла Immutable DAO) добавляется к базе URI и выводится с помощью tokenURI(). Владелец прокси-сервера отвечает за размещение конечной точки URI web2, которая обслуживает данные метаданных JSON, используемые для отображения этого NFT. Некоторые проекты также могут каким-то образом раскрыть mint(), чтобы обеспечить согласованность при создании NFT и/или упростить интерфейс по сравнению с DAO.

Чтобы увидеть полную реализацию, ее можно найти здесь, в нашем основном репозитории GitHub. Поскольку идентификаторы объекта и продукта определяются при развертывании, каждый может использовать один и тот же смарт-контракт без изменений. Мы заканчиваем примером, который показывает, как клиент развертывает собственный прокси-сервер с помощью сценария развертывания 10_deploy_collection_proxy.js.

Участник из нашего примера зарегистрировал название своей организации и создал продукт на рынке. Опция Разработчики созданного продукта отображает уникальный и неизменный номер объекта и продукта, соответственно значения два (2) и ноль (0). Посмотрите на эту картинку из нашего dApp.

Сначала мы клонируем репозиторий и устанавливаем зависимости с помощью NPM с помощью командной строки (в данном примере — MS Windows). Для этого требуется NPM, поэтому убедитесь, что NPM уже установлен в вашей системе разработки, или сделайте это сейчас, прежде чем продолжить.

D:\>git clone https://github.com/ImmutableSoft/ImmutableEcosystem.git
Cloning into 'ImmutableEcosystem'...
remote: Enumerating objects: 803, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (60/60), done.
Receiving objects:  98% (787/803), 10.53 MiB | 10.52 MiB/sremote: Total 803 (delta 44), reused 42 (delta 24), pack-reused 718
Receiving objects: 100% (803/803), 14.72 MiB | 10.65 MiB/s, done.
Resolving deltas: 100% (451/451), done.
D:\>cd ImmutableEcosystem
D:\ImmutableEcosystem>npm install
...
D:\ImmutableEcosystem>truffle compile --all
...
D:\>

Если на последнем шаге возникает ошибка, убедитесь, что truffle установлен глобально для NPM (npm install -g truffle). Как только контракты скомпилированы, мы открываем файл развертывания 10_deploy_collection_proxy.js и меняем параметры инициализации (выделены жирным шрифтом ниже) на нашу уникальную сущность и идентификатор продукта этой коллекции.

В этом случае имя коллекции — «Компьютерные системы», символ токена — «CSI», а сущность Immutable DAO — два (2) и нулевой продукт (0) (как на картинке выше).

После изменения файла развертывания последний шаг — запустить только это развертывание в сети EVM (в данном примере — Polygon Mainnet). Вам нужно будет заполнить secrets.json словами восстановления вашего кошелька, чтобы транзакция развертывания смарт-контракта была подписана с правильным закрытым ключом.

Не забудьте удалить слова восстановления из этого файла после развертывания — никогда не фиксируйте их в репозиторий git.

Рекомендуется использовать кошелек с низкой стоимостью криптовалюты (только газ) для развертывания и управления владением смарт-контрактом, чтобы ваша система разработки не стала целью для хакеров.

D:\>ImmutableEcosystem>truffle migrate --f 10--to 10--compile-none --skip-dry-run --network polygon_mainnet

С адресом смарт-контракта развернутого прокси-контракта, указанным выше, просмотрите свою любимую стороннюю биржу NFT и увидите только NFT этого продукта под новым именем коллекции. Обратите внимание, что для развертывания потребуется, чтобы владелец прокси-сервера был тем же адресом кошелька, зарегистрированным в Immutable DAO для этого идентификатора объекта. Это поможет защитить прокси-экосистему. См. ссылку на исходный код выше, чтобы узнать подробности того, как мы это делаем.

В заключение, количество прокси-серверов, которые может использовать член DAO, не ограничено. Тем не менее, каждый из них должен относиться к уникальному продукту, и все они должны принадлежать зарегистрированному адресу юридического лица для этого продукта (и имя продукта DAO должно совпадать с названием коллекции!). Carpe partem для коллекций NFT, отчеканенных DAO, представленных прокси-смарт-контрактом!

Пожалуйста, оставьте комментарий, если вам понравился этот путь через дебри джунглей блокчейна.