Как прочитать хеш-значение и получить соответствующий AccountId из субстрата с помощью вызова RPC?
У меня есть узел подложки, работающий с элементом хранения как: value(Hash): Option<AccountId>
. Моя цель - предоставить хеш-значение (скажем,0x0000000000000000000000000000000000000000000000000000000000000001
и получить взамен соответствующий идентификатор аккаунта).
Когда я делаю это через пользовательский интерфейс, я получаю следующее:
Я хочу выполнить ту же задачу с помощью вызовов RPC. После прохождения этого сообщения в блоге, я понял, что мое дело будет читатьStorageMaps
и поэтому я начал с нескольких запросов. Если я не ошибаюсь, модульSubstratekitties
и предмет хранения value
. Отображение будетvalue
к AccountId
.
Я выполнил первые два вызова:
util_crypto.xxhashAsHex("Substratekitties", 128)
"0xe4a154b5ba85d6072b187ee66e4fef05"
util_crypto.xxhashAsHex("Value", 128)
"0x6b2f21989c43cc4e06ac1ad3e2027000"
Но меня смущает третья кодировка вызова: кодировка хеша файла sha256. Как это сделать? Бегutil_crypto.blake2AsHex("0000000000000000000000000000000000000000000000000000000000000001", 256)
"0x16821de47d8b3b0fa4ca43e5db1028d75207cbd1c379a4738144972b105355aa"
не работает и тоже не работает.
Под неработающим я подразумеваю, что при выполнении этого запроса я получаю "нулевые" значения. Это структура хранения:
use frame_support::{decl_module, decl_storage, dispatch::result::Result, ensure, StorageMap};
use frame_system::ensure_signed;
use sp_runtime::DispatchError;
// pub trait Trait: balances::Trait {}
pub trait Trait: pallet_balances::Trait {}
decl_storage! {
trait Store for Module<T: Trait> as KittyStorage {
// Value: map T::Hash => Option<T::AccountId>;
// TODO: check whether this is the appropriate datatype(hash).
Value: map hasher(blake2_256) T::Hash => Option<T::AccountId>;
// Balances: map hasher(blake2_256) (T::AssetId, T::AccountId) => T::Balance;
}
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn set_value(origin, value: T::Hash) -> Result<(), DispatchError> {
let sender = ensure_signed(origin)?;
ensure!(!<Value<T>>::contains_key(value), "key already exists");
<Value<T>>::insert(value, sender);
Ok(())
}
}
}
Обновление: мой буквальный запрос:
curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "state_getStorage", "params": ["0x3fd011a1ea758d2e1b46ed3cec43fc86b2f21989c43cc4e06ac1ad3e2027000d3585436436a2253c5163fa0cfe54a648fa533ef32ea10dbd966ac438af77b71"]}' http://localhost:9933/
Hex-запросы:
util_crypto.xxhashAsHex("KittyStorage", 128)
"0xe3fd011a1ea758d2e1b46ed3cec43fc8"
util_crypto.xxhashAsHex("Value", 128)
"0x6b2f21989c43cc4e06ac1ad3e2027000"
util_crypto.blake2AsHex("0x0000000000000000000000000000000000000000000000000000000000001234")
"0xd3585436436a2253c5163fa0cfe54a648fa533ef32ea10dbd966ac438af77b71"
1 ответ
Я думаю, проблема здесь в том, что вы берете хэш строки "0000...0001", а не байты. Попробуйте добавить0x
к передней части строки.
РЕДАКТИРОВАТЬ: Попробуйте вот так:
util_crypto.blake2AsHex("0x0000000000000000000000000000000000000000000000000000000000000001")
> "0x33e423980c9b37d048bd5fadbd4a2aeb95146922045405accc2f468d0ef96988"
РЕДАКТИРОВАТЬ 2: Другая проблема заключается в том, что вы используете неправильный ключ.
В вашем примере показано, что вы используете ключ хранилища "Substratekitties", но ваш ключ хранилища KittyStorage
как указано в decl_storage!
макрос.
Итак, ваш первый хеш должен быть: 0xe3fd011a1ea758d2e1b46ed3cec43fc8