Architecture · plain English + the code

What VoiceBan actually is

The network explained for total beginners — with the exact code receipts folded in for the blockchain wizards. Read the plain part, or expand “Under the hood” for the source.

01

It's its own blockchain, built with Polkadot's tools

TL;DR: VoiceBan is a sovereign Layer-1 — its own independent blockchain. It was built with the Polkadot SDK (a toolkit), but it does not run on the Polkadot network, and it is not a parachain.

The word "Polkadot" means two different things, and mixing them causes most of the confusion:

Polkadot the network — an actual live blockchain. ② Polkadot the SDK (Substrate) — a free toolkit for building your own blockchain. VoiceBan used the toolkit to build a brand-new, standalone chain. Think of it like using a car-factory's tools to build your own car — you're not driving their car.

Under the hood — solochain, own consensus, no parachain

The runtime is declared a solochain (not a parachain):

// runtime/src/configs/system.rs:62
#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)]

It runs its own consensusBABE (block production) + GRANDPA (finality) via sc_consensus_babe / sc_consensus_grandpa (node/src/service.rs). There is no cumulus_pallet_parachain_system, parachain_info, or register_validate_block anywhere in the runtime — so it needs no relay chain. Deps come from VoiceBan's own forks: github.com/VoiceBan/polkadot-sdk & /frontier.

02

Accounts are Ethereum-style 0x — since day one

TL;DR: Your account is a normal Ethereum 0x… address, so MetaMask works. It was never a Polkadot 5… account that got "converted" — it's been 0x from genesis. The 5… you saw in Polkadot.js is just that tool mis-labelling the same address.

VoiceBan chose Ethereum-style accounts from the very first block. That's why any 0x wallet — MetaMask, or the Ethereum account in Talisman/SubWallet — holds VBAN natively.

Why the old Polkadot.js portal showed a 5… account: that's a generic Substrate tool. It assumes every chain uses Polkadot's 5… format and re-encodes the same bytes into a 5… string. It's a display quirk of that tool — not VoiceBan's real address format. (It's exactly why we built our own explorer.)

Under the hood — AccountId20 · EthereumSignature · genesis
// primitives/runtime-primitives/src/lib.rs:37
pub type Signature = fp_account::EthereumSignature;
pub type AccountId  = <<Signature as Verify>::Signer
                      as IdentifyAccount>::AccountId;   // → AccountId20 (H160)
// runtime/src/configs/system.rs
type AccountId = AccountId;              // 20-byte
type Lookup    = IdentityLookup<AccountId>;   // address IS the account — no ss58 indices

Genesis endows 20-byte H160 literals (not 32-byte ss58 keys):

// runtime/src/genesis_config_presets.rs:71+
AccountId::from(hex_literal::hex!("e04cc55ebee1cbce552f250e85c57b70b2e2625b"))

SS58Prefix = 42 exists but is a vestigial Substrate constant; user accounts are H160. No migration ever happened — it's H160 from genesis.

03

VBAN is a native coin — not an ERC-20 token

TL;DR: VBAN is the chain's own base currency (like ETH is to Ethereum), held directly by the protocol. It is not a token sitting in a smart contract.

An ERC-20 is a token created by a contract on top of an existing chain (like USDC on Ethereum). VBAN is the opposite: it's the native coin of its own chain — the thing you pay gas with and stake. MetaMask shows it as the network's native currency, not as a contract token.

Under the hood — pallet_balances · EVM currency
// runtime/src/configs/balances.rs
use runtime_primitives::currency::{Balance, VBAN};
pub const ExistentialDeposit: Balance = VBAN;
impl pallet_balances::Config for Runtime { … }   // native balances

// runtime/src/configs/system.rs
type AccountData = pallet_balances::AccountData<Balance>;

// runtime/src/configs/evm.rs:57
type Currency = Balances;   // EVM gas spends the SAME native VBAN
// primitives/.../currency.rs
pub type Balance = u128;
pub const VBAN: Balance = 1_000_000_000_000_000_000;  // 18 decimals (wei-style)

VBAN lives in pallet_balances as the chain's native unit. No ERC-20 contract is involved.

04

It speaks two languages: Substrate and Ethereum

TL;DR: VoiceBan is a "Frontier" chain — a Substrate blockchain with a full Ethereum engine built in. Same chain, two doors: a Substrate wss RPC and an Ethereum eth_* RPC. MetaMask uses the Ethereum door. EVM chain id is 9956.

This is why the same network answers both Polkadot-style apps (via wss) and Ethereum tools like MetaMask, ethers, Hardhat (via eth_*). It's one chain wearing both interfaces.

Under the hood — Frontier: pallet_evm + pallet_ethereum

The runtime configures the full Frontier stack — pallet_evm, pallet_ethereum, pallet_base_fee (configs/evm.rs) — and the node exposes standard eth_* / net_* / web3_* JSON-RPC via fc_rpc / fc_db (node/src/eth.rs).

// runtime/src/configs/evm.rs:61
type ChainId = ConstU64<9956>;   // "vban custom chain id" (MetaMask network id)

The Substrate side (BABE/GRANDPA state, staking, extrinsics) is served over the native JSON-RPC / WebSocket that Polkadot.js speaks. Both hit the same state.

05

The 5… keys are validator machinery, not wallets

TL;DR: The 5… keys you sometimes see are consensus keys that nodes use to produce and finalize blocks. They hold no user funds. Your money lives on your 0x account.

Validators use special keys — BABE (to produce blocks) and GRANDPA (to finalize them) — which happen to be in the 5… format. They're the engine of the network, completely separate from the 0x wallet that holds coins.

Under the hood — session keys
// runtime/src/lib.rs — impl_opaque_keys!
pub struct SessionKeys { babe, grandpa, im_online, authority_discovery, ipfs_address }

GRANDPA = ed25519; BABE / AuthorityDiscovery / ImOnline = sr25519 — the crypto that renders as 5…. They're derived on sub-paths (//babe, //grandpa…) and inserted into the node keystore to sign blocks & finality (node/src/session_keys.rs). The validator's spendable account is derived on the Ethereum path → an 0x H160. Consensus keys ≠ user accounts.

06

Spec sheet (for the wizards)

Chain typeSovereign Layer-1 · solochain (not a parachain)
FrameworkPolkadot SDK (Substrate) + Frontier EVM
Account modelEthereum AccountId20 (20-byte 0x), IdentityLookup
SignaturesECDSA — fp_account::EthereumSignature
Native coinVBAN · 18 decimals (10^18 wei) · in pallet_balances
Token standard?None — native coin, not ERC-20
EVM chain ID9956
ConsensusBABE (production) + GRANDPA (finality) · ~6s blocks
RPCSubstrate wss + Ethereum eth_* (Frontier)
Public RPCwss://explorer.voiceban.com/rpc
vs PolkadotBuilt with the SDK · not on the Polkadot network · no relay chain
07

Myths, busted

The claimThe reality
"VBAN is an ERC-20 token"No. It's the native coin of its own chain (pallet_balances), like ETH to Ethereum.
"The account was changed from Polkadot to Ethereum"No. It's been Ethereum 0x (H160) since genesis — no conversion ever happened.
"VoiceBan was created on Polkadot"No. It's a sovereign chain built with Polkadot's SDK — not on the Polkadot network, not a parachain.
"The 5… account holds my VBAN"No. 5… = validator consensus keys. Funds live on 0x accounts.