디버그
Last updated
use sp_runtime::traits::Printable;
use sp_runtime::print;#[frame_support::pallet]
pub mod pallet {
// 팔렛의 에러들
#[pallet::error]
pub enum Error<T> {
/// 값이 None인 경우
NoneValue,
/// 값이 최대치에 도달하여 더 이상 증가할 수 없는 경우
StorageOverflow,
}
impl<T: Config> Printable for Error<T> {
fn print(&self) {
match self {
Error::NoneValue => "잘못된 값".print(),
Error::StorageOverflow => "값이 초과되어 오버플로우 발생".print(),
_ => "잘못된 에러 케이스".print(),
}
}
}
}/// 매개변수를 받지 않고, 스토리지 값을 증가시키려고 시도하고, 오류가 발생할 수 있음
pub fn cause_error(origin) -> dispatch::DispatchResult {
// 서명된 것인지 확인하고 서명자를 가져옴. ensure_root와 ensure_none도 참고
let _who = ensure_signed(origin)?;
print!("내 테스트 메시지");
match Something::get() {
None => {
print(Error::<T>::NoneValue);
Err(Error::<T>::NoneValue)?
}
Some(old) => {
let new = old.checked_add(1).ok_or(
{
print(Error::<T>::StorageOverflow);
Error::<T>::StorageOverflow
})?;
Something::put(new);
Ok(())
},
}
}RUST_LOG=runtime=debug ./target/release/node-template --dev2020-01-01 tokio-blocking-driver DEBUG runtime 내 테스트 메시지 <-- str은 기본적으로 Printable을 구현합니다
2020-01-01 tokio-blocking-driver DEBUG runtime 잘못된 값 <-- NoneValue의 사용자 정의 문자열
2020-01-01 tokio-blocking-driver DEBUG runtime DispatchError
2020-01-01 tokio-blocking-driver DEBUG runtime 8
2020-01-01 tokio-blocking-driver DEBUG runtime 0 <-- Error enum 정의에서의 인덱스 값
2020-01-01 tokio-blocking-driver DEBUG runtime NoneValue <-- 에러의 식별자 이름을 담고 있는 struse sp_runtime::print;
// --snip--
pub fn do_something(origin) -> DispatchResult {
print!("do_something 실행");
let who = ensure_signed(origin)?;
let my_val: u32 = 777;
Something::put(my_val);
print!("my_val 저장 후");
Self::deposit_event(RawEvent::SomethingStored(my_val, who));
Ok(())
}
// --snip--RUST_LOG=runtime=debug ./target/release/node-template --dev2020-01-01 00:00:00 tokio-blocking-driver DEBUG runtime do_something 실행
2020-01-01 00:00:00 tokio-blocking-driver DEBUG runtime my_val 저장 후use sp_std::if_std; // if_std! 매크로를 스코프에 가져옵니다.#[pallet::call]
impl<T: Config<I>, I: 'static> Pallet<T, I> {
// --snip--
pub fn do_something(origin) -> DispatchResult {
let who = ensure_signed(origin)?;
let my_val: u32 = 777;
Something::put(my_val);
if_std! {
// 이 코드는 `std` 기능이 활성화된 경우에만 컴파일되고 실행됩니다.
println!("안녕하세요 네이티브 월드!");
println!("내 값은: {:#?}", my_val);
println!("호출자 계정은: {:#?}", who);
}
Self::deposit_event(RawEvent::SomethingStored(my_val, who));
Ok(())
}
// --snip--
}$ 2020-01-01 00:00:00 Substrate Node
2020-01-01 00:00:00 version x.y.z-x86_64-linux-gnu
2020-01-01 00:00:00 by Anonymous, 2017, 2020
2020-01-01 00:00:00 Chain specification: Development
2020-01-01 00:00:00 Node name: my-node-007
2020-01-01 00:00:00 Roles: AUTHORITY
2020-01-01 00:00:00 Imported 999 (0x3d7a…ab6e)
# --snip--
-> 안녕하세요 네이티브 월드!
-> 내 값은: 777
-> 호출자 계정은: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)
# --snip--
2020-01-01 00:00:00 Imported 1000 (0x3d7a…ab6e)