오프체인 인덱싱
단계
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> { // -- 생략 -- }use sp_runtime::offchain::StorageValueRef; #[derive(Debug, Deserialize, Encode, Decode, Default)] struct IndexingData(Vec<u8>, u64); fn offchain_worker(block_number: T::BlockNumber) { // 오프체인 인덱싱 값을 다시 읽어옵니다. 이는 ocw 로컬 스토리지에서 읽는 것과 정확히 동일합니다. let key = Self::derived_key(block_number); let storage_ref = StorageValueRef::persistent(&key); if let Ok(Some(data)) = storage_ref.get::<IndexingData>() { debug::info!("로컬 스토리지 데이터: {:?}, {:?}", str::from_utf8(&data.0).unwrap_or("에러"), data.1); } else { debug::info!("로컬 스토리지에서 읽는 중 오류가 발생했습니다."); } // -- 생략 -- }
관련 자료
Last updated