# pezkuwi_sdk_docs::pezkuwi_sdk::pezcumulus - Rust
Learn about Pezcumulus, the framework that transforms `bizinikiwi`-based chains into `pezkuwi`-enabled teyrchains.

## Module pezcumulus

Source
Expand description

Learn about Pezcumulus, the framework that transforms `bizinikiwi`-based chains into `pezkuwi`-enabled teyrchains.

## §Pezcumulus

Bizinikiwi provides a framework (FRAME) through which a blockchain node and runtime can easily be created. Pezcumulus aims to extend the same approach to creation of Pezkuwi teyrchains.

> Pezcumulus clouds are shaped sort of like dots; together they form a system that is intricate, beautiful and functional.

### §Example: Runtime

A Pezcumulus-based runtime is fairly similar to other FRAME-based runtimes. Most notably, the following changes are applied to a normal FRAME-based runtime to make it a Pezcumulus-based runtime:

##### §Pezcumulus Pallets

A teyrchain runtime should use a number of pallets that are provided by Pezcumulus and Bizinikiwi. Notably:

- `pezframe-system`, like all FRAME-based runtimes.
- [`pezcumulus_pezpallet_teyrchain_system`]
- [`teyrchain_info`]

ⓘ

    mod system_pallets {
    	use super::*;

    	#[derive_impl(pezframe_system::config_preludes::TestDefaultConfig)]
    	impl pezframe_system::Config for Runtime {
    		type Block = MockBlock<Self>;
    		type OnSetCode = pezcumulus_pezpallet_teyrchain_system::TeyrchainSetCode<Self>;
    	}

    	impl pezcumulus_pezpallet_teyrchain_system::Config for Runtime {
    		type RuntimeEvent = RuntimeEvent;
    		type OnSystemEvent = ();
    		type SelfParaId = teyrchain_info::Pezpallet<Runtime>;
    		type OutboundXcmpMessageSource = ();
    		type XcmpMessageHandler = ();
    		type ReservedDmpWeight = ();
    		type ReservedXcmpWeight = ();
    		type CheckAssociatedRelayNumber =
    			pezcumulus_pezpallet_teyrchain_system::RelayNumberMonotonicallyIncreases;
    		type ConsensusHook = pezcumulus_pezpallet_aura_ext::FixedVelocityConsensusHook<
    			Runtime,
    			6000, // relay chain block time
    			1,
    			1,
    		>;
    		type WeightInfo = ();
    		type DmpQueue = pezframe::traits::EnqueueWithOrigin<(), pezsp_core::ConstU8<0>>;
    		type RelayParentOffset = ConstU32<0>;
    	}

    	impl teyrchain_info::Config for Runtime {}
    }

Given that all Pezcumulus-based runtimes use a simple Aura-based consensus mechanism, the following pallets also need to be added:

- [`pezpallet_timestamp`]
- [`pezpallet_aura`]
- [`pezcumulus_pezpallet_aura_ext`]

ⓘ

    mod consensus_pallets {
    	use super::*;

    	impl pezpallet_aura::Config for Runtime {
    		type AuthorityId = AuraId;
    		type DisabledValidators = ();
    		type MaxAuthorities = ConstU32<100_000>;
    		type AllowMultipleBlocksPerSlot = ConstBool<false>;
    		type SlotDuration = pezpallet_aura::MinimumPeriodTimesTwo<Self>;
    	}

    	#[derive_impl(pezpallet_timestamp::config_preludes::TestDefaultConfig)]
    	impl pezpallet_timestamp::Config for Runtime {}

    	impl pezcumulus_pezpallet_aura_ext::Config for Runtime {}
    }

Finally, a separate macro, similar to `impl_runtime_api`, which creates the default set of runtime APIs, will generate the teyrchain runtime’s validation runtime API, also known as teyrchain validation function (PVF). Without this API, the relay chain is unable to validate blocks produced by our teyrchain.

ⓘ

    pezcumulus_pezpallet_teyrchain_system::register_validate_block! {
    	Runtime = Runtime,
    	BlockExecutor = pezcumulus_pezpallet_aura_ext::BlockExecutor::<Runtime, Executive>,
    }