Polkadot validate_block, PVF, and relay validators

Companion to Polkadot HRMP protocol (implementation guide).

What implementation.rs is

cumulus/pallets/parachain-system/src/validate_block/implementation.rs implements validate_block: take the PoV’s storage proof, build a sparse in-memory trie, override sp_io::storage (and related) host functions so validation runs inside the Wasm instead of calling the node’s DB, execute the parachain block, then return ValidationResult — head data, horizontal_messages, hrmp_watermark, upward messages, processed downward message count, optional new validation code.

The helper run_with_externalities_and_recorder wraps Substrate Externalities (Ext over proof + OverlayedChanges) so pallet storage reads/writes during execute_verified_block and the follow-up reads for the result see consistent state. That is production PVF behavior, not limited to tests.

Read more...

Polkadot HRMP protocol (implementation guide)

Implementation-oriented notes from the Polkadot SDK: relay pallet polkadot/runtime/parachains/src/hrmp.rs, inclusion wiring, and Cumulus parachain-system. See also validate_block and PVF.

What HRMP is

HRMP (Horizontally Relay-routed Message Passing) lets parachains send bytes to each other using the same conceptual model as XCMP (channels, queues), but full message payloads live in relay-chain storage. That keeps semantics simpler and makes relay resource use higher. It is described as an interim mechanism until XCMP is fully available.

Read more...

Solidity patterns

Solidity 设计模式汇总笔记

本笔记总结了用于优化 Gas 消耗、增强安全性以及改善开发体验的核心 Solidity 编程模式。

1. 重入保护模式 (Reentrancy Protection)

问题:当合约发起外部调用时,执行控制权会转移给另一方。攻击者可以利用此机会在原始操作完成前再次调用合约函数,从而导致资产被超额提取。

Read more...

Terminology in Polkadot

Terminology

PoV (Proof of Validity)

The PoV is the data package produced by parachain collators and sent to Relay Chain validators.

  • Purpose: It acts as the “argument” or evidence that a parachain has transitioned its state correctly

  • Contents: It typically includes the L2’s state proof and the witness data (extra data needed for verification)

  • Size: A PoV block is often around 5MB of untrusted data provided to the validator group

Read more...

Light client bridge

Light client bridge

Light client bridge will relay every block from source chain to target chain, normally for asset transfer just need to lock asset in some backing module or smart contract in source chain and mint the mapping asset in target chain

Components

Since the chain cannot directly access each other, the cross-chain data submission needs to be completed by a third party. This third party is the bridge relayers. Anyone can become a bridge relayer, and the bridge relayer obtains income by completing the relay task between the bridges. This incentive can promote the stable existence of bridge relayers to ensure the bridge’s regular operation.

Read more...

xcmp research

XCMP Research

workflow

xcm types

transact

call data(pallet & call index required)

#[derive(Encode, Decode)]
pub enum RelayTemplatePalletCall {
	#[codec(index = 100)] // the index should match the position of the module in `construct_runtime!`
	DoSomething(DoSomethingCall),
}

#[derive(Encode, Decode)]
pub enum DoSomethingCall {
	#[codec(index = 0)] // the index should match the position of the dispatchable in the target pallet
	Something(u32),
}

#[derive(Encode, Decode)]
pub enum CrowdloanPalletCall {
	#[codec(index = 27)] // the index should match the position of the module in `construct_runtime!`
	CrowdloanContribute(ContributeCall),
}

#[derive(Debug, PartialEq, Encode, Decode)]
pub struct Contribution {
	#[codec(compact)]
	index: ParaId,
	#[codec(compact)]
	value: BalanceOf,
	signature: Option<MultiSignature>,
}

#[derive(Encode, Decode)]
pub enum ContributeCall {
	#[codec(index = 1)] // the index should match the position of the dispatchable in the target pallet
	Contribute(Contribution),
}

format

let call = RelayTemplatePalletCall::DoSomething(DoSomethingCall::Something(some_value)).encode();

let msg = Xcm::Transact {
    origin_type: OriginKind::SovereignAccount,
    require_weight_at_most: u64::MAX,
    call: call.into(),
};

asset transfer

DepositReserveAsset

 Xcm::WithdrawAsset {
 assets: vec![MultiAsset::ConcreteFungible {
     id: location,
     amount: amount.into(),
 }],
 effects: vec![
     Order::BuyExecution {
        fees: MultiAsset::All,
        weight: 0,
        debt,
        halt_on_error: false,
        xcm: vec![]
    },
     Order::DepositReserveAsset {
         assets: vec![MultiAsset::All],
         dest: MultiLocation::X1(
             Junction::Parent,
         ),
         effects: vec![
              Order::DepositAsset {
              assets: vec![MultiAsset::All],
              dest: MultiLocation::X1(Junction::AccountId32 {
                    network: NetworkId::Any,
                    id: T::AccountId32Converter::convert(account),
              }),
          }],
     }],
}

Teleport

let msg = Xcm::WithdrawAsset {
    assets:vec![MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount: some_value }],
    effects: vec![
        Order::BuyExecution {
            fees: MultiAsset::All,
            weight: 0,
            debt,
            halt_on_error: false,
            xcm: vec![]
        },
        Order::InitiateTeleport {
            assets: vec![MultiAsset::All],
            dest: MultiLocation::X1(Junction::Parachain(para_id)),
            effects: vec![
                Order::BuyExecution {
                    fees: MultiAsset::All,
                    weight: 0,
                    debt,
                    halt_on_error: false,
                    xcm: vec![]
                },
                Order::DepositAsset {
                    assets: vec![MultiAsset::All],
                    dest: MultiLocation::X1(account_32.clone()),
                },
            ]
        }
    ]
};

test code

relax xcm filter

Read more...

Darwinia Bridge

Theory

White Paper

Principle

Darwinia-Ethereum Bridge

Projects Navigation

Darwinia Bridge

cross-chain overview

Background

ERC223

ERC721

Patricia Merkle Trees

Mining difficulty calculate

mmr

relay game

Bridger

Relayers (aka. Bridgers) in Darwinia Network are offchain worker clients which help relay the headers and messages between source chains and target chains

Background

actix

deprecated dj

Shadow

Services for bridger which retrieve header data from public chains and generate mmr proof

Background

ffi

Wormhole

Background

wiki

Read more...

Phragmen election

The problem that Phragmén’s methods try to solve is that of electing a set of a given numbers of persons from a larger set of candidates. Phragmén discussed this in the context of a parliamentary election in a multi-member constituency; the same problem can, of course, also occur in local elections, but also in many other situations such as electing a board or a committee in an organization.

Read more...