Offchain Indexing
Steps
const ONCHAIN_TX_KEY: &[u8] = b"my_pallet::indexing1"; #[pallet::call] impl<T: Config> Pallet<T> { #[pallet::weight(100)] pub fn extrinsic(origin: OriginFor<T>, number: u64) -> DispatchResult { let who = ensure_signed(origin)?; let key = Self::derived_key(frame_system::Module::<T>::block_number()); // ... Ok(()) } } impl<T: Config> Pallet<T> { fn derived_key(block_number: T::BlockNumber) -> Vec<u8> { block_number.using_encoded(|encoded_bn| { ONCHAIN_TX_KEY.clone().into_iter() .chain(b"/".into_iter()) .chain(encoded_bn) .copied() .collect::<Vec<u8>>() }) } }use sp_io::offchain_index; const ONCHAIN_TX_KEY: &[u8] = b"my_pallet::indexing1"; #[derive(Debug, Deserialize, Encode, Decode, Default)] struct IndexingData(Vec<u8>, u64); #[pallet::call] impl<T: Config> Pallet<T> { #[pallet::weight(100)] pub fn extrinsic(origin: OriginFor<T>, number: u64) -> DispatchResult { let who = ensure_signed(origin)?; let key = Self::derived_key(frame_system::Module::<T>::block_number()); let data = IndexingData(b"submit_number_unsigned".to_vec(), number); offchain_index::set(&key, &data.encode()); Ok(()) } } impl<T: Config> Pallet<T> { // -- skipped for brevity -- }use sp_runtime::offchain::StorageValueRef; #[derive(Debug, Deserialize, Encode, Decode, Default)] struct IndexingData(Vec<u8>, u64); fn offchain_worker(block_number: T::BlockNumber) { // Reading back the offchain indexing value. This is exactly the same as reading from // ocw local storage. let key = Self::derived_key(block_number); let storage_ref = StorageValueRef::persistent(&key); if let Ok(Some(data)) = storage_ref.get::<IndexingData>() { debug::info!("local storage data: {:?}, {:?}", str::from_utf8(&data.0).unwrap_or("error"), data.1); } else { debug::info!("Error reading from local storage."); } // -- snip -- }
Related material
Last updated