Как использовать Band Protocol на Moonbeam?
Пошаговое руководство к Сетевому Первому Оракулу
Часто утверждается, что смарт-контракты обладают невероятным потенциалом, позволяя различным сторонам заключать соглашения без доверия, минимизируя риски и обеспечивая прозрачность. Однако одно из их фундаментальных ограничений заключается в том, что, поскольку блокчейны не могут получать данные или отправлять данные в любую внешнюю систему изначально, смарт-контракты не имеют доступа к реальной информации.
Предположим, что два человека решают сделать ставку на счет с помощью смарт-контракта, который автоматически передает средства победителю. В этой простой настройке уже есть много вопросов, на которые нет ответов: как смарт-контракт узнает, кто победитель? Как в контракте может быть указан счет, на который была сделана ставка? Как оба человека могут доверять информации, предоставленной смарт-контракту?
Войдите в оракулы блокчейна. Вообще говоря, оракул блокчейна — это безопасный посредник между автономными системами и блокчейном. Оракулы передают данные в блокчейн, которые могут использоваться смарт-контрактами. В общих чертах, оракул может прослушивать сеть для любого конкретного запроса данных вне сети, извлекать данные из внешних источников и подписывать / транслировать транзакцию в цепочке с информацией. Однако этот процесс не так прост, как описано ранее, потому что эти запросы нужно обслуживать без доверия. Более подробную информацию о проблеме оракула можно найти в этом блоге или в этой статье о среде.
PureStake недавно объявила, что инфраструктура Oracle Band Protocol теперь доступна разработчикам, использующим Moonbeam. Следовательно, разработчики теперь могут запрашивать данные, такие как разные цены на криптовалюту, для интеграции в свои приложения в Moonbase Alpha TestNet. Давайте посмотрим, как разработчики могут использовать систему Oracle Band Protocol.
Поддерживаемый токен
На момент написания список поддерживаемых символов можно найти по этой ссылке. Запросы информации о ценах с любым номиналом доступны, если поддерживаются базовые символы и символы котировки (основание / котировка). Например:
- BTC/USD
- BTC/ETH
- ETH/EUR
Запрос цен
У разработчиков есть два способа получить цены из инфраструктуры Oracle Oracle. С одной стороны, они могут использовать смарт-контракты Band на Moonbeam, которые в настоящее время развернуты только на Moonbase Alpha TestNet. При этом они получают доступ к данным, которые находятся в цепочке и обновляются либо через регулярные промежутки времени, либо когда проскальзывание цены превышает целевое значение (разное для каждого токена). С другой стороны, разработчики могут использовать вспомогательную библиотеку JavaScript, которая использует конечную точку API для извлечения данных с использованием функций, аналогичных функциям смарт-контрактов, но эта реализация полностью обходит блокчейн.
Получение данных с помощью смарт-контрактов
Контракты могут запрашивать данные в цепочке, такие как цены токенов, из оракула Band, реализуя интерфейс контракта StdReference, который предоставляет функции getReferenceData и getReferenceDataBulk.
Первая функция, getReferenceData, принимает две строки (основание и символ кавычки) в качестве входных данных. Функция запрашивает у контракта StdReference последние доступные ставки для этих двух токенов. Он возвращает структуру ReferenceData.
Структура ReferenceData состоит из следующих элементов:
- Курс: обменный курс, выраженный в _базе / котировке_. Возвращаемое значение умножается на 10¹⁸.
- Последняя обновленная база: последний раз, когда обновлялась базовая цена (с эпохи UNIX)
- Последнее обновление котировки: последний раз, когда котировочная цена была обновлена (с эпохи UNIX)
struct ReferenceData {
uint256 rate;
uint256 lastUpdatedBase;
uint256 lastUpdatedQuote;
}
Вторая функция, getReferenceDataBulk, аналогична предыдущему случаю, но принимает информацию в виде массивов данных. Например, если мы передадим [‘BTC’, ‘BTC’, ‘ETH’] в качестве базы и [‘USD’, ‘ETH’, ‘EUR’] в качестве цитаты, возвращаемый массив ReferenceData будет содержать информацию о следующих пары:
- BTC/USD
- BTC/ETH
- ETH/EUR
Пример контракта
Следующий код смарт-контракта предоставляет несколько простых примеров контракта StdReference и функции getReferenceData, они не предназначены для производства. Интерфейс IStdReference.sol определяет структуру ReferenceData и функции, доступные для выполнения запросов.
pragma solidity 0.6.11;
pragma experimental ABIEncoderV2;interface IStdReference {
/// A structure returned whenever someone requests for standard reference data.
struct ReferenceData {
uint256 rate; // base/quote exchange rate, multiplied by 1e18.
uint256 lastUpdatedBase; // UNIX epoch of the last time when base price gets updated.
uint256 lastUpdatedQuote; // UNIX epoch of the last time when quote price gets updated.
}/// Returns the price data for the given base/quote pair. Revert if not available.
function getReferenceData(string memory _base, string memory _quote)
external
view
returns (ReferenceData memory);/// Similar to getReferenceData, but with multiple base/quote pairs at once.
function getReferenceDataBulk(string[] memory _bases, string[] memory _quotes)
external
view
returns (ReferenceData[] memory);
}
Далее мы можем использовать следующий скрипт DemoOracle. Он предоставляет четыре функции:
- getPrice: функция просмотра, которая запрашивает одну базу, в этом примере цена BTC, указанная в долларах США
- getMultiPrices: функция просмотра, которая запрашивает несколько баз, в этом примере цена BTC и ETH, обе указаны в долларах США
- savePrice: общедоступная функция, которая запрашивает пару основание / котировка. Каждый элемент предоставляется в виде отдельных строк, например _base = «BTC», _quotes = «USD». Это отправляет транзакцию и изменяет ценовую переменную, хранящуюся в контракте
- saveMultiPrices: общедоступная функция, которая запрашивает различные пары основание / цитата. Входные данные представлены в виде строкового массива, например: _bases = [«BTC», «ETH»], _quotes = [«USD», «USD»] `. Это отправляет транзакцию и изменяет массив цен, хранящийся в контракте, который будет содержать цену каждой пары в том же порядке, что и во входных данных
При развертывании функции конструктора требуется адрес контракта агрегатора для целевой сети.
pragma solidity 0.6.11;
pragma experimental ABIEncoderV2;import "./IStdReference.sol";contract DemoOracle {
IStdReference ref;
uint256 public price;
uint256[] public pricesArr;constructor(IStdReference _ref) public {
ref = _ref; // Aggregator Contract Address
// Moonbase Alpha 0xDA7a001b254CD22e46d3eAB04d937489c93174C3}function getPrice(string memory _base, string memory _quote) external view returns (uint256){
IStdReference.ReferenceData memory data = ref.getReferenceData(_base,_quote);
return data.rate;
}function getMultiPrices(string[] memory _bases, string[] memory _quotes) external view returns (uint256[] memory){
IStdReference.ReferenceData[] memory data = ref.getReferenceDataBulk(_bases,_quotes);uint256 len = _bases.length;
uint256[] memory prices = new uint256[](len);
for (uint256 i = 0; i < len; i++) {
prices[i] = data[i].rate;
}return prices;
}
function savePrice(string memory _base, string memory _quote) external {
IStdReference.ReferenceData memory data = ref.getReferenceData(_base,_quote);
price = data.rate;
}
function saveMultiPrices(
string[] memory _bases,
string[] memory _quotes
) public {
require(_bases.length == _quotes.length, "BAD_INPUT_LENGTH");
uint256 len = _bases.length;
IStdReference.ReferenceData[] memory data = ref.getReferenceDataBulk(_bases,_quotes);
delete pricesArr;
for (uint256 i = 0; i < len; i++) {
pricesArr.push(data[i].rate);
}
}
}
Попробуйте в Moonbase Alpha!
Мы развернули контракт, доступный в Moonbase Alpha TestNet (по адресу 0x0D0dB701befcb7c2E22c27411543F774434534b3), так что вы можете легко проверить информацию, поступающую из оракула Band Protocol. Для этого вам понадобится следующий интерфейсный контракт:
pragma solidity 0.6.11;
pragma experimental ABIEncoderV2;interface TestInterface {
function getPrice(string memory _base, string memory _quote) external view returns (uint256);function getMultiPrices(string[] memory _bases, string[] memory _quotes) external view returns (uint256[] memory);
}
С его помощью вам нужно будет просмотреть доступные функции, очень похожие на наши предыдущие примеры:
- getPrice: предоставляет ценовой поток для одной пары базовая цена / котировка, которая передается в качестве входных данных функции, то есть «BTC», «USD».
- getMultiPrices: предоставляет ценовой поток для нескольких пар базовая цена / котировка, которые передаются в качестве входных данных функции, то есть [«BTC», «ETH», «ETH»], [«USD», «USD», «EUR» ”]
Библиотека помощников JavaScript BandChain.js
Другой способ использования dApps источника данных Band — это использование вспомогательной библиотеки JavaScript, которая также поддерживает аналогичную функцию getReferenceData. Для начала необходимо установить библиотеку:
npm install @bandprotocol/bandchain.js
Библиотека предоставляет функцию конструктора, для которой требуется указать конечную точку. Это возвращает экземпляр, который затем включает все необходимые методы, такие как функция getReferenceData. При запросе информации функция принимает массив, каждый элемент которого является необходимой парой основание / цитата, например:
getReferenceData([‘BTC/USD’, ‘BTC/ETH’, ‘ETH/EUR’])
Затем он возвращает объект массива со следующей структурой:
[
{
pair: ‘BTC/USD’,
rate: rate,
updated: { base: lastUpdatedBase, quote: lastUpdatedQuote },
},
{
pair: ‘BTC/ETH’,
rate: rate,
updated: { base: lastUpdatedBase, quote: lastUpdatedQuote },
},
{
pair: ‘ETH/EUR’,
rate: rate,
updated: { base: lastUpdatedBase, quote: lastUpdatedQuote },
}
]
Где lastUpdatedBase и lastUpdatedQuote — это последний раз, когда базовая цена и котировка обновлялись соответственно (с эпохи UNIX).
const BandChain = require('@bandprotocol/bandchain.js');const queryData = async () => {
const endpoint = 'https://poa-api.bandchain.org';const bandchain = new BandChain(endpoint);
const dataQuery = await bandchain.getReferenceData([
'BTC/USD',
'BTC/ETH',
'ETH/EUR',
]);
console.log(dataQuery);
};queryData();
Когда можно выполнить этот код с помощью узла, следующий вывод dataQuery должен выглядеть следующим образом:
Обратите внимание, что по сравнению с запросом, выполненным через смарт-контракты, результат отображается непосредственно в правильных единицах.
Связаться с нами
Если у вас есть какие-либо отзывы относительно реализации Band Protocol в вашем проекте или по любой другой теме, связанной с Moonbeam, не стесняйтесь обращаться через наш официальный сервер Discord разработки.