# 一文说清Redstone预言机的集成方式

By [kekec@Crypto](https://paragraph.com/@889908) · 2024-03-15

---

Redstone 提供了三种集成方式供其他产品使用，每种集成方式如下：

*   **RedStone Core:** 这是RedStone 的最成熟方式，已在生产中进行过实战测试，保护了多个主网中超过 1 亿美元 TVL 的 DeFi 协议。价格提供已超过 ~50K 笔交易。
    
*   **RedStone Classic:** 并不是所有的业务场景都适合用Redstone Core，有些场景可能使用Classic模式更适合。RedStone Classic与推送模式的Oracle相比，具有明显的优势。它的模块化设计让您对价格更新的时间和方式有决定性的发言权。
    
*   **RedStone X:** RedStone X 采用了延迟执行模式，交易分两步处理，用户在交易前其实是不知道具体的价格的，这就减少了任何试图通过从 Oracle 提前交付价格来套利协议的行为。价格只在第二步推送到链上，通常发生在下一个区块。这样的价格将用于最终结算交易。
    

Redstone作为成熟的预言机解决方案，集成流程也经过了大量的验证和测试，关键的集成步骤我总结为：

1.  模型选择
    
2.  合约改造
    
3.  数据处理
    
4.  持续监控
    

![](https://storage.googleapis.com/papyrus_images/5c79ceb9fb09b3ee605e9a7c3dd4d2cce3b30daf909acb3430485f6b75e6a90a.png)

接下来我将针对每一种方式集成的关键点和核心进行介绍。Redstone集成对使用者有一定的技术要求，在你完成测试体验之前，需要具备如下环境：

1.  **_对 Solidity 和智能合约开发有基础的理解_**
    
2.  **_安装 Node.js 和 npm_**
    
3.  **_安装 Truffle Suite 或任何其他智能合约部署工具_**
    
4.  **_拥有以太币的以太坊钱包来部署合约_**
    

> **本文假设你已经具备了相关区块链代码开发的经验**

> **一、配置开发环境**

    mkdir MyDApp && cd MyDApp
    npm init -y
    npm install -g truffle
    truffle init
    

> **二、编写智能合约**

在 contracts/ 目录创建一个新的 Solidity 文件：

    touch contracts/test.sol
    

根据Redstone提供的三种集成方式，我们逐个进行介绍并提供相关集成内容。

第一种：**RedStone Core集成**
-----------------------

该模式未来会是Redstone相关方案中最常用的一种方式，通过他能够高效且优惠的实现我们的价格需求。该模式使用的步骤如下：

> **第一步：安装 @redstone-finance/evm-connector**

    npm install @redstone-finance/evm-connector
    

![](https://storage.googleapis.com/papyrus_images/a0ecb1657aa4677e03e2c312e8d1e59954e005337490d50b92c29f97f55575f2.png)

> **第二步：在智能合约中集成Redstone**

    pragma solidity ^0.8.2;
    
    import "@redstone-finance/evm-connector/contracts/data-services/MainDemoConsumerBase.sol";
    
    contract ExampleContract is getPrice{
    
      uint256 private lastPrice = 0;
     
      function ethPrice() public {
        uint256 ethPrice = getOracleNumericValueFromTxMsg(bytes32("ETH"));
        lastPrice = ethPrice;
      }
    } 
    

如果在合约中，需要获得多个价格的时候，使用方法如下：

      bytes32[] memory dataFeedIds = new bytes32Unsupported embed;
      dataFeedIds[0] = bytes32("ETH");
      dataFeedIds[1] = bytes32("BTC");
      uint256[] memory values = getOracleNumericValuesFromTxMsg(dataFeedIds);
      uint256 ethPrice = values[0];
      uint256 btcPrice = values[1];
    

  
最后，在dapp代码中进行实现相关的业务逻辑。官方提供了一个sample的demo库，可以基于自己的实际需求进行参考。[_Demo仓库_](https://github.com/redstone-finance/redstone-evm-connector-examples)

第二种：**RedStone** Classic**集成**
------------------------------

> **RedStone Classic 是一个完整的数据收集和存储模型，适用于某些希望按照传统设计将数据推送到区块链的协议，该模型适合在以下情况:**

*   _已有一份经过深度审核的代码库，且开发者团队更倾向于不进行任何改动；_
    
*   _协议部署在私有网络或者手续费用最少的区块链上；_
    
*   _不需要过于频繁地更新价格。_
    

该模式需要通过一个服务来推动数据上链。这个服务是可定制的，基于环境变量定期检查一定的条件集合，并在满足条件时推送价格。这个服务被称为"Relayer"。

![](https://storage.googleapis.com/papyrus_images/724f6860aa786789c9ec4e61168b2bebf7c683f7d2d70a8c53369f81984ee938.png)

Relayer需要设置相应的环境变量，这些环境变量描述了Relayer的工作方式。比如，通过设置`UPDATE_PRICE_INTERVAL`变量来控制价格应该多久更新一次。`MIN_DEVIATION_PERCENTAGE`变量用于指定价格变动多少后应该进行更新。针对Relayer详细的参数说明如下：

_RELAYER\_ITERATION\_INTERVAL：更新价格的尝试间隔_

_UPDATE\_CONDITIONS：描述决定价格是否可以更新的参数数组_

_UPDATE\_PRICE\_INTERVAL：描述多久更新一次价格的时间间隔_

_MIN\_DEVIATION\_PERCENTAGE：描述价格变动多少将触发价格更新的最小偏差百分比_

_RPC\_URL：与区块链交互的RPC的URL_

_CHAIN\_NAME：所在的区块链的名称_

_CHAIN\_ID：所在区块链的ID_

_PRIVATE\_KEY：在对应网络上拥有充足资金以推送价格至适配器合约的钱包的私钥_

_ADAPTER\_CONTRACT\_ADDRESS：在对应网络上部署的适配器合约的地址_

_DATA\_SERVICE\_ID：描述应用哪些数据服务来获取价格的RedStone包装器参数_

_UNIQUE\_SIGNERS\_COUNT：描述应签名价格数据的独特签名者数量的RedStone包装器参数_

_DATA\_FEEDS：描述将使用哪些代币的RedStone包装器参数。_

_CACHE\_SERVICE\_URLS：描述将使用哪些缓存服务URL来获取价格的RedStone包装器参数。_

_GAS\_LIMIT：推送数据至价格定阅合约的Gas limit 限制。_

该模式的详细使用可以参考\*[这里。](https://github.com/redstone-finance/redstone-oracles-monorepo/blob/main/packages/on-chain-relayer/contracts/core/RedstoneAdapterBase.sol)\*

第三种：RedStone X
--------------

> **RedstoneX目的是在保护以太坊上的交易执行免于前插交易方面，提供了极强的保护。这一模型借鉴了被延迟执行模式，每笔交易的处理分为两步。**

1.  _用户发起交易，会先记录在链上一个他打算与协议进行交互的请求，但是并不知道交易执行时的具体的价格。这种做法可以避免任何尝试通过预先将价格输送到Oracles从而进行套利的行为。_
    
2.  _价格在第二步中被推送到链上，这通常发生在下一个区块之后。任何人（包括用户自己）都可以推送价格，因为价格的完整性是在链上基于协议限制进行验证的。此价格将用于最终结算交易。_
    

![](https://storage.googleapis.com/papyrus_images/4f16f1db46f606497f47259e5ea734d19a35fb7e1319af3c652294cc50278bf3.png)

想要实现RedStone X模型，合约的逻辑需要进行调整：

1.  针对请求的过程进行阶段划分，确保每次交易都分为两阶段操作：**请求 --> 执行**。这里比较类似数据库最后的Commit.
    
2.  部署一个监听服务，这个服务会自动获取价格并触发交易的执行。
    

总结
--

Redstone的三种集成模式，都有各自的优势和特点，我们应该基于我们dapp自身的特性和需求进行选择。在深入研究redstone的集成过程之前，必须在区块链技术和智能合约方面拥有一定的经验和知识储备。这其中包括了全面了解区块链的工作原理，去中心化性质和共识机制， Solidity 编程语言等。

Redstone一定是预言机领域最先进的解决方案，如果未来我们期望我们的dapp能够在价格数据方面有较大的优势，现在很有必要针对Redstone的方案进行深入的研究与学习。

本文参考：

1.  [How it works](https://docs.redstone.finance/docs/smart-contract-devs/how-it-works)
    
2.  [Comprehensive Guide to Integrating RedStone Oracles into Your dApp](https://medium.com/@kot232007/comprehensive-guide-to-integrating-redstone-oracles-into-your-dapp-5a41dd6ece97)
    
3.  [Integrating Redstone Oracle with Your DApp](https://mirror.xyz/argonstark.eth/YP9COo5aPu0PIxC2B4aenDjyrmCnJheFfH9nXL-TvVE)
    
4.  [redstone-3-models-dex-example](https://github.com/redstone-finance/redstone-3-models-dex-example)

---

*Originally published on [kekec@Crypto](https://paragraph.com/@889908/redstone)*
