ساخت با سوپرا: تقویت برنامه های غیرمتمرکز با داده های بهتر

سوپرا به عنوان یک بازیکن برجسته در قلمرو اوراکلهای غیرمتمرکز ایستاده است و یک سرویس حیاتی برای برنامههای DeFi ارائه میکند: دادههای امن و قابل اعتماد برای محیطهای بلاک چین. این راهنما به بررسی قابلیتهای سوپرا میپردازد و نحوه ایجاد برنامههای کاربردی DeFi قابل اعتماد را به توسعهدهندگان توانمند میکند. بیایید شیرجه بزنیم
بلاک چین ها، اگرچه انقلابی برای امنیت و تغییر ناپذیری هستند، اما اکوسیستم های جدا شده ای هستند. زمانی که قراردادهای هوشمند، موتورهای برنامههای DeFi، برای عملکرد به دادههای دنیای واقعی نیاز دارند، این نقطه ضعف به نقطه ضعف تبدیل میشود. داده های خارجی برای موارد مختلف استفاده از DeFi بسیار مهم است:
- صرافی های غیرمتمرکز (DEX): فید قیمت دقیق و به موقع برای DEX ها برای تسهیل مبادله توکن های منصفانه و کارآمد ضروری است.
- پروتکل های وام دهی: داده های قابل اعتماد در مورد ارزش دارایی ها برای محاسبات وثیقه و مدیریت ریسک در بسترهای وام و استقراض ضروری است.
- پیش بینی بازارها: داده های خارجی مانند امتیازات ورزشی یا نتایج انتخابات برای تسویه قراردادهای بازار پیش بینی بسیار مهم هستند.
راهحلهای اوراکل موجود اغلب با چالشهایی از نظر مقیاسپذیری و امنیت مواجه هستند، که باعث میشود توسعهدهندگان در هنگام دسترسی به دادههای قابل اعتماد برای برنامههای DeFi خود، شکافی را برای پر کردن ایجاد کنند.
Enter Supra، یک راه حل اوراکل نسل بعدی، این محدودیت ها را برطرف می کند. برخلاف اوراکلهای سنتی که به شدت به افزودن گرههای بیشتر (مقیاسبندی افقی) متکی هستند، سوپرا اولویتبندی میکند. مقیاس بندی عمودی. این بدان معناست که سوپرا بر روی بسته بندی قدرت پردازشی و منابع بیشتر در هر گره مجزا در شبکه خود تمرکز می کند. این رویکرد چندین مزیت بالقوه برای تحویل داده های DeFi ارائه می دهد:
- سرعت های بیشتر: با گره های قدرتمندتر، سوپرا به طور بالقوه می تواند داده ها را به طور قابل توجهی سریعتر بازیابی و پردازش کند. این برای نیازهای بلادرنگ در DeFi، مانند نوسان دائمی قیمت ارزهای دیجیتال یا نرخ بهره پویا، بسیار مهم است.
- تاخیر کاهش یافته: با به حداقل رساندن تعداد ارتباطات مورد نیاز بین گره ها، مقیاس بندی عمودی می تواند منجر به تاخیر کمتر در تحویل داده شود. این به معنی زمان کمتری بین زمان درخواست داده تا رسیدن به قرارداد هوشمند است و تضمین میکند که برنامهها با بیشترین داده در زمان واقعی کار میکنند.
- کارایی بالقوه هزینه: یک شبکه کوچکتر از گرههای قدرتمندتر میتواند به هزینههای عملیاتی پایینتر برای Supra ترجمه شود و این به توسعهدهندگان سود میرساند که به طور بالقوه منجر به قیمتگذاری رقابتیتر برای فیدهای داده در مقایسه با اوراکلها با شبکه بزرگتر و مقیاس افقی میشود.
قدرت اصلی سوپرا در آن نهفته است فیدهای قیمت غیرمتمرکز اوراکل. این اوراکلها بهعنوان پلهای امن عمل میکنند و دادههای دنیای واقعی را به برنامههای DeFi در سناریوهای مختلف زنجیرهای و خارج از زنجیره ارائه میکنند. این تضمین میکند که دادههایی که DeFi را تامین میکنند دقیق و قابل تأیید است، یک نیاز حیاتی برای برنامههایی که به اطلاعات بلادرنگ متکی هستند، مانند قیمتهای ارزهای دیجیتال یا حرکات بازار.
ویژگی های کلیدی فیدهای داده سوپرا
- اوراکلز را بکشید: Pull Oracles مانند یک سیستم تحویل داده به موقع برای قراردادهای هوشمند عمل می کند. قراردادهای هوشمند به جای دریافت جریان دائمی به روز رسانی، می توانند هر زمان که به آن نیاز داشته باشند، به طور فعال نقاط داده خاصی را از شبکه سوپرا درخواست کنند و ازدحام غیرضروری شبکه را به حداقل برسانند و هزینه های گاز را کاهش دهند. – V1: نسخه اولیه، ارائه خدمات پایه داده بر اساس تقاضا. – V2: نسخه پیشرفته با عملکرد بهبود یافته و ویژگی های اضافی.
- اوراکلز را فشار دهید: نیازی نیست که همه داده ها دائماً به روز شوند. برخی از برنامههای DeFi، مانند پروتکلهای وامدهی که نرخهای بهره را به معیارهای تعیینشده مرتبط میکنند، میتوانند با بهروزرسانیهای منظم دادهها به خوبی عمل کنند. Push Oracles با فشار دادن فعالانه به روز رسانی داده ها از شبکه سوپرا به قراردادهای هوشمند در فواصل از پیش تعیین شده، این کار را انجام می دهد. این یک رویکرد کارآمدتر برای موقعیتهایی است که دادههای بیدرنگ اهمیتی ندارند و باعث صرفهجویی در منابع و کاهش تراکم شبکه میشود.
-
VRF غیرمتمرکز
dVRF سوپرا برای تولید اعداد تصادفی ایمن، قابل تایید و غیرمتمرکز طراحی شده است و به برنامه های DeFi منبع امن و قابل اعتمادی از اعداد تصادفی را ارائه می دهد. قراردادهای هوشمند می توانند از این تصادفی بودن برای اهداف مختلف استفاده کنند و از عدالت و شفافیت در یک اکوسیستم غیرمتمرکز اطمینان حاصل کنند.
ما در حال ساخت یک قرارداد هوشمند هستیم که فیدهای داده قیمت را واکشی می کند و در صورتی که با استفاده از هاردهات و اترها به آستانه خاصی برسد، رویدادی را منتشر می کند. کد با من!
پیش نیازها
قبل از غواصی، مطمئن شوید که ابزارها و پیش نیازهای زیر را در اختیار دارید:
- Node.js
- امروز
- کیف پول Metamask: متاماسک را برای اتصال به شبکه Sepolia پیکربندی کنید
- کیمیاگری یا Infura: نقطه پایانی HTTP خود را برای شبکه تست Sepolia دریافت کنید. اینجا را راهنمایی کنید
- نشانه های تست: درخواست تست Sepolia
-
آدرس سرور gRPC برای تست نت
- آدرس قرارداد را از شبکه های موجود در Supra Docs بکشید. می توانید سایر شبکه های موجود را بررسی کنید.
تنظیم محیط
اکنون که ابزارهای خود را جمع آوری کرده ایم، زمان آن رسیده است که محیط توسعه خود را راه اندازی کنیم. در اینجا یک راهنمای گام به گام آورده شده است:
- با اجرای دستورات زیر شروع کنید:
mkdir auction
cd auction
npm init -y
npm install --save-dev hardhat
npx hardhat init
npm install --save-dev @nomicfoundation/hardhat-toolbox
npm i dotenv
code .
- گام بعدی کلون کردن کد نمونه برداری Oracle از GitHub و نصب وابستگی های لازم است.
git clone https://github.com/Entropy-Foundation/oracle-pull-example
cd oracle-pull-example/javascript/evm_client
npm install
- برای ایمن نگه داشتن اطلاعات حساس مانند کلید خصوصی Metamask و URL RPC، یک فایل .env در فهرست پروژه خود ایجاد کنید و کلیدهای خود را در قالب زیر در آنجا ذخیره کنید:
PRIVATE_KEY=""
RPC_URL=""
- فایل پیکربندی Hardhat خود (hardhat.config.js) را تغییر دهید تا کلیدهای فایل .env خود را تشخیص دهید. همچنین، sepolia را به عنوان یک شبکه اضافه کنید.
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
module.exports = {
solidity: "0.8.19",
networks: {
sepolia: {
url: process.env.RPC_URL,
accounts: [process.env.PRIVATE_KEY],
},
},
};
بخش بعدی به ساخت یک قرارداد هوشمند می پردازد که با استفاده از Hardhat با سوپرا اوراکلز تعامل دارد. ما شما را گام به گام با کد آشنا خواهیم کرد و نحوه واکشی فیدهای داده قیمت و انتشار رویدادها را بر اساس آستانههای خاص نشان خواهیم داد. من برخی از نظرات را اضافه کرده ام تا جزئیات بیشتری از آنچه در حال وقوع است ارائه دهم.
- اول، ما اضافه می کنیم
ISupraOraclePull
که شاملverifyOracleProof
تابعی که تأیید را انجام می دهد و a را برمی گرداندPriceData
ساختار حاوی داده های قیمت استخراج شده است.
interface ISupraOraclePull {
/**
* @dev Verified price data structure.
* @param pairs List of pairs.
* @param prices List of prices corresponding to the pairs.
* @param decimals List of decimals corresponding to the pairs.
*/
struct PriceData {
uint256[] pairs;
uint256[] prices;
uint256[] decimals;
}
/**
* @dev Verifies oracle proof and returns price data.
* @param _bytesproof The proof data in bytes.
* @return PriceData Verified price data.
*/
function verifyOracleProof(
bytes calldata _bytesproof
) external returns (PriceData memory);
}
- برای قراردادمان، یک متغیر داخلی ایجاد میکنیم
oracle
برای نشان دادن رابط. با این ما می توانیم اوراکل را صدا کنیمverifyOracleProof
تابعی برای اعتبارسنجی اثبات های همراه با داده های قیمت (به صورت رشته های بایتی ارائه می شود). پس از تأیید، قرارداد اطلاعات قیمت (شامل شناسههای جفت، قیمتها و اعشار) را استخراج میکند و آن را در نگاشتهای داخلی ذخیره میکند.latestPrices
وlatestDecimal
.
contract Supra {
// The oracle contract
ISupraOraclePull internal oracle;
// Stores the latest price data for a specific pair
mapping(uint256 => uint256) public latestPrices;
mapping(uint256 => uint256) public latestDecimals;
// Event to notify when a price threshold is met
event PriceThresholdMet(uint256 pairId, uint256 price);
/**
* @dev Sets the oracle contract address.
* @param oracle_ The address of the oracle contract.
*/
constructor(address oracle_) {
oracle = ISupraOraclePull(oracle_);
}
/**
* @dev Extracts price data from the bytes proof data.
* @param _bytesProof The proof data in bytes.
*/
function deliverPriceData(bytes calldata _bytesProof) external {
ISupraOraclePull.PriceData memory prices = oracle.verifyOracleProof(
_bytesProof
);
// Iterate over all the extracted prices and store them
for (uint256 i = 0; i < prices.pairs.length; i++) {
uint256 pairId = prices.pairs[i];
uint256 price = prices.prices[i];
uint256 decimals = prices.decimals[i];
// Update the latest price and decimals for the pair
latestPrices[pairId] = price;
latestDecimals[pairId] = decimals;
// Example utility: Trigger an event if the price meets a certain threshold
if (price > 1000 * (10 ** decimals)) {
// Example threshold
emit PriceThresholdMet(pairId, price);
}
}
}
/**
* @dev Updates the oracle contract address.
* @param oracle_ The new address of the oracle contract.
*/
function updatePullAddress(address oracle_) external {
oracle = ISupraOraclePull(oracle_);
}
/**
* @dev Returns the latest price and decimals for a given pair ID.
* @param pairId The ID of the pair.
* @return price The latest price of the pair.
* @return decimals The decimals of the pair.
*/
function getLatestPrice(
uint256 pairId
) external view returns (uint256 price, uint256 decimals) {
price = latestPrices[pairId];
decimals = latestDecimals[pairId];
}
}
این getLatestPrice
تابع woula به ما امکان می دهد آخرین قیمت و اعشار مربوط به آن را برای شناسه جفت خاصی بازیابی کنیم.
قرارداد خود را با اجرای این دستور کامپایل کنید: npx hardhat compile
npx hardhat compile
Compiled 1 Solidity file successfully
- اکنون که قرارداد خود را جمع آوری کرده اید، کتابخانه های لازم را وارد کرده و پیکربندی شما را برای اسکریپت خود تنظیم می کنیم.
const { ethers } = require("hardhat");
const PullServiceClient = require("../oracle-pull-example/javascript/evm_client/pullServiceClient");
require("dotenv").config();
const address = "testnet-dora.supraoracles.com";
const pairIndexes = [0, 21, 61, 49];
const sepoliaPullContractAdress = "0x6Cd59830AAD978446e6cc7f6cc173aF7656Fb917"; //Update for V1 or V2
const privateKey = process.env.PRIVATE_KEY;
- در ما
main
تابع، ما ایجاد می کنیمPullServiceClient
نمونه، مثال (client
) برای ارتباط با سرویس سوپرا اوراکل. ما از این استفاده می کنیمclient
برای تماس باgetProof
روش بر رویclient
شیء، ارسال درخواست (که شامل شاخص ها و نوع زنجیره است) و یک تابع callback که دو آرگومان و آرگومان را نیز می پذیرد.err
وresponse
. اکنون می توانیم با آن تماس بگیریمcalContract
تابع، ارسال داده های اثبات بازیابی شده (response.evm
) به عنوان استدلال.
async function main() {
const client = new PullServiceClient(address);
const request = {
pair_indexes: pairIndexes,
chain_type: "evm",
};
console.log("Getting proof....");
const proof = client.getProof(request, (err, response) => {
if (err) {
console.error("Error getting proof:", err.details);
return;
}
console.log("Calling contract to verify the proofs.. ");
callContract(response.evm);
});
}
- این
callContract
تابع، اثبات داده های قیمت بازیابی شده را می گیرد (response
) و تراکنشی را برای تعامل با مستقر آماده می کندSupra
قرارداد.
async function callContract(response) {
const Supra = await ethers.getContractFactory("Supra");
const supra = await Supra.deploy(sepoliaPullContractAdress);
const contractAddress = await supra.getAddress();
console.log("Supra deployed to: ", contractAdress);
const hex = ethers.hexlify(response);
const txData = await supra.deliverPriceData(hex);
const gasEstimate = await supra.estimateGas.deliverPriceData(hex);
const gasPrice = await ethers.provider.getGasPrice();
console.log("Estimated gas for deliverPriceData:", gasEstimate.toString());
console.log("Estimated gas price:", gasPrice.toString());
const tx = {
from: "0xDA01D79Ca36b493C7906F3C032D2365Fb3470aEC",
to: contractAddress,
data: txData,
gas: gasEstimate,
gasPrice: gasPrice,
};
const wallet = new ethers.Wallet(privateKey);
const signedTransaction = await wallet.signTransaction(tx);
const txResponse = await wallet.sendTransaction(tx);
console.log("Transaction sent! Hash:", txResponse.hash);
// (Optional) Wait for transaction confirmation (e.g., 1 block confirmation)
const receipt = await txResponse.wait(1);
console.log("Transaction receipt:", receipt);
}
در حال استقرار به Sepolia
برای استقرار در sepolia، دستور زیر را اجرا کنید:
npx hardhat run scripts/run-supra.js --network sepolia
با این کار، باید بتوانید از فیدهای داده قیمت سوپرا با Hardhat در ساخت برنامه های غیرمتمرکز استفاده کنید. کد کامل این آموزش را می توانید از اینجا بیابید.
با استفاده از سوپرا اوراکلز، توسعه دهندگان می توانند برنامه های DeFi ایمن و قابل اعتماد با دسترسی به فیدهای داده قابل اعتماد و به موقع بسازند. برای ادامه ساخت با سوپرا و کاوش سایر خدمات، منابع زیر را توصیه می کنم: