Transactions
pow-register
Register using an owner-enabled proof instead of TAO.
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.
| Signer | Origin | Pallet | Wraps |
|---|---|---|---|
coldkey | signed account (pallet role may apply) | SubtensorModule | SubtensorModule.pow_register |
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
netuid | integer | yes | Non-root subnet with PoW enabled. |
work_block | integer | yes | Recent block used for the challenge. |
nonce | integer | yes | Unsigned 64-bit solution nonce. |
work_hex | string | yes | 32-byte registration seal, encoded as hex. |
hotkey_ss58 | string | no | Hotkey receiving the UID. |
mining_workers | integer | no | Workers when the CLI refreshes an expired proof. |
mining_timeout | number | no | Seconds allowed for CLI proof refresh. |
mining_backend | string | no | auto, gpu, or cpu mining. |
mining_device_ids | array of integer | no | GPU 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_coldkeyPython
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).