如何在Arbitrum上开发和部署智能合约

  • 时间:
  • 浏览:26
  • 来源:区块链技术网

原文链接:https://blog.chain.link/how-to-use-chainlink-price-feeds-on-arbitrum-zh/

Arbitrum是一个以太坊的的二层网络,开发者能够以低成本开发和部署高度可扩展的智能合约。通过Arbitrum上的Chainlink Data Feeds,开发者可以快速、轻松地将他们的智能合约与链外数据连接起来,包括用于构建大量DeFi应用的高度可靠的资产价格。

在本篇技术教程中,我们将解释什么是Arbitrum,了解如何在Arbitrum Rinkeby测试网上开发,并给出如何在Arbitrum智能合约中使用Chainlink Price Feeds的步骤说明。虽然在这篇文章中我们将在测试网环境中开发和部署,但对于Arbitrum One主网来说,步骤是一样的。

《如何在Arbitrum上开发和部署智能合约》详情视频:

https://youtu.be/wSq1YAkvqms

什么是Arbitrum?

Arbitrum是一个基于Optimistic rollup的以太坊二层解决方案。为了在以太坊上提供更快的速度和更低的成本,涌现了一些扩容方案,包括 Layer 2 rollup、状态(和支付)通道、侧链、Plasma和Validium等。这些解决方案之间最重要的区别是,rollup和状态通道继承以太坊区块链(Layer 1)的安全性,开发者本质上可以在以太坊Layer 1之上进行开发。

Layer 2 rollup包括Optimistic rollup和ZK-rollup两种。两者都是 "真正的Layer 2解决方案",这意味着它们能够高速、低成本地执行大量交易,然后在Layer 1验证打包的交易。对于Optimistic rollup,我们会“乐观地相信”这些交易真的发生在Layer 2。这些rollup是“乐观的”,因为这些打包交易被认为是“无罪的”,直到通过欺诈证明来证明其“有罪”;也即我们会乐观地认为交易在发布到Layer 1时是正确的,除非在7天的挑战期内提交了挑战。

开始使用Arbitrum

在本教程中,我们将在Arbitrum Rinkeby测试网上开发和部署一个智能合约,这是Rinkeby测试网的二层。同样的步骤也适用于Arbitrum One,它是以太坊主网的二层。为了使用Arbitrum Rinkeby测试网,我们需要一些Rinkeby测试网的ETH。可以通过Chainlink Faucets获得你的Rinkeby测试LINK--只需粘贴你的钱包地址,选择Rinkeby Ethereum,并领取测试ETH。

然后,我们需要从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。

准确可靠的价格数据在智能合约中的重要性

为了拓展二层上智能合约的可能性,开发者需要安全连接到链下资源。借助来自 Chainlink 预言机的高度准确和可靠的价格数据,开发者可以开始在 Arbitrum 上开发和测试各种可扩展的 DeFi 应用程序,这些应用程序依赖于ETH 和其他通证的价格,例如借贷协议、去中心化交易所、预测市场等。

虽然这些 DeFi 用例需要外部数据,但区块链和二层解决方案无法本地访问自身外部的数据。当向区块链提供数据以服务高级DeFi用例时,必须保证数据的安全性和高质量,以防止价格预言机攻击。

Chainlink Price Feeds提供来自各种高质量数据提供商的聚合数据,并由去中心化的预言机通过 Chainlink 网络在链上提供数据,从而降低了这些攻击的风险。Chainlink的去中心化预言机机制确保最终价格反映广泛的市场覆盖范围,这意味着最终价格是在汇总整个市场的一组不同价格后确定的,而不仅仅是一小部分,还考虑了交易量和流动性等其他方面。借助 Chainlink Price Feeds,开发者能够开发不影响安全性的高级 DeFi 应用程序。

现在我们了解了Solidity智能合约中准确可靠的价格数据的需求以及Chainlink价格预言机所扮演的重要角色,我们将通过在Arbitrum上的Solidity智能合约使用Chainlink Price Feeds获取ETH最新价格的示例。

在Arbitrum上使用Chainlink Price Feeds

首先在你最喜欢的代码编辑器中创建一个新的 Solidity 项目。使用Hardhat与Typescript的完整例子可在Github上找到。我们将使用Solidity和Chainlink的最新版本。

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

现在我们要写一个函数来检索Chainlink网络中的Price Feeds数据。导航到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"参数传递给我们的函数。

几乎完成了! 认识L2定序器的健康标志

Arbitrum中的交易是高速确认的。这是因为有所谓的定序器。定序器是一个链外的组件,能够高速为用户交易排序并给用户提供收据。然而,如果定序器不可用,用户必须通过以太坊提交他们的交易,以便让它们在Arbitrum中处理。这对用户体验是不利的,许多dApps仍然没有能力处理需要同时与Ethereum和Arbitrum交互的情况。

如果你不想在你的应用程序中担心这个问题,可以使用Chainlink预言机来确保定序器对用户可用。下面是这样做的步骤。

首先,我们需要在我们的 Solidity 代码中添加下面的导入语句:

import "@chainlink/contracts/src/v0.8/interfaces/FlagsInterface.sol";

根据Chainlink的文档,L2定序器器健康标志由三个角色组成:

  • Chainlink Cluster(一组验证器节点)--它在每个心跳时间"T"(Chainlink feed配置的更新的最小频率)执行OCR Job。
  • 报告定序器状态的实际OCR feed--这可用于Layer 1的外部用户检查OR协议(如Arbitrum)的状态。
  • 验证器--由OCR feed触发,如果当前答案与之前的不同,则执行升起或放下标志的动作。

现在,我们需要用以下几行来扩展我们的合约:

// Identifier of the Sequencer offline flag on the Flags contractaddress 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 Feeds更新后,你可以继续像往常一样使用你的合约。我们增加这个额外的检查。

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 operationsrevert("Chainlink feeds are not being updated");}
AggregatorV3Interface priceFeed = AggregatorV3Interface(_priceFeedAddress);(uint80 roundID,int price,uint startedAt,uint updatedAt,uint80 answeredInRound) = priceFeed.latestRoundData();return price;}

部署和测试智能合约

现在我们准备部署和测试我们的合约。在Remix中编译合约,然后在部署标签中,将环境改为 "Injected Web3"。确保钱包连接到Arbitrum Rinkeby测试网,并且下面的钱包地址是MetaMask钱包的地址,包含之前获得的ETH。然后,按下部署按钮,按照步骤进行。

最终的结果是交易成功,智能合约部署到Arbitrum Rinkeby测试网。

为了测试这个合约,我们只需要调用我们的 "getThePrice"函数,并将Arbitrum Rinkeby测试网上的一个Chainlink Price Feed地址作为"_priceFeedAddress"参数进行传递。记住,你可以在Chainlink文档中看到所有可用的Price Feed合约地址。

总结

Chainlink中流行的ETH/USD价格数据,以及LINK/USD、AAVE/USD和BTC/USD的价格数据都可以在Arbitrum上使用。这些Chainlink Price Feeds建立在去中心化的预言机基础设施上,由众多经过安全审查的节点运营商和优质数据源组成,成就了高度准确、可用和防篡改的Data Feeds,这些Data Feeds本身就可以抵御像闪电贷引起的价格操纵攻击这样的漏洞。

这个技术教程已经展示了在Arbitrum上编写和部署混合型智能合约是多么容易。有了这些知识,你就可以利用Arbitrum的低成本和高速度以及Chainlink Price Feeds所解锁的进阶应用场景,开始开发你自己的智能合约。

本文首发于:https://blog.chain.link/how-to-use-chainlink-price-feeds-on-arbitrum-zh/

猜你喜欢

NFT Worlds游玩介绍!Minecraft为主体,融入智能合约及P2E要素

TheSandbox在12月Alpha版本结束后,至今仍有大量功能未开放。与此同时,不少元宇宙沙盒项目持续开发,像是介绍过的Critterz及Decentraland等。而今日

2022-07-30

操纵预言机+提案攻击—Fortress Loans被黑事件分析

2022年5月9日消息,FortressLoans遭到黑客攻击。此次攻击事件损失了1048.1ETH以及40万DAI。SharkTeam第一时间对此事件进行了分析,并总结了安全

2022-07-30

(复现)操纵预言机+提案攻击—Fortress Loans

参考:操纵预言机+提案攻击—FortressLoans被黑事件分析|登链社区|深入浅出区块链技术(learnblockchain.cn)说在前面:有对漏洞复现研究的小伙伴可以私

2022-07-30

智能合约安全审计入门篇 —— delegatecall (1)

By:小白@慢雾安全团队背景概述上篇文章中我们学习了合约中数据的存储方式以及如何读取合约中的各种数据。这次我们将带大家了解delegatecall函数。前置知识首先,我们先来了

2022-07-30

智能合约安全审计入门篇 —— delegatecall (2)

By:小白@慢雾安全团队背景概述上篇文章中我们了解了什么是delegatecall函数以及一个基础的漏洞,这篇文章的目的是加深一下大家对delegatecall的印象并带大家一

2022-07-30