上一篇文章,我们学习了hardhat ignition 的声明式部署特性,接下来我们详细拆解一次成功部署的结果,彻底明白背后发生的一切。
恭喜!我们的合约已成功发射!
首先,最重要的一点:我们已经成功地将Lock智能合约部署到了一个本地区块链上! npx hardhat ignition deploy 命令顺利完成了它的使命。现在,让我们像侦探一样,逐行分析这份“部署报告”。
# 警告信息:关于部署环境
You are running Hardhat Ignition against an in-process instance of Hardhat Network.
This will execute the deployment, but the results will be lost.
You can use --network <network-name> to deploy to a different network.
# 部署过程日志
Hardhat Ignition 🚀
Deploying [ LockModule ]
Batch #1
Executed LockModule#Lock
[ LockModule ] successfully deployed 🚀
# 最终部署结果
Deployed Addresses
LockModule#Lock - 0x5FbDB2315678afecb367f032d93F642f64180aa3
第一部分:重要警告 - 理解我们的“一次性”沙盒
You are running Hardhat Ignition against an in-process instance of Hardhat Network.
This will execute the deployment, but the results will be lost.
这是整个输出中最需要注意的提示信息。
- 它说了什么?
我们正在对一个“进程内(in-process)”的Hardhat Network实例进行部署。部署会成功,但一旦命令执行完毕,所有结果(包括我们部署的合约)都会丢失。 - 这是什么意思?
当我们直接运行 npx hardhat ignition deploy而不指定网络时,Hardhat会为我们临时创建一个内存中的区块链。这个区块链只存在于该命令的生命周期内。命令结束,区块链和上面的所有数据(我们的合约)就烟消云散了。这非常适合快速、一次性的脚本测试。 - 解决方案是什么?
正如提示所说 You can use --network <network-name> ...。如果我们希望部署的合约能够“存活”下来,方便我们后续进行交互和测试,我们应该先启动一个独立的本地节点:
然后,在另一个终端中,指定网络进行部署:# 终端1: 启动一个持久化的本地节点
npx hardhat node
这样,我们的合约就会被部署到那个持续运行的节点上,不会丢失。# 终端2: 部署到上面启动的节点
npx hardhat ignition deploy ./ignition/modules/Lock.js --network localhostost
Hardhat Ignition 🚀
Deploying [ LockModule ]
Batch #1
Executed LockModule#Lock
[ LockModule ] successfully deployed 🚀
Deployed Addresses
LockModule#Lock - 0x5FbDB2315678afecb367f032d93F642f64180aa3
第二部分:部署过程全记录 - Ignition的“飞行日志”
Hardhat Ignition 🚀
Deploying [ LockModule ]
Batch #1
Executed LockModule#Lock
[ LockModule ] successfully deployed 🚀
这部分是Ignition执行部署任务的实时日志。
Deploying [ LockModule ]Ignition告诉我们,它已经开始处理名为 LockModule的部署模块了。这个名字正是我们在Lock.js文件中通过buildModule("LockModule", ...)定义的。Batch #1Ignition非常智能,它会将多个部署操作打包成“批次(Batch)”来优化Gas费用和执行效率。对于我们这个简单的部署,所有操作都在一个批次里。 Executed LockModule#Lock这是最核心的执行记录。它表示Ignition已经成功执行了 LockModule模块中定义的、名为Lock的合约部署操作。这个LockModule#Lock是该部署操作的唯一标识符。[ LockModule ] successfully deployed 🚀伴随着胜利的火箭图标,Ignition宣告整个 LockModule模块已经成功部署完毕。
第三部分:最终成果 - 我们的合约地址
Deployed Addresses
LockModule#Lock - 0x5FbDB2315678afecb367f032d93F642f64180aa3
这是我们最需要关注的结果!
LockModule#Lock这个标识符再次出现,明确告诉我们下面这个地址对应的是哪个合约。 0x5FbDB2315678afecb367f032d93F642f64180aa3这就是我们的 Lock智能合约被部署到本地区块链上的地址。 它是这个合约在这个链上的唯一身份标识。
这个地址有什么用?
这个地址是我们与刚刚部署的合约进行交互的唯一入口。我们可以:
- 在Hardhat测试中使用它
编写测试脚本,获取这个地址,然后与合约进行交互来验证其功能。 - 在Hardhat Console中使用它
npx hardhat console --network localhost
> const lock = await ethers.getContractAt("Lock", "0x5FbDB2315678afecb367f032d93F642f64180aa3")
> await lock.unlockTime() // 调用合约的公共方法 - 在我们的DApp前端应用中使用它
在前端代码(例如使用 ethers.js)中,我们可以用这个地址和合约的ABI来创建一个合约实例,从而实现用户与合约的交互。
一个有趣的知识点:在全新的Hardhat Network环境中,第一个部署的合约地址总是0x5FbDB2315678afecb367f032d93F642f64180aa3。这是因为Hardhat的账户和交易Nonce是确定性的,这为测试带来了极大的便利。
总结
这次部署的输出告诉了我们一个完整的故事:我们在一个临时的Hardhat网络环境中,通过Ignition的LockModule模块,成功部署了Lock合约,并获得了它在链上的地址0x5FbDB2315678afecb367f032d93F642f64180aa3。同时,它也友好地提醒我们,如果想让部署结果持久化,记得使用--network localhost。
我们已经迈出了坚实的一步,现在,拿着这个合约地址,去探索与智能合约交互的广阔世界吧!

