March 10, 2021

Cách sử dụng Band Protocol trên Moonbeam

Hướng dẫn từng bước về Oracle đầu tiên của mạng lưới Moonbeam

Người ta thường tuyên bố rằng các hợp đồng thông minh có tiềm năng đáng kinh ngạc cho phép các bên khác nhau tham gia vào các thỏa thuận theo cách không cần sự tin tưởng, giảm thiểu rủi ro và cung cấp tính minh bạch. Tuy nhiên, một trong những hạn chế cơ bản của chúng là do các blockchain không thể tìm nạp dữ liệu hoặc gửi dữ liệu ra ngoài bất kỳ hệ thống bên ngoài nào, nên các hợp đồng thông minh không có quyền truy cập vào thông tin trong thế giới thực.

Ví dụ, giả sử rằng hai người quyết định đặt cược vào một cuộc thi thông qua một hợp đồng thông minh với cơ chế tự động cung cấp tiền cho người chiến thắng. Trong thiết lập đơn giản này, đã có rất nhiều câu hỏi chưa được trả lời: Làm thế nào để hợp đồng thông minh biết ai là người chiến thắng? Làm thế nào hợp đồng có thể lấy số điểm đã đặt cược? Làm cách nào để cả hai người có thể tin tưởng vào thông tin được cung cấp cho hợp đồng thông minh?

Lúc này cần sử dụng blockchain oracles. Nói rộng ra, một blockchain oracle là một trung gian an toàn giữa các hệ thống ngoài chuỗi và blockchain. Oracles cung cấp dữ liệu vào blockchain có thể được sử dụng bởi các hợp đồng thông minh. Nói chung, một oracle có thể đáp ứng đối với bất kỳ yêu cầu cụ thể nào đối với dữ liệu ngoài chuỗi, trích xuất dữ liệu từ các nguồn bên ngoài và ký / phát một giao dịch trên chuỗi với thông tin. Tuy nhiên, quá trình này không đơn giản như đã mô tả trước đây, bởi vì những yêu cầu này cần được phục vụ một cách không cần sự tin cậy.

PureStake gần đây đã thông báo rằng cơ sở hạ tầng oracle của Band Protocol hiện đã có sẵn cho các nhà phát triển xây dựng trên Moonbeam. Do đó, các nhà phát triển hiện có thể yêu cầu dữ liệu, chẳng hạn như giá tiền điện tử khác nhau, để tích hợp vào ứng dụng của họ trên Moonbase Alpha TestNet.

Token được hỗ trợ

Tại thời điểm viết bài này, bạn có thể tìm thấy danh sách các ký hiệu được hỗ trợ bằng cách nhấp vào liên kết này. Yêu cầu cung cấp thông tin về giá với bất kỳ mệnh giá nào đều có sẵn, miễn là có hỗ trợ ký hiệu cơ sở và báo giá (cơ sở / báo giá). Ví dụ:
BTC / USD
BTC / ETH
ETH / EUR

Truy vấn giá

Các nhà phát triển có hai cách để lấy giá từ cơ sở hạ tầng oracle của Band. Ở một phía, họ có thể sử dụng các hợp đồng thông minh của Band trên Moonbeam, hiện chỉ được triển khai cho Moonbase Alpha TestNet. Làm như vậy, họ truy cập vào dữ liệu trên chuỗi và được cập nhật theo định kỳ hoặc khi trượt giá nhiều hơn số tiền mục tiêu (khác nhau đối với mỗi token). Mặt khác, các nhà phát triển có thể sử dụng thư viện trình trợ giúp JavaScript, thư viện này sử dụng điểm cuối API để tìm nạp dữ liệu bằng các chức năng tương tự như các chức năng từ hợp đồng thông minh, nhưng việc triển khai này hoàn toàn bỏ qua blockchain.

Nhận dữ liệu bằng hợp đồng thông minh

Các hợp đồng có thể truy vấn dữ liệu trên chuỗi, chẳng hạn như giá mã thông báo từ Band’s oracle bằng cách triển khai giao diện của hợp đồng StdReference, giao diện này hiển thị các chức năng getReferenceData và getReferenceDataBulk.

Hàm đầu tiên, getReferenceData, lấy hai chuỗi (cơ sở và ký hiệu trích dẫn) làm đầu vào. Hàm truy vấn hợp đồng StdReference để biết tỷ giá mới nhất có sẵn cho hai mã thông báo đó. Nó trả về một cấu trúc ReferenceData.

Cấu trúc ReferenceData có các phần tử sau:

- Tỷ giá: tỷ giá hối đoái theobase / quote. Giá trị trả về được nhân với 10¹⁸

- Cơ sở cập nhật lần cuối: lần cuối cùng khi giá cơ sở được cập nhật (kể từ UNIX epoch)

- Báo giá cập nhật lần cuối: lần cuối cùng khi giá báo giá được cập nhật (kể từ UNIX epoch)

struct ReferenceData { uint256 rate; uint256 lastUpdatedBase; uint256 lastUpdatedQuote; }

Hàm thứ hai, getReferenceDataBulk, tương tự như trường hợp trước, nhưng nó lấy thông tin dưới dạng mảng dữ liệu.

Ví dụ: nếu chúng tôi chuyển ['BTC', 'BTC', 'ETH'] làm cơ sở và ['USD', 'ETH', 'EUR'] dưới dạng báo giá, mảng Dữ liệu tham chiếu được trả về chứa thông tin liên quan đến những điều sau cặp:

- BTC/USD

- BTC/ETH

- ETH/EUR

Hợp đồng mẫu


Mã hợp đồng thông minh sau đây cung cấp một số ví dụ đơn giản về hợp đồng StdReference và hàm getReferenceData, chúng không dành cho sản xuất. Giao diện IStdReference.sol xác định cấu trúc ReferenceData và các chức năng có sẵn để thực hiện các truy vấn.

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); }

Tiếp theo, chúng ta có thể sử dụng đoạn mã DemoOracle sau đây. Nó cung cấp bốn chức năng:

- getPrice: một chức năng xem truy vấn một cơ sở duy nhất, trong ví dụ này là giá BTC được tính bằng USD

- getMultiPrices: một chức năng xem truy vấn nhiều cơ sở, trong ví dụ này là giá của BTC và ETH, cả hai đều được tính bằng USD

- savePrice: một hàm public truy vấn cặp base / quote. Mỗi phần tử được cung cấp dưới dạng các chuỗi riêng biệt, ví dụ: _base = “BTC”, _quotes = “USD”. Thao tác này sẽ gửi một giao dịch và sửa đổi biến giá được lưu trữ trong hợp đồng.

- saveMultiPrices: một hàm public truy vấn các cặp base / quote khác nhau. Đầu vào được cung cấp dưới dạng một mảng chuỗi, ví dụ: _bases = [“BTC”, ”ETH”], _quotes = [“USD”, “USD”] `. Thao tác này sẽ gửi một giao dịch và sửa đổi mảng giá được lưu trữ trong hợp đồng, sẽ giữ giá của từng cặp theo cùng một thứ tự như được chỉ định trong đầu vào.

Khi được triển khai, hàm khởi tạo cần địa chỉ Hợp đồng tổng hợp cho mạng đích.

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); } } }

Hãy thử nó trong Moonbase Alpha!

Chúng tôi đã triển khai một hợp đồng có sẵn trong Moonbase Alpha TestNet (tại địa chỉ 0x0D0dB701befcb7c2E22c27411543F774434534b3), vì vậy bạn có thể dễ dàng kiểm tra thông tin được cung cấp từ ban nhạc của Band Protocol. Để làm như vậy, bạn cần có hợp đồng giao diện sau:

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); }

Với nó, bạn sẽ phải xem các chức năng có sẵn, rất giống với các ví dụ trước đây của chúng tôi:

- getPrice: cung cấp nguồn cấp dữ liệu giá cho một cặp cơ sở / báo giá duy nhất được cung cấp làm đầu vào cho hàm, nghĩa là “BTC”, “USD”

- getMultiPrices: cung cấp nguồn cấp dữ liệu giá cho nhiều cặp cơ sở / báo giá được cung cấp làm đầu vào cho hàm, nghĩa là [“BTC”, “ETH”, “ETH”], [“USD”, “USD”, “EUR ”]

BandChain.js JavaScript Helper Library

Một cách khác mà dApps có thể tận dụng nguồn dữ liệu của Band là thông qua việc sử dụng thư viện trình trợ giúp JavaScript cũng hỗ trợ hàm getReferenceData tương tự. Để bắt đầu, thư viện cần được cài đặt:

npm install @bandprotocol/bandchain.js

Thư viện cung cấp một hàm khởi tạo yêu cầu một điểm cuối trỏ tới. Điều này trả về một thể hiện sau đó kích hoạt tất cả các phương thức cần thiết, chẳng hạn như hàm getReferenceData. Khi truy vấn thông tin, hàm chấp nhận một mảng trong đó mỗi phần tử là cặp cơ sở / dấu ngoặc kép cần thiết, ví dụ:

getReferenceData(['BTC/USD', 'BTC/ETH', 'ETH/EUR'])

Sau đó, nó trả về một đối tượng mảng có cấu trúc sau:[
{ 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 }, } ]
Trong đó lastUpdatedBase và lastUpdatedQuote là lần cuối cùng khi giá cơ sở và báo giá được cập nhật tương ứng (kể từ UNIX epoch).

Cách sử dụng ví dụ

Đoạn mã JavaScript sau cung cấp một ví dụ đơn giản về hàm getReferenceData, hàm này không dành cho sản xuất.

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();

Khi nào có thể thực thi mã này với node, đầu ra dataQuery sau sẽ giống như sau:

Lưu ý rằng so với yêu cầu được thực hiện thông qua hợp đồng thông minh, kết quả được cung cấp trực tiếp theo các đơn vị chính xác.

Liên hệ chúng tôi

Nếu bạn có bất kỳ phản hồi nào về việc triển khai Band Protocol trong dự án của mình hoặc bất kỳ chủ đề nào khác liên quan đến Moonbeam, vui lòng liên hệ thông qua Discord