发布了 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 终端。
要遵循本文的内容,需要具备以下条件:
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。它们是:
solidityLog.displayPrefix: 这个选项设置了每个 console.log 行的前缀。默认是""。如果您想将 console.log 输出与额外的冗长文本输出区分开来,这是一个有用的选项。
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 test
或 truffle 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 控制台中打印出以下内容:
这也适用于当你用 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/
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!