substrate中打印调试信息的多种方式详解
目录
- 1. 获取substrate-node-template代码
- 2. 添加一个用于测试的pallet至依赖到pallets目录
- 3. log方式来输出信息
- 3.1 将log依赖添到cargo.toml文件
- 3.2 log-test/src/lib.rs修改call方法
- 3.3 polkadot.js.调用测试函数do_something_log_test
- 4. printable trait方式来输出信息
- 4.1 首选需要将sp_runtime加到[dependencies]
- 4.2 log-test/src/lib.rs修改代码
- 4.3 polkadot.js.调用测试函数cause_error
- 5. 直接使用print方式来输出信息
- 5.1 log-test/src/lib.rs修改call方法
- 5.2 polkadot.js.调用测试函数do_something_log_test
- 6. 使用if_std!方式来输出信息
- 6.1 log-test/src/lib.rs修改代码
- 6.2 polkadot.js.调用测试函数do_something_log_test
1. 获取substrate-node-template代码
https://github.com/substrate-developer-hub/substrate-node-template/
获取代码后切换到 polkadot-v0.9.30 (这是一个tag)
2. 添加一个用于测试的pallet至依赖到pallets目录
对于如何添加一个新的pallet中以参照:添加新的pallet

将template/src/lib.rs的代码copy到log-test/src/lib.rs
3. log方式来输出信息
3.1 将log依赖添到cargo.toml文件
https://crates.io 查看一下可用的版本号

[dependencies]
......
log={version = "0.4.17", default-features = false }[features]
default = ["std"]
std = [
......
"log/std",
]
3.2 log-test/src/lib.rs修改call方法
使用log::info!来输出调试信息
#[pallet::weight(10_000 + T::DbWeight::get().writes(1).ref_time())]
pub fn do_something_log_test(origin: OriginFor<T>, something: u32) -> DispatchResult {let who = ensure_signed(origin)?;log::info!("do_something_log_test-> accountId={:?}, somthing={:?}", who, something);<Something<T>>::put(something);Self::deposit_event(Event::SomethingStored(something, who));Ok(())
}
编译完成后直接运行:
cargo build
./target/debug/node-template --dev
3.3 polkadot.js.调用测试函数do_something_log_test
https://polkadot.js.org/apps/#/extrinsics
选中LogTestMudule模块下的doSomethingLogTest、输入13579然后提交

这时在输出屏幕上可以看到如下信息:

4. printable trait方式来输出信息
4.1 首选需要将sp_runtime加到[dependencies]
[dependencies]
......
sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.30" }[features]
default = ["std"]
std = [
......
"sp-runtime/std",
]
4.2 log-test/src/lib.rs修改代码
mod pallet中引用Printable
#[frame_support::pallet]
pub mod pallet {use sp_runtime::traits::Printable;use sp_runtime::print;......
}
在Error枚举下方,增加Printable对Error的实现
#[pallet::error]pub enum Error<T> {/// Error names should be descriptive.NoneValue,/// Errors should have helpful documentation associated with them.StorageOverflow,}impl<T: Config> Printable for Error<T> {fn print(&self) {match self {Error::NoneValue => "### Printable for Error is NoneValue!!!".print(),Error::StorageOverflow => "### Printable for Error is StorageOverflow!!!".print(),_ => "### Printable for Error is Unknow Reason!!!".print(),}}}
修改cause_error方法、让其调用上述的trait
#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1).ref_time())]pub fn cause_error(origin: OriginFor<T>) -> DispatchResult {let _who = ensure_signed(origin)?;// Read a value from storage.match <Something<T>>::get() {// Return an error if the value has not been set.None => {print(Error::<T>::NoneValue);return Err(Error::<T>::NoneValue.into())},Some(old) => {// Increment the value read from storage; will error in the event of overflow.let new = old.checked_add(1).ok_or({print(Error::<T>::StorageOverflow);Error::<T>::StorageOverflow})?;// Update the value in storage with the incremented result.<Something<T>>::put(new);Ok(())},}}
编译完成后以debug方式运行:
cargo build
RUST_LOG=runtime=debug ./target/debug/node-template --dev
4.3 polkadot.js.调用测试函数cause_error

这时在输出屏幕上可以看到如下Debug信息:

5. 直接使用print方式来输出信息
5.1 log-test/src/lib.rs修改call方法
do_something_log_test来输出调试信息
pub fn do_something_log_test(origin: OriginFor<T>, something: u32) -> DispatchResult {print("### do_something_log_test start...");......
}
编译完成后以debug方式运行:
cargo build
RUST_LOG=runtime=debug ./target/debug/node-template --dev
5.2 polkadot.js.调用测试函数do_something_log_test

这时在输出屏幕上可以看到如下Debug信息:

6. 使用if_std!方式来输出信息
6.1 log-test/src/lib.rs修改代码
mod pallet中引用if_std
#[frame_support::pallet]
pub mod pallet {use sp_std::if_std; ......
}
修改do_something_log_test来输出调试信息
#[pallet::call]impl<T: Config> Pallet<T> {#[pallet::weight(10_000 + T::DbWeight::get().writes(1).ref_time())]pub fn do_something_log_test(origin: OriginFor<T>, something: u32) -> DispatchResult {let who = ensure_signed(origin)?;if_std! {// This code is only being compiled and executed when the `std` feature is enabled.println!("### do_something_log_test Hello native world!");println!("### something value is: {:#?}", something);println!("### The caller account is: {:#?}", who);}<Something<T>>::put(something);Self::deposit_event(Event::SomethingStored(something, who));Ok(())}
编译完成后直接运行:
cargo build
./target/debug/node-template --dev
6.2 polkadot.js.调用测试函数do_something_log_test

这时在输出屏幕上可以看到如下Debug信息:

相关文章:
substrate中打印调试信息的多种方式详解
目录 1. 获取substrate-node-template代码2. 添加一个用于测试的pallet至依赖到pallets目录3. log方式来输出信息3.1 将log依赖添到cargo.toml文件3.2 log-test/src/lib.rs修改call方法 3.3 polkadot.js.调用测试函数do_something_log_test4. printable trait方式来输出信息4.1…...
Disentangled Graph Collaborative Filtering
代码地址:https://github.com/ xiangwang1223/disentangled_graph_collaborative_filtering Background: 现有模型在很大程度上以统一的方式对用户-物品关系进行建模(将模型看做黑盒,历史交互作为输入,Embedding作为输出。)&…...
Nginx快速上手
Nginx快速上手 OVERVIEW Nginx快速上手一、基本概念1.Nginx初步认识2.正向/反向代理(1)正向代理(2)反向代理 二、Nginx 安装和配置1.安装2.Nginx指令3.Nginx配置 三、Nginx的使用1.Web服务器(1)静态网页存储…...
【设计模式】实际场景解释策略模式与工厂模式的应用
文章目录 前言策略模式概念场景示例 工厂模式概念场景示例 策略模式与工厂模式的比较相同点不同点 总结 前言 策略模式和工厂模式是常见的设计模式,它们可以帮助我们更好地组织和管理代码,提高代码的可维护性和可扩展性。 在本篇博客中,我将…...
外包干了三年,算是废了...
先说一下自己的情况。大专生,19年通过校招进入湖南某软件公司,干了接近3年的测试,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了三年,…...
九龙证券|光模块概念股封单资金超3亿元,传媒板块涨停潮来袭
今天A股三大股指低开低走。沪深两市收盘共37股涨停。剔除4只ST股,合计33股涨停。另外,10股封板未遂,整体封板率为78.72%。 涨停战场: 华工科技封单资金超3亿元 从收盘涨停板封单量来看,同方股份封单量最高࿰…...
[ES6] 数组
[ES6] 数组 数组的创建类数组对象可迭代对象的转换 扩展方法findfindIndexfillcopyWithinentrieskeysvaluesincludesflatflatMap 扩展运算符复制数组合并数组 数组缓冲区创建数组缓冲区视图创建 定型数组创建通过数组缓冲区生成通过构造函数 定型数组特性 拷贝浅拷贝深拷贝 数组…...
【问题描述】编写一个程序计算出球、圆柱和圆锥的表面积和体积。
【问题描述】 编写一个程序计算出球、圆柱和圆锥的表面积和体积。 要求: (1)定义一个基类,至少含有一个数据成员半径,并设为保护成员; (2)定义基类的派生类球、圆柱、圆锥&#…...
Python 人工智能:16~20
原文:Artificial Intelligence with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何…...
【华为OD机试真题】最优资源分配(javapython)
最优资源分配 知识点数组贪心Q时间限制:1s空间限制:32MB限定语言:不限 题目描述: 某块业务芯片最小容量单位为1.25G,总容量为M1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为1.251=1.25G 配置B:占用容量为1.252=2…...
git的使用——操作流程
一、什么是git git是一个开源的分布式版本控制软件,能够有效并高效的处理很小到非常大的项目。 二、添加SSH公钥 安装下载后,会发现鼠标右击,会出现 Git Bash Here 这个选项,如图所示,点击进入 1.打开git窗口后&…...
Ae:自动定向
Ae 菜单:图层/变换/自动定向 Auto-Orient 快捷键:Ctrl Alt O 自动定向 Auto-Orient是 Ae 图层中的一个附加的、隐藏实现(不会在时间轴面板上更改属性的值)的功能,它可以使得图层自动旋转或改变方向以朝向指定的运动路…...
ClickHouse入门详解
ClickHouse基础部分详解 一、ClickHouse简介二、ClickHouse单机版安装2.1、ClickHouse安装前准备环境2.2、ClickHouse单机安装2.3、ClickHouse一些默认路径2.4、ClickHouse端口说明 三、ClickHouse数据类型四、ClickHouse的表引擎4.1 MergeTree4.1.1 partition by 分区 五、Cli…...
javaweb笔记2
JSP 1、在webapp的根目录下新建一个index.jsp文件,访问以下地址: http://localhost:8080/webappName/index.jsp 实际上访问这个index.jsp文件,底层执行的是:index_jsp.class这个程序。 这个index.jsp会被tomcat翻译成index_jsp.j…...
【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透」
文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助,比如…...
算法训练day2:哈希表
哈希表理论基础 哈希表是根据关键码的值而直接进行访问的数据结构。 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据&#…...
Git——利用SSH密钥本地仓库上传远程GitHub库
文章目录 1、前言2、详细步骤2.1 创建密钥2.2 进入密钥文件并复制2.3 在GitHub上添加密钥2.4 回到本地仓库文件夹,连接GitHub并上传 3. 结语 1、前言 现在想要从本地设备将本地仓库上传到GitHub上需要用到SSH密钥,接下来讲解大致的步骤,本文默…...
一起读源码 —— Fastjson 的核心方法及其实现原理
源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库,它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本,即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…...
Python实现批量图片下载及去重处理
背景 在爬虫应用开发中,常常需要批量下载图片,并对图片进行去重处理。Python 是一种非常流行的编程语言,也是开发爬虫应用的首选,本文将介绍如何使用 Python 下载图片,并对下载的图片进行去重处理。 内容 首先&…...
【QA】Python代码调试之解决Segmentation fault (core dumped)问题
Python代码调试之解决Segmentation fault 问题 问题描述排查过程1. 定位错误,2. 解决办法 参考资料 问题描述 Python3执行某一个程序时,报Segmentation fault (core dumped)错,且没有其他任何提示,无法查问题。 Segmentation fa…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
EC2安装WebRTC sdk-c环境、构建、编译
1、登录新的ec2实例,证书可以跟之前的实例用一个: ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境: https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...
