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

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

什么是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 Feed,开发者能够开发不影响安全性的高级 DeFi 应用程序。

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

在Arbitrum上使用Chainlink Price Feed

首先在你最喜欢的代码编辑器中创建一个新的 Solidity 项目。使用Hardhat与Typescript的完整例子可在 Github 上找到。我们将使用Solidity和Chainlink的最新版本。
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"参数传递给我们的函数。

几乎完成了! 认识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 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;     
	}

部署和测试智能合约

现在我们准备部署和测试我们的合约。在 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 Feed建立在去中心化的预言机基础设施上,由众多经过安全审查的节点运营商和优质数据源组成,成就了高度准确、可用和防篡改的Data Feed,这些Data Feed本身就可以抵御像闪电贷引起的价格操纵攻击这样的漏洞。

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

获取更多关于Chainlink的信息,请访问chain.link或在docs.chain.link阅读文档。要讨论集成问题,请联系专家。

Logo

为所有Web3兴趣爱好者提供学习成长、分享交流、生态实践、资源工具等服务,作为Anome Land原住民可不断优先享受各种福利,共同打造全球最大的Web3 UGC游戏平台。

更多推荐