mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2024-11-13 12:09:25 +03:00
89f15f591c
* wallet changes from pac * cat changes * pool tests * pooling tests passing * offers * lint * mempool_mode * black * linting * workflow files * flake8 * more cleanup * renamed * remove obsolete test, don't cast announcement * memos are not only bytes32 * trade renames * fix rpcs, block_record * wallet rpc, recompile settlement clvm * key derivation * clvm tests * lgtm issues and wallet peers * stash * rename * mypy linting * flake8 * bad initializer * flaky tests * Make CAT wallets only create on verified hints (#9651) * fix clvm tests * return to log lvl warn * check puzzle unhardened * public key, not bytes. api caching change * precommit changes * remove unused import * mypy ci file, tests * ensure balance before creating a tx * Remove CAT logic from full node test (#9741) * Add confirmations and sleeps for wallet (#9742) * use pool executor * rever merge mistakes/cleanup * Fix trade test flakiness (#9751) * remove precommit * older version of black * lint only in super linter * Make announcements in RPC be objects instead of bytes (#9752) * Make announcements in RPC be objects instead of bytes * Lint * misc hint'ish cleanup (#9753) * misc hint'ish cleanup * unremove some ci bits * Use main cached_bls.py * Fix bad merge in main_pac (#9774) * Fix bad merge at71da0487b9
* Remove unused ignores * more unused ignores * Fix bad merge at3b143e7050
* One more byte32.from_hexstr * Remove obsolete test * remove commented out * remove duplicate payment object * remove long sync * remove unused test, noise * memos type * bytes32 * make it clear it's a single state at a time * copy over asset ids from pacr * file endl linter * Update chia/server/ws_connection.py Co-authored-by: dustinface <35775977+xdustinface@users.noreply.github.com> Co-authored-by: Matt Hauff <quexington@gmail.com> Co-authored-by: Kyle Altendorf <sda@fstab.net> Co-authored-by: dustinface <35775977+xdustinface@users.noreply.github.com>
95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
from typing import List, Optional
|
|
|
|
from blspy import AugSchemeMPL, PrivateKey, G1Element
|
|
|
|
from chia.util.ints import uint32
|
|
|
|
# EIP 2334 bls key derivation
|
|
# https://eips.ethereum.org/EIPS/eip-2334
|
|
# 12381 = bls spec number
|
|
# 8444 = Chia blockchain number and port number
|
|
# 0, 1, 2, 3, 4, 5, 6 farmer, pool, wallet, local, backup key, singleton, pooling authentication key numbers
|
|
|
|
|
|
def _derive_path(sk: PrivateKey, path: List[int]) -> PrivateKey:
|
|
for index in path:
|
|
sk = AugSchemeMPL.derive_child_sk(sk, index)
|
|
return sk
|
|
|
|
|
|
def _derive_path_unhardened(sk: PrivateKey, path: List[int]) -> PrivateKey:
|
|
for index in path:
|
|
sk = AugSchemeMPL.derive_child_sk_unhardened(sk, index)
|
|
return sk
|
|
|
|
|
|
def master_sk_to_farmer_sk(master: PrivateKey) -> PrivateKey:
|
|
return _derive_path(master, [12381, 8444, 0, 0])
|
|
|
|
|
|
def master_sk_to_pool_sk(master: PrivateKey) -> PrivateKey:
|
|
return _derive_path(master, [12381, 8444, 1, 0])
|
|
|
|
|
|
def master_sk_to_wallet_sk_intermediate(master: PrivateKey) -> PrivateKey:
|
|
return _derive_path(master, [12381, 8444, 2])
|
|
|
|
|
|
def master_sk_to_wallet_sk(master: PrivateKey, index: uint32) -> PrivateKey:
|
|
intermediate = master_sk_to_wallet_sk_intermediate(master)
|
|
return _derive_path(intermediate, [index])
|
|
|
|
|
|
def master_sk_to_wallet_sk_unhardened_intermediate(master: PrivateKey) -> PrivateKey:
|
|
return _derive_path_unhardened(master, [12381, 8444, 2])
|
|
|
|
|
|
def master_sk_to_wallet_sk_unhardened(master: PrivateKey, index: uint32) -> PrivateKey:
|
|
intermediate = master_sk_to_wallet_sk_unhardened_intermediate(master)
|
|
return _derive_path_unhardened(intermediate, [index])
|
|
|
|
|
|
def master_sk_to_local_sk(master: PrivateKey) -> PrivateKey:
|
|
return _derive_path(master, [12381, 8444, 3, 0])
|
|
|
|
|
|
def master_sk_to_backup_sk(master: PrivateKey) -> PrivateKey:
|
|
return _derive_path(master, [12381, 8444, 4, 0])
|
|
|
|
|
|
def master_sk_to_singleton_owner_sk(master: PrivateKey, wallet_id: uint32) -> PrivateKey:
|
|
"""
|
|
This key controls a singleton on the blockchain, allowing for dynamic pooling (changing pools)
|
|
"""
|
|
return _derive_path(master, [12381, 8444, 5, wallet_id])
|
|
|
|
|
|
def master_sk_to_pooling_authentication_sk(master: PrivateKey, wallet_id: uint32, index: uint32) -> PrivateKey:
|
|
"""
|
|
This key is used for the farmer to authenticate to the pool when sending partials
|
|
"""
|
|
assert index < 10000
|
|
assert wallet_id < 10000
|
|
return _derive_path(master, [12381, 8444, 6, wallet_id * 10000 + index])
|
|
|
|
|
|
async def find_owner_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Optional[G1Element]:
|
|
for wallet_id in range(50):
|
|
for sk in all_sks:
|
|
auth_sk = master_sk_to_singleton_owner_sk(sk, uint32(wallet_id))
|
|
if auth_sk.get_g1() == owner_pk:
|
|
return auth_sk
|
|
return None
|
|
|
|
|
|
async def find_authentication_sk(all_sks: List[PrivateKey], authentication_pk: G1Element) -> Optional[PrivateKey]:
|
|
# NOTE: might need to increase this if using a large number of wallets, or have switched authentication keys
|
|
# many times.
|
|
for auth_key_index in range(20):
|
|
for wallet_id in range(20):
|
|
for sk in all_sks:
|
|
auth_sk = master_sk_to_pooling_authentication_sk(sk, uint32(wallet_id), uint32(auth_key_index))
|
|
if auth_sk.get_g1() == authentication_pk:
|
|
return auth_sk
|
|
return None
|