Solidity

在我的 Solidity 智能合約中檢索 Uniswap tx 數據

  • November 23, 2020

正如標題所說,我有我的 Solidity 智能合約,我正在嘗試從 Uniswap 合約中導入一些公共數據。特別是,我希望將 tx 數據儲存在我的契約中(假設是最新的 10 個 tx)。

我不想使用 web3.js 界面執行此操作,但我希望這發生在我的契約中。

我正在考慮以某種方式使用 Oraclize(我從未使用過這個)。是否可以查詢已部署的智能合約並獲取過去的 tx 數據?最好的方法是什麼?

聽起來您正在尋找通過 API 獲取外部數據。為此,您必須使用oracle


如果不使用 web3.js 或其他與鏈互動的方式,您將需要與確實與鏈互動的服務、API 或其他方式進行互動。Etherscan 有一個 API可以提供你正在尋找的東西。

一旦你把這兩部分放在一起,即:

  1. 您要呼叫的 API
  2. 您要返回的數據

請注意

這將是如何以集中的方式提取數據。請使用多個數據源和多個chainlink oracles來獲得生產實例的去中心化聚合答案

然後你可以呼叫 Chainlink API來獲取數據。完整的契約如下所示。只需將 API 和路徑換成您要查找的內容即可。您也可以在chainlink 文件中找到混音範例。

pragma solidity ^0.6.0;

import "@chainlink/contracts/src/v0.6/ChainlinkClient.sol";

contract APIConsumer is ChainlinkClient {
 
   uint256 public volume;
   
   address private oracle;
   bytes32 private jobId;
   uint256 private fee;
   
   /**
    * Network: Kovan
    * Oracle: Chainlink - 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e
    * Job ID: Chainlink - 29fa9aa13bf1468788b7cc4a500a45b8
    * Fee: 0.1 LINK
    */
   constructor() public {
       setPublicChainlinkToken();
       oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
       jobId = "29fa9aa13bf1468788b7cc4a500a45b8";
       fee = 0.1 * 10 ** 18; // 0.1 LINK
   }
   
   /**
    * Create a Chainlink request to retrieve API response, find the target
    * data, then multiply by 1000000000000000000 (to remove decimal places from data).
    */
   function requestVolumeData() public returns (bytes32 requestId) 
   {
       Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
       
       // Set the URL to perform the GET request on
       request.add("get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD");
       
       // Set the path to find the desired data in the API response, where the response format is:
       // {"RAW":
       //   {"ETH":
       //    {"USD":
       //     {
       //      "VOLUME24HOUR": xxx.xxx,
       //     }
       //    }
       //   }
       //  }
       request.add("path", "RAW.ETH.USD.VOLUME24HOUR");
       
       // Multiply the result by 1000000000000000000 to remove decimals
       int timesAmount = 10**18;
       request.addInt("times", timesAmount);
       
       // Sends the request
       return sendChainlinkRequestTo(oracle, request, fee);
   }
   
   /**
    * Receive the response in the form of uint256
    */ 
   function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId)
   {
       volume = _volume;
   }
}

注意:我是 Chainlink DevRel

引用自:https://ethereum.stackexchange.com/questions/90437