为什么使用 <T::Lookup as StaticLookup>::Source 而不是普通的 T::AccountId?

Pet*_*sik 3 rust substrate polkadot

根据此PR,所有可调度的调用都应使用<T::Lookup as StaticLookup>::Source而不是T::AccountId. 为什么通过查找来处理转账比通过用户的帐户来处理转账更好?Substrate 中的查找如何工作,是否有替代方案StaticLookup

最后,除了 之外还有其他类型吗IdentityLookup?您将如何使用它们?

type Lookup = IdentityLookup<AccountId>;
Run Code Online (Sandbox Code Playgroud)

Sha*_*izi 9

StaticLookup 是对地址的抽象,可以将多种不同的地址类型转换为基础 AccountId。

想象一个仅使用 AccountId 的外部变量。与该函数交互的唯一方法是提供链上帐户的原始 AccountId。

相反,使用 StaticLookup,您可以提供任何兼容的地址格式,并且将使用其他逻辑将该地址转换为基础帐户。

想象一下以下情况:

enum Address {
    AccountId([u8; 32]),  // 32 byte account id
    String(Vec<u8>),      // arbitrary string
}
Run Code Online (Sandbox Code Playgroud)

这是一个实际示例,说明如何允许人们在您的链上使用名称服务。例如你可以这样做:

transfer(b"shawntabrizi", 100 UNIT)
Run Code Online (Sandbox Code Playgroud)

此外:

transfer(5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY, 100 UNIT)
Run Code Online (Sandbox Code Playgroud)

StaticLookup 将包含任何适当的代码,用于将已知格式转换为您需要的最终 AccountId。

想象一下下面的代码:

transfer(b"shawntabrizi", 100 UNIT)
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到我们有特殊的逻辑来处理地址(如果它是 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 }
}
Run Code Online (Sandbox Code Playgroud)