混合智能合约利用第二层解决方案的速度和低成本以及在底层区块链上结算交易的安全性,将其状态链上功能与链下组件相结合,以利用两种环境的优势。
在本教程中,我将教您如何使用 Chainlink 编写和部署混合智能合约。您将安装和设置 Foundry,利用 Chainlink 的价格数据预言机创建混合智能合约,并使用 Foundry 在 Polygon Mumbai 测试网上部署和验证该合约。
先决条件
要理解本教程的全部内容,您应该对以下概念有基本的了解:
铸造厂
坚固性
Metamask 与水龙头
Windows 11 操作系统
通过本教程,您将学习如何:
安装并设置 Foundry;
利用 Chainlink 的价格数据馈送聚合器合约创建混合智能合约;
使用 Foundry 在 Polygon Mumbai 测试网上进行部署和验证。
但首先,让我们澄清一下混合智能合约、Foundry 和 Chainlink 预言机是什么。如果您已经熟悉这些概念,请跳至步骤 1 开始。
获取可自定义且安全的区块链服务器,专为密集型 Web3 工作负载而设计。享受最短的停机时间、加密货币友好型支付和免费的 24/7 专家支持。
什么是混合智能合约?
混合智能合约与常规智能合约一样,都是为实现去中心化和无需信任的交易而构建和部署到区块链上的。唯一的区别在于,混合智能合约并非完全去中心化;然而,这并不会降低它们的无需信任程度。
混合智能合约遵循常规智能合约的规则,但还将其状态链上功能与链下组件相结合,以充分利用两种环境的优势。与传统智能合约不同,混合智能合约集成了外部数据源、API 以及由 Chainlink 等预言机协议提供的其他链下信息。链上组件通常处理关键功能,例如执行和执行合约条款。同时,链下元素提供补充信息或与现实世界数据交互。
混合智能合约旨在通过整合来自外部来源的实时和动态数据来解决与链上执行的确定性和孤立性相关的限制。这种方法促进了能够响应现实世界事件和条件的复杂且适应性强的去中心化应用程序 ( DApps )。
什么是 Foundry?
Foundry 是一个开源开发者平台,提供工具和框架来改善以太坊DApp 和智能合约的构建、部署和扩展,使其更易于访问和高效。它有助于执行复杂的逻辑和数据转换,然后将结果集成到智能合约中。
此外,Foundry 允许与外部数据源、API 和系统无缝集成,从而增强了智能合约的可扩展性、互操作性和功能性。它扩展了基于区块链的应用程序的功能,使它们能够访问现实世界的数据并执行链下计算,同时保持链上执行的安全性和不变性。
什么是 Chainlink 预言机?
Chainlink 预言机解决了区块链无法处理现实世界数据的问题。它作为一个集中式协议运行,使用计算算法处理链下数据,以实现解决区块链预言机问题的功能。
什么是 Polygon Mumbai 网络?
孟买是 Polygon 生态系统中指定的测试网络,与以太坊虚拟机 (EVM) 完全兼容。它是 Polygon 构建的以太坊第 1 层区块链,旨在为任何地方的任何人提供安全、低成本、开发人员友好的方式来构建去中心化应用程序。在本教程中,您将在孟买网络上部署混合合约的链上组件,以从 Polygon 孟买网络获取汇总价格信息。
如何使用 Chainlink 部署混合智能合约:分步指南
要开始部署混合智能合约,您需要遵循几个步骤,包括从 Chainlink 获取 Oracle 合约地址、获取用于在测试网上部署的水龙头、设置环境以及编写智能合约。让我们开始吧。
步骤 1:获取 Chainlink 聚合器合约
Chainlink 拥有部署在多个区块链上的多个预言机合约地址的集体存档。以下步骤将帮助您了解如何从 Chainlink 获取所需的预言机合约地址。
1. 前往 Chainlink 网站
前往Chainlink页面,其中列出了 Chainlink 在多个网络上部署的所有聚合器合约。单击多边形图标并滚动到页面底部以找到您首选的合约地址,该地址将用作部署混合合约的链下组件。
2. 获取 Chainlink 预言机地址
这些地址都是聚合器合约的已部署版本,它返回该链上两个代币交换的当前价格(取决于您选择的对)。
注:聚合合约采用链下多层确定算法,计算出多条链上货币互换的准确平均价格。
在本教程中,您将使用合约地址0x0715A7794a1dc8e42615F059dD6e406A6594651A
获取孟买测试网上代币对 ETH/USD 的价格信息。保存已部署的合约链接以供日后使用。
第 2 步:获取水龙头
水龙头是您可以在测试网上使用的简单测试资金,它们模拟在任何链的主网上使用真实资金。
您可以将合约地址存储在工作区中的任何文件中。以下是有关如何将 Polygon Mumbai 测试网添加到您的钱包(Metamask 或更高版本)的快速指南。
然后前往此处的链接获取 Matic 测试水龙头。
步骤 3:设置 Foundry
现在,是时候开始编写代码了,但首先,您需要设置开发环境才能开始。
在您的终端上运行下面的代码,创建一个新的./目录,进入新打开的目录,并在您喜欢的 IDE 上打开一个新的工作区。
mkdir hybrid_contractcd hybrid_contractcode .
接下来,运行命令
curl -L https://foundry.paradigm.xyz | bash
来安装 Foundry。运行命令
source ~/.bashrc
以应用将 foundryup 添加到 PATH 变量的更改。运行命令
foundryup
安装其他 Foundry 模块化工具包,cast
forge
anvil
chisel
输入 接受安装过程中的所有提示y
。运行命令
apt install npm
。安装软件包后,在 bash 终端上运行命令 forge init 来初始化 Foundry 工作区,如果出现错误,可以添加 --force 标志。
运行命令
forge install smartcontractkit/foundry-Chainlink-toolkit
来安装 Chainlink 库,其中拥有 Chainlink 合约套件的所有实例。最后,运行命令
forge install forge std
安装forge标准库。在主目录中创建一个新文件
.env
并创建变量:
POLYSCAN_API_KEY=<your-polygon-api-key>SECRET_KEY=<your-wallet-secret-key>MUMBAI_MATIC=<your-polygon-rpc-url>
要获取多边形扫描 API 密钥,请使用链接转到多边形扫描,以获取您的公钥。
注册或登录以创建帐户,然后单击页面左上角的个人资料图标。
从下拉菜单中选择,您将被重定向到一个新页面,以创建一个新的 API 密钥来填充文件中的
API Keys
变量。POLYSCAN_API_KEY
.env
前往链接创建一个新的应用程序并复制您的新内容(
RPC URL
包括下图中的内容),以填充文件中的RPC-API-key
变量。MUMBAI_MATIC
.env
可能的错误:
万一在尝试安装库(特别是 Chainlink)时遇到错误,请尝试将目录更改为lib
文件夹并运行命令 git clone 。 您可以在此处org-25111032@github.com:smartcontractkit/chainlink-brownie-contracts.git
阅读更多相关信息。
步骤 4:编写智能合约
转到src
工作区中的文件夹,将合约重命名为DataFeed.sol
,并用下面的代码替换代码。
// SPDX-License-Identifier: MITpragma solidity ^0.8.10;import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";contract DataFeed { address private immutable i_owner; AggregatorV3Interface private s_priceFeed; constructor(address priceFeed) { s_priceFeed = AggregatorV3Interface(priceFeed); i_owner = msg.sender; } function getPrice(AggregatorV3Interface priceFeed) public view returns (uint256) { (, int256 answer,,,) = priceFeed.latestRoundData(); // ETH/USD rate in 18 digit return uint256(answer * 10000000000); } function getLatestRoundData() public view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) { return s_priceFeed.latestRoundData(); } function getDecimals() public view returns (uint8) { return s_priceFeed.decimals(); } function getDescription() public view returns (string memory) { return s_priceFeed.description(); } // 1000000000 // call it get fiatConversionRate, since it assumes something about decimals // It wouldn't work for every aggregator function getConversionRate(uint256 ethAmount, AggregatorV3Interface priceFeed) public view returns (uint256) { uint256 ethPrice = getPrice(priceFeed); uint256 ethAmountInUsd = (ethPrice * ethAmount) / 1000000000000000000; // the actual ETH/USD conversation rate, after adjusting the extra 0s. return ethAmountInUsd; } function getVersion() public view returns (uint256) { return s_priceFeed.version(); } function getOwner() public view returns (address) { return i_owner; } function getPriceFeed() public view returns (AggregatorV3Interface) { return s_priceFeed; }}
具体内容:
上述合约为 Chainlink 价格信息预言机设置了一个包装器,提供获取数据、转换汇率以及与价格信息相关的其他元数据的功能。假设您熟悉 Solidity 语言,下面简要介绍一下上述智能合约中发生的事情。
将合约的许可证设置
SPDX-License-Identifier
为MIT
和 solidity 版本后,首先,使用名称 初始化合约DataFeed
。导入语句:
import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"
;AggregatorV3Interface
从 Chainlink 合约导入接口。该接口用于与外部数据源交互。DataFeed Contract:这是文件中定义的主要合同。
getPrice
:从价格供给预言机中检索最新价格,并将其转换为 18 位表示 ETH/USD 汇率的 uint256 值。getLatestRoundData
:从价格供给预言机中检索最新一轮数据。getDecimals
:检索价格信息合约使用的十进制位数。- -getDescription
:检索价格信息合约的描述。状态变量: -
i_owner
:一个不可变的私有变量,用于存储合约部署者的地址。 -s_priceFeed
:一个不可变的私有变量,用于存储代表价格供给的 AggregatorV3Interface 合约的地址。构造函数:构造函数
s_priceFeed
使用作为参数传递的 AggregatorV3Interface 合约的地址初始化变量,并将i_owner
变量设置为部署者的地址。查看功能:
转换功能: -
getConversionRate
:根据当前价格馈送数据计算一定数量的以太币到美元的转换率。Getter 函数:
getVersion
:检索价格信息合约的版本。getOwner
:获取合约部署者的地址。getPriceFeed
:检索价格信息预言机的地址。转到目录script
重命名合约DataFeed.s.sol
,并将以下代码粘贴到文件中。
// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.13;import {Script, console} from "forge-std/Script.sol";import {DataFeed} from "../src/DataFeed.sol";contract DeployDataFeed is Script { function setUp() public {} function run() public returns (address) { vm.startBroadcast(); DataFeed dataFeed = new DataFeed(0x0715A7794a1dc8e42615F059dD6e406A6594651A); vm.stopBroadcast(); return address(dataFeed); }}
具体内容:
上述合约充当主 DataFeed.sol 合约的 Solidity 部署脚本。执行时,它将部署 DataFeed 合约的新实例,并使用指定的地址作为构造函数参数,并返回已部署合约的地址。
导入语句:
import {Script, console} from "forge-std/Script.sol";
:这将从Forge 标准库导入Script
和 -实用程序。console
Script is a base contract that provides functionality for writing scripts for contract deployment and interaction.
控制台is used for logging messages during script execution.
从“ ../src/DataFeed.sol”导入{DataFeed};: This imports the DataFeed contract from the
DataFeed.sol`文件位于项目的src目录中。合约定义:该合约
DeployDataFeed
定义为脚本合约,通过继承自来表示Script
。功能:
setUp()
:此函数已定义但为空。它不执行任何操作。run()
:此函数是脚本的主要入口点。它部署了DataFeed
合约以地址0x0715A7794a1dc8e42615F059dD6e406A6594651A
作为参数。它分别使用 d.vm.startBroadcast()
和来启动和停止广播事件vm.stopBroadcast()
。最后,它返回已部署合约的地址DataFeed
。
第六步:部署并验证合约
首先,转到
foundry.toml
主目录中的文件并添加以下代码行:
remappings = [ '@chainlink/contracts/=lib/chainlink-brownie-contracts/contracts/', '@forge-std=lib/src']
该
remapping
数组有助于将合同中的导入语句路由到正确的lib
源。要同时部署和验证您的合约,您可以运行该命令,同时直接在命令中输入您的私人详细信息。
forge create --rpc-url <your-rpc-url> --constructor-args "0x0715A7794a1dc8e42615F059dD6e406A6594651A" --private-key <your-wallet-private-key> script/DataFeed.s.sol:DeployDataFeed --etherscan-api-key <your-polygon-scan-api-key> --verify
注意:命令中的合约地址是pricedfeed
你之前存储的来自 Chainlink 部署的合约。
或者,运行命令
source .env
来导出您的私人详细信息。最后,运行命令。
forge create --rpc-url MUMBAI_MATIC --constructor-args "0x0715A7794a1dc8e42615F059dD6e406A6594651A" --private-key SECRET_KEY script/DataFeed.s.sol:DeployDataFeed --etherscan-api-key POLYSCAN_API_KEY --verify
您应该会得到这样的回应。
[⠰] Compiling...[⠒] Compiling 2 files with 0.8.23[⠑] Solc 0.8.23 finished in 3.18sCompiler run successful!Deployer: 0x4B96F9F8fe84577e65A17c666b76769a395d8273Deployed to: 0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9Transaction hash: 0xfdad96187bb4b6edd45a6641939a41f01069661d273dd808899c9fab4a60625eStarting contract verification...Waiting for etherscan to detect contract deployment...Start verifying contract `0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9` deployed on mumbaiSubmitting verification for [src/DataFeed.sol:DataFeed] 0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9.Submitting verification for [src/DataFeed.sol:DataFeed] 0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9.Submitting verification for [src/DataFeed.sol:DataFeed] 0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9.Submitted contract for verification: Response: `OK` GUID: `upedrsziekvycvd1sjqhr6hsdydbwdcwdp8avgcgf9seqmu2s8` URL: https://mumbai.polygonscan.com/address/0x5486c1adc0c6ac4ffedb855e969c826fd23c19f9Contract verification status:Response: `NOTOK`Details: `Pending in queue`Contract verification status:Response: `OK`Details: `Pass - Verified`Contract successfully verified
拥有您的钱包公共地址、Polygon Mumbai 上部署的合约地址、部署交易哈希以及其他验证详细信息,如您的全球唯一标识符GUID
和验证状态。
步骤 7:从合约中获取价格数据
使用链接前往孟买多边形扫描,并将您部署的钱包地址粘贴到搜索栏中,在本例中为
0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9
。您会注意到您有经过验证的合同证明。
单击合约
Read Contract
按钮,您会发现在 solidity 文件中创建的所有可调用函数。单击
Connect to web3
连接您的 metamask 钱包,以便进行功能调用。该
getConversionRate
函数接受 中的任意值eth
和 Chainlink 价格供给合约地址,并返回usdt
中的等值金额uint256
。从 Chainlink Price Feed 预言机获取
getLatestRoundData
最新一轮数据。它返回轮次 ID、答案(价格)、轮次开始的时间戳、轮次更新的时间戳以及记录答案的轮次 ID。在本例中,该函数
getPrice
以地址作为参数,并返回从 Chainlink Price Feed 预言机获取的最新价格。它从指定的价格源中检索最新一轮数据,并在将其转换为 uint256 值后返回答案(价格)。priceFeed
chainlink hybrid contract
该
getPriceFeed
调用返回与合约关联的 Chainlink Price Feed 预言机的地址DataFeed
。
完成上述所有步骤后,您不仅使用 Chainlink oracle 创建了混合智能合约,而且还成功建立了铸造工作区,并使用铸造框架和命令在部署时验证了您的智能合约。您还部署到了 Polygon Mumbai 区块链并在链上验证了合约的熟练程度。
结论
部署和交互从多个实时源的聚合集合中检索价格反馈的混合合约只是如何利用混合合约以及你可以用它们构建的东西的开始。
您可能会考虑从混合合约的基础开始构建自己的自动赚钱机 (AMM) 或去中心化交易所 (DEX)。其他一些混合合约功能可能是生成随机性、VRF、自动交易执行等。