Address Formats¶
ComputeChain uses Bech32 encoding for addresses with different prefixes depending on the entity type.
Address Types¶
Accounts¶
Prefix: cpc
Example: cpc1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t
Usage:
- Regular users
- Transaction recipients
- Validator reward addresses (reward_address)
Generation:
from computechain.protocol.crypto.keys import public_key_from_private
from computechain.protocol.crypto.address import address_from_pubkey
priv_key_bytes = bytes.fromhex("...")
pub_key_bytes = public_key_from_private(priv_key_bytes)
address = address_from_pubkey(pub_key_bytes, prefix="cpc")
Validators¶
Prefix: cpcvalcons (consensus address)
Example: cpcvalcons1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t
Usage:
- Validator identification in consensus
- Address in Validator.address
- Used in BlockHeader.proposer_address
Generation:
# When staking, pub_key is specified in payload
pub_key_hex = tx.payload.get("pub_key")
val_pub_bytes = bytes.fromhex(pub_key_hex)
val_addr = address_from_pubkey(val_pub_bytes, prefix="cpcvalcons")
Important: Validator has two addresses:
- cpcvalcons... — for consensus (used in blockchain)
- cpc1... — for receiving rewards (regular account)
Operator Address (Future)¶
Prefix: cpcvaloper (config: bech32_prefix_val)
Status: Reserved for future use
Planned usage: - Validator operator / self-delegator address - Separation of operator from consensus address
Address Structure¶
Bech32 format:
Components:
- prefix: Prefix (cpc, cpcvalcons, cpcvaloper)
- 1: Separator
- data: Encoded data (20 bytes for address)
- checksum: Checksum for error detection
Usage Examples¶
Creating Address from Private Key¶
from computechain.cli.keystore import KeyStore
ks = KeyStore()
key = ks.create_key("alice")
print(f"Address: {key['address']}") # cpc1...
print(f"Pubkey: {key['public_key']}")
Getting Validator Address¶
from computechain.protocol.crypto.address import address_from_pubkey
# From validator public key
pub_key_hex = "02a1b2c3d4e5f6..."
pub_key_bytes = bytes.fromhex(pub_key_hex)
val_addr = address_from_pubkey(pub_key_bytes, prefix="cpcvalcons")
print(f"Validator address: {val_addr}")
Validating Address Format¶
from bech32 import bech32_decode
VALID_PREFIXES = {"cpc", "cpcvalcons", "cpcvaloper"}
def is_valid_address(address: str) -> bool:
"""Checks if string is a valid ComputeChain address"""
if not address:
return False
hrp, data = bech32_decode(address)
if hrp is None or data is None:
return False
return hrp in VALID_PREFIXES
Prefix Configuration¶
Network parameters:
# protocol/config/params.py
bech32_prefix_acc: str = "cpc" # Accounts
bech32_prefix_val: str = "cpcvaloper" # Operators (future)
bech32_prefix_cons: str = "cpcvalcons" # Consensus addresses
Current prefixes across networks:
- Accounts: cpc
- Consensus: cpcvalcons
- Operator: cpcvaloper (reserved, not used in MVP)