当前位置: 首页 > 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…...

通过Nodejs快速为Web应用接入多模型AI能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Nodejs快速为Web应用接入多模型AI能力 现代Web应用对智能交互能力的需求日益增长&#xff0c;无论是客服对话、内容辅助生成还…...

ChatGPT资源宝库:从提示工程到项目实践的完整指南

1. 项目概述&#xff1a;一份关于ChatGPT的“Awesome”清单意味着什么&#xff1f;如果你最近在GitHub上搜索过任何与ChatGPT、AI或提示工程相关的内容&#xff0c;那么你大概率见过一个以“awesome-”开头的仓库。而sindresorhus/awesome-chatgpt无疑是这个领域里最知名、最常…...

用Python和OpenCV手把手教你搞定自动驾驶图像坐标系转换(附NuScenes数据集实战代码)

用Python和OpenCV手把手教你搞定自动驾驶图像坐标系转换&#xff08;附NuScenes数据集实战代码&#xff09; 自动驾驶技术的核心在于让车辆"看懂"周围环境&#xff0c;而坐标系转换正是连接物理世界与数字世界的桥梁。想象一下&#xff0c;当一辆自动驾驶汽车行驶在…...

3大突破性功能:如何用QtScrcpy彻底改变你的Android投屏体验

3大突破性功能&#xff1a;如何用QtScrcpy彻底改变你的Android投屏体验 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 你是否曾经为了在电脑上操作手机而烦恼&#xff1f;无论是游…...

进化算法驱动机械爪设计优化:从原理到EvoClaw项目实践

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“EvoClaw”。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但点进去一看&#xff0c;发现这是一个关于“进化算法驱动的机械爪设计优化”的开源项目。简单来说&#xff0c;就是利用计算机…...

终极Python通达信数据解析方案:mootdx完整使用指南与金融量化实践

终极Python通达信数据解析方案&#xff1a;mootdx完整使用指南与金融量化实践 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析和量化交易领域&#xff0c;通达信作为国内主流的证券…...

用51单片机和HC-SR04超声波模块DIY一个倒车雷达(附完整代码和立创EDA原理图)

51单片机与HC-SR04超声波模块实战&#xff1a;打造高精度倒车雷达系统 在汽车电子和智能硬件领域&#xff0c;倒车雷达作为基础安全装置&#xff0c;其DIY实现不仅能帮助理解超声波测距原理&#xff0c;更是掌握嵌入式系统开发的绝佳实践。本文将手把手教你使用经典的STC89C52单…...

Claw框架数据库迁移工具claw-migrate:原理、实践与团队协作指南

1. 项目概述&#xff1a;一个专为Claw设计的迁移工具最近在折腾一个叫Claw的开源项目&#xff0c;它本身是一个轻量级的Web框架&#xff0c;用起来挺顺手。但项目迭代过程中&#xff0c;难免会遇到数据库结构变更、数据迁移这类“脏活累活”。手动写SQL脚本&#xff1f;太原始&…...

模拟WiFi反向散射技术:无电池物联网通信新突破

1. 项目概述&#xff1a;模拟WiFi反向散射技术的革新突破在物联网设备爆炸式增长的今天&#xff0c;电池续航已成为制约大规模部署的关键瓶颈。传统传感器节点即使采用低功耗设计&#xff0c;其电池寿命也鲜有超过3-5年。而Leggiero提出的模拟WiFi反向散射技术&#xff0c;则开…...

基于MCP协议构建Reddit社区趋势分析工具:架构、部署与应用

1. 项目概述&#xff1a;一个实时洞察社区脉搏的利器最近在做一个社区运营相关的项目&#xff0c;需要实时追踪几个特定话题在Reddit上的讨论热度变化。手动刷帖、统计关键词频率这种笨办法效率太低&#xff0c;而且很难量化趋势。就在我琢磨着是不是要自己写个爬虫加分析脚本的…...