连接到公共测试网络
我们将使用*公共测试网络*(也称为 testnets),这些网络与以太坊主网络类似,但其中的 Ether 没有价值并且可以免费获得 - 这使得它们成为零成本测试合约的理想选择。
在本指南中,我们将使用我们最喜欢的 Box
合约,并将其部署到测试网,同时学习:
请记住,部署到公共测试网络是开发 Ethereum 项目的必要步骤。它们提供了一个安全的测试环境,可以密切模拟主网络 - 您不希望在错误会花费您和您的用户金钱的网络中进行项目试运行!
可用的测试网络
有许多测试网络可供选择,每个网络都有自己的特点。 建议用于测试去中心化应用程序和智能合约的网络是 Sepolia。(id=11155111)
每个网络都由一个数字 ID 标识。 本地网络通常具有较大的随机值,而 id=1 保留给 Ethereum 主网络。 |
将项目连接到公共网络
要将我们的项目连接到公共测试网,我们需要:
访问测试网节点
虽然您可以启动您自己的 Ethereum 节点 连接到测试网,但访问测试网的最简单方法是通过公共节点服务,例如 Alchemy 或 Infura。 Alchemy 和 Infura 通过免费和付费计划提供对所有测试网和主网络的公共节点的访问。
当一个节点可以被公众访问并且不管理任何帐户时,我们说该节点是_公共的_。 这意味着它可以回复查询并中继签名交易,但不能自行签署交易。 |
在本指南中,我们将使用 Alchemy,但您可以使用 Infura 或您选择的其他公共节点提供商。
前往 Alchemy(包括推荐代码),注册并记下您分配的 API 密钥 - 我们稍后将使用它连接到网络。
创建一个新帐户
要在测试网中发送交易,您需要一个新的 Ethereum 帐户。 有很多方法可以做到这一点:这里我们将使用 mnemonics
包,它将输出一个新的助记词(一组 12 个单词),我们将使用它来派生我们的帐户:
$ npx mnemonics
drama film snack motion ...
请务必保护好您的助记词。 不要将密码提交到版本控制。 即使只是为了测试目的,仍然会有恶意用户为了好玩而破坏您的测试网部署! |
配置网络
由于我们使用的是公共节点,因此我们需要在本地签署所有交易。 我们将使用我们的助记词和 Alchemy 端点配置网络。
这部分假设您已经设置了一个项目。 如果您还没有,请前往 设置 Solidity 项目指南。 |
我们需要使用与测试网的新网络连接更新我们的配置文件。 这里我们将使用 Sepolia,但您可以使用您想要的任何一个:
// hardhat.config.js
+ const { alchemyApiKey, mnemonic } = require('./secrets.json');
...
module.exports = {
+ networks: {
+ sepolia: {
+ url: `https://eth-sepolia.g.alchemy.com/v2/${alchemyApiKey}`,
+ accounts: { mnemonic: mnemonic },
+ },
+ },
...
};
有关配置选项的信息,请参阅 Hardhat 网络配置文档。 |
请注意,在第一行中,我们正在从 secrets.json
文件中加载项目 ID 和助记词,该文件应如下所示,但使用您自己的值。 确保对其进行 .gitignore
,以确保您不会将密码提交到版本控制!
{
"mnemonic": "drama film snack motion ...",
"alchemyApiKey": "JPV2..."
}
除了 secrets.json 文件,您可以使用您喜欢的任何密码管理解决方案来管理您的项目。 一个流行且简单的选择是使用 dotenv 将密码作为环境变量注入。
|
我们现在可以通过列出我们可用于 Sepolia 网络的帐户来测试此配置是否有效。 请记住,您的帐户会有所不同,因为它们取决于您使用的助记词。
$ npx hardhat console --network sepolia
Welcome to Node.js v20.17.0.
Type ".help" for more information.
> accounts = (await ethers.getSigners()).map(signer => signer.address)
[
'0x6B1c3A2f2160a7Cb2ebc7Fc861b8dB71476C30E7',
'0xC1310ade58A75E6d4fCb8238f9559188Ea3808f9',
...
]
我们还可以通过查询我们的帐户余额来测试与节点的连接。
> (await ethers.provider.getBalance(accounts[0])).toString()
'0'
空空如也! 这指向我们的下一个任务:获取测试网资金,以便我们可以发送交易。
为测试网帐户充值
大多数公共测试网都有一个水龙头:一个可以免费为您提供少量测试 Ether 的网站。 如果您在 Sepolia 上,请前往 Alchemy 的免费 Sepolia 水龙头、https://www.infura.io/faucet[Infura 的免费 Sepolia 水龙头] 或 Google 的免费 Sepolia 水龙头 以获取免费的 testETH。
有了资金充足的帐户,让我们将我们的合约部署到测试网!
在测试网上工作
通过配置为在公共测试网上工作的项目,我们现在终于可以 部署我们的 Box
合约了。 此处的命令与您在 本地开发网络上完全相同,尽管由于需要挖掘新区块,因此需要几秒钟才能运行。
$ npx hardhat run --network sepolia scripts/deploy.js
Deploying Box...
Box deployed to: 0x1b99CCaCea0e4046db618770dEF72180F8138641
就这样! 您的 Box
合约实例将永远存储在测试网中,并且对任何人公开。
您可以在区块浏览器(例如 Etherscan)上查看您的合约。 请记住访问您部署合约的测试网上的浏览器,例如 Sepolia 的 sepolia.etherscan.io。
您可以在 此处查看我们在上面的示例中部署的合约以及发送给它的所有交易。 |
$ npx hardhat console --network sepolia
Welcome to Node.js v20.17.0.
Type ".help" for more information.
> const Box = await ethers.getContractFactory('Box');
undefined
> const box = await Box.attach('0x1b99CCaCea0e4046db618770dEF72180F8138641');
undefined
> await box.store(42);
{
hash: '0x330e331d30ee83f96552d82b7fdfa6156f9f97d549a612eeef7283d18b31d107',
...
> (await box.retrieve()).toString()
'42'
请记住,每次交易都会花费一些 Gas,因此您最终需要用更多资金来补充您的帐户。
后续步骤
在公共测试网上彻底测试您的应用程序后,您就可以进行开发过程的最后一步了:在生产环境中部署您的应用程序。