Truffle 已支持 Solidity 智能合约中 的console.log

  • ConsenSys
  • 更新于 2023-02-07 10:08
  • 阅读 2990

发布了 console.sol 库,并更新了Ganache,使其能够解析并自动记录对 console.sol的 调用,以便像 JavaScript 的 console.log 一样实现标准化输出。

如果你在 Solidity 之前使用的是流行的编程语言 JavaScript,那么有可能会在调试 Solidity 智能合约时遇到困难。之前你可能在代码中遇到了一些错误,一个简单的 console.log() 就可以解决,但由于 Solidity 没有内置的方法,现在您不得不寻找其他替代方法来修复这个错误。

为了解决 Ganache 用户的这个问题,我们发布了 console.sol 库,并更新了Ganache,使其能够解析并自动记录对 console.sol的 调用,以便像 JavaScript 的 console.log 一样实现标准化输出。

要在开发和测试期间将 Ganache 的 console.sol 与 Truffle 一起使用,你必须启动一个独立的 Ganache 实例并连接 Truffle。这也意味着你的智能合约的日志输出将被发送到 Ganache 终端。

由于 Truffle 有自己的内置 Ganache 实例,可以在运行 truffle develop 时轻松访问它。我们决定更进一步,直接在 Truffle 中实现 Ganache 对 console.log 的支持。

你不再需要手动安装任何软件包或运行一个单独的 Ganache 实例来获得日志功能。日志输出也会被发送到 Truffle 终端。

安装

要遵循本文的内容,需要具备以下条件:

Node.js

Windows, Linux, 或 macOSIt 

建议使用 Node 版本管理器下载 Node.js,以避免使用 sudo 下载 Truffle 造成的权限错误。按照这里的说明,为操作系统下载一个 Node 版本管理器。

在安装了 Node.js 后,可以通过先全局卸载 Truffle,然后像这样安装最新版本来进行升级。

npmuninstall-gtruffle
npminstall-gtruffle

只有当你的机器上没有安装早先版本的 Truffle 时才运行 npm install -g truffle

配置

有两个配置选项可以用来调整 console.log 功能的行为,这两个选项都可以在 truffle 配置文件中设置,即 truffle-config.js。它们是:

  1. solidityLog.displayPrefix: 这个选项设置了每个 console.log 行的前缀。默认是""。如果您想将 console.log 输出与额外的冗长文本输出区分开来,这是一个有用的选项。

  2. solidityLog.preventConsoleLogMigration: 这个选项是一个安全措施,防止意外地将使用 console.log 的合约迁移到 MAINNET。它在默认情况下被设置为 false,所以你必须手动将其设置为 true。

module.exports = {
  . . .
  solidityLog: {
    displayPrefix: ' :', // defaults to ""
    preventConsoleLogMigration: true, // defaults to false
  }

使用方法

要在 Solidity 合约中使用 console.log,需要导入 truffle/console.sol 库,并按照下面的代码示例来使用它。请注意,当你运行 truffle testtruffle develop 时,这些日志将出现在你的终端。

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;
import "truffle/console.sol";

contract SampleContract {
    address public admin;

    constructor(address _admin) {
        console.log("SampleContract::constructor\n\tadmin: %o", _admin);
        admin = _admin;
    }
}

SampleContract 的迁移文件:

// 1_migration_file.js
const SampleContract = artifacts.require(“SampleContract”);

module.exports = function(deployer, network, accounts){
    const admin = accounts[0];
    deployer.deploy(sampleContract, admin);
}

现在,如果你运行 Truffle develop ,然后再运行 migrate,会看到在 truffle develop 控制台中打印出以下内容:

console.log output

这也适用于当你用 truffle test命令运行 Truffle 测试用例时,智能合约代码中的 console.log 语句的输出将在您的终端上与测试结果一起显示。

如你所见,用法与 Node.js 的 console.log 方法非常相似,它返回一个格式化的字符串,并使用第一个参数作为类似 printf 的格式字符串,其中可以包含零个或多个格式指定符。

每个指定符都被替换成相应参数的转换值。一些支持的指定符包括: 

  • %s 代表字符串

  • %d 代表数字

  • %j 代表JSON,还有更多,详见 Nodejs 的 util.format() 文档

结论

在 Truffle,我们一直致力于通过创建开发者工具、资源和教育材料,来改善和简化 Web3 生态系统中应用程序开发者的用户体验。

要了解有关我们的开发者工具套件的更多信息,请访问 Truffle 官方网站。如果您有问题,请随时在 Truffle Github Discussions上展开讨论。

原文链接:https://trufflesuite.com/blog/truffle-now-supports-console-logging-in-solidity-smart-contract/

本文首发于:https://mp.weixin.qq.com/s/Rzqi5ndulxEArmRhLJme1w

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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