KEY MANAGEMENT
The key is a sr25519 key that is used to sign, encrypt, decrypt and verify any string or message. We can also replicate the key to other chains through using the same seed to generate the other keys. This means you can have one key instead of multiple keys for each chain, which is more convenient and secure.
c.add_key("alice")
or
c add_key alice
key already exists at alice
{
'crypto_type': 1,
'seed_hex': '518fad1043efc934a759334215ef54d48e1f8836355ed864bbb797f90ecb32b7',
'derive_path': None,
'path': 'alice',
'ss58_format': 42,
'public_key': '7cd0e327f4f6649719158892dafe766a5efd0185cb5fe17548d294f00f12661b',
'private_key':
'943fb89150a67192919a43004f87685faba470e754fe4ff0af6a93e7fc54dc0a6cceb6fbc29d610d5486ba78969f609ea83753fb9e32d58df0c67f13
dfcbbd68',
'mnemonic': 'quantum belt rival casual benefit obscure sight wool pupil jaguar guide mango',
'ss58_address': '5EtMr6n6APFay8FFdhhP9sMPwvv1Nfcm5yxiRTxviHH4WVZg'
}
Now this generates a random key and if you want to save it to a file you can do so like this.
c.add_key("alice")
or
c add_key alice
{
'crypto_type': 1,
'seed_hex':
'518fad1043efc934a759334215ef54d48e1f8836355ed864bbb797f90ecb32b7',
'derive_path': None,
'path': 'alice',
'ss58_format': 42,
'public_key':
'7cd0e327f4f6649719158892dafe766a5efd0185cb5fe17548d294f00f12661b',
'private_key':
'943fb89150a67192919a43004f87685faba470e754fe4ff0af6a93e7fc54dc0a6cceb6fb
c29d610d5486ba78969f609ea83753fb9e32d58df0c67f13dfcbbd68',
'mnemonic': 'quantum belt rival casual benefit obscure sight wool
pupil jaguar guide mango',
'ss58_address': '5EtMr6n6APFay8FFdhhP9sMPwvv1Nfcm5yxiRTxviHH4WVZg'
}
Refreshing existing key
c add_key alice refresh=True
To list all the keys you can do so like this.
c.keys("alice")
or
c keys alice
[
'alice',
]
To search for your keys you can do so like this. The search term finds all of the keys that contain the search term.
c keys ali
[
'alice',
'alice2',
'alice3',
]
Save Keys
To save the keys to a file you can do so like this.
c save_keys
This saves the keys to a specific path in the config file. You can also specify the path like this.
To sign a message you can do so like this.
key = c.get_key("alice")
Original (Substrate) signature output :
key.sign("hello")
hexadecimal (bytes):
b'\xd6RV\xf4)\x88\x9aC\x99$\xe5E\xa5N=\xcf\xf4\x7f\xc7\\\xfe\xa1V\xdd\xc0
\xfc\x1bz:\x17\xa1$[\x84Al\xb0\xee\x0b\xedg\xc2\xe7\x93\x00\xf1~}\xd2r;\x
f2\xb4.\x90\xf2k\xd1\x10\xd9\xd5\x8f\x9d\x85'
dictionary
{"data":"hello",
"signature":"0x7e7","public_key":"0x7cd0e327f4f6649719158892dafe766a5efd0185cb5fe17548d294f00f12661b"}
String Output
This is a string that contains the data and signature. The separator is used to mainly distinguish the data from the signature.
{DATA}{SEPARATOR}{SIGNATURE}
Signature Tickets for Temporary Tokens
In the ticket the timestamp is taken, and the separator is ":🎫:".
such that the format is timestamp:🎫:signature
by calling
c.ticket("alice")
the alice key signs the current timestamp and returns the ticket.
1713500654.659339::ticket::e0559b535129037a62947c65af35f17c50d29b4a5c31df86b069d8ada5bcbb230f4c1e996393e6721f78d88f9b512b
6493b5ca743d027091585366875c6bea8e
now to verify the ticket you can do so like this.
c.verify_ticket("1713500654.659339::ticket::e0559b535129037a62947c65af35f17c50d29b4a5c31df86b069d8ada5bcbb230f4c1e996393e6721f78d88f9b512b6493b5ca743d027091585366875c6bea8e")
to get the signer
c.ticket2signer("1713500654.659339::ticket::e0559b535129037a62947c65af35f17c50d29b4a5c31df86b069d8ada5bcbb230f4c1e996393e6721f78d88f9b512b6493b5ca743d027091585366875c6bea8e")
To create a temporary token you can do so like this.
Temporary Tokens using Time Stamped Signatures: Verification Without Your Keys
This allows for anyone to sign a timestamp, and vendors can verify the signature. This does not require the seed to be exposed, and can be used to identify key likely to be the same person. The only issue is if the staleness of the timestamp is too old. This can be adjusted by the vendor.
Key Management
In this tutorial, we'll explore the usage of the commune
Python package for managing keys, balances, stakes, and key statistics.
Listing Keys
To start, let's list all the available keys using the keys()
function:
c keys
or
c.keys()
[
'model.openrouter::replica.1',
'model.openrouter::replica.2',
'model.openrouter::replica.3',
'model.openrouter::replica.4',
'model.openrouter::replica.5',
'model.openrouter::replica.6',
'model.openrouter::replica.7',
'model.openrouter::replica.8',
'model.openrouter::replica.9'
]
Adding and Removing Keys
You can add and remove keys with the following steps:
Adding a New Key
To add a new key, use the add_key()
function:
c.add_key('fam')
or
c add_key fam
Getting Key Info
You can also retrieve key info using the key_info()
function:
c.key_info('fam') # Replace 'fam' with the key name
{
'crypto_type': 1,
'seed_hex': '6a363df4c2b7eaeb0b13efedbd37308d2bda3be8bc8aa758ecc00eb3089f7b97',
'derive_path': None,
'path': 'fam',
'ss58_format': 42,
'public_key': '38199493328ca2224364c77204ee61008a9cab5a8246906201357ef056b82142',
'ss58_address': '5DLG8wM2beoHcveKEXxuh2NRgh55vRRx8b1PE4Ch3ZE8fndL',
'private_key':'d8e1c3d46f813eafac0d44481737e87b06241ba9cb5d6f760f8d62df48be450d2a84dcdfe506f218bc6646fe89daa1c1d1fd7af3a64ea0f3e8a73cc766743aa1',
'mnemonic': 'typical piece chair oven lift trap case current tomorrow wrap motor
light'
}
Removing a Key
To remove a key, use the rm_key()
function:
c.rm_key('demo') # Replace 'demo' with the key you want to remove
Saving and Loading Keys
You can save and load keys for future use:
Saving Keys
To save the keys, use the save_keys()
function:
c.save_keys(path='./keys.json') # save the key mnemonics to this file
Loading Keys
To load the saved keys, use the load_keys()
function:
c.load_keys('./keys.json')
SUBSPACE
Retrieving Balances and Stakes
You can retrieve balance and stake information for a specific key:
Balance
To get the balance for a key, use the get_balance()
function:
c.get_balance('fam') # Replace 'fam' with the key name
or
c balance fam
Get stake of the Key
To get the stake for a key, use the get_stake()
function:
c get_stake fam # Replace 'fam' with the key name or the address
c.get_stake('fam', netuid='text') # Replace 'fam' with the key name