GTokenTool全网最好的代币发行工具平台
当前位置:首页 >> 加密百科 >> 如何使用 Chainlink 部署混合智能合约 | 分步说明

如何使用 Chainlink 部署混合智能合约 | 分步说明

admin 加密百科 63

混合智能合约利用第二层解决方案的速度和低成本以及在底层区块链上结算交易的安全性,将其状态链上功能与链下组件相结合,以利用两种环境的优势。


在本教程中,我将教您如何使用 Chainlink 编写和部署混合智能合约。您将安装和设置 Foundry,利用 Chainlink 的价格数据预言机创建混合智能合约,并使用 Foundry 在 Polygon Mumbai 测试网上部署和验证该合约。

先决条件

要理解本教程的全部内容,您应该对以下概念有基本的了解:

  1. 铸造厂

  2. 坚固性

  3. Metamask 与水龙头

  4. 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

现在,是时候开始编写代码了,但首先,您需要设置开发环境才能开始。

  1. 在您的终端上运行下面的代码,创建一个新的./目录,进入新打开的目录,并在您喜欢的 IDE 上打开一个新的工作区。

mkdir hybrid_contractcd hybrid_contractcode .
  1. 接下来,运行命令curl -L https://foundry.paradigm.xyz | bash来安装 Foundry。

  2. 运行命令source ~/.bashrc以应用将 foundryup 添加到 PATH 变量的更改。

  3. 运行命令foundryup安装其他 Foundry 模块化工具包,cast forge anvil chisel输入 接受安装过程中的所有提示y

  4. 运行命令apt install npm

  5. 安装软件包后,在 bash 终端上运行命令 forge init 来初始化 Foundry 工作区,如果出现错误,可以添加 --force 标志。

  6. 运行命令forge install smartcontractkit/foundry-Chainlink-toolkit来安装 Chainlink 库,其中拥有 Chainlink 合约套件的所有实例。

  7. 最后,运行命令forge install forge std安装forge标准库。

  8. 在主目录中创建一个新文件.env并创建变量:

POLYSCAN_API_KEY=<your-polygon-api-key>SECRET_KEY=<your-wallet-secret-key>MUMBAI_MATIC=<your-polygon-rpc-url>
  1. 要获取多边形扫描 API 密钥,请使用链接转到多边形扫描,以获取您的公钥。

  2. 注册或登录以创建帐户,然后单击页面左上角的个人资料图标。

创建账户

  1. 从下拉菜单中选择,您将被重定向到一个新页面,以创建一个新的 API 密钥来填充文件中的API Keys变量。POLYSCAN_API_KEY.env

  2. 前往链接创建一个新的应用程序并复制您的新内容(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 语言,下面简要介绍一下上述智能合约中发生的事情。

  1. 将合约的许可证设置SPDX-License-IdentifierMIT和 solidity 版本后,首先,使用名称 初始化合约DataFeed

  2. 导入语句:import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"AggregatorV3Interface从 Chainlink 合约导入接口。该接口用于与外部数据源交互。

  3. DataFeed Contract:这是文件中定义的主要合同。

    • getPrice:从价格供给预言机中检索最新价格,并将其转换为 18 位表示 ETH/USD 汇率的 uint256 值。

    • getLatestRoundData:从价格供给预言机中检索最新一轮数据。

    • getDecimals:检索价格信息合约使用的十进制位数。- - getDescription:检索价格信息合约的描述。

    • 状态变量: - i_owner:一个不可变的私有变量,用于存储合约部署者的地址。 - s_priceFeed:一个不可变的私有变量,用于存储代表价格供给的 AggregatorV3Interface 合约的地址。

    • 构造函数:构造函数s_priceFeed使用作为参数传递的 AggregatorV3Interface 合约的地址初始化变量,并将i_owner变量设置为部署者的地址。

    • 查看功能:

  4. 转换功能: - getConversionRate:根据当前价格馈送数据计算一定数量的以太币到美元的转换率。

  5. 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 合约的新实例,并使用指定的地址作为构造函数参数,并返回已部署合约的地址。

  1. 导入语句:

    • 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目录中。

  2. 合约定义:该合约DeployDataFeed定义为脚本合约,通过继承自来表示Script

  3. 功能:

    • setUp():此函数已定义但为空。它不执行任何操作。

    • run():此函数是脚本的主要入口点。它部署了

    • DataFeed合约以地址0x0715A7794a1dc8e42615F059dD6e406A6594651A作为参数。它分别使用 d.vm.startBroadcast()和来启动和停止广播事件vm.stopBroadcast()。最后,它返回已部署合约的地址DataFeed

第六步:部署并验证合约

  1. 首先,转到foundry.toml主目录中的文件并添加以下代码行:

remappings = [
    '@chainlink/contracts/=lib/chainlink-brownie-contracts/contracts/',
    '@forge-std=lib/src']
  1. remapping数组有助于将合同中的导入语句路由到正确的lib源。

  2. 要同时部署和验证您的合约,您可以运行该命令,同时直接在命令中输入您的私人详细信息。

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 部署的合约。

  1. 或者,运行命令source .env来导出您的私人详细信息。

  2. 最后,运行命令。

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:从合约中获取价格数据

  1. 使用链接前往孟买多边形扫描,并将您部署的钱包地址粘贴到搜索栏中,在本例中为0x5486C1aDC0c6Ac4Ffedb855E969C826fd23C19F9。您会注意到您有经过验证的合同证明。

核实合约

  1. 单击合约Read Contract按钮,您会发现在 solidity 文件中创建的所有可调用函数。

  2. 单击Connect to web3连接您的 metamask 钱包,以便进行功能调用。

    • getConversionRate函数接受 中的任意值eth和 Chainlink 价格供给合约地址,并返回usdt中的等值金额uint256查阅合同信息

    • 为了验证,您可以转到浏览器和搜索eth usdt rate 转换器,输入相同的价格金额,您将得到类似的回应。eth usdt 汇率转换器

    • 返回getDecimalChainlink Price Feed 预言机用来表示价格的小数位数。获取十进制

    • 从 Chainlink Price Feed 预言机获取getLatestRoundData最新一轮数据。它返回轮次 ID、答案(价格)、轮次开始的时间戳、轮次更新的时间戳以及记录答案的轮次 ID。获取最新轮次数据

    • 只是getOwner返回合约的部署者。获取所有者

    • 在本例中,该函数getPrice以地址作为参数,并返回从 Chainlink Price Feed 预言机获取的最新价格。它从指定的价格源中检索最新一轮数据,并在将其转换为 uint256 值后返回答案(价格)。priceFeedchainlink hybrid contract获取价格

    • getPriceFeed调用返回与合约关联的 Chainlink Price Feed 预言机的地址DataFeed获取价格信息

    • 调用该getVersion函数将返回 Chainlink Price Feed 预言机的当前版本。获取版本

完成上述所有步骤后,您不仅使用 Chainlink oracle 创建了混合智能合约,而且还成功建立了铸造工作区,并使用铸造框架和命令在部署时验证了您的智能合约。您还部署到了 Polygon Mumbai 区块链并在链上验证了合约的熟练程度。

结论

部署和交互从多个实时源的聚合集合中检索价格反馈的混合合约只是如何利用混合合约以及你可以用它们构建的东西的开始。


您可能会考虑从混合合约的基础开始构建自己的自动赚钱机 (AMM) 或去中心化交易所 (DEX)。其他一些混合合约功能可能是生成随机性、VRF、自动交易执行等。

作者:GTokenTool一键发币平台

交流群:https://t.me/+Kz4u3xoDpFo3ZWY1

同类推荐