Как цифровое искусство хранится в Ethereum в форме NFT

Невзаимозаменяемые токены (NFT) довольно часто появляются в новостях. Хотя они существуют уже несколько лет, недавние события, такие как продажа цифрового искусства EVERYDAYS: ПЕРВЫЕ 5000 ДНЕЙ цифрового художника Бипла, проданная за 69 миллионов долларов, привлекли большое внимание к технологиям, позволяющим предметы коллекционирования в Интернете, самым известным из которых является Ethereum.

Как может это цифровое искусство, файл JPEG, стоить столько? К сожалению, это не тот вопрос, на который я могу ответить. Я здесь не для того, чтобы обсуждать легитимность NFT или оценивать их экономическую ценность. Это оставлено на ваше усмотрение. Тем не менее, я хочу пролить свет на некоторые технические вопросы, такие как: Как NFT представлена ​​в цепочке блоков? Хранится ли файл JPEG в Ethereum? А если нет, то где именно хранится файл JPEG?

Чтобы ответить на эти вопросы, мы собираемся получить изображение Бипла из NFT в живом смарт-контракте, работающем на Ethereum. И все начинается с EIP-721.

Я предполагаю, что вы уже знаете, что такое Ethereum и смарт-контракты, хотя некоторые базовые знания языка программирования смарт-контрактов solidity помогают, но это не обязательно.

EIP-721

Предложения по улучшению Ethereum (EIP) описывают стандарты для платформы Ethereum, включая спецификации основных протоколов, клиентские API и стандарты контрактов.

Предложения по улучшению не ограничивают какую-либо конкретную группу. Кто угодно может придумать такой вариант, написав спецификацию с подробным описанием того, почему и как, и опубликовать ее для обзора в открытой сети. Сообщество Ethereum, состоящее как из технических (клиентские разработчики, основные разработчики, майнеры и т. Д.), Так и из нетехнических лиц (пользователи, трейдеры и т. Д.), Затем рассмотрит предложение и достигнет консенсуса по любому из следующих вариантов: отсрочка, отклонение, или принимая это.

EIP-721 является одним из таких предложений и попадает в категорию предложений контрактных стандартов среди сотен других. Вы можете найти полный список отслеживаемых EIP ниже:



EIP-721 описывает стандарт, по которому может быть реализован смарт-контракт для отслеживания и передачи NFT. Снимок интерфейса EIP представлен ниже.

interface ERC721 {
    event Transfer(...);
    event Approval(...);
    event ApprovalForAll(...);

    function balanceOf(...);
    function ownerOf(...);
    function safeTransferFrom(...);
    function safeTransferFrom(...);
    function transferFrom(...);
    function approve(...);
    function setApprovalForAll(...);
    function getApproved(...);
    function isApprovedForAll(...);
}
interface ERC721Metadata {
    function name(...);
    function symbol(...);
    function tokenURI(...);
}

Обратите внимание, что я вырезал аргументы функции и типы возвращаемых значений, чтобы она была простой и удобочитаемой. Вы можете обратиться к официальной спецификации для получения полной информации.

Базовый интерфейс ERC721 является ядром NFT и предоставляет набор функций для обработки; хранилище токенов, передача права собственности на токены и некоторые средства получения, позволяющие любому пользователю запрашивать, кто владеет каким токеном, и т. д. Для нашей цели мы собираемся проигнорировать большую часть этого и сосредоточимся в первую очередь на интерфейсе расширения, а точнее на функции tokenURI.

function tokenURI(uint256 _tokenId) external view returns (string);

В сигнатуре функции указано, что она использует единственный аргумент uint256 и возвращает string. Теперь у нас есть ответ на наш первый вопрос.

Как NFT представлен в блокчейне? - Он просто представлен в виде числа (tokenId), а точнее 256-битного целого числа без знака.

Смарт-контракт

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

  1. Идентификатор токена: 40913
  2. Адрес контракта: 0x2a46f2ffd99e19a89476e2f62270e0a35bbf0756

Я откопал эти данные с сайта christies, где проводился аукцион NFT.

Адрес контракта необходим для нахождения действующего кода контракта, ответственного за создание, передачу и хранение NFT Beeple. Мы собираемся использовать etherscan.io в качестве обозревателя блоков. Взаимодействие с блокчейном Ethereum обычно осуществляется посредством транзакций, и в этом случае нам понадобится немного эфира, чтобы оплатить gas стоимость для совершения транзакции. Но, к счастью для нас, мы не собираемся изменять состояние цепочки и хотим только запросить некоторые данные из нее. Это будет происходить бесплатно, и мы вскоре увидим, почему.

Давайте посмотрим на код развернутого контракта. Откройте etherscan.io в своем браузере и введите адрес контракта в поисковике проводника:

Теперь вы должны увидеть адресную страницу контракта. Перейдите на вкладку Контакт, и вы увидите связанный исходный код контракта для этого адреса:

Я извлек только самую актуальную информацию ниже:

contract ERC721Token is ERC721, ERC721BasicToken {
  ...
  
  mapping(uint256 => string) internal tokenURIs;
  ...
  function tokenURI(uint256 _tokenId) public view returns (string) {
    require(exists(_tokenId));
    return tokenURIs[_tokenId];
  }
}

Данные токена хранятся в mapping, и, если вы никогда раньше не видели твердого кода, аналогичны Go map или Python dict. Ключ - это идентификатор токена uint256, а значение - это URI токена string, и поскольку это внутренняя карта, она недоступна извне контракта. Поэтому нам нужно вызвать tokenURI, чтобы получить значение URI. FunctiontokenURI объявляется со следующими ключевыми словами:

  • общедоступный: делает его доступным извне (внешние аккаунты или другие смарт-контракты).
  • view: делает его функцией просмотра, что означает, что функция не будет обновлять какое-либо состояние и будет выполняться на одном узле (скорее всего, на узле Ethereum, запущенном etherscan.io), а не из сама сеть, поэтому gas не требуется.

Итак, теперь вопрос в том, что такое URI string токена? Выполняем функцию! Перейдите на вкладку Прочитать контракт:

Прокрутите вниз до карточки tokenURI, введите идентификатор токена 40913 и нажмите Запрос:

Результаты появятся менее чем за несколько секунд:

>> string :  ipfs://ipfs/QmPAg1mjxcEQPPtqsLoEcauVedaeMH81WXDPvPx3VC5zUz

Вы, наверное, уже догадались, что URI токена string не может быть самим изображением и, следовательно, ответом на наш второй вопрос.

Хранится ли файл JPEG в Ethereum? - Неа. Маркер - это ссылка на URI, представляющий цифровое искусство.

IPFS

Файловая система InterPlanatery (IPFS) - это распределенная система для хранения и доступа к файлам, веб-сайтам, приложениям и данным. - ipfs.io

Как получить доступ к ресурсам, хранящимся в сети IPFS, с помощью найденного URI? Есть несколько способов сделать это. Мы можем запустить локальный демон ipfs и напрямую общаться с помощью команд IPFS, использовать браузеры, которые изначально поддерживают протокол IPFS, такие как Brave или Firefox, или самым простым способом было бы использовать общедоступный HTTP-шлюз, такой как infura или Ipfs.io. Эти шлюзы позволяют нам запрашивать данные, аналогичные посещению URL-адреса веб-сайта, и они будут передавать наш запрос узлу IPFS, подключенному к сети, для извлечения данных. Я выбрал ipfs.io.

Заменив схему URI токена с ipfs:// на https://ipfs.io/:

Https://ipfs.io/ipfs/QmPAg1mjxcEQPPtqsLoEcauVedaeMH81WXDPvPx3VC5zUz

Это превратит его в ваш знакомый URL-адрес, и, как и любые другие веб-ссылки, вы сможете увидеть следующие данные в формате JSON:

JSON содержит метаданные того, что представляет ресурс, изображения Бипла. Атрибут, который мы искали: imageUrl или raw_media_file под properties. URL-адрес уже отформатирован в знакомый URL-адрес HTTP, и вот он. Все, что вам нужно сделать, это перейти по ссылке, и у вас будет изображение за 69 миллионов долларов, загруженное в ваш браузер в необработанном виде.

Где именно хранится файл? - в IPFS, сети компьютерных узлов, хранящих фрагменты файла JPEG на диске.

Вы можете быть удивлены, узнав, что само изображение не хранится в блокчейне, я знаю, что был. Но после некоторого размышления становится понятно, почему это так.

В конце концов, Ethereum - это база данных, и для любых баз данных, таких как Cassandra, MongoDB, Postgres и т. Д., Хранение больших двоичных файлов (BLOB) непосредственно в них никогда не будет жизнеспособным как с точки зрения эксплуатационных затрат, так и производительности. . Базы данных не предназначены для таких случаев использования, в отличие от файловых систем.

Каждый смарт-контракт имеет собственное хранилище данных (собственную постоянную базу данных), а хранение данных в блокчейне требует больших затрат. Давайте посчитаем на салфетке, сколько денег (в долларах США) может стоить хранение полного изображения.

Размер изображения: ~ 319 МБ.

Все соответствующие данные, такие как стоимость газа и цена ETH, используемые в следующих расчетах, основаны на дате создания NFT, 16 февраля 2021 года.

Цена на газ: ~ 12 Gwei

Цена ETH: ~ 1,781 USD

Gwei - одна из единиц номинала эфира, где 10⁹ Gwei = 1 ETH. Из этих данных мы можем получить стоимость в долларах США за газ:

(12 Gwei / 10⁹ Gwei) * 1781 USD = ~ 0,000021372 USD

Теперь, когда мы знаем цену за газ, давайте разберемся, сколько его требуется для хранения полного изображения.

Базовая ставка для каждой транзакции составляет 21 000 газа, это комиссия по умолчанию, которую Ethereum взимает за обработку транзакций. Согласно желтой бумаге эфириума, OPCODE SSTORE стоит 20 000 газа и хранит данные объемом 32 байта. Таким образом, хранение полного изображения размером 319 168 313 байт будет стоить:

(319,168,313 байта / 32 байта) * 20000 газа + 21000 газа = ~ 199,480,216,625 газа

Умножение требуемого количества газа на цену за газ дает:

0,000021372 долл. США / газ * 199480216625 газ = ~ 4 263 291 долл. США

Да, хранение изображения размером 319 МБ будет стоить более 4 миллионов долларов! Ethereum также имеет лимит газа на блок в 12 491 798 газа, поэтому вам нужно будет конкурировать за все наборы транзакций из ~ 16 000 блоков (199480216625 газа / 12491798 газа), что требует огромных затрат. , мягко говоря. Следовательно, требуется альтернативное решение, одним из которых является IPFS.

Заключение

Напомним, NFT - это число, которое ссылается на ссылку (URI), которая содержит некоторые метаданные о ресурсе токена. Другими словами, NFT - это уникальная подпись или доказательство владения ресурсом, который он представляет.

Я не вдавался в подробности о том, как данные изображения фрагментируются, присваиваются CID (идентификатор содержимого), запрашиваются и физически хранятся на диске на машинах, участвующих в сети IPFS. IPFS - сложная система, которая быстро развивается и заслуживает отдельного описания. Я отвечу на оставшиеся вопросы в следующей статье, так что следите за обновлениями!

Ресурсы