Rust 为什么要使用<;T::查找为StaticLookup>;::源而不是普通的T::AccountId?
根据这一点,所有可调度调用都应该使用Rust 为什么要使用<;T::查找为StaticLookup>;::源而不是普通的T::AccountId?,rust,substrate,polkadot,Rust,Substrate,Polkadot,根据这一点,所有可调度调用都应该使用::Source,而不是T::AccountId。为什么用查找来处理传输比用帐户来处理用户更好?基板中的查找是如何工作的,是否有静态查找的替代方案 最后,除了IdentityLookup之外,还有其他类型吗?您将如何使用它们 type Lookup = IdentityLookup<AccountId>; type Lookup=IdentityLookup; StaticLookup是对地址的抽象,它可以将多种不同的地址类型转换为基础Accou
::Source
,而不是T::AccountId
。为什么用查找来处理传输比用帐户来处理用户更好?基板中的查找是如何工作的,是否有静态查找
的替代方案
最后,除了IdentityLookup
之外,还有其他类型吗?您将如何使用它们
type Lookup = IdentityLookup<AccountId>;
type Lookup=IdentityLookup;
StaticLookup是对地址的抽象,它可以将多种不同的地址类型转换为基础AccountId
想象一个只使用AccountId的外部代码。与该函数交互的唯一方法是为链上的帐户提供原始AccountId
相反,使用StaticLookup,您可以提供任何兼容的地址格式,并且还可以使用其他逻辑将该地址转换为基础帐户
想象一下:
枚举地址{
AccountId([u8;32]),//32字节的帐户id
字符串(Vec),//任意字符串
}
这是一个实际的例子,说明您如何允许人们在您的连锁店上使用姓名服务。例如,您可以执行以下操作:
transfer(b"shawntabrizi", 100 UNIT)
除此之外:
transfer(5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY, 100 UNIT)
StaticLookup将包含从已知格式转换为所需最终AccountId的任何适当代码
想象一下下面的代码:
struct-NameServiceLookup;
NameServiceLookup的impl StaticLookup{
类型源=地址;
类型Target=AccountId;
fn查找(a:地址)->结果{
匹配{
地址::AccountId(id)=>Ok(id),
地址::字符串(字符串)=>{
字符串到帐户id(字符串)。确定或(查找错误)
},
}
}
fn解除锁定(a:[u8;32])->地址{
地址::AccountId(a)
}
}
在这里,您可以看到,如果地址是AccountId或字符串,我们有特殊的逻辑来处理地址。这就是StaticLookup
最终提供的功能
IdentityLookup
的实现是一个简单的传递,它精确地返回输出的输入。因此,当您没有任何这样奇特的逻辑,并且希望使所有的StaticLookup
与AccountId
完全相同时,这就是您想要使用的:
pub struct IdentityLookup<T>(PhantomData<T>);
impl<T: Codec + Clone + PartialEq + Debug> StaticLookup for IdentityLookup<T> {
type Source = T;
type Target = T;
fn lookup(x: T) -> Result<T, LookupError> { Ok(x) }
fn unlookup(x: T) -> T { x }
}
pub-struct-IdentityLookup(PhantomData);
IdentityLookup的impl StaticLookup{
类型源=T;
类型目标=T;
fn查找(x:T)->结果{Ok(x)}
fn解除锁定(x:T)->T{x}
}
你可能应该在公关上问这个问题itself@michaeldel这可能是真的,但我发现可能有很多人对这个话题感兴趣,如果他们能够通过SO找到答案,那就太好了。