Redstone 提供了三种集成方式供其他产品使用,每种集成方式如下:
-
RedStone Core: 这是RedStone 的最成熟方式,已在生产中进行过实战测试,保护了多个主网中超过 1 亿美元 TVL 的 DeFi 协议。价格提供已超过 ~50K 笔交易。
-
RedStone Classic: 并不是所有的业务场景都适合用Redstone Core,有些场景可能使用Classic模式更适合。RedStone Classic与推送模式的Oracle相比,具有明显的优势。它的模块化设计让您对价格更新的时间和方式有决定性的发言权。
-
RedStone X: RedStone X 采用了延迟执行模式,交易分两步处理,用户在交易前其实是不知道具体的价格的,这就减少了任何试图通过从 Oracle 提前交付价格来套利协议的行为。价格只在第二步推送到链上,通常发生在下一个区块。这样的价格将用于最终结算交易。
Redstone作为成熟的预言机解决方案,集成流程也经过了大量的验证和测试,关键的集成步骤我总结为:
-
模型选择
-
合约改造
-
数据处理
-
持续监控
接下来我将针对每一种方式集成的关键点和核心进行介绍。Redstone集成对使用者有一定的技术要求,在你完成测试体验之前,需要具备如下环境:
-
对 Solidity 和智能合约开发有基础的理解
-
安装 Node.js 和 npm
-
安装 Truffle Suite 或任何其他智能合约部署工具
-
拥有以太币的以太坊钱包来部署合约
本文假设你已经具备了相关区块链代码开发的经验
一、配置开发环境
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
第二步:在智能合约中集成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 bytes32[](2);
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仓库
第二种:RedStone Classic集成
RedStone Classic 是一个完整的数据收集和存储模型,适用于某些希望按照传统设计将数据推送到区块链的协议,该模型适合在以下情况:
-
已有一份经过深度审核的代码库,且开发者团队更倾向于不进行任何改动;
-
协议部署在私有网络或者手续费用最少的区块链上;
-
不需要过于频繁地更新价格。
该模式需要通过一个服务来推动数据上链。这个服务是可定制的,基于环境变量定期检查一定的条件集合,并在满足条件时推送价格。这个服务被称为"Relayer"。
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 限制。
该模式的详细使用可以参考*这里。*
第三种:RedStone X
RedstoneX目的是在保护以太坊上的交易执行免于前插交易方面,提供了极强的保护。这一模型借鉴了被延迟执行模式,每笔交易的处理分为两步。
-
用户发起交易,会先记录在链上一个他打算与协议进行交互的请求,但是并不知道交易执行时的具体的价格。这种做法可以避免任何尝试通过预先将价格输送到Oracles从而进行套利的行为。
-
价格在第二步中被推送到链上,这通常发生在下一个区块之后。任何人(包括用户自己)都可以推送价格,因为价格的完整性是在链上基于协议限制进行验证的。此价格将用于最终结算交易。
想要实现RedStone X模型,合约的逻辑需要进行调整:
-
针对请求的过程进行阶段划分,确保每次交易都分为两阶段操作:请求 --> 执行。这里比较类似数据库最后的Commit.
-
部署一个监听服务,这个服务会自动获取价格并触发交易的执行。
总结
Redstone的三种集成模式,都有各自的优势和特点,我们应该基于我们dapp自身的特性和需求进行选择。在深入研究redstone的集成过程之前,必须在区块链技术和智能合约方面拥有一定的经验和知识储备。这其中包括了全面了解区块链的工作原理,去中心化性质和共识机制, Solidity 编程语言等。
Redstone一定是预言机领域最先进的解决方案,如果未来我们期望我们的dapp能够在价格数据方面有较大的优势,现在很有必要针对Redstone的方案进行深入的研究与学习。
本文参考:
评论 (0)