如何将以太坊智能合约部署到区块链

  • tenderly
  • 发布于 2023-07-13 15:55
  • 阅读 38

本文介绍了如何使用Hardhat和Tenderly DevNets在以太坊上部署智能合约的详细步骤。首先,设置Hardhat开发环境并编写Solidity智能合约。然后,配置Tenderly DevNet,这是一个零设置的智能合约开发测试环境,可以轻松获取测试用的ETH。最后,使用Tenderly执行合约函数,以直观的方式查看详细的执行信息。

如何使用 Hardhat 和 Tenderly DevNets 在以太坊上部署你的第一个智能合约

准备好部署你的第一个以太坊智能合约了吗?按照这份使用 Hardhat 和 Tenderly DevNets 部署智能合约的分步指南,了解在此过程中实际发生了什么。

如何使用 hardhat 和 tenderly devnets 将智能合约部署到以太坊

在本教程中,你将学习如何创建智能合约并将其部署到私有开发和测试网络。

首先,你将设置 HardHat,一个智能合约开发环境,并用 Solidity 编写一个智能合约。接下来,你将设置一个 Tenderly DevNet,这是一个零设置的智能合约开发和测试环境。

有了 DevNet,你可以轻松地从无限 faucet(水龙头) 中获取一些测试 ETH。你将使用这个私有环境,根据实时的以太坊主网数据来部署和试用智能合约。最后,你将使用 Tenderly 执行一个带有更新参数的合约函数,以人类可读的格式查看详细的执行信息。

作为全栈基础设施提供商,Tenderly 是 web3 技术栈的重要组成部分。它使你能够在以太坊和其他 EVM 兼容网络上开发、测试、调试、优化和部署你的智能合约。

此外,Tenderly DevNets 是 HardHat 的补充,因此你拥有构建和部署可靠、万无一失的智能合约所需的所有强大工具。

那么,让我们开始吧!

1. 设置一个 Tenderly 帐户来使用 Tenderly DevNets

首先,访问 Tenderly 并按照几个简单的步骤来设置你的帐户。你可以使用你的电子邮件,也可以使用 Google 或 GitHub 注册。Tenderly 将向你发送一封验证电子邮件。验证你的电子邮件后,你就可以开始了。

在本教程中,我们将使用 Tenderly DevNets 在本地环境中执行交易。登录后,你将进入 DevNets 页面。在这里,点击 Experience DevNets(体验 DevNets) 按钮来创建你的第一个 DevNet。

一旦你生成了你的第一个 DevNet,Run Overview(运行概览) 页面将会打开,显示运行细节和你的 DevNet 的 RPC URL。在这里,你可以复制 DevNet RPC 并在后面的步骤中使用它。

查找 DevNet RPC 查找 DevNet RPC

2. 在 DevNet 上获取一些测试 ETH

在你继续之前

  • 智能合约的创建和测试通常不是在以太坊主网上进行的,而是在以太坊测试网之一上进行的。
  • 然而,有了 Tenderly DevNets,你可以得到一个零设置的私有网络,它具有最新的生产数据和新鲜的主网状态,你可以在这里立即执行交易。
  • DevNet 还允许你在几秒钟内获得无限量的测试 ETH,而无需费力地从公共 faucet(水龙头) 获得 tokens(代币)
  • 启动 DevNet 还可以让你立即解决潜在的 bugs(漏洞),并确保你的代码在你将其部署到以太坊主网之前按预期执行。

随意继续

  • 每个 Tendely DevNet 都预先填充了 100 个测试 tokens(代币),你可以将它们用于你的开发和测试目的。
  • 但是,你可以在 DevNets 上使用不同的自定义 RPC 方法来操作你的私有网络的状态,包括调整你帐户的余额。
  • 因此,为了给自己大量的 ETH,只需使用 tenderly_setBalance 即可。

3. 使用 Hardhat 编译和部署智能合约

现在基本设置已经完成,你可以开始创建区块链智能合约了。

3.1. 安装 Hardhat

要设置 Hardhat,你需要在你的系统上安装以下两个 packages(包)

  • node.js(我们使用的是 v18.9.0)
  • npm(我们使用的是 v8.19.1)

启动一个终端并完成以下步骤:

  1. 为你的项目创建一个目录

mkdir tenderly_deploy_tutorial && cd tenderly_deploy_tutorial

  1. 初始化项目(这将创建 package.json 文件)

npm init -y

  1. 安装 Hardhat

npm install hardhat

  1. 创建一个 Hardhat 项目

npx hardhat

  1. 选择 "empty hardhat.config.js" 选项:

设置 Hardhat 项目设置 Hardhat 项目

6. 将 libraries(库) 添加到你的项目。我们将使用 ethers 与区块链交互,并使用 dotenv 隐藏我们的秘密。🤫

npm install @nomiclabs/hardhat-ethers ethers dotenv

7. 我们也来添加 Hardhat 的 Tenderly plugin(插件),它可以自动验证你的智能合约并将其上传到 Tenderly。 验证你的智能合约非常重要,以启用 Tenderly 功能的所有功能。

npm install @tenderly/hardhat-tenderly

3.2 准备以太坊智能合约代码

为智能合约创建一个目录,并创建一个合约文件:

mkdir contracts && touch contracts/Greeter.sol

对于本教程,不要从头开始编写智能合约,而是使用现成的智能合约示例。将以下代码粘贴到你新创建的 Greeter.sol 文件中:


//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

contract Greeter {
  string private greeting;

  constructor(string memory _greeting) {
    greeting = _greeting;
  }

  function greet() public view returns (string memory) {
    return greeting;
  }

  function setGreeting(string memory _greeting) public {
    greeting = _greeting;
  }
}

3.3. 完成 Hardhat 配置

创建一个 .env 文件,其中将包含秘密信息,例如你的私钥和 Tenderly DevNet RPC URL。

touch .env

在你选择的文本编辑器中打开 .env 文件,并将你的私钥和 Tenderly URL 添加到其中,如下所示:

PRIVATE_KEY = # 删除此注释并在此处添加你的钱包私钥 TENDERLY_URL = # 删除此注释并添加你从本教程的第 1 步获得的 Tenderly DevNet RPC URL

ℹ️

DevNet RPC URL 的有效期很短,只有 90 分钟,足够完成部署和测试 scripts(脚本)。 你可以按照几个简单的步骤来自动化这个过程,并避免复制粘贴 URL。

如果你要对这个项目进行版本控制,应该将此文件添加到你的 .gitignore 列表中。 你的私钥不公开非常重要。 这样,你可以分享你的项目配置,而不必担心其他人知道你的秘密。

接下来,让我们修改 hardhat.config.js 文件。它应该导入 ethers library(库),设置我们将要使用的 network(网络),并为以后准备我们的私钥。

我们还将调用 setup 来初始化 Tenderly plugin(插件) 以进行自动智能合约验证。我们需要配置 hardhat-tenderly plugin(插件) 以自动执行验证,并将验证后的合约直接添加到你的项目中。

ℹ️

除了配置 plugin(插件) 之外,你还需要通过 Tenderly 进行身份验证。为此,可以使用 Tenderly CLI 或在 Dashboard(仪表板) 中生成 API key(密钥),并将其放置在 ~/.tenderly/config.yaml 中的 access_key 下。


require("@nomiclabs/hardhat-ethers");
require("dotenv").config();

// 初始化用于自动合约验证的 hardhat-tenderly 插件
var tdly = require("@tenderly/hardhat-tenderly");
tdly.setup({ automaticVerifications: true });

// 你的私钥和 tenderly devnet URL(其中包含我们的密钥 ID)
// 我们从 .env 文件中读取它们,这样我们就可以将此配置推送到 git 和/或公开共享
const privateKey = process.env.PRIVATE_KEY;
const tenderlyUrl = process.env.TENDERLY_URL;

module.exports = {
  solidity: "0.8.17",
  networks: {
    devnet: {
      url: tenderlyUrl,
      // 这将允许我们稍后使用我们的私钥进行签名
      accounts: [`0x${privateKey}`],
      // 这是主网链 ID
      chainId: 1,
    },
  },
  tenderly: {
    // 替换为 Tenderly 中的项目标识符
    project: "project",
    // 替换为你的 Tenderly 用户名
    username: "my-username",
    // 在私有模式下执行合约验证
    privateVerification: true,
  },
};

3.4. 编译代码

要编译你的智能合约,请运行以下命令:

npx hardhat compile

HardHat 将在你的 contracts(合约) 目录中查找智能合约,使用我们在 hardhat.config.js 文件中指定的编译器版本,并将编译结果存储在新创建的 “artifacts(工艺品)” 目录中。 同样,如果要对你的项目进行版本控制,你可能需要将 artifacts(工艺品) 目录添加到你的 .gitignore 列表中。

你可能之前已经经历过这个过程,但是编译智能合约时到底发生了什么?

首先,Solidity 编译器会识别你的智能合约中的所有函数、事件和错误,并根据它们创建一个 ABI(应用程序二进制接口)。 任何人(链上或链下)都可以在智能合约部署后使用 ABI 与其交互。 你可以将智能合约 ABI 视为合约面向外部世界的接口。 你可以在 artifacts/contracts/Greeter.sol/Greeter.json 中查看你的智能合约的 ABI。

{
  "abi": [\
  {\
    "inputs": [\
    {\
      "internalType": "string",\
      "name": "_greeting",\
      "type": "string"\
    }\
    ],\
    "stateMutability": "nonpayable",\
    "type": "constructor"\
  },\
  {\
    "inputs": [],\
    "name": "greet",\
    "outputs": [\
    {\
      "internalType": "string",\
      "name": "",\
      "type": "string"\
    }\
    ],\
    "stateMutability": "view",\
    "type": "function"\
  },\
  {\
    "inputs": [\
    {\
      "internalType": "string",\
      "name": "_greeting",\
      "type": "string"\
    }\
    ],\
    "name": "setGreeting",\
    "outputs": [],\
    "stateMutability": "nonpayable",\
    "type": "function"\
  }\
  ]
}

你可以在此文件中找到的另一件事是你合约的 bytecode(字节码)。 实际上,编译的主要目的是将 Solidity 源代码转换为 EVM bytecode(字节码),该 bytecode(字节码) 可以存储在基于以太坊的区块链上。 EVM bytecode(字节码) 中的每个指令都可以用数字表示。 这就是为什么生成的 bytecode(字节码) 在基数 16 中表示为长字符串数字的原因。

编译智能合约本质上是将它从人类可读的 Solidity 源代码转换为针对 EVM 执行优化的 bytecode(字节码)。 从功能上讲,两种类型的代码都描述了合约的相同行为。 现在我们已经准备好了 bytecode(字节码),是时候将它放在区块链上供所有人查看和使用了。

3.5. 部署智能合约

对于以太坊智能合约部署,我们需要创建一个简单的 JS script(脚本),它将使用 Tenderly DevNet 来访问区块链并发布我们编译的 bytecode(字节码)。 首先,创建部署 script(脚本)

mkdir scripts && touch scripts/deploy.js

script(脚本) 包含部署智能合约的过程。 它引用我们的配置以获取部署者的私钥。 该 script(脚本) 还针对 Tenderly DevNet 以访问该节点,就像它在主网上运行一样。 部署过程包括签名并发送包含合约 bytecode(字节码)transaction(交易),而不指定接收者。

在部署过程中,合约的地址是根据发送者的地址和当前 nonce(随机数) 确定的,因此它始终是唯一的。 智能合约部署完成后,我们将打印出存储它的地址,以便我们可以检查它并与之交互。

接下来,使用你选择的编辑器编辑部署 script(脚本) scripts/deploy.js


const { ethers } = require("hardhat");
require("dotenv").config();

async function main() {
  // 准备部署者钱包 - 这将基于我们在配置中设置的私钥
  const [deployer] = await ethers.getSigners();

  // 准备提供商 - 这将使我们能够通过 Tenderly DevNet 访问区块链
  provider = new ethers.providers.JsonRpcProvider(process.env.TENDERLY_URL);

  // Greeter 将是已编译合约的 ethers 内部表示
  const Greeter = await ethers.getContractFactory("Greeter", deployer);
  console.log("Deploying Greeter...");

  // greeter 将是我们即将部署的合约的实例
  const greeter = await Greeter.deploy("Hello from Tenderly!");

  // 我们等待部署完成并确认
  await greeter.deployed();
  await greeter.setGreeting("hello");

  // 这将告诉我们合约部署到的地址
  console.log("Greeter deployed to:", greeter.address);
}

// 做这件事!
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

最后,运行 script(脚本)

npx hardhat run –network devnet scripts/deploy.js

script(脚本) 将输出你新部署的合约的地址。 在此示例中,智能合约地址为 0x8E69bC733367D80D758080fD12DFc8e6dBAE5185

但是,由于我们使用了自动合约验证,因此你无需记住该地址。 相反,你的合约会自动添加到 Tenderly 并准备就绪。

运行用于智能合约部署的脚本运行用于智能合约部署的脚本

恭喜!🎉 你的智能合约已启动并运行,并且你已成功将其上传到 Tenderly。你可以在你的 Tenderly DevNet 的合约列表中找到它。

在 Tenderly DevNet 中查找已部署的合约在 Tenderly DevNet 中查找已部署的合约

你现在可以使用许多 Tenderly 功能来优化你的智能合约,减少 gas fees(Gas费) 并调试潜在的错误。 那么,让我们玩得开心吧!

4. 使用 Tenderly DevNets 来获得深入的 transaction(交易) 见解

使用 Tenderly DevNets,你可以深入了解你的智能合约 transactions(交易) 将如何在真实网络上执行,而无需实际使用一个。 而且,如果你想更改智能合约代码或调整一些输入参数,你可以在你的 DevNet 环境中重新模拟 transactions(交易)

因此,通过使用 Tenderly DevNets,你可以:

  • 在开发过程中避免等待并快速试用你的智能合约,而无需实际使用测试 network(网络)
  • 重放失败的 transaction(交易),以更深入地了解其执行情况以及出错的原因,即 发现一个 bug(漏洞)
  • 使用 Tenderly Debugger 详细检查 bug(漏洞) 以检查每行代码并确定问题的确切原因。
  • 尝试、测试和验证你的 bug(漏洞) 修复,以确保你更新后的合约在生产中按预期运行。
  • 使用更新的合约源代码和/或参数模拟 transaction(交易),包括区块号、transaction(交易) 索引、地址、gas(Gas) 和价值。

很酷,对吧?😎 为什么不尝试一下呢?

4.1. 重新模拟已执行的 transactions(交易)

要运行模拟,请选择执行 setGreeting 函数的 Transaction(交易)

在 DevNet 中模拟 transaction(交易) 执行在 DevNet 中模拟 transaction(交易) 执行

接下来,打开你的 DevNet 环境中的 Transaction(交易) 选项卡。 然后,单击屏幕右上角的 Re-Simulate(重新模拟) 按钮。

DevNet 环境中的 Transaction(交易) 概览DevNet 环境中的 Transaction(交易) 概览

这将打开模拟窗口。 在这里,setGreeting 函数已在下拉菜单中选择,并且所有 transaction(交易) 参数都已预先填充。

预填充的模拟参数预填充的模拟参数

现在,你可以通过单击 Simulate Transaction(模拟交易) 来运行模拟。

4.2. 检查模拟输出

接下来,你可以查看你的 transaction(交易) 模拟是否成功执行。 你还可以找到任何相关信息,例如你的 transaction(交易) 使用了多少 gas(Gas)transaction(交易) 索引、nonce(随机数) 和其他详细信息。 通过单击 View input data(查看输入数据),你可以查看 transaction(交易) 输入。

ℹ️

在 DevNets 之上运行模拟不会更改你的环境状态。 它们只是提供了对智能合约行为的深入了解。

这是模拟 transaction(交易) 的输出:

查看 transaction(交易) 模拟输出查看 transaction(交易) 模拟输出

5. 编辑合约源代码

在重新模拟 transaction(交易) 之前,你可以通过单击 Edit Contract Source(编辑合约源代码) 来更改合约源代码。

使用更新的合约源代码运行新的模拟使用更新的合约源代码运行新的模拟

这将打开 Editing Source(编辑源代码) 视图,你可以在其中查看和编辑源代码。

接下来,更改 greet() 函数并将返回值替换为一个字符串。 完成后,单击左下角的 Apply Changes(应用更改) 按钮,然后单击 Simulate Transaction(模拟交易)

编辑智能合约源代码编辑智能合约源代码

同样,你可以在下一个视图中找到有关你的成功的 transaction(交易) 的详细信息。 在输出数据部分中,你将找到添加到源代码的字符串。

查看模拟 transaction(交易) 的新输出查看模拟 transaction(交易) 的新输出

6. 部署你的智能合约以开始试验

只需几个步骤,你就可以学习如何创建和部署智能合约,以及幕后发生的事情。借助 Tenderly 的全栈基础设施,你拥有开发智能合约所需的所有工具。此外,Tenderly DevNets 是 HardHat 的补充,因此你可以轻松地将它们引入你的开发流程中。

准备好升级了吗?尝试构建一个真正的多重签名钱包来发送和保护你的 ETH。首先使用 Tenderly 的全栈基础设施在一个地方构建、测试、优化和监视你的智能合约。因此,开始使用 DevNets 并发现开发和部署智能合约的简便方法。

  • 原文链接: blog.tenderly.co/how-to-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
tenderly
tenderly
江湖只有他的大名,没有他的介绍。