什么是Solidity控制台日志?

  • Alchemy
  • 发布于 2025-01-18 15:28
  • 阅读 9

本文深入探讨了调试Solidity智能合约的重要性及其主要工具。介绍了如何使用console.log()进行调试,强调了在Hardhat环境中利用Solidity事件进行日志记录,并概述了其他调试工具如Foundry、Truffle和Brownie的功能与应用。适合希望提升Solidity开发技能的程序员。

Brady Werkheiser headshot

Brady Werkheiser 审核

发表于 2022年10月4日,阅读时间6分钟


调试是 学习如何编写 Solidity 智能合约、修复漏洞和解决问题的关键且反复出现的步骤。智能合约中常见的两种开发错误分别是运行时错误和逻辑错误。

利用能够增强开发者理解的工具,可以使开发者体验变得更容易,尤其是在修复程序错误时。类似于 JavaScript 开发,console.log() 函数用于将输出消息返回到网页控制台,这有助于调试过程。

console.log() 接受一个参数(即数组、对象或消息),并将值打印到网页控制台供开发者评估。此方法使开发者可以通过逐步列出代码的输出,导航可能出现的问题。

在本文中,我们将向你展示调试 Solidity 的主要方法,回顾 Hardhat、Foundry、Truffle 和 Brownie 中的调试工具,然后提供调试技巧。

什么是 Solidity 控制台日志?

日志输出到控制台是调试代码的常用工具,console.log() 是 Hardhat 提供的合约库中的一个函数。 输出日志到控制台帮助开发者理解和排除程序中的问题。在 Solidity 中,这被称为事件。

以太坊提供了一种日志功能,可以将数据存储在区块链中的交易日志数据结构中。Solidity 事件提供了该功能的抽象,因为它允许开发者在区块链上输出数据。

由于日志与区块链上的合约地址保持完整,并且可以随着区块访问,Solidity 开发者可以查询和引用特定交易数据。

使用 Solidity 事件的用例

Solidity 事件 可通过多种方法使用,包括测试智能合约、索引交易数据、前端开发的引用等。最常见的是,开发者将事件用于三个用例:

  1. 在智能合约中返回可以在前端使用的值

  2. 作为智能合约的异步触发器,发出一个事件以触发前端执行某个操作

  3. 更便宜的存储形式,因为数据存储在交易日志中。

在事件中,参数可以指定为索引或非索引。如果合约经过验证,日志中的交易数据将视为编码形式,否则它将显示为非索引或哈希形式。

在其他情况下,如果开发过程发生在支持环境中,例如 Hardhat,那么可以在事件之外使用 console.log() 函数,其功能与 JavaScript 开发类似。

为什么控制台日志重要?

控制台日志作为开发者在智能合约调试过程中的必要工具。 控制台日志是程序测试环境(控制台)与用于输出数据的函数(log())的结合。

从本质上讲,控制台日志提供了程序在测试环境中的输出,可以用于开发和调试过程。如果程序中出现错误或问题,控制台日志将作为检查代码和识别 bug 根本原因的主要步骤。

在编写 Solidity 智能合约 过程中,控制台日志同样是一个有效的调试步骤,用于提取代码并理解逻辑。

Solidity 中的日志是如何工作的?

日志,别名事件观察协议或事件,是由交易和区块生成的信号,用于提供智能合约无法获得的信息。

Solidity 具有“事件”的概念。事件可以在智能合约函数中发出,最多可以有 0 到 4 个主题,这些主题是索引的,以便快速查找。在 Solidity 中,使用 'emit' 关键字来发出事件。这被翻译成 EVM 的一种操作码,即 LOG0、LOG1、... 、LOG4。

由于合约数据存储在 States trie 中,而事件数据存储在 Transaction Receipts trie 中,智能合约无法读取事件数据。

交易数据或日志条目包括:

  • 地址 - 合约的地址

  • 主题 - 事件的索引值

  • 数据 - ABI 编码值或事件的非索引值

Hardhat 中的 Solidity 调试工具

Hardhat 是一个以太坊开发环境,专注于让开发者能够在本地开发 Solidity 智能合约,并为他们提供必要的 Solidity 调试工具。

Hardhat 提供了一整套测试、编译、部署和调试 dApp 的工具。通过利用 Hardhat 网络,开发者可以从本地机器创建、编译和部署智能合约,使用 Solidity 接口

1. Console.log

在 Hardhat 网络中,可以使用 console.log() 函数作为可靠的工具,直接从 Solidity 代码中输出日志消息和提取详细信息。Hardhat 网络旨在提供灵活和全面的执行检查,无论交易是否失败。

如何打印到 Solidity 控制台日志

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 的控制台日志工具。

2. Solidity 堆栈跟踪

Hardhat 的堆栈跟踪工具结合了 JavaScript 和 Solidity,在交易发生或调用失败时提供报告。这种自动化错误报告为开发者提供了有价值的信息,以评估和调试他们的智能合约。

3. 显式错误

Hardhat 提供了多种可能的错误,帮助开发者简化调试过程,包括:

  • 通用

  • 网络

  • 任务定义

  • 参数

  • 依赖关系解析

  • 内置任务

  • 工件

  • 插件

  • 内部

  • 源名称

  • 合约名称

Solidity 控制台日志提示:使用事件和函数来改进调试

事件可以用于将交易日志中的数据输出到控制台,适用于调试和生产阶段。事件作为一个标记,用于指示某个过程是否发生。此外,事件还会指示特定步骤是否出现问题。这样的过程类似于 Solidity 中的 “require” 关键字,用于检查条件是否为真,并仅在所需条件为真时允许代码流动。

要开始使用事件和函数来改进调试,请创建一个正确定义的事件并在函数中发出该事件。这两个步骤确保一旦调用函数,事件就会发生。

其他 Solidity 控制台日志工具

尽管 Hardhat 是行业标准的 Solidity 开发工具,用于构建、测试和调试智能合约,但还有一些替代工具可用于故障排除 Solidity 代码,包括 Foundry、Truffle 和 Brownie。

1. Foundry

Foundry 提供了一套以太坊智能合约开发工具,能够管理依赖关系、编译智能合约、部署、测试和链上交互。

Foundry 工具包可以与 Hardhat 集成,以利用其 console.log() 函数进行调试过程。开发者可以使用多达 4 个参数调用此函数,包括 uint、string、bool 和 address。

Forge

Forge 是一个与 Foundry 集成的命令行工具(CLI),用于测试、构建和部署智能合约。此测试框架使开发者能够使用 JavaScript 或 TypeScript 创建 Solidity 测试,并解锁调试过程中的众多功能。

forge test 命令自动化 Solidity 测试,并进一步提供结果摘要,包括日志和堆栈跟踪。forge debug 命令也是一个互动调试器,以脚本形式审核单个智能合约,以识别程序中的任何错误。

Cast

Cast 是一个与以太坊 RPC 调用进行交互的命令行工具(CLI)。这包括智能合约调用、交易或通过命令行检索链数据。

Anvil

Anvil 是与 Foundry 集成的本地测试网络节点,用于从前端进行智能合约的部署和测试,或通过与 EVM(以太坊虚拟机)兼容的网络的 RPC(远程过程调用)交互进行测试。

2. Truffle

Truffle 提供了三种以太坊智能合约开发者工具:一种开发环境、一个测试框架和区块链的资产管道。Truffle 的综合生态系统为开发者提供了多种工具,以创建、测试和调试端到端的去中心化应用程序(dApp)。

Truffle 提供的工具集包括:

  • 智能合约工具包 - 编译、链接、部署等。

  • 调试 - 断点、变量分析、步骤功能、自动化合约测试

  • 管理 - 网络、包、迁移框架

了解更多: https://trufflesuite.com/docs/truffle/

3. Brownie

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

了解 Alchemy University 的 Solidity 控制台日志

本文已向你介绍了开发 Solidity 智能合约时最流行的日志和调试工具。如果你正在学习 Solidity,选择最好的智能合约调试工具对解决你在 Solidity 开发中遇到的问题至关重要。

要开始或加速你的 Solidity 开发培训,请探索 Alchemy University 的免费 7 周 Solidity 开发者训练营,本课程最初是由 ChainShot 教授的价值 3,000 美元的认证课程,现在已与 Alchemy 完全整合!如果你是开发新手,Alchemy 的 3 周 JavaScript 速成课程 是在开始以太坊训练营前的绝佳前置课程。

超强功能 | Alchemy | Substack

超强功能

来自 Web3 顶尖开发平台的最新消息

由 Alchemy 发布 · 超过 111,000 名订阅者

订阅

订阅即表示你同意 Substack 的使用条款我们的隐私政策我们的信息收集通知

Substack

加入 Alchemy University,开始免费学习 Solidity 开发 立即注册

📚 目录


  • 什么是 Solidity 控制台日志?
  • Hardhat 中的 Solidity 调试工具
  • 其他 Solidity 控制台日志工具
  • 了解 Alchemy University 的 Solidity 控制台日志

分享:

概述卡片背景图

相关概述

精选内容卡片覆盖\ \ 学习 Solidity\ \ Solidity 中的 selfdestruct 是什么?\ \ 它是什么、如何工作以及如何开始 精选内容卡片覆盖\ \ 学习 Solidity\ \ 学习 Solidity 开发的 7 个最佳课程 (2024)\ \ 探索最佳免费和付费课程学习 Solidity 开发 精选内容卡片覆盖\ \ 学习 Solidity\ \ 什么是 Solidity 数组?\ \ 你开始使用 Solidity 数组的指南——函数、声明和故障排除

桌面区背景图

构建区块链魔法

Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区和传奇支持结合在一起。

获取你的 API 密钥

  • 原文链接: alchemy.com/overviews/so...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Alchemy
Alchemy
江湖只有他的大名,没有他的介绍。