原文题目:《Using Chainlink Oracles on Matic Network》
原文地址:https://blog.chain.link/matic-defi-price-feeds/
原文作者:Harry Papacharissiou
自从今年初 Matic 网络上线后,得力于它的平安和可扩大的基础设施以及即时交易个性,它疾速成为以太坊开发者中受欢迎的 Layer 2 解决方案。Matic 的高性能,低手续费的基础设施为 DeFi 应用程序促成大规模利用提供了一个可行的平台。与此类似,在区块链预言机畛域,Chainlink 曾经成为 DeFi 协定优先选择的预言机解决方案,Chainlink 的喂价(Price Feeds)当初正在守护着价值数亿美元的价值资产。在本篇技术文章中,咱们将向你展现如何在 Matic 的 DeFi 利用中应用 Chainlink 的预言机,以及如何应用 Chainlink 的喂价来给予利用拜访高质量的、防篡改的数据,这些数据不易蒙受诸如 预言机破绽和闪电攻打 等危险。
对可扩大和平安 DeFi 协定的需要
本年度曾经见证了 DeFi 协定的大暴发,DeFi 的总价值锁定(TVL)从一月份的 6.8 亿美元快速增长到当初的超过 140 亿美元。随着 TVL 的增长,链上交易数量也达到了新的程度,但同时也引起了一些不必要的关注,作恶者们为了本身的利益开始利用这些协定破绽。
因为 DeFi 的增长带来的链上交易数量程度的晋升使得以太坊的性能变得拥挤,这也归因于以太坊区块链本身的可扩展性的限度和吞吐量低的问题。这引起了一系列困扰用户应用 DeFi 协定体验和简短交易工夫的关联反馈。(P.S. 拥挤会导致昂扬的 gas 费,否则矿工不会打包;同时交易确认工夫缩短,除非给更高的 gas 费)
交易速度迟缓以及交易费用昂扬是妨碍 DeFi 跨入支流的最重要的两个限度因素。诸如 Matic 这种 Layer 2 网络可能解锁下一阶段的 DeFi 的增长,这得益于它的加强的可扩展性,高吞吐量以及低成本的交易等性质。Matic 侧链也是可组合的,并且齐全与 EVM 兼容。DeFi 的一大外围价值在于它的无需许可的可组合性,Matic 为这些寻求构建各种有价值的 DeFi 利用的开发者们提供了一个极具吸引力的抉择,这些 DeFi 利用可扩大,能提供低成本交易,能确保无需许可的组合性,并提供无缝的用户体验。
然而,这些 DeFi 利用依然须要拜访高质量的可信的内部数据。正如咱们在本年度屡次看到的那样,DeFi 协定可能会蒙受多种形式的攻打,如价格预言机攻打等,作恶者联合闪电贷和低质量的预言机来操纵市场来达到对他们无利的场面,侵害的是其余用户的利益。
Chainlink 的喂价机制升高了 DeFi 利用容易蒙受这些攻打的危险,采纳的形式是提供多种高质量的数据提供方的汇总数据,这些数据由 Chainlink 网络上的去中心化的预言机来公布上链。Chainlink 的去中心化架构以及宽泛的高质量数据源确保了最终价格反映的是宽泛的市场的覆盖范围,这事实上意味着此价格是聚合了整个市场上一系列不同的价格后确定的,而不只是其中的一个小小的子集。
当初咱们了解了在 Matic 网络上构建 DeFi 协定的劣势,以及 Chainlink 预言机和喂价机制在其中表演的重要角色,咱们将展现在 Matic 网络上构建 DeFi 利用时应用 Chainlink 喂价的案例。
在 Matic 网络上应用 Chainlink 喂价机制
Chainlink 的喂价机制应用多种高质量的数据输出,并将它们与 Chainlink 预言机网络相结合,该预言机会将价格数据喂到参考合约(reference contracts),在此合约中数据后果将会聚合。DeFi 协定非常重视数据品质和完整性,这一点尤为重要。Chainlink 喂价机制为这些想要爱护本身免受各种因为数据品质问题或者传输问题导致的攻打的协定提供了最佳的、通过严格考验的生产环境解决方案。
上面的两个教程内容也能够通过 Remix 中的这个残缺的智能合约来查看。
在 Matic 网络上应用 Chainlink 喂价机制的和预言机的第一步是设置你的 MetaMask 钱包,应用它来连贯 Matic 的 Mumbai 测试网络,而后你就能够获取肯定的 Mumbai 测试网上的 MATIC 代币,并在 DeFi 智能合约中应用。
在 MetaMask 中设置 Matic Mumbai 测试网
**
获取测试网 Matic 代币
MATIC 是 Matic 网络上的本地代币,能够类比于以太坊上的 ETH 代币。为了和 Matic 网络交互,MATIC 代币会用来领取 gas 费用。为了获取 Mumbai 测试网的 MATIC 代币,返回 MATIC 水龙头,抉择 MATIC 代币和 Mumbai 测试网络,输出 MetaMask 钱包地址,并点击提交。
Obtaining testnet MATIC 获取测试网 MATIC 代币
留神:提交后还须要确认,并可返回浏览器查看此交易:https://explorer-mumbai.maticvigil.com/tx/0x742aa8e4c1fb12105b424840e435193b1b24324e2d77d926d4903fcc54142772/internal-transactions
查看钱包能够发现获取了测试代币(获取两次,每次 0.1 MATIC):
创立智能合约
在 Matic 网络上应用 Chainlink 喂价机制开始构建智能合约最容易的形式是应用规范的价格消费者(Price Consumer)合约。这是根本的规范合约,可能向 Chainlink 的喂价机制发动申请。咱们将在 Remix 编辑器中关上合约,并且批改它以满足咱们本人的需要。本文的演示会采纳 ETH/USD 价格获取。第一步是构造函数中初始化 Matic 的喂价参考合约,其中,在 Mumbai 测试网上部署的 ETH/USD 喂价参考合约地址是:_0x0715A7794a1dc8e42615F059dD6e406A6594651A。`
priceFeed = AggregatorV3Interface(0x0715A7794a1dc8e42615F059dD6e406A6594651A);
接下来,咱们须要一个函数来从价格获取聚合合约(Price Feed Aggregator contract)中获取最新价格,该聚合合约在下面的结构器中实例化。为了实现这个指标,咱们在聚合合约中曾经有了一个函数叫作 latestRoundData,这是一个会返回以后聚合合约状态的函数,并且在本案例中,咱们将取出以后的价格并且返回。
function getLatestPrice() public view returns (int) {( uint80 roundID, int price, uint startedAt, uint timeStamp, uint80 answeredInRound) = priceFeed.latestRoundData(); return price;}
部署和测试智能合约
当初咱们能够部署并测试咱们的智能合约。在 Remix 中编译智能合约,而后在部署的页面,将环境改为“Injected Web3”,并确保钱包地址是含有 MATIC 代币的地址,点击部署(deploy)按钮,并追随操作后续步骤。最终后果就是胜利部署智能合约到 Matic Mumbai 测试网。
部署实现后,咱们只须要简略的执行 ”getLatestPrice” 函数。后果将为 ETH/USD 聚合合约中的函数返回的最新的价格数据,这能够用在 Matic 网络上的 DeFi 利用中。
ETH/USD 喂价后果
在 Matic 网络上应用 Chainlink 预言机
在 Matic 上可能有一些场景中智能合约须要链下数据,而这些数据是 Chainlink 的喂价没有提供的。这也是咱们须要应用 Chainlink 预言机的中央。咱们当初批改咱们的智能合约来获取应用 Chainlink 的喂价器不能提供的市场价格,在这个案例中,咱们应用 ETH/EUR 价格。
获取测试网的 LINK 代币
你须要获取一些测试网的 LINK 代币来发送申请给 Chainlink 的预言机。为了获取 Mumbai 测试网的 LINK 代币,须要退出 Matic 的 Discord 社群,并贴上你的 MetaMask 钱包地址,申请 Matic 团队成员发送一些 Mumbai 测试网的 LINK 代币。一旦你获取了一些 MATIC 和 LINK 到钱包中,就能够进入到智能合约的步骤了。
创立智能合约
在 Matic 中应用 Chainlink 预言机建设智能合约的最简略办法是应用规范的 Chainlink APIConsumer 合约。这是根底的规范合约,用于通过 Chainlink 预言机发动申请获取内部数据。咱们在 Remix 中批改此合约以满足本人的需要。
首先咱们须要重命名“volume”参数为“ethPrice”,而后“requestVolumeData”函数名批改为“requestEthereumPrice”。实现后,咱们须要批改构造函数为:
- Mumbai 测试网上 LINK 代币地址为_0x70d1F773A9f81C852087B77F6Ae6d3032B02D2AB,咱们将其传到“setChainlinkToken”函数中_
- 正如在 Matic 文档中表明的,有一个在 Mumbai 测试网上运行的预言机合约,地址在_0x1cf7D49BE7e0c6AC30dEd720623490B64F572E1,咱们设置预言机变量为这个值_
- 咱们将应用的 API 将通过 HTTP GET 申请,返回的值是一个无符号整数。运行在 Mumbai 测试网上的预言机有很多不同的作业标准(job specifications)能够应用。依据 Matic 文档中列出的作业,满足咱们需要的是这个:_d8fcf41ee8984d3b8b0eae7b74eca7dd,_因为咱们想要执行 HTTP GET 申请,并且返回数据是无符号整数,所以咱们设置“jobId”变量为这个值
- 批改“fee”变量为 1LINK,移除“0.1”前缀即可。这是随着内部数据申请一块发送到预言机的领取数据(为此申请领取 LINK 代币)。
constructor() public { setChainlinkToken(0x70d1F773A9f81C852087B77F6Ae6d3032B02D2AB); oracle = 0x1cf7D49BE7e0c6AC30dEd720623490B64F572E17; jobId = "d8fcf41ee8984d3b8b0eae7b74eca7dd"; fee = 10 ** 18; // 1 LINK }
当初咱们实现了构造函数,咱们能够移步到“requestEthereumPrice”函数和“fulfill”函数。
Chainlink 预言机满足申请的工作原理是采纳 Chainlink 的申请和响应设计模式,其中链上函数会创立并发送申请,预言机检测到申请,而后 响应 会发送到雷同合约的另一个函数。在咱们的例子中,“requestEthereumPrice”函数会创立和发送申请,“fulfill”函数会解决响应,响应标准定义在 this.fulfill.selector 中。
咱们将要生产的 ETH/EUR 价格数据 API 是来自 crypto.com 的公开 API。浏览器中点开此链接,你能够看到返回数据的 JSON 格局。
在咱们的“requestEthereumPrice”函数中,咱们将其批改如下:
- 设置 URL 为 ETH/EUR 接口端点
- 设置申请中“path”变量为“EUR”,该门路是咱们想要发现并返回的 JSON 响应的门路,该端点输入后果中蕴含当初的 ETH 价格
- 将后果乘以 100,因为 Solidity 不会解决含有小数点的数据
- 将申请发送到 Chainlink 预言机
function requestEthereumPrice() 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/price?fsym=ETH&tsyms=EUR"); // Set the path to find the desired data in the API response, where the response format is: // {"USD":243.33} request.add("path", "EUR"); // Multiply the result by 100 to remove decimals request.addInt("times", 100); // Sends the request return sendChainlinkRequestTo(oracle, request, fee); }
在“fulfill”函数中,咱们能够看到预言机发回一个响应到_price 参数中,而后该参数值在合约中保留到了 ethereumPrice 变量。
function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId) {ethereumPrice = _price;}
当初咱们的合约筹备好了,能够编译并部署到 Matic Mumbai 测试网。
部署并测试合约
在 Remix 中编译合约,而后部署合约到 Mumbai 测试网,这几个步骤咱们在后面喂价合约中曾经做过一遍。
下一步是为合约中增加肯定的 LINK 代币,所以它能发送申请到 Chainlink 预言机。为了实现这个步骤,拿到部署的合约的地址,而后通过 MetaMask 钱包发送 1LINK 代币到此地址中。
给合约充 LINK 代币
一旦合约部署实现并且充值完 LINK,咱们能够点击“requestEthereumPrice”按钮调用函数,发送申请到 Chainlink 预言机来获取以后的以太坊价格。咱们也将发送 LINK 作为领取到 Chainlink 的预言机来实现此申请。
测试部署的合约
申请实现后,Chainlink 预言机会实现它,而后合约中的“fulfill”函数会被 Chainlink 结点预言机合约调用。这会破费几秒钟的工夫来实现,而后咱们能够通过执行“ethereumPrice”的 getter 函数来查看 API 申请后果。这个后果应该是以后的以 EUR 计价的 ETH 价格,当初就保留到了合约,期待运行在 Matic 网络上的 DeFi 利用来生产这个数据。
查看返回后果
总结
Matic 网络自身具备疾速、便宜且牢靠的交易个性,为构建 DeFi 协定提供了切实可行的 Layer 2 解决方案。而 Chainlink 预言机和 Chainlink 的喂价器进一步加强了在 Matic 上构建 DeFi 协定的价值主张,Chainlink 预言机和 Chainlink 的喂价器使得这些协定能够拜访内部数据和事件,包含能够用在各种各样的有价值的 DeFi 利用中的高质量的聚合价格数据,如去中心化交易所(DEX),流动性池,借贷协定,去中心化保险以及自动化做市商(AMMs)等等。
如果你是开发者,想要疾速为你的利用连贯到 Chainlink 的价格参考数据,拜访开发者文档,并接入 Discord 技术探讨。如果你想要安顿一个电话来更深刻探讨 Matic/Chainlink 的集成,请在此处分割。
Website | Twitter | Reddit | YouTube | Telegram | Events | GitHub | Price Feeds | DeFi
END.