도우미 함수 사용하기

이 짧은 가이드는 팔렛의 코드 내에서 일반적인 "확인" 검사를 수행하기 위해 도우미 함수를 생성하고 재사용하는 예제를 안내합니다.

팔렛 내부의 호출 가능한 함수는 때로는 다른 호출 가능한 함수에서 공통으로 사용되는 로직을 재사용합니다. 이 경우, 이 로직을 자체적인 개인 함수로 리팩토링하는 것이 유용합니다. 또 다른 경우에는 호출 가능한 함수가 호출 가능한 내부에서 다양한 검사를 수행하기 위해 코드 양이 증가함에 따라 읽기 어려워집니다. 이러한 경우 팔렛 외부에서 액세스할 수 없는 도우미 함수를 사용하여 코드의 가독성과 재사용성을 최적화하는 유용한 도구입니다. 이 가이드에서는 산술 오버플로우를 확인하는 adder 도우미를 생성하는 방법을 살펴보겠습니다.

도우미 함수 생성하기

우리가 참조할 도우미 함수는 fn_adder라고 합니다. 이 함수는 u32 타입의 두 정수를 더할 때 오버플로우가 발생하지 않는지 확인합니다.

이 함수는 두 개의 u32 정수를 가져와 checked_addok_or를 사용하여 오버플로우가 발생하지 않는지 확인합니다. 만약 오버플로우가 발생하면 오류를 반환하고, 그렇지 않으면 결과를 반환합니다.

다음은 도우미 함수로서의 모습입니다. 이것은 팔렛의 가장 아래에 위치하게 됩니다:

impl<T: Config> Pallet<T> {
    fn _adder(num1: u32, num2: u32) -> Result<u32, &'static str> {
        num1.checked_add(num2).ok_or("더할 때 오버플로우 발생")
    }
}

호출 가능한 함수에서 사용하기

덧셈을 수행할 때 오버플로우를 확인해야 하는 위치를 식별합니다. 같은 코드를 반복해서 작성하는 대신 도우미 함수를 사용합니다. 다음은 부호 있는 외부 호출이 기존 저장 값에 값을 추가할 수 있는 간단한 예입니다:

// 런타임 외부에서 호출 가능한 외부 호출.
#[pallet::call]
impl<T: Config> Pallet<T> {
  #[pallet::weight(0)]
  fn add_value(
    origin: OriginFor<T>,
    val_to_add: u32
    ) -> DispatchResultWithPostInfo {
      let _ = ensure_signed(origin)?;

      ensure!(val_to_add <= T::MaxAddend::get(), "값은 최대 추가 금액 상수보다 작거나 같아야 합니다");

      // 이전 값 가져오기
      let c_val = SingleValue::<T>::get();

      // 새로운 값 추가 시 오버플로우 확인
      let result = _adder(c_val, val_to_add);

      <SingleValue<T>>::put(result);
      Self::deposit_event(Event::Added(c_val, val_to_add, result));
      Ok(().into())
  }
}

예제

자료

Last updated