Как с помощью Rust закодировать шестнадцатеричное строковое представление идентификатора учетной записи в Substrate?

Учитывая шестнадцатеричное представление: 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d, мы можем получить AccountId, который он представляет, используя keyring.encodeAddress()используя JavaScript. Однако какова соответствующая функция в Rust?

AccountId - это адрес адреса пользователя Substrate. Например,5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - идентификатор учетной записи Алисы из цепочки разработчиков Substrate.

1 ответ

Решение

В ржавчине вам не следует начинать с шестнадцатеричного представления, вы хотите работать с байтами.

Но если у вас есть шестнадцатеричный код, вы можете преобразовать шестнадцатеричную строку в байты AccountId, используя hex_literal::hex макрос:

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

Обратите внимание, что 0x опускается в шестнадцатеричном литерале.

Теперь у тебя должно быть [u8; 32] завернутый в AccountId32 структура идентичности.

Оттуда вы можете просто выполнить ту же логику, что и в реализации для Display за 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 закодированная версия байтов идентификатора учетной записи.

Библиотеку кодеков ss58 можно найти здесь: https://substrate.dev/rustdocs/master/sp_core/crypto/trait.Ss58Codec.html

Другие вопросы по тегам