跳到主要内容

在本地区块链节点测试合约

本教程应该让你熟悉使用 Hardhat 启动本地区块链,将样本智能合约部署到本地区块链上,并用 Metamask 和 Remix 与该区块链进行交互。

为什么是本地区块链?

运行本地区块链是非常有用的,因为测试变得非常快速和高效。只有你的机器在运行区块链,因此共识很快,你不必等待其他节点的同步或验证。你还可以使用许多专门为本地测试建立的模块,如 Hardhat console.log,它可以帮助你在合约中添加打印。

构建

为了构建智能合约,我们将使用 Hardhat。Hardhat 是一个 Ethereum 开发环境和框架,为 Solidity 的全栈开发而设计。简单地说,你可以编写你的智能合约,部署它们,运行测试,并调试你的代码。

创建项目

要设置一个 Hardhat 项目,请打开终端并执行这些命令

npm init --yes
npm install --save-dev hardhat

初始化项目

在你安装 Hardhat 的同一目录下运行。

npx hardhat
  • 选择创建一个 JavaScript 项目
  • 对已经指定的 Hardhat 项目根目录按回车键
  • 对于是否要添加.gitignore 的问题按回车键
  • 在 "是否要用 npm @nomicfoundation/hardhat-toolbox 来安装这个样本项目的依赖项 "上按回车键。

现在你已经有一个准备好的 hardhat 项目了!

如果你不是在 mac 上,请做这个额外的步骤,同时安装这些库 :)

安装依赖

npm install --save-dev @nomicfoundation/hardhat-toolbox

并对所有问题按回车键。

下面的代码是一个简单的智能合约。我们将在我们的例子中使用这个智能合约。

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

import "hardhat/console.sol";

contract Greeter {
string private greeting;

constructor(string memory _greeting) {
console.log("Deploying a Greeter with greeting:", _greeting);
greeting = _greeting;
}

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

function setGreeting(string memory _greeting) public {
console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
greeting = _greeting;
}
}

这个契约声明了一个字符串--greeting。还有两个方法和一个构造函数。构造函数用提供的字符串值启动了 greeting 变量。

greet 方法返回问候的字符串。由于这是一个视图函数,它不需要花费任何气体,也不需要签名来执行。

setGreeting 方法用提供的用户值设置问候字符串。由于这是在更新智能合约的状态,所以需要花费气体,并且需要签名。关于 setGreeting 方法的一个有趣的事情是,它使用了 Hardhat 的 console.log 合约,所以我们实际上可以调试并看到问候语被改成了什么值。

现在要真正开始运行你的本地区块链,在你的终端上指向你的目录,执行这个命令。

npx hardhat node

(保持这个终端运行)

这个命令为你启动一个本地区块链节点。你应该能够看到一些已经被 hardhat 资助了 10000ETH 的账户

现在,你可以通过运行 npx hardhat run scripts/deploy.js,继续使用 Hardhat 将合约部署到本地区块链上。

另外,你也可以使用类似 Remix 的东西,让它把合约部署到你的本地区块链上。第二种方法也将涉及设置 Metamask 以与你的本地区块链一起工作,并将使你了解如何使用在本地区块链上运行的合约在本地测试你的 React/Next.js 应用程序,所以让我们这样做。

Metamask 连接

然后点击网络,接着点击 Localhost 8545Image

将链 ID 改为 31337(这是你正在运行的本地区块链的链 ID),然后点击保存 Image

现在你的 MetaMask 已经与你的本地区块链建立了连接,我们现在将添加 Hardhat 给我们的账户。在节点终端,你应该看到显示了几个账户。让我们抓取其中一个。

0 号账户: 0xf39fd6e51aad88f6f4ce6ab8827cfffb92266 (10000 ETH) 私钥。0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

进入 Metamask-->点击你的个人资料-->导入账户。在下拉菜单中选择私钥,并粘贴你希望的账户中的私钥。你现在应该看到一个账户有