Покрокове керівництво до першого мережевого Oracle
Часто зазначається, що розумні контракти мають неймовірний потенціал, що дозволяє різним сторонам брати участь у угодах без довіри, мінімізуючи ризик та забезпечуючи прозорість. Однак одне з їхніх фундаментальних обмежень полягає в тому, що, оскільки блокчейни не можуть отримувати дані з будь-якої зовнішньої системи або надсилати їх у будь-яку зовнішню систему, розумні контракти не мають доступу до реальної інформації.
Скажімо, як приклад, дві особи вирішують зробити ставку на рахунок за допомогою розумного контракту, який автоматично передає кошти переможцю. У цій простій установці вже є багато питань без відповіді: Як смарт-контракт знає, хто є переможцем? Як за контрактом можна отримати рахунок, на який було зроблено ставку? Як обидві особи можуть довіряти інформації, наданій смарт-контракту?
Введіть оракули блокчейну. Загалом кажучи, блокчейн-оракул є безпечним посередником між поза ланцюговими системами та блокчейном. Оракули подають дані в блокчейн, які можуть використовуватися смарт-контрактами. Загалом, оракул може прослуховувати мережу для будь-якого конкретного запиту на дані поза мережею, витягувати дані із зовнішніх джерел та підписувати / транслювати транзакцію в мережі з інформацією. Однак процес не такий простий, як описано раніше, оскільки ці запити повинні бути подані довірчим чином. Більше інформації про проблему оракула можна знайти в цьому дописі блогу або в цій статті про засіб.
Нещодавно PureStake оголосив, що інфраструктура оракула Band Protocol тепер доступна розробникам, що працюють на Moonbeam. Отже, розробники тепер можуть запитувати дані, такі як різні ціни на криптовалюту, щоб інтегрувати їх у свій додаток на Moonbase Alpha TestNet. Давайте подивимося, як розробники можуть використовувати систему оракулів Band Band.
Підтримуваний маркер
На момент написання статті список підтримуваних символів можна знайти за цим посиланням . Запити на інформацію про ціни з будь-яким номіналом доступні, якщо підтримуються базові та котирувальні символи ( база / котирування ). Наприклад:
- BTC / USD
- BTC / ETH
- ETH / EUR
Запит цін
Розробники мають два способи отримати ціни з інфраструктури оракулу Band. З одного боку, вони можуть використовувати розумні контракти Band на Moonbeam, які в даний час розгорнуті лише на Moonbase Alpha TestNet . Роблячи це, вони отримують доступ до мережевих даних, які оновлюються або через регулярні проміжки часу, або коли пробуксовка ціни перевищує цільову суму (різну для кожного маркера). З іншого боку, розробники можуть використовувати допоміжну бібліотеку JavaScript, яка використовує кінцеву точку API для отримання даних, використовуючи подібні функції, як із смарт-контрактів, але ця реалізація повністю обходить блокчейн.
Отримуйте дані за допомогою інтелектуальних контрактів
Контракти можуть запитувати дані в ланцюжку, такі як ціни маркерів від оракула Band, реалізуючи інтерфейс контракту StdReference , який надає функції getReferenceData та getReferenceDataBulk.
Перша функція, getReferenceData , приймає два рядки ( основу та символ лапки ) як вхідні дані. Функція запитує договір StdReference щодо останніх ставок, доступних для цих двох токенів. Він повертає структуру ReferenceData.
Структура ReferenceData має такі елементи:
- Курс: обмінний курс в перерахунку на _базу / котирування_. Повернене значення множиться на 1⁰¹⁸
- Останнє оновлення бази: востаннє оновлення базової ціни (з часів 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 вказана в доларах США
- getMultiPrice: функція перегляду, яка запитує декілька баз, у цьому прикладі ціна BTC та ETH , обидві котируються в доларах США
- savePrice: загальнодоступна функція, яка запитує пару база / котирування . Кожен елемент подається у вигляді окремих рядків, наприклад _base = “BTC” , _quotes = “USD” . Це надсилає транзакцію та змінює змінну ціни, що зберігається у контракті.
- saveMultiPrice: публічна функція, яка запитує різні пари базових / цитат . Вхідні дані подаються у вигляді масиву рядків, наприклад: _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”
- getMultiPrice: забезпечує подачу ціни для кількох пар базових / котирувань, які вводяться як вхідні дані для функції, тобто [ „BTC“, „ETH“, „ETH“], [„USD“, „USD“, „EUR ”]
BandChain.js JavaScript Helper Library
Інший спосіб, за допомогою якого 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).
Приклад використання
Наступний сценарій JavaScript надає простий приклад функції getReferenceData , це не призначено для виробництва.
const BandChain = require (' @ bandprotocol / bandchain .js');const queryData = async () => {
const endpoint = ' https://poa-api.bandchain.org' ;const bandchain = new BandChain (кінцева точка);
const dataQuery = await bandchain.getReferenceData ([
'BTC / USD',
'BTC / ETH',
'ETH / EUR',
]);
console.log (dataQuery);
};queryData ();
Коли можна виконати цей код за допомогою вузла , такий вивід dataQuery повинен виглядати так:
Зверніть увагу, що порівняно із запитом, зробленим за допомогою смарт-контрактів, результат подається безпосередньо у правильних одиницях.
Зв’яжіться з нами
Якщо у вас є якісь відгуки щодо впровадження Band-протоколу у ваш проект або будь-якої іншої теми, пов’язаної з Moonbeam, не соромтеся звертатися через наш офіційний сервер розробки Discord.
- **Автор відмовляється від будь якого права на статтю, перекладано з Англійської на Українську мову.**
- Оригінал https://medium.com/moonbeam-network/how-to-use-band-protocol-on-moonbeam-fc26d131a82b