RedStone Oracle: настраиваем ядро для своего Dapp
Установка
Установите @redstone-finance/evm-connector из реестра NPM
Зависимости устанавливаются с помощью подмодулей git. Таким образом, для установки зависимостей необходимы дополнительные шаги.
Установите @redstone-finance/evm-connector - он установит текущий код из основной ветки
Установите контракты @OpenZeppelin (зависимость от @redstone-finance/evm-connector) - он установит текущий код из основной ветки
forge install OpenZeppelin/[email protected]
Добавьте библиотеки в remappings.txt
echo "@redstone-finance/evm-connector/dist/contracts/=lib/redstone-oracles-monorepo/packages/evm-connector/contracts/
@openzeppelin/contracts=lib/openzeppelin-contracts/contracts/" >> remappings.txt
Использование
Вам нужно внести небольшие изменения в исходный код, чтобы смарт-контракт получал доступ к данным. Для этого ваш контракт должен быть дополнен одним из наших базовых контрактов. Выбор конкретного базового контракта зависит от того, какой сервис передачи данных вы планируете использовать.
import "@redstone-finance/evm-connector/contracts/data-services/MainDemoConsumerBase.sol";
Вы должны передать идентификатор канала передачи данных, преобразованный в 32 байта.
Теперь отрегулируем Javascript-код нашего DApp.
Вам также следует обновить код, отвечающий за отправку транзакций. Если вы используете ethers.js, мы подготовили специальную библиотеку, чтобы сделать переход более плавным.
Во-первых, вам нужно импортировать код оболочки в свой проект
const { WrapperBuilder } = require("@redstone-finance/evm-connector");
import { WrapperBuilder } from "@redstone-finance/evm-connector";
Затем вы можете подключить свой контракт Ethereum к выбранному идентификатору службы передачи данных Redstone. Вы можете (по желанию) указать количество уникальных подписчиков, идентификаторы каналов передачи данных и URL-адреса для узлов кэширования Redstone.
const yourEthersContract = new ethers.Contract(address, abi, provider);
const wrappedContract = WrapperBuilder.wrap(contract).usingDataService(
{
dataFeeds: ["ETH", "BTC"], // На примере эфира и битка
},
);
Теперь вы можете получить доступ к любому из методов контракта точно так же, как при взаимодействии с кодом ethers-js:
Если вы хотите использовать оболочку в тестовом контексте, мы рекомендуем использовать макетную оболочку, чтобы вы могли легко переопределить значения oracle для тестирования различных сценариев. Чтобы использовать макетную оболочку, просто используйте функцию using Mock Data(signedDataPackages) вместо функции usingDataService.
const { SimpleNumericMockWrapper } = require("@redstone-finance/evm-connector/dist/src/wrappers/SimpleMockNumericWrapper");
const wrappedContract =
WrapperBuilder.wrap(yourContract).usingSimpleNumericMock(
{
mockSignersCount: 10,
dataPoints: [
{dataFeedId: "ETH", value: 1000}
],
},
);
await wrappedContract.yourMethod();
Демонстрация
Вы можете ознакомиться с примерами использования @redstone-finance/evm-connector репозитории RedStone с примерами: