Transactions

pow-register

Register using an owner-enabled proof instead of TAO.

View as Markdown

Direct submission with zero tip pays no transaction fee, burn or initial collateral purchase. Root is excluded. The proof binds the subnet, signing coldkey and hotkey; reused or stale challenge blocks are rejected. A full subnet applies ordinary pruning and immunity rules. Mine a fresh intent with client.mine_pow_registration and submit it promptly.

SignerOriginPalletWraps
coldkeysigned account (pallet role may apply)SubtensorModuleSubtensorModule.pow_register

Parameters

ParameterTypeRequiredDescription
netuidintegeryesNon-root subnet with PoW enabled.
work_blockintegeryesRecent block used for the challenge.
nonceintegeryesUnsigned 64-bit solution nonce.
work_hexstringyes32-byte registration seal, encoded as hex.
hotkey_ss58stringnoHotkey receiving the UID.
mining_workersintegernoWorkers when the CLI refreshes an expired proof.
mining_timeoutnumbernoSeconds allowed for CLI proof refresh.
mining_backendstringnoauto, gpu, or cpu mining.
mining_device_idsarray of integernoGPU device ids, or all discovered GPUs.

Address parameters (--hotkey, --coldkey, --dest, ...) accept a raw ss58 address, an address-book or proxy-book name, or a local wallet/hotkey name.

CLI

Preview with --dry-run (shows fee, effects, and policy result without submitting), then submit:

btcli tx pow-register \
  --netuid <int> \
  --work-block <int> \
  --nonce <int> \
  --work-hex <value> --dry-run
btcli tx pow-register \
  --netuid <int> \
  --work-block <int> \
  --nonce <int> \
  --work-hex <value> -w my_coldkey

Python

import bittensor as bt
from bittensor.wallet import Wallet

wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = bt.PowRegister(netuid=1, work_block=0, nonce=0, work_hex="...")

sub = bt.Subtensor()
plan = sub.plan(intent, wallet)   # fee, effects, policy — no submission
result = sub.execute(intent, wallet)
if not result.success:
    print(result.error.code, result.error.remediation)

(bt.Subtensor is also the async client — async with bt.Subtensor() as client: — see The client.) Or build the intent by op name, as an agent would:

result = sub.execute_tool("pow_register", {...}, wallet)

On-chain implementation

SubtensorModule.pow_register — pallets/subtensor/src/macros/dispatches.rs#L854:

#[pallet::call_index(152)]
#[pallet::weight((<T as crate::pallet::Config>::WeightInfo::pow_register(), Pays::No))]
pub fn pow_register(
    origin: OriginFor<T>,
    netuid: NetUid,
    work_block: u64,
    nonce: u64,
    work: [u8; 32],
    hotkey: T::AccountId,
) -> DispatchResult {
    Self::do_pow_register(origin, netuid, work_block, nonce, work, hotkey)
}

Delegates to do_pow_register.

Every file is browsable under /code exactly as built into the runtime, or as plain text under /code/raw/<path> (index: /code/index.json).