Witnet VRF для он-чейн NFT на Conflux eSpace

Witnet VRF для он-чейн NFT на Conflux eSpace

@confluxrussians

 Генерация случайных чисел в блокчейне (в первую очередь для использования в смарт-контрактах) является совсем не простой задачей, так как практически все параметры, такие как blockNumber, blockTimestamp или даже blockHash, которые используются для увеличения энтропии при генерации случайных чисел, могут легко манипулироваться майнерами, что делает систему детерминированной. Исходя из этого, существует необходимость в надежном, децентрализованном и проверенном протоколе, который способен предоставлять случайные значения, по запросу клиента (в данном случае смарт-контракту).  
Как раз то, что децентрализованные оракулы, такие как Witnet, предоставляют, среди других услуг, таких как, Price Feed и Web Oracles.

 Многие NFT проекты имеют множество различных параметров, которые необходимо назначить каждому NFT в рамках одной коллекции. Это была бы катастрофа, если бы разработчики проекта назначали параметры вручную для каждого NFT, поэтому децентрализованный, случайный и проверяемый способ распределения/назначения этих параметров просто необходимы для выпуска NFT. Как раз, в данном случае, на помощь приходит оракул случайности Witnet. Процесс достаточно прост;

 • Смарт-контракт NFT написан для интеграции с контрактом WitnetRandomness от команды Witnet.

 • Всякий раз, когда при выпуске NFT, смарт-контракт создаёт запрос из случайного набора байтов к оракулу.

 • Далее, смарт-контракт использует это 32-байтовое случайное значение для вычисления параметров NFT пользователя.

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

 Сначала проверяем структуру NFT.

pragma solidity 0.8.10;

  struct TokenDeets {
        string name;
        bytes32 tag;
        uint8[5] props;
    }
    
    string[4] availNames = ["King", "Warrior", "Knight", "Steed"];

 Базовая структура NFT


 L3-L7 показывает, что каждый NFT имеет 3 основных параметра:

 • Имя, которое может принимать значения King, Warior, Knight или Steed.

 • Тег, который равен случайному значению bytes32, полученному от witnet.

 • Пять свойств, которые содержат 5 чисел от 0 до 100

 Также обратите внимание, что все метаданные хранятся он-чейн, а не в хранилищах формата ipfs.


pragma solidity 0.8.10;

function mintNFT() external payable {
        fetchRandomness();
        assert(randomness != 0);
        _mint(msg.sender, tokenID);
        TokenDeets storage s = TokenTags[tokenID];
        s.name = availNames[genName(randomness)];
        s.props = genProp(randomness);
        s.tag = genTag(randomness);

        tokenID++;
        requestRandomness();
  }
        
function genProp(bytes32 _rand) internal returns (uint8[5] memory m) {
        uint128 base = uint128(bytes16(_rand));
        m[0] = genSingleProp(tear(_rand), 1);
        m[1] = genSingleProp(tear(_rand), 2);
        m[2] = genSingleProp(tear(_rand), 3);
        m[3] = genSingleProp(tear(_rand), 4);
        m[4] = genSingleProp(tear(_rand), 5);
 }
 
function genName(bytes32 _rand) internal view returns (uint8 pos) {
        uint128 base2 = uint128(bytes16(_rand << 128));
        uint16 mid = uint16(uint128(base2));
        pos = uint8(mid % 4);
    }
  
    

  Основные свойства

• mintNFT () — это основная функция, которая позволяет выпускать NFT, перед выпуском вызывает метод fetchRandomness(), который запрашивает оракул случайности witnet, предоставить готовое случайное значение. 
Обратите внимание, что вы должны вызывать fetchRandomness(), только после того, как Вы выполнили requestRandomness() и подождали несколько минут. После чего, полученное значение, используется для вычисления параметров NFT. Метод requestRandomness() вызывается в конструкторе смарт-контракта.

 Обратите внимание, что оракул случайности witnet может предоставить случайное значение в формате случайное числа(uint256), либо в формате bytes32. Мы используем случайное значение в формате bytes32 для этого кода и для генерации других параметров.

•  genProp() — это функция, которая принимает полученное случайное значение и использует его для выбора пяти свойств(5 props) NFT.

• genName() также преобразует случайное значение в число от 0 до 3 и для выбора параметра имени(name) NFT.

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

На этом все.  Если вы хотите потренироваться в работе с NFT, вы можете создать его по данной ссылке в тестовой сети Conflux eSpace.

Оригинал Новости: https://medium.com/conflux-network/witnet-vrf-for-onchain-nfts-on-conflux-espace-664424d0648

Материал подготовлен: Mitrandir

Поблагодарить автора: cfx:aaky1vh7z36e8g85rvzdf6gc0d4cbvaw3jbmum96nh

Мы рады приветствовать всех на официальных ресурсах оригинального Русскоязычного сообщества Conflux: 

Telegram: https://t.me/confluxrussians;

Новостной канал в Telegram: https://t.me/confluxrussians


Запуск Conflux Russian DAO все ближе!!!

Присоединяйся

Conflux - Cообщество без границ

  Conflux - Community without barriers


Примечание: https://t.me/confluxrussian Telegram-чат не поддерживается русским сообществом и самовольно управляется украинскими ambassadors под руководством Camilla Caban.

Report Page