Arbitrum是一个以太坊的的二层网络,开发者能够以低成本开发和部署高度可扩展的智能合约。通过Arbitrum上的Chainlink Data Feed,开发者可以快速、轻松地将他们的智能合约与链外数据连接起来,包括用于构建大量DeFi应用的高度可靠的资产价格。
在本篇技术教程中,我们将解释什么是Arbitrum,了解如何在Arbitrum Rinkeby测试网上开发,并给出如何在Arbitrum智能合约中使用Chainlink Price Feed的步骤说明。虽然在这篇文章中我们将在测试网环境中开发和部署,但对于Arbitrum One主网来说,步骤是一样的。
Layer 2 rollup包括Optimistic rollup和ZK-rollup两种。两者都是 “真正的Layer 2解决方案”,这意味着它们能够高速、低成本地执行大量交易,然后在Layer 1验证打包的交易。对于Optimistic rollup,我们会“乐观地相信”这些交易真的发生在Layer 2。这些rollup是“乐观的”,因为这些打包交易被认为是“无罪的”,直到通过欺诈证明来证明其“有罪”;也即我们会乐观地认为交易在发布到Layer 1时是正确的,除非在7天的挑战期内提交了挑战。
然后,我们需要从Rinkeby存入测试ETH,以便在 Arbitrum Rinkeby测试网上支付费用。导航到Arbitrum桥,连接钱包,输入Rinkeby ETH数量,然后点击“存款”。大约需要10分钟才能看到余额记入二层网络——可以喝杯咖啡休息一下。
在二层上收到ETH后,就可以在Metamask钱包中配置Arbitrum Rinkeby测试网。导航到Chainlist并找到 Arbitrum Rinkeby Network的详细信息,或导航到Etherscan浏览器并在网站页脚中找到Add Arbitrum Network 或选择Settings -> Networks -> Add Network in Metamask,然后手动输入详细信息。
Network Name: Arbitrum Rinkeby Testnet
Network URL: https://rinkeby.arbitrum.io/rpc
Chain ID: 421611
Currency Symbol: ETH
Block Explorer URL: https://testnet.arbiscan.io/
最后,回到Chainlink Faucets,选择Arbitrum Rinkeby,领取10个测试网LINK。
虽然这些 DeFi 用例需要外部数据,但区块链和二层解决方案无法本地访问自身外部的数据。当向区块链提供数据以服务高级DeFi用例时,必须保证数据的安全性和高质量,以防止价格预言机攻击。
Chainlink Price Feeds提供来自各种高质量数据提供商的聚合数据,并由去中心化的预言机通过 Chainlink 网络在链上提供数据,从而降低了这些攻击的风险。Chainlink的去中心化预言机机制确保最终价格反映广泛的市场覆盖范围,这意味着最终价格是在汇总整个市场的一组不同价格后确定的,而不仅仅是一小部分,还考虑了交易量和流动性等其他方面。借助 Chainlink Price Feed,开发者能够开发不影响安全性的高级 DeFi 应用程序。
现在我们了解了Solidity智能合约中准确可靠的价格数据的需求以及Chainlink价格预言机所扮演的重要角色,我们将通过在Arbitrum上的Solidity智能合约使用Chainlink Price Feed获取ETH最新价格的示例。
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
现在我们要写一个函数来检索Chainlink网络中的Price Feed数据。导航到Chainlink官方文档中的Data Feeds部分。我们将以"getPrice"函数为例,并稍作修改。
function getThePrice(address _priceFeedAddress) public view returns (int) {
AggregatorV3Interface priceFeed = AggregatorV3Interface(_priceFeedAddress);
(
uint80 roundID,
int price,
uint startedAt,
uint updatedAt,
uint80 answeredInRound
) = priceFeed.latestRoundData();
return price;
}
你可以看到我们把 "PriceFeedAddress"作为一个参数来传递,使这个智能合约更具可扩展性。你可以在这里看到Arbitrum Rinkeby测试网上的所有Price Feed地址的完整列表。
例如,如果我们想知道BTC的美元价格,我们可以将 “0x0c9973e7a27d00e656B9f153348dA46CaD70d03d"作为”_priceFeedAddress"参数传递给我们的函数。
如果你不想在你的应用程序中担心这个问题,可以使用Chainlink预言机来确保定序器对用户可用。下面是这样做的步骤。
首先,我们需要在我们的 Solidity 代码中添加下面的导入语句:
import "@chainlink/contracts/src/v0.8/interfaces/FlagsInterface.sol";
根据Chainlink的文档,L2定序器器健康标志由三个角色组成:
// Identifier of the Sequencer offline flag on the Flags contract
address constant private FLAG_ARBITRUM_SEQ_OFFLINE = address(bytes20(bytes32(uint256(keccak256("chainlink.flags.arbitrum-seq-offline")) - 1)));
FlagsInterface internal chainlinkFlags;
constructor() {
chainlinkFlags = FlagsInterface(0x491B1dDA0A8fa069bbC1125133A975BF4e85a91b);
}
"0x491B1dDA0A8fa069bbC1125133A975BF4e85a91b"是 Arbitrum Rinkeby Flags合约的地址。要检查其他的地址,请到Chainlink文档中查看。
一个升起的标志表明,feed在 "T"时间内没有更新,其数据可以被认为是过时的。换句话说,定序器下线了,你的合约不应该执行任何关键操作。当定序器再次恢复,二层上Chainlink Data Feed更新后,你可以继续像往常一样使用你的合约。我们增加这个额外的检查。
function getThePrice(address _priceFeedAddress) public view returns (int) {
bool isRaised = chainlinkFlags.getFlag(FLAG_ARBITRUM_SEQ_OFFLINE);
if (isRaised) {
// If flag is raised we shouldn't perform any critical operations
revert("Chainlink feeds are not being updated");
}
AggregatorV3Interface priceFeed = AggregatorV3Interface(_priceFeedAddress);
(
uint80 roundID,
int price,
uint startedAt,
uint updatedAt,
uint80 answeredInRound
) = priceFeed.latestRoundData();
return price;
}
最终的结果是交易成功,智能合约部署到Arbitrum Rinkeby测试网。
为了测试这个合约,我们只需要调用我们的 “getThePrice"函数,并将Arbitrum Rinkeby测试网上的一个Chainlink Price Feed地址作为”_priceFeedAddress"参数进行传递。记住,你可以在Chainlink文档中看到所有可用的Price Feed合约地址。
这个技术教程已经展示了在Arbitrum上编写和部署混合智能合约是多么容易。有了这些知识,你就可以利用Arbitrum的低成本和高速度以及Chainlink Price Feed所解锁的进阶应用场景,开始开发你自己的智能合约,。
获取更多关于Chainlink的信息,请访问chain.link或在docs.chain.link阅读文档。要讨论集成问题,请联系专家。