本文深入探讨了调试Solidity智能合约的重要性及其主要工具。介绍了如何使用console.log()
进行调试,强调了在Hardhat环境中利用Solidity事件进行日志记录,并概述了其他调试工具如Foundry、Truffle和Brownie的功能与应用。
调试是 学习如何编写 Solidity 智能合约、修复漏洞和解决问题的关键且反复出现的步骤。智能合约中常见的两种开发错误分别是运行时错误和逻辑错误。
利用能够增强开发者理解的工具,可以使开发者体验变得更容易,尤其是在修复程序错误时。类似于 JavaScript 开发,console.log()
函数用于将输出消息返回到网页控制台,这有助于调试过程。
console.log()
接受一个参数(即数组、对象或消息),并将值打印到网页控制台供开发者评估。此方法使开发者可以通过逐步列出代码的输出,导航可能出现的问题。
在本文中,我们将向你展示调试 Solidity 的主要方法,回顾 Hardhat、Foundry、Truffle 和 Brownie 中的调试工具,然后提供调试技巧。
日志输出到控制台是调试代码的常用工具,console.log()
是 Hardhat 提供的合约库中的一个函数。 输出日志到控制台帮助开发者理解和排除程序中的问题。在 Solidity 中,这被称为事件。
以太坊提供了一种日志功能,可以将数据存储在区块链中的交易日志数据结构中。Solidity 事件提供了该功能的抽象,因为它允许开发者在区块链上输出数据。
由于日志与区块链上的合约地址保持完整,并且可以随着区块访问,Solidity 开发者可以查询和引用特定交易数据。
Solidity 事件 可通过多种方法使用,包括测试智能合约、索引交易数据、前端开发的引用等。最常见的是,开发者将事件用于三个用例:
在智能合约中返回可以在前端使用的值
作为智能合约的异步触发器,发出一个事件以触发前端执行某个操作
更便宜的存储形式,因为数据存储在交易日志中。
在事件中,参数可以指定为索引或非索引。如果合约经过验证,日志中的交易数据将视为编码形式,否则它将显示为非索引或哈希形式。
在其他情况下,如果开发过程发生在支持环境中,例如 Hardhat,那么可以在事件之外使用 console.log()
函数,其功能与 JavaScript 开发类似。
控制台日志作为开发者在智能合约调试过程中的必要工具。 控制台日志是程序测试环境(控制台)与用于输出数据的函数(log())的结合。
从本质上讲,控制台日志提供了程序在测试环境中的输出,可以用于开发和调试过程。如果程序中出现错误或问题,控制台日志将作为检查代码和识别 bug 根本原因的主要步骤。
在编写 Solidity 智能合约 过程中,控制台日志同样是一个有效的调试步骤,用于提取代码并理解逻辑。
日志,别名事件观察协议或事件,是由交易和区块生成的信号,用于提供智能合约无法获得的信息。
Solidity 具有“事件”的概念。事件可以在智能合约函数中发出,最多可以有 0 到 4 个主题,这些主题是索引的,以便快速查找。在 Solidity 中,使用 'emit' 关键字来发出事件。这被翻译成 EVM 的一种操作码,即 LOG0、LOG1、... 、LOG4。
由于合约数据存储在 States trie 中,而事件数据存储在 Transaction Receipts trie 中,智能合约无法读取事件数据。
交易数据或日志条目包括:
地址 - 合约的地址
主题 - 事件的索引值
数据 - ABI 编码值或事件的非索引值
Hardhat 是一个以太坊开发环境,专注于让开发者能够在本地开发 Solidity 智能合约,并为他们提供必要的 Solidity 调试工具。
Hardhat 提供了一整套测试、编译、部署和调试 dApp 的工具。通过利用 Hardhat 网络,开发者可以从本地机器创建、编译和部署智能合约,使用 Solidity 接口。
在 Hardhat 网络中,可以使用 console.log()
函数作为可靠的工具,直接从 Solidity 代码中输出日志消息和提取详细信息。Hardhat 网络旨在提供灵活和全面的执行检查,无论交易是否失败。
Solidity 控制台日志可以以类似 JavaScript 的结构打印。一旦完成导入,可以在函数内使用 console.log()
函数打印特定的输出,这取决于智能合约的上下文。以下代码概述了整个过程。
首先,将 hardhat/console.sol 导入智能合约
复制
pragma solidity ^0.8.9;
import "hardhat/console.sol";
contract BookStore {
//...
}
接下来,将 console.log()
函数添加到智能合约中的特定函数:
复制
function transfer(address to, uint256 amount) external {
require(balances[msg.sender] >= amount, "Not enough tokens");
console.log(
"Transferring %s tokens to %s",
amount,
to,
msg.sender
);
balances[msg.sender] -= amount;
balances[to] += amount;
emit Transfer(amount, to, msg.sender);
}
注意:只有在将 hardhat/console.sol 导入智能合约后,才能使用 Hardhat 的控制台日志工具。
Hardhat 的堆栈跟踪工具结合了 JavaScript 和 Solidity,在交易发生或调用失败时提供报告。这种自动化错误报告为开发者提供了有价值的信息,以评估和调试他们的智能合约。
Hardhat 提供了多种可能的错误,帮助开发者简化调试过程,包括:
通用
网络
任务定义
参数
依赖关系解析
内置任务
工件
插件
内部
源名称
合约名称
事件可以用于将交易日志中的数据输出到控制台,适用于调试和生产阶段。事件作为一个标记,用于指示某个过程是否发生。此外,事件还会指示特定步骤是否出现问题。这样的过程类似于 Solidity 中的 “require” 关键字,用于检查条件是否为真,并仅在所需条件为真时允许代码流动。
要开始使用事件和函数来改进调试,请创建一个正确定义的事件并在函数中发出该事件。这两个步骤确保一旦调用函数,事件就会发生。
尽管 Hardhat 是行业标准的 Solidity 开发工具,用于构建、测试和调试智能合约,但还有一些替代工具可用于故障排除 Solidity 代码,包括 Foundry、Truffle 和 Brownie。
Foundry 提供了一套以太坊智能合约开发工具,能够管理依赖关系、编译智能合约、部署、测试和链上交互。
Foundry 工具包可以与 Hardhat 集成,以利用其 console.log() 函数进行调试过程。开发者可以使用多达 4 个参数调用此函数,包括 uint、string、bool 和 address。
Forge 是一个与 Foundry 集成的命令行工具(CLI),用于测试、构建和部署智能合约。此测试框架使开发者能够使用 JavaScript 或 TypeScript 创建 Solidity 测试,并解锁调试过程中的众多功能。
forge test
命令自动化 Solidity 测试,并进一步提供结果摘要,包括日志和堆栈跟踪。forge debug
命令也是一个互动调试器,以脚本形式审核单个智能合约,以识别程序中的任何错误。
Cast 是一个与以太坊 RPC 调用进行交互的命令行工具(CLI)。这包括智能合约调用、交易或通过命令行检索链数据。
Anvil 是与 Foundry 集成的本地测试网络节点,用于从前端进行智能合约的部署和测试,或通过与 EVM(以太坊虚拟机)兼容的网络的 RPC(远程过程调用)交互进行测试。
Truffle 提供了三种以太坊智能合约开发者工具:一种开发环境、一个测试框架和区块链的资产管道。Truffle 的综合生态系统为开发者提供了多种工具,以创建、测试和调试端到端的去中心化应用程序(dApp)。
Truffle 提供的工具集包括:
智能合约工具包 - 编译、链接、部署等。
调试 - 断点、变量分析、步骤功能、自动化合约测试
管理 - 网络、包、迁移框架
了解更多: https://trufflesuite.com/docs/truffle/
Brownie 是一个基于 Python 的以太坊智能合约开发和测试框架,支持 Solidity 和 Vyper,分为 4 个类别:测试、调试、交互和部署。每个步骤都支持开发者创建灵活的程序。
开发者可以访问各种调试工具,以收集有关交易失败的详细信息,并定位、复制和排除 Solidity 错误。
TransactionReceipt.revert_ms - 获取交易失败的直接解释信息
TransactionReceipt.error() - 定位交易失败的智能合约的根本原因和部分
TransactionReceipt.events - 查看在回退交易中触发的事件
TransactionReceipt.trace - 查看包含交易信息的字典列表
TransactionReceipt.call_trace() - 查看交易步骤的完整映射(跟踪)
开发者还可以利用 pytest 进行智能合约的单元测试,然后查看提供的 堆栈跟踪 报告。
了解更多: https://eth-brownie.readthedocs.io/en/v1.2.1/index.html
本文已向你介绍了开发 Solidity 智能合约时最流行的日志和调试工具。如果你正在学习 Solidity,选择最好的智能合约调试工具对解决你在 Solidity 开发中遇到的问题至关重要。
- 原文链接: alchemy.com/overviews/so...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!