#price #crypto #chainlink #ethereum #web-apps

rustlink

一个轻量级且易于使用的库,用于定期从 Chainlink 去中心化数据馈送中检索数据

2 个版本

0.0.2 2024 年 5 月 17 日
0.0.1 2024 年 5 月 16 日

#1 in #chainlink

每月下载量 45

MIT/Apache

25KB
304 代码行

rustlink - 去中心化加密货币价格馈送

一个轻量级的 rust 库,用于定期从 ChainLink 去中心化价格馈送中检索加密货币价格。使用 rustlink,您可以轻松检索 ChainLink 支持的任何加密货币的最新价格。

功能

  • 检索 ChainLink 支持的任何加密货币的最新价格。
  • 与 WASM 兼容,因此您可以在您的 Web 应用程序中使用它。
  • 轻量级且易于使用。
  • 可自定义更新间隔以进行速率限制。
  • 添加任何自定义合约列表。
  • 可自定义 RPC URL。

我在开发这个库时一直坚持的核心原则是健壮性和简单性。作为 Web3 开发者,支付运营商我们经常需要检索加密货币价格。然而,大多数可用的库都使用中心化交易所 API,这些 API 已经证明是不可靠的,并且受到本地交易所波动的影响。使用 ChainLink 去中心化数据馈送,我们可以检索由许多独立预言机提供的可靠数据。

该库是为了与 WASM 兼容而设计的,因此您也可以在您的 Web 应用程序中使用它。这允许您在您的 Web 和桌面应用程序中实时接收去中心化价格更新,而不必依赖于中心化价格馈送或 API。

要查看 ChainLink 支持的加密货币,您可以访问 ChainLink 数据馈送列表

什么是 WASM?

WebAssembly (WASM) 是一种基于堆栈的虚拟机的二进制指令格式。WASM 是作为高级语言(如 C/C++/Rust)的编译便携式目标的而设计的,使您能够在网络上部署客户端和服务器应用程序。WASM 被所有主流浏览器支持,包括 Chrome、Firefox、Safari 和 Edge。

这意味着您可以在您的 Web 应用程序中运行 rust 代码,并使用 rustlink 在您的 Web 应用程序中实时检索加密货币价格。

安装

要在您的项目中使用 rustlink,请将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
rustlink = "0.0.2"

为 WASM 构建

  1. 先决条件

    要为 WASM 构建库,您需要安装 wasm-pack 工具。您可以通过运行以下命令进行安装

    cargo install wasm-pack
    

    您还需要安装 wasm32-unknown-unknown 目标。您可以通过运行以下命令进行安装

    rustup target add wasm32-unknown-unknown
    
  2. 构建 WASM

    您可以为 浏览器Node.js 构建库。

    针对浏览器

    wasm-pack build --target web --out-name rustlink --out-dir <directory>
    

    针对Node.js

    wasm-pack build --target nodejs --out-name rustlink --out-dir <directory>
    

使用方法

以下是一个简单的示例,展示如何使用 rustlink 获取加密货币的最新价格

use async_std::channel::unbounded;
use rustlink::config::{Reflector, Rustlink};

#[tokio::main]
async fn main(){
    let mut contracts: Vec<(String, String)> = Vec::new();
    contracts.push((
        "ETH".to_string(),"0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e".to_string(),
    ));
    
    let (sender, receiver) = unbounded();
    
    let rustlink = Rustlink::try_new(
        "https://bsc-dataseed1.binance.org/",
        1,
        Reflector::Sender(sender),
        contracts,
    )
    .unwrap();
    rustlink.start();
    let round_data = receiver.recv().await.unwrap();
    println!("Received data: {:#?}", round_data);
}

您也可以通过将接收器放入循环中来遍历它,以实时获取最新价格更新

loop {
    let round_data = receiver.recv().await.unwrap();
    println!("Received data: {:#?}", round_data);
}

WASM 使用

import init, { RustlinkJS } from '../web/rustlink.js';

async function runWasm() {
   await init(); // Initialize the wasm module

   // Example data
   const rpcUrl = "https://bsc-dataseed1.binance.org/";
   const fetchIntervalSeconds = BigInt(1);
   const contracts = [
       ["ETH", "0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e"],
       ["1INCH", "0x9a177Bb9f5b6083E962f9e62bD21d4b5660Aeb03"],
   ];

   async function callback(roundData) {
       console.log("Callback received:", roundData);
   }

   let rustlink = new RustlinkJS(rpcUrl, fetchIntervalSeconds, contracts, callback);

   rustlink.start();
   console.log("Stopping after 5 seconds");
   setTimeout(() => {
       rustlink.stop();
   }, 5000);
}

runWasm();

依赖项

~35–52MB
~1M SLoC