大数跨境
0
0

Ethereum: Hardhat Ignition部署全流程拆解

Ethereum: Hardhat Ignition部署全流程拆解 运维开发与AI实战
2025-08-06
1
导读:当我们直接运行npx hardhat ignition deploy而不指定网络时,Hardhat会为我们临时创建一个内存中的区块链。这个区块链只存在于该命令的生命周期内。

上一篇文章,我们学习了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 #1
    Ignition非常智能,它会将多个部署操作打包成“批次(Batch)”来优化Gas费用和执行效率。对于我们这个简单的部署,所有操作都在一个批次里。
  • Executed LockModule#Lock
    这是最核心的执行记录。它表示Ignition已经成功执行了LockModule模块中定义的、名为Lock的合约部署操作。这个LockModule#Lock是该部署操作的唯一标识符。
  • [ LockModule ] successfully deployed 🚀
    伴随着胜利的火箭图标,Ignition宣告整个LockModule模块已经成功部署完毕。

第三部分:最终成果 - 我们的合约地址

Deployed Addresses
LockModule#Lock - 0x5FbDB2315678afecb367f032d93F642f64180aa3

这是我们最需要关注的结果!

  • LockModule#Lock
    这个标识符再次出现,明确告诉我们下面这个地址对应的是哪个合约。
  • 0x5FbDB2315678afecb367f032d93F642f64180aa3
    这就是我们的Lock智能合约被部署到本地区块链上的地址。 它是这个合约在这个链上的唯一身份标识。

这个地址有什么用?

这个地址是我们与刚刚部署的合约进行交互的唯一入口。我们可以:

  1. 在Hardhat测试中使用它
    编写测试脚本,获取这个地址,然后与合约进行交互来验证其功能。
  2. 在Hardhat Console中使用它

    npx hardhat console --network localhost
    > const lock = await ethers.getContractAt("Lock""0x5FbDB2315678afecb367f032d93F642f64180aa3")
    > await lock.unlockTime() // 调用合约的公共方法
  3. 在我们的DApp前端应用中使用它
    在前端代码(例如使用ethers.js)中,我们可以用这个地址和合约的ABI来创建一个合约实例,从而实现用户与合约的交互。

一个有趣的知识点:在全新的Hardhat Network环境中,第一个部署的合约地址总是0x5FbDB2315678afecb367f032d93F642f64180aa3。这是因为Hardhat的账户和交易Nonce是确定性的,这为测试带来了极大的便利。

总结

这次部署的输出告诉了我们一个完整的故事:我们在一个临时的Hardhat网络环境中,通过Ignition的LockModule模块,成功部署了Lock合约,并获得了它在链上的地址0x5FbDB2315678afecb367f032d93F642f64180aa3。同时,它也友好地提醒我们,如果想让部署结果持久化,记得使用--network localhost

我们已经迈出了坚实的一步,现在,拿着这个合约地址,去探索与智能合约交互的广阔世界吧!

【声明】内容源于网络
0
0
运维开发与AI实战
DevSecOps工程师,分享AI, Web3, Claude code开发的经验与心得。希望能帮大家解决技术难题,提升开发效率!自身从与大家的沟通中获得进步,欢迎留言交流,一起成长!
内容 2386
粉丝 0
运维开发与AI实战 DevSecOps工程师,分享AI, Web3, Claude code开发的经验与心得。希望能帮大家解决技术难题,提升开发效率!自身从与大家的沟通中获得进步,欢迎留言交流,一起成长!
总阅读2.4k
粉丝0
内容2.4k