#near #connector #feed #signer #hex #red-stone #redstone

redstone-near-connector-rs

RedStone Near 连接器

3 个版本

0.0.3 2022 年 11 月 21 日
0.0.2 2022 年 11 月 19 日
0.0.1 2022 年 11 月 12 日

#signer 中排名 61

自定义许可

15KB
196

redstone-near-connector-rs

RedStone Oracles 与 NEAR 智能合约和 dApps 集成的 RUST 库。

🔮 RedStone Oracles

RedStone 是一个数据生态系统,提供频繁更新、可靠和多样化的链上数据。

了解更多关于 RedStone Oracles 的信息,请使用以下链接

🚀 入门指南

1. 调整您的 NEAR 智能合约

安装

redstone-near-connector-rs 依赖项添加到您的智能合约 crate 中的 Cargo.toml 文件

用法

现在您可以在以下方式中使用您的智能合约代码中的 get_oracle_value 函数

use near_sdk::{log, near_bindgen};
use redstone_near_connector_rs::{get_oracle_value, decode_hex};

const BTC_BYTES_32_HEX_STR: &str =
    "4254430000000000000000000000000000000000000000000000000000000000";

const REDSTONE_MAIN_DEMO_SIGNER_PUB_KEY_HEX: &str =
  "009dd87eb41d96ce8ad94aa22ea8b0ba4ac20c45e42f71726d6b180f93c3f298e333ae7591fe1c9d88234575639be9e81e35ba2fe5ad2c2260f07db49ccb9d0d";

fn get_pub_key(hex_pub_key: &str) -> [u8; 64] {
  let pub_key_vec = decode_hex(hex_pub_key).unwrap();
  pub_key_vec.try_into().unwrap()
}

#[near_bindgen]
pub struct YourContract {
  ...
}

#[near_bindgen]
impl YourContract {
  ...

  pub fn your_contract_method(&mut self, redstone_payload_str: String) {
    ...

    // 32 bytes identifier of the data feed
    let data_feed_id_vec = decode_hex(BTC_BYTES_32_HEX_STR).unwrap();
    let data_feed_id: [u8; 32] = data_feed_id_vec.try_into().unwrap();

    // Required min number of unique signers for the requested data feed
    let unique_signers_threshold = 1;

    // Vector, containing public keys of trusted signers
    // Trusted public keys can be found here: https://github.com/redstone-finance/redstone-oracles-monorepo/blob/main/packages/oracles-smartweave-contracts/src/contracts/redstone-oracle-registry/initial-state.json
    let authorised_signers: Vec<[u8; 64]> =
      vec![get_pub_key(REDSTONE_MAIN_DEMO_SIGNER_PUB_KEY_HEX)];

    let current_timestamp_milliseconds = u128::from(near_sdk::env::block_timestamp() / 1_000_000);

    // Signer oracle data, efficiently serialized to bytes
    let redstone_payload = decode_hex(&redstone_payload).unwrap();

    // `get_oracle_value` function will:
    // - parse redstone payload,
    // - go through each signed data package,
    // - verify each signature,
    // - count unique signers for the requested data feed,
    // - after passing all checks, return the aggregated median value
    let oracle_value = get_oracle_value(
      &data_feed_id,
      unique_signers_threshold,
      &authorised_signers,
      current_timestamp_milliseconds,
      &redstone_payload,
    );

    ...
  }
}

2. 调整您的前端代码

您可能已经注意到,在第一步中,您的智能合约函数需要一个额外的 String 参数(redstone_payload)。您可以使用 redstone-sdk 在您的前端或测试代码中获取它。

安装

首先,在您的前端 JS 或 TS 项目中安装它

# Using NPM
npm install redstone-sdk

# Or using yarn
yarn add redstone-sdk

用法

然后您可以按以下方式请求 redstone 有效负载

import redstoneSDK from "redstone-sdk";

const redstoneDataGateways = [
  "https://cache-service-direct-1.b.redstone.finance",
  "https://d33trozg86ya9x.cloudfront.net",
];

const redstonePayloadHex = await redstoneSDK.requestRedstonePayload(
  {
    dataServiceId: "redstone-main-demo",
    uniqueSignersCount: 1,
    dataFeeds: ["BTC"],
  },
  redstoneDataGateways
);

// Then you can pass the `redstonePayloadHex` as an argument to the smart contract call, e.g.
const outcome = await wallet.signAndSendTransaction({
  ...
  actions: [
    {
      type: "FunctionCall",
      params: {
        methodName: "your_contract_method",
        args: {
          redstone_payload: redstonePayloadHex,
        },
        ...
      },
    },
  ],
});

🔥 示例

您可以在这里查看一个由 RedStone Oracles 驱动的简单 NEAR dApp 示例。

👩🏻‍💻 开发和贡献

代码结构

主要逻辑位于 src/lib.rs 文件中。测试位于 tests 文件夹中。

要运行带有输出打印的测试

cargotest ----nocapture

🙋‍♂️ 联系我们

请随时通过 Discord 联系 RedStone 团队或发送电子邮件至 [email protected]

📜 许可证

MIT

依赖关系

~3–4.5MB
~84K SLoC