目标
在pallet内使用辅助功能函数来提高代码的可读性和可重用性。
使用案例
重用辅助函数,跨多个pallet执行常见的“验证”检查。
概述
有时,pallet内部的可调度功能会重用其他可调度对象共有的逻辑。在这种情况下,将此逻辑重构为其自己的私有函数非常有用。
另外一种情况,随着代码量的增加以在可调度内执行各种检查,可调度函数变得越来越难以阅读。
在这两种情况下,使用不能从托盘外部访问的辅助函数是优化代码可读性和重用性的有用工具。
接下来,我们将了解如何创建一个加法器辅助函数,该程序检查算术溢出,并且可以在任何可调度中重用。
操作步骤
- 创建辅助函数我们要提到的辅助函数叫做
fn _adder
。它检查在添加两个u32类型的整数时是否有溢出。它需要两个u32
整数,使用checked_add
和ok_or
检查是否没有溢出。如果有,则返回错误;否则,它将返回结果。下面是辅助函数的样子。这将位于pallet的底部:
impl<T: Config> Pallet<T> {
fn _adder(num1: u32, num2: u32) -> Result<u32, &'static str> {
num1.checked_add(num2).ok_or("Overflow when adding")
}
}
- 在可调度程序中使用它。
确定在执行添加时需要检查溢出的位置。使用辅助函数,而不是重写相同的代码。下面是一个可调度程序的简单示例,它允许有符号的外部向现有存储值添加值:
// Extrinsics callable from outside the runtime.
#[pallet::call]
impl<T: Config> Pallet<T> {
#[pallet::weight(1_000)]
fn add_value(
origin: OriginFor<T>,
val_to_add: u32
) -> DispatchResultWithPostInfo {
let _ = ensure_signed(origin)?;
ensure!(val_to_add <= T::MaxAddend::get(), "value must be <= maximum add amount constant");
// previous value got
let c_val = SingleValue::<T>::get();
// checks for overflow when new value added
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())
}
}
示例
example-offchain-worker:add_price
在pallet的调度中使用。