4

给定一个十六进制表示: ,我们可以使用 JavaScript0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d获取它表示的 AccountId 。keyring.encodeAddress()但是,Rust 中对应的函数是什么?

AccountId 是Substrate用户地址的地址。例如,5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY是来自 Substrate 开发链的 Alice 的帐户 ID。

4

1 回答 1

3

在 rust 中,您不应该真正从十六进制表示开始,而是要使用字节。

hex_literal::hex但假设您有十六进制,您可以使用宏将十六进制字符串转换为 AccountId 字节:

let account: AccountId32 = hex_literal::hex!["d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"].into(),

请注意,0x从十六进制文字中省略了。

现在你应该已经[u8; 32]包裹在AccountId32身份结构中了。

Display从那里,您可以简单地执行与for实现中相同的逻辑AccountId32

#[cfg(feature = "std")]
impl std::fmt::Display for AccountId32 {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "{}", self.to_ss58check())
    }
}

基本上,地址是ss58帐户 ID 字节的编码版本。

可以在此处找到 ss58 编解码器库:https ://substrate.dev/rustdocs/master/sp_core/crypto/trait.Ss58Codec.html

于 2020-04-02T11:53:26.060 回答