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找到答案,那就太好了。