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
substrate中打印调试信息的多种方式详解_第1张图片
将template/src/lib.rs的代码copy到log-test/src/lib.rs

3. log方式来输出信息

3.1 将log依赖添到cargo.toml文件

https://crates.io 查看一下可用的版本号
substrate中打印调试信息的多种方式详解_第2张图片

[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然后提交
substrate中打印调试信息的多种方式详解_第3张图片
这时在输出屏幕上可以看到如下信息:
在这里插入图片描述

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

substrate中打印调试信息的多种方式详解_第4张图片
这时在输出屏幕上可以看到如下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

substrate中打印调试信息的多种方式详解_第5张图片
这时在输出屏幕上可以看到如下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

substrate中打印调试信息的多种方式详解_第6张图片
这时在输出屏幕上可以看到如下Debug信息:
在这里插入图片描述

你可能感兴趣的:(Substrate,rust,开发语言,后端,substrate)