برنامه نویسی

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

سوپرا به عنوان یک بازیکن برجسته در قلمرو اوراکل‌های غیرمتمرکز ایستاده است و یک سرویس حیاتی برای برنامه‌های 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 ایمن و قابل اعتماد با دسترسی به فیدهای داده قابل اعتماد و به موقع بسازند. برای ادامه ساخت با سوپرا و کاوش سایر خدمات، منابع زیر را توصیه می کنم:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا