В этой статье мы посмотрим как получается адресс биткойна из сид фразы Что понадобится: - Python - Умение копипастить Теория Чтобы получить приват кей и паблик кей из сид фразы, нам нужно выполнить следующие действия: - Задействовать pbkdf2hmac_sha512 шифрование на нашу сид фразу, на 2048 кругов, с выходной длиной ключа в 64 байта, с солью 'mnemonic' - Задействовать hmac_sha512 на наш результат с предыдущего этапа с ключом 'Bitcoin seed' - Вычленить 32 байта, с левой стороны - это наш приват кей - Получить публичный ключ из приват кея, с помощью элиптическй кривой secp256k1 и скомпрессировать его, если у вас есть вопросы, что это за кривая, то вок доходчивое описание из вики, поймет даже школьник Теперь у нас на руках есть паблик кей и мы можем получить адресс нашего битка - Делаем шифрование sha256 на паблик кей - Делаем шифрование Ripemd160 на на хэш из предыдущего этапа и прибавляем нулевой байт в начало - Делаем двойной sha256 на хэш из предыдущего этапа и берем из него 4 первых байта - Соединяем ripemd хэш с двойным хэшем 21 + 4 байт, у нас получаются 25 байтов в итоге - Шифруем это все в base58 и получаем адресс нашего битка Код import hashlib import hmac from ecdsa import SECP256k1, SigningKey import binascii import base58 if __name__ == "__main__": seed = "mushroom orange black valve erase brother submit biology tortoise debate arrive slim" key = hashlib.pbkdf2_hmac('sha512', seed.encode("utf-8"), "mnemonic".encode("utf-8"), 2048, 64) master_key_chain_code = hmac.new('Bitcoin seed'.encode("utf-8"), key, hashlib.sha512) priv_key = binascii.unhexlify(master_key_chain_code.hexdigest())[:-32] priv = SigningKey.from_string(priv_key, curve=SECP256k1) pub = priv.get_verifying_key().to_string() public_key = pub.hex()[:64] public_key_to_int = int(public_key, 16) if public_key_to_int % 2: public_key = '02' + public_key else: public_key = '03' + public_key public_key_bytes = binascii.unhexlify(public_key) first_hash = hashlib.sha256(public_key_bytes) second_hash = hashlib.new('ripemd160', binascii.unhexlify(first_hash.hexdigest())) second_hash = binascii.unhexlify('00'+second_hash.hexdigest()) double_hash = hashlib.sha256(second_hash) double_hash = hashlib.sha256(binascii.unhexlify(double_hash.hexdigest())) final_hash = second_hash.hex() + double_hash.hexdigest()[:8] adress = base58.b58encode(binascii.unhexlify(final_hash)).decode("utf-8") print(f"Private key: {priv_key.hex()}") print(f"Public key: {public_key}") print(f"Adress: {adress}") Python import hashlib import hmac from ecdsa import SECP256k1, SigningKey import binascii import base58 if __name__ == "__main__": seed = "mushroom orange black valve erase brother submit biology tortoise debate arrive slim" key = hashlib.pbkdf2_hmac('sha512', seed.encode("utf-8"), "mnemonic".encode("utf-8"), 2048, 64) master_key_chain_code = hmac.new('Bitcoin seed'.encode("utf-8"), key, hashlib.sha512) priv_key = binascii.unhexlify(master_key_chain_code.hexdigest())[:-32] priv = SigningKey.from_string(priv_key, curve=SECP256k1) pub = priv.get_verifying_key().to_string() public_key = pub.hex()[:64] public_key_to_int = int(public_key, 16) if public_key_to_int % 2: public_key = '02' + public_key else: public_key = '03' + public_key public_key_bytes = binascii.unhexlify(public_key) first_hash = hashlib.sha256(public_key_bytes) second_hash = hashlib.new('ripemd160', binascii.unhexlify(first_hash.hexdigest())) second_hash = binascii.unhexlify('00'+second_hash.hexdigest()) double_hash = hashlib.sha256(second_hash) double_hash = hashlib.sha256(binascii.unhexlify(double_hash.hexdigest())) final_hash = second_hash.hex() + double_hash.hexdigest()[:8] adress = base58.b58encode(binascii.unhexlify(final_hash)).decode("utf-8") print(f"Private key: {priv_key.hex()}") print(f"Public key: {public_key}") print(f"Adress: {adress}") Результат Private key: a0ccf14c939faa07b896cd5fb306a37fb3f9cb041196c5364d0cca9dbd82e53a Public key: 03d1cc1f6bdea4d17eb7f2573d676f9ddb087f8b784c912c4466407781d8acfe38 Adress: 18XzGRj3fBqLtkB2b9CfJT8zrHpRaGSacQ Code Private key: a0ccf14c939faa07b896cd5fb306a37fb3f9cb041196c5364d0cca9dbd82e53a Public key: 03d1cc1f6bdea4d17eb7f2573d676f9ddb087f8b784c912c4466407781d8acfe38 Adress: 18XzGRj3fBqLtkB2b9CfJT8zrHpRaGSacQ Проверяем правильность наших операций https://brainwalletx.github.io/#generator
Не до конца понимаю практичности этой статьи, так как если захочешь работать напрямую с блокчейном бтк, то придеться поднимать свою ноду, а там это уже вся эта генерация встроена