当前位置: 首页 > news >正文

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

代码地址&#xff1a;https://github.com/ xiangwang1223/disentangled_graph_collaborative_filtering Background&#xff1a; 现有模型在很大程度上以统一的方式对用户-物品关系进行建模(将模型看做黑盒&#xff0c;历史交互作为输入&#xff0c;Embedding作为输出。)&…...

Nginx快速上手

Nginx快速上手 OVERVIEW Nginx快速上手一、基本概念1.Nginx初步认识2.正向/反向代理&#xff08;1&#xff09;正向代理&#xff08;2&#xff09;反向代理 二、Nginx 安装和配置1.安装2.Nginx指令3.Nginx配置 三、Nginx的使用1.Web服务器&#xff08;1&#xff09;静态网页存储…...

【设计模式】实际场景解释策略模式与工厂模式的应用

文章目录 前言策略模式概念场景示例 工厂模式概念场景示例 策略模式与工厂模式的比较相同点不同点 总结 前言 策略模式和工厂模式是常见的设计模式&#xff0c;它们可以帮助我们更好地组织和管理代码&#xff0c;提高代码的可维护性和可扩展性。 在本篇博客中&#xff0c;我将…...

外包干了三年,算是废了...

先说一下自己的情况。大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了三年&#xff0c…...

九龙证券|光模块概念股封单资金超3亿元,传媒板块涨停潮来袭

今天A股三大股指低开低走。沪深两市收盘共37股涨停。剔除4只ST股&#xff0c;合计33股涨停。另外&#xff0c;10股封板未遂&#xff0c;整体封板率为78.72%。 涨停战场&#xff1a; 华工科技封单资金超3亿元 从收盘涨停板封单量来看&#xff0c;同方股份封单量最高&#xff0…...

[ES6] 数组

[ES6] 数组 数组的创建类数组对象可迭代对象的转换 扩展方法findfindIndexfillcopyWithinentrieskeysvaluesincludesflatflatMap 扩展运算符复制数组合并数组 数组缓冲区创建数组缓冲区视图创建 定型数组创建通过数组缓冲区生成通过构造函数 定型数组特性 拷贝浅拷贝深拷贝 数组…...

【问题描述】编写一个程序计算出球、圆柱和圆锥的表面积和体积。

【问题描述】 编写一个程序计算出球、圆柱和圆锥的表面积和体积。 要求&#xff1a; &#xff08;1&#xff09;定义一个基类&#xff0c;至少含有一个数据成员半径&#xff0c;并设为保护成员&#xff1b; &#xff08;2&#xff09;定义基类的派生类球、圆柱、圆锥&#…...

Python 人工智能:16~20

原文&#xff1a;Artificial Intelligence with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如何…...

【华为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是一个开源的分布式版本控制软件&#xff0c;能够有效并高效的处理很小到非常大的项目。 二、添加SSH公钥 安装下载后&#xff0c;会发现鼠标右击&#xff0c;会出现 Git Bash Here 这个选项&#xff0c;如图所示&#xff0c;点击进入 1.打开git窗口后&…...

Ae:自动定向

Ae 菜单&#xff1a;图层/变换/自动定向 Auto-Orient 快捷键&#xff1a;Ctrl Alt O 自动定向 Auto-Orient是 Ae 图层中的一个附加的、隐藏实现&#xff08;不会在时间轴面板上更改属性的值&#xff09;的功能&#xff0c;它可以使得图层自动旋转或改变方向以朝向指定的运动路…...

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文件,访问以下地址&#xff1a; http://localhost:8080/webappName/index.jsp 实际上访问这个index.jsp文件&#xff0c;底层执行的是&#xff1a;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.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…...

算法训练day2:哈希表

哈希表理论基础 哈希表是根据关键码的值而直接进行访问的数据结构。 当我们遇到了要快速判断一个元素是否出现集合里的时候&#xff0c;就要考虑哈希法。 但是哈希法也是牺牲了空间换取了时间&#xff0c;因为我们要使用额外的数组&#xff0c;set或者是map来存放数据&#…...

Git——利用SSH密钥本地仓库上传远程GitHub库

文章目录 1、前言2、详细步骤2.1 创建密钥2.2 进入密钥文件并复制2.3 在GitHub上添加密钥2.4 回到本地仓库文件夹&#xff0c;连接GitHub并上传 3. 结语 1、前言 现在想要从本地设备将本地仓库上传到GitHub上需要用到SSH密钥&#xff0c;接下来讲解大致的步骤&#xff0c;本文默…...

一起读源码 —— Fastjson 的核心方法及其实现原理

源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库&#xff0c;它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本&#xff0c;即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…...

Python实现批量图片下载及去重处理

背景 在爬虫应用开发中&#xff0c;常常需要批量下载图片&#xff0c;并对图片进行去重处理。Python 是一种非常流行的编程语言&#xff0c;也是开发爬虫应用的首选&#xff0c;本文将介绍如何使用 Python 下载图片&#xff0c;并对下载的图片进行去重处理。 内容 首先&…...

【QA】Python代码调试之解决Segmentation fault (core dumped)问题

Python代码调试之解决Segmentation fault 问题 问题描述排查过程1. 定位错误&#xff0c;2. 解决办法 参考资料 问题描述 Python3执行某一个程序时&#xff0c;报Segmentation fault (core dumped)错&#xff0c;且没有其他任何提示&#xff0c;无法查问题。 Segmentation fa…...

C++ 迭代器之旅(Journey of Iterators)

C 迭代器之旅&#xff08;Journey of Iterators&#xff09; 一、引言&#xff08;Introduction&#xff09;C Iterator模板库简介&#xff08;Overview of C Iterator Template Library&#xff09;Iterator的重要性和作用&#xff08;The Importance and Role of Iterators&a…...

使用全球融合CDN的10大优势

根据预估&#xff0c;今年的全球内容交付网络&#xff08;CDN&#xff09;市场预计将达到424亿美元。而由于移动应用程序的激增和人工智能尤其是ChatGPT等相关领域的快速发展将进一步带来CDN市场的快速增长&#xff0c;可以说全球CDN的黄金时代才刚开始。 融合CDN和多CDN战略是…...

前端学习:HTML图像、表格、列表

目录 图像 一、图像标签和源属性(Src) 二、替换文本属性(Alt) 三、设置图片样式基本属性 四、图像标签 表格 一、标签 补充: 二、表格的表头 三、表格常用标签和属性 标签 属性 列表 一、无序列表 二、有序列表 三、定义列表 四、列表常用标签属性 图像 一、…...

202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带

《因思念而沉着》作者巴哑哑&#xff0c;忘了是什么时候加入的书架&#xff0c;昨天下班地铁上读完的书。是美的&#xff01; 部分节选如下&#xff1a; 羽叶茑萝举着熄灭的花青色的小枣落了一地所以哭泣沾染上了你的脸 在没落下 当我们开始生活 就是开始患上了眼疾你独自悲伤…...

M1 M2上能安装上Autocad 2024 Mac 中文版吗 autocad m1 m2版本有啦 终于支持Ventura 13x了

AutoCAD是一款强大的工具&#xff0c;适合于各种领域的设计和绘图。它具有二维图形和三维建模功能、多种文件格式支持、自定义命令和样式、批处理和脚本等特点&#xff0c;可以帮助用户实现高质量的设计和建模。同时&#xff0c;还支持云端存储和共享&#xff0c;方便用户随时随…...

【题解】P4055 [JSOI2009] 游戏

link 题目大意 题目说得比较清楚。 题解 前置知识&#xff1a;二分图最大匹配、基础博弈论。 每个点只能走一次的四联通点阵&#xff0c;可以想到二分图匹配。 将其套路地奇偶分点&#xff0c;相邻两点连边&#xff08;显然不能为 #&#xff09;。 先求一个最大匹配。 …...

P1020 [NOIP1999 普及组] 导弹拦截

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于该系统…...

Makefile学习

什么是Makefile 使用 GCC 编译器在 Linux 进行 C 语言编译&#xff0c;通过在终端执行 gcc 命 令来完成 C 文件的编译&#xff0c;如果我们的工程只有一两个 C 文件还好&#xff0c;需要输入的命令不多&#xff0c;当文件有几十、上百甚至上万个的时候用终端输入 GCC 命令的方…...

2.4 随机变量函数的分布

学习目标&#xff1a; 学习随机变量函数的分布&#xff0c;我会采取以下步骤&#xff1a; 熟悉随机变量的基本概念和分布&#xff1a;在学习随机变量函数的分布之前&#xff0c;需要先掌握随机变量的基本概念和分布&#xff0c;包括离散型随机变量和连续性随机变量的概率密度…...

数据结构【一】:前缀表达式与后缀表达式的区别

在早期计息机系统中&#xff0c;由于没有括号规定运算顺序&#xff0c;因此&#xff0c;依靠出栈和入栈两种方式&#xff0c;限定元素和符号之间的关系确定了前缀表达式和后缀表达式两种运算方式&#xff0c;中缀表达式即为普通的运算表达式&#xff1b;注意&#xff0c;在栈结…...