调试合同
您可以使用 Solidity 控制台日志来调试在模拟的 Hardhat 本地节点上运行的合同。
要调试合同,请将其部署到内置的 Hardhat Local Node 环境,并仅在本地调试分支或临时工作副本中进行所有日志记录更改。
内置的本地环境名为 hardhatnode,并使用链 ID 为 31337 的 http://127.0.0.1:8545。它不是已保存的 Oracle Blockchain Platform 或其他 EVM 环境。当选择它来部署或运行合同并且没有本地节点正在监听时,Blockchain App Builder for Besu 将为所选项目启动 Hardhat 节点并打开 Hardhat 本地节点终端。
- 在包含要检查的代码路径的 Solidity 文件的顶部,添加 Hardhat 控制台导入。
import "hardhat/console.sol"; - 在函数或内部助手中添加临时日志以进行调查。
以下代码显示了常见日志示例。console.log("value", value);
使用与要检查的变量匹配的值类型。这些示例涵盖字符串、地址、整数值和布尔值。使日志语句保持窄和临时;不要记录私钥、验证令牌或其他凭证。console.log("entered transfer"); console.log("caller", msg.sender); console.log("amount", amount); console.log("is allowed", isAllowed); - 在部署/执行表单中,如果需要放弃旧对象,请选择清除,然后选择编译。
- 选择 Hardhat Local Node 作为环境。
- 部署本地合同实例,或使用已部署的本地代理。满足本地网络中特定于项目的部署先决条件,例如治理合同。
- 打开执行窗格,选择本地令牌或帐户代理,输入函数参数,然后选择查询或调用。
Query 完成本地调用, Invoke 发送本地事务处理。可以访问已记录的代码路径,但只有调用会更改模拟的链状态。
- 在 Visual Studio Code 中打开 Hardhat Local Node 终端并检查发出的日志行。
- 删除
hardhat/console.solimport 语句和每个临时console.log语句。 - 在提交代码或使用 Oracle Blockchain Platform Besu、其他 EVM 或生产环境之前,请进行清理和编译。
请勿尝试将仅硬帽检测用于 Oracle Blockchain Platform 或其他 EVM 环境。而是使用普通应用事件、链外事务跟踪或环境认可的可观测性。控制台日志记录不能替代生产诊断。
调试过程故障排除
| 条件 | 解决方法 |
|---|---|
找不到 hardhat/console.sol
|
在所选项目中运行安装依赖项,然后重新编译。导入由项目的 Hardhat 依赖性提供。 |
| 本地节点未启动 | 确认所选项目包含 hardhat.config.ts 或 hardhat.config.js,验证 Node.js 和 npm 是否可用于 Visual Studio Code,并检查 Hardhat Local Node 终端是否存在启动错误。
|
| 未显示日志 | 确认 Hardhat Local Node 是选定的环境,已调用的代码路径到达日志语句,并且您正在查看 Hardhat Local Node 终端而不是 Oracle Blockchain Platform 或项目终端。 |
| 应用程序正在使用旧代码 | 在重新部署或调用之前,先依次选择清除和编译。 |
| 调试后,非本地构建或部署失败 | 删除每个 hardhat/console.sol 导入和 console.log 调用,然后清除并再次编译项目。
|