Struct pallet_example_offchain_worker::pallet::Pallet
source · pub struct Pallet<T>(_);
Expand description
The pallet implementing the on-chain logic.
Implementations
sourceimpl<T: Config> Pallet<T>
impl<T: Config> Pallet<T>
A public part of the pallet.
sourcepub fn submit_price(
origin: OriginFor<T>,
price: u32
) -> DispatchResultWithPostInfo
pub fn submit_price(
origin: OriginFor<T>,
price: u32
) -> DispatchResultWithPostInfo
Submit new price to the list.
This method is a public function of the module and can be called from within
a transaction. It appends given price
to current list of prices.
In our example the offchain worker
will create, sign & submit a transaction that
calls this function passing the price.
The transaction needs to be signed (see ensure_signed
) check, so that the caller
pays a fee to execute it.
This makes sure that it’s not easy (or rather cheap) to attack the chain by submitting
excessive transactions, but note that it doesn’t ensure the price oracle is actually
working and receives (and provides) meaningful data.
This example is not focused on correctness of the oracle itself, but rather its
purpose is to showcase offchain worker capabilities.
sourcepub fn submit_price_unsigned(
origin: OriginFor<T>,
_block_number: T::BlockNumber,
price: u32
) -> DispatchResultWithPostInfo
pub fn submit_price_unsigned(
origin: OriginFor<T>,
_block_number: T::BlockNumber,
price: u32
) -> DispatchResultWithPostInfo
Submit new price to the list via unsigned transaction.
Works exactly like the submit_price
function, but since we allow sending the
transaction without a signature, and hence without paying any fees,
we need a way to make sure that only some transactions are accepted.
This function can be called only once every T::UnsignedInterval
blocks.
Transactions that call that function are de-duplicated on the pool level
via validate_unsigned
implementation and also are rendered invalid if
the function has already been called in current “session”.
It’s important to specify weight
for unsigned calls as well, because even though
they don’t charge fees, we still don’t want a single block to contain unlimited
number of such transactions.
This example is not focused on correctness of the oracle itself, but rather its purpose is to showcase offchain worker capabilities.
pub fn submit_price_unsigned_with_signed_payload(
origin: OriginFor<T>,
price_payload: PricePayload<T::Public, T::BlockNumber>,
_signature: T::Signature
) -> DispatchResultWithPostInfo
sourceimpl<T: Config> Pallet<T>
impl<T: Config> Pallet<T>
sourcepub fn next_unsigned_at() -> T::BlockNumber
pub fn next_unsigned_at() -> T::BlockNumber
Defines the block when next unsigned transaction will be accepted.
To prevent spam of unsigned (and unpaid!) transactions on the network,
we only allow one transaction every T::UnsignedInterval
blocks.
This storage entry defines when new transaction is going to be accepted.
Trait Implementations
sourceimpl<T: Config> GetStorageVersion for Pallet<T>
impl<T: Config> GetStorageVersion for Pallet<T>
sourcefn current_storage_version() -> StorageVersion
fn current_storage_version() -> StorageVersion
sourcefn on_chain_storage_version() -> StorageVersion
fn on_chain_storage_version() -> StorageVersion
sourceimpl<T: Config> Hooks<<T as Config>::BlockNumber> for Pallet<T>
impl<T: Config> Hooks<<T as Config>::BlockNumber> for Pallet<T>
sourcefn offchain_worker(block_number: T::BlockNumber)
fn offchain_worker(block_number: T::BlockNumber)
Offchain Worker entry point.
By implementing fn offchain_worker
you declare a new offchain worker.
This function will be called when the node is fully synced and a new best block is
successfully imported.
Note that it’s not guaranteed for offchain workers to run on EVERY block, there might
be cases where some blocks are skipped, or for some the worker runs twice (re-orgs),
so the code should be able to handle that.
You can use Local Storage
API to coordinate runs of the worker.
sourcefn on_finalize(_n: BlockNumber)
fn on_finalize(_n: BlockNumber)
sourcefn on_idle(_n: BlockNumber, _remaining_weight: Weight) -> Weight
fn on_idle(_n: BlockNumber, _remaining_weight: Weight) -> Weight
on_finalize
).
Implement to have something happen using the remaining weight.
Will not fire if the remaining weight is 0.
Return the weight used, the hook will subtract it from current weight used
and pass the result to the next on_idle
hook if it exists. Read moresourcefn on_initialize(_n: BlockNumber) -> Weight
fn on_initialize(_n: BlockNumber) -> Weight
sourcefn on_runtime_upgrade() -> Weight
fn on_runtime_upgrade() -> Weight
sourcefn try_state(_n: BlockNumber) -> Result<(), &'static str>
fn try_state(_n: BlockNumber) -> Result<(), &'static str>
sourcefn pre_upgrade() -> Result<Vec<u8, Global>, &'static str>
fn pre_upgrade() -> Result<Vec<u8, Global>, &'static str>
sourcefn post_upgrade(_state: Vec<u8, Global>) -> Result<(), &'static str>
fn post_upgrade(_state: Vec<u8, Global>) -> Result<(), &'static str>
sourcefn integrity_test()
fn integrity_test()
sourceimpl<T: Config> IntegrityTest for Pallet<T>
impl<T: Config> IntegrityTest for Pallet<T>
sourcefn integrity_test()
fn integrity_test()
sourceimpl<T: Config> OffchainWorker<<T as Config>::BlockNumber> for Pallet<T>
impl<T: Config> OffchainWorker<<T as Config>::BlockNumber> for Pallet<T>
sourcefn offchain_worker(n: <T as Config>::BlockNumber)
fn offchain_worker(n: <T as Config>::BlockNumber)
sourceimpl<T: Config> OnFinalize<<T as Config>::BlockNumber> for Pallet<T>
impl<T: Config> OnFinalize<<T as Config>::BlockNumber> for Pallet<T>
sourcefn on_finalize(n: <T as Config>::BlockNumber)
fn on_finalize(n: <T as Config>::BlockNumber)
sourceimpl<T: Config> OnGenesis for Pallet<T>
impl<T: Config> OnGenesis for Pallet<T>
sourcefn on_genesis()
fn on_genesis()
sourceimpl<T: Config> OnIdle<<T as Config>::BlockNumber> for Pallet<T>
impl<T: Config> OnIdle<<T as Config>::BlockNumber> for Pallet<T>
sourcefn on_idle(n: <T as Config>::BlockNumber, remaining_weight: Weight) -> Weight
fn on_idle(n: <T as Config>::BlockNumber, remaining_weight: Weight) -> Weight
remaining_weight
to make sure it is high enough to allow for
your pallet’s extra computation. Read moresourceimpl<T: Config> OnInitialize<<T as Config>::BlockNumber> for Pallet<T>
impl<T: Config> OnInitialize<<T as Config>::BlockNumber> for Pallet<T>
sourcefn on_initialize(n: <T as Config>::BlockNumber) -> Weight
fn on_initialize(n: <T as Config>::BlockNumber) -> Weight
sourceimpl<T: Config> OnRuntimeUpgrade for Pallet<T>
impl<T: Config> OnRuntimeUpgrade for Pallet<T>
sourcefn on_runtime_upgrade() -> Weight
fn on_runtime_upgrade() -> Weight
sourcefn pre_upgrade() -> Result<Vec<u8>, &'static str>
fn pre_upgrade() -> Result<Vec<u8>, &'static str>
sourceimpl<T: Config> PalletInfoAccess for Pallet<T>
impl<T: Config> PalletInfoAccess for Pallet<T>
sourcefn module_name() -> &'static str
fn module_name() -> &'static str
sourcefn crate_version() -> CrateVersion
fn crate_version() -> CrateVersion
sourceimpl<T: Config> PalletsInfoAccess for Pallet<T>
impl<T: Config> PalletsInfoAccess for Pallet<T>
sourceimpl<T: Config> StorageInfoTrait for Pallet<T>
impl<T: Config> StorageInfoTrait for Pallet<T>
fn storage_info() -> Vec<StorageInfo> ⓘ
sourceimpl<T: Config> TryState<<T as Config>::BlockNumber> for Pallet<T>
impl<T: Config> TryState<<T as Config>::BlockNumber> for Pallet<T>
sourcefn try_state(
n: <T as Config>::BlockNumber,
_s: TryStateSelect
) -> Result<(), &'static str>
fn try_state(
n: <T as Config>::BlockNumber,
_s: TryStateSelect
) -> Result<(), &'static str>
sourceimpl<T: Config> ValidateUnsigned for Pallet<T>
impl<T: Config> ValidateUnsigned for Pallet<T>
sourcefn validate_unsigned(
_source: TransactionSource,
call: &Self::Call
) -> TransactionValidity
fn validate_unsigned(
_source: TransactionSource,
call: &Self::Call
) -> TransactionValidity
Validate unsigned call to this module.
By default unsigned transactions are disallowed, but implementing the validator here we make sure that some particular calls (the ones produced by offchain worker) are being whitelisted and marked as valid.
sourcefn pre_dispatch(call: &Self::Call) -> Result<(), TransactionValidityError>
fn pre_dispatch(call: &Self::Call) -> Result<(), TransactionValidityError>
sourceimpl<T: Config> WhitelistedStorageKeys for Pallet<T>
impl<T: Config> WhitelistedStorageKeys for Pallet<T>
sourcefn whitelisted_storage_keys() -> Vec<TrackedStorageKey> ⓘ
fn whitelisted_storage_keys() -> Vec<TrackedStorageKey> ⓘ
Vec<TrackedStorageKey>
indicating the storage keys that
should be whitelisted during benchmarking. This means that those keys
will be excluded from the benchmarking performance calculation. Read moreimpl<T> Eq for Pallet<T>
Auto Trait Implementations
impl<T> RefUnwindSafe for Pallet<T>where
T: RefUnwindSafe,
impl<T> Send for Pallet<T>where
T: Send,
impl<T> Sync for Pallet<T>where
T: Sync,
impl<T> Unpin for Pallet<T>where
T: Unpin,
impl<T> UnwindSafe for Pallet<T>where
T: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
sourceimpl<T> CheckedConversion for T
impl<T> CheckedConversion for T
sourcefn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
sourcefn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read morefn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read morefn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read morefn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read moresourceimpl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
sourcefn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T, Outer> IsWrappedBy<Outer> for Twhere
Outer: AsRef<T> + AsMut<T> + From<T>,
T: From<Outer>,
impl<T, Outer> IsWrappedBy<Outer> for Twhere
Outer: AsRef<T> + AsMut<T> + From<T>,
T: From<Outer>,
sourceimpl<T> PalletVersionToStorageVersionHelper for Twhere
T: GetStorageVersion + PalletInfoAccess,
impl<T> PalletVersionToStorageVersionHelper for Twhere
T: GetStorageVersion + PalletInfoAccess,
fn migrate(db_weight: &RuntimeDbWeight) -> Weight
impl<T> Pointable for T
impl<T> Pointable for T
sourceimpl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
sourcefn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
sourcefn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read moresourceimpl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
sourcefn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.sourceimpl<T, S> UniqueSaturatedInto<T> for Swhere
T: Bounded,
S: TryInto<T>,
impl<T, S> UniqueSaturatedInto<T> for Swhere
T: Bounded,
S: TryInto<T>,
sourcefn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.