Pages:
Author

Topic: Script Python para extrair informação de uma wallet (Read 559 times)

hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
pode ser interessante gerar automaticamente uma seed valida, para o usuário poder testar a ferramenta sem precisar recorrer a outro software para testar o seu
Alterações e novas mudanças feitas:

Agora é possível criar um novo mnemônico de 12, 18 e 24 palavras;

Também adicionei informações relevantes da carteira como o fingerprint, um identificador de 8 digítos de toda carteira, muito útil para quem usa passphrases.

Outra importante alteração feita é que agora eu consegui fazer o chatGPT adicionar a funcionalidade de alterar o número da conta.

Consegui fazer ele corrigir a informação no hdkeypath, onde não estava mostrando o derivation path index corretamente, estava com um zero a mais.

Na saída agora aparecem:

Code:
BIP32 Masterkey: xpriv
BIP32 Extended Private Key (account Level): xpriv/ypriv/zpriv
Derivation Path usado: m/84'/0'/0'/0
Fingerprint da carteira: 00000000
BIP32 Root PrivKey (WIF): L1xxxxxxxx



O código parece bem completo, eu queria adicionar novas funcionalidades, mas não consegui, mas não recomendo de forma alguma que substituam iancoleman por esse, a não ser que seja feito pra fazer testes e conhecer como funciona o esquema de geração de chaves.

Code:
import sys
import hashlib
from bip_utils import (
    Bip39MnemonicGenerator, Bip39MnemonicValidator, Bip39SeedGenerator,
    Bip44, Bip49, Bip84, Bip86, Bip44Coins, Bip49Coins, Bip84Coins, Bip86Coins,
    Bip44Changes, Bip32Slip10Secp256k1, Secp256k1PrivateKey, WifEncoder
)
from getpass import getpass

def main():
    # Perguntar se deseja criar um novo mnemônico
    mnemonic_choice = input("Digite o número de palavras para criar um novo mnemônico (12, 18, 24) ou pressione Enter para usar um mnemônico existente: ").strip()

    if mnemonic_choice in ['12', '18', '24']:
        # Gerar um novo mnemônico com o número de palavras especificado
        num_words = int(mnemonic_choice)
        mnemonic = Bip39MnemonicGenerator().FromWordsNumber(num_words)
        print(f"Novo mnemônico gerado ({num_words} palavras): {mnemonic}")
    else:
        # Perguntar pelo mnemônico
        mnemonic = input("Digite o mnemônico: ").strip()

    # Validar o mnemônico
    if not Bip39MnemonicValidator().IsValid(mnemonic):
        print("Mnemônico inválido!")
        sys.exit(1)

    # Perguntar pela passphrase (opcional)
    passphrase = getpass("Digite a passphrase (opcional): ").strip()

    # Gerar a seed BIP39
    seed = Bip39SeedGenerator(mnemonic).Generate(passphrase)

    # Definindo os paths padrões
    deriv_paths = {
        '1': "m/44'/0'",    # p2pkh
        '2': "m/49'/0'",    # p2wpkh-p2sh
        '3': "m/84'/0'",    # p2wpkh
        '4': "m/86'/0'"     # p2tr
    }

    print("Derivation path e tipos de endereços disponíveis:")
    print("1: p2pkh (m/44'/0')")
    print("2: p2wpkh-p2sh (m/49'/0')")
    print("3: p2wpkh (m/84'/0')")
    print("4: p2tr (m/86'/0')")

    address_type = input("Escolha o tipo de endereço (1-4): ").strip()

    if address_type not in deriv_paths:
        print("Tipo de endereço inválido!")
        sys.exit(1)

    # Caminho de derivação base
    base_derivation_path = deriv_paths[address_type]

    # Perguntar pela conta
    account_index = input("Digite o índice da conta (padrão 0): ").strip()
    account_index = int(account_index) if account_index.isdigit() else 0

    # Perguntar se quer gerar endereços de recebimento (0) ou de troco (1)
    address_purpose = input("Gerar endereços de recebimento (0) ou de troco (1)? ").strip()
    if address_purpose not in ['0', '1']:
        print("Opção inválida!")
        sys.exit(1)

    # Perguntar a partir de qual index mostrar os endereços
    start_index = int(input("A partir de qual index mostrar os endereços (padrão 0)? ").strip() or 0)

    # Perguntar quantos endereços mostrar
    address_count = int(input("Quantos endereços mostrar (padrão 50)? ").strip() or 50)

    # Inicializar a classe BIP adequada
    bip_cls_dict = {
        '1': (Bip44, Bip44Coins.BITCOIN),
        '2': (Bip49, Bip49Coins.BITCOIN),
        '3': (Bip84, Bip84Coins.BITCOIN),
        '4': (Bip86, Bip86Coins.BITCOIN)
    }
    bip_cls, coin_type = bip_cls_dict[address_type]
    bip_obj = bip_cls.FromSeed(seed, coin_type)

    # Derivar a conta principal
    bip_acc_obj = bip_obj.Purpose().Coin().Account(account_index)

    # Obter o fingerprint da chave pública da raiz BIP32
    root_pubkey = bip_obj.PublicKey().RawCompressed().ToBytes()
    fingerprint = hashlib.new('ripemd160', hashlib.sha256(root_pubkey).digest()).digest()[:4]

    # Derivar os endereços
    addresses = []
    for i in range(start_index, start_index + address_count):
        addr_obj = bip_acc_obj.Change(Bip44Changes(int(address_purpose))).AddressIndex(i)
        priv_key = addr_obj.PrivateKey().Raw().ToBytes()
        priv_key_wif = WifEncoder.Encode(Secp256k1PrivateKey.FromBytes(priv_key))
        addresses.append({
            'index': i,
            'address': addr_obj.PublicKey().ToAddress(),
            'private_key_wif': priv_key_wif,
            'hdkeypath': f"{base_derivation_path}/{account_index}'/{address_purpose}/{i}"
        })

    # Gerar a chave privada BIP32 raiz
    bip32_obj = Bip32Slip10Secp256k1.FromSeed(seed)
    root_xpriv = bip32_obj.PrivateKey().ToExtended()

    # Gerar a chave privada estendida BIP32 no nível da conta
    account_xpriv = bip_acc_obj.PrivateKey().ToExtended()

    # Gerar o WIF para a chave privada raiz
    root_priv_key_bytes = bip32_obj.PrivateKey().Raw().ToBytes()
    root_priv_key_wif = WifEncoder.Encode(Secp256k1PrivateKey.FromBytes(root_priv_key_bytes))

    # Mostrar os resultados
    print("\nMnemônico:", mnemonic)
    if passphrase:
        print("Passphrase:", passphrase)
    print("\nBIP32 Masterkey:", root_xpriv)
    print("BIP32 Extended Private Key (account Level):", account_xpriv)
    print("Derivation Path usado:", f"{base_derivation_path}/{account_index}'/{address_purpose}")
    print("Fingerprint da carteira:", fingerprint.hex())
    print("BIP32 Root PrivKey (WIF):", root_priv_key_wif)
    print()

    for addr in addresses:
        print(f"{addr['private_key_wif']} # addr={addr['address']} hdkeypath={addr['hdkeypath']}")

    # Perguntar se deseja gerar um arquivo dump.txt
    save_to_file = input("Deseja gerar um arquivo dump.txt para importar em uma carteira? (s/n): ").strip().lower()
    if save_to_file == 's':
        with open('dump.txt', 'w') as f:
            f.write(f"Mnemônico: {mnemonic}\n")
            if passphrase:
                f.write(f"Passphrase: {passphrase}\n")
            f.write(f"\nBIP32 Masterkey: {root_xpriv}\n")
            f.write(f"BIP32 Extended Private Key (account Level): {account_xpriv}\n")
            f.write(f"Derivation Path usado: {base_derivation_path}/{account_index}'/{address_purpose}\n")
            f.write(f"Fingerprint da carteira: {fingerprint.hex()}\n")
            f.write(f"BIP32 Root PrivKey (WIF): {root_priv_key_wif}\n\n")
            for addr in addresses:
                f.write(f"{addr['private_key_wif']} # addr={addr['address']} hdkeypath={addr['hdkeypath']}\n")
        print("Arquivo dump.txt exportado com sucesso!")
    else:
        print("Saída salva apenas na tela.")

if __name__ == "__main__":
    main()
legendary
Activity: 2352
Merit: 6089
bitcoindata.science
O usuário é solicitado ao rodar o script:

Entrar com o mnemônico (o código checa se o mnemônico é válido).
Passphrase (se não for incluida, ele ignora e gera só à partir da seed).

pode ser interessante gerar automaticamente uma seed valida, para o usuário poder testar a ferramenta sem precisar recorrer a outro software para testar o seu
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real

Posta aqui para eu dar uma olhada, por gentileza.

Só botar vários print() bem grandes avisando que o código está extremamente quebrado, não testato, super arriscado, e que não deve ser usado seriamente. Grin

Segue o código:

Code:
import sys
from bip_utils import (
    Bip39MnemonicValidator, Bip39SeedGenerator, Bip44, Bip49,
    Bip84, Bip86, Bip44Coins, Bip49Coins, Bip84Coins, Bip86Coins,
    Bip44Changes, Bip32Slip10Secp256k1, Secp256k1PrivateKey, WifEncoder
)
from getpass import getpass

def main():
    # Perguntar pelo mnemônico
    mnemonic = input("Digite o mnemônico: ").strip()

    # Validar o mnemônico
    if not Bip39MnemonicValidator().IsValid(mnemonic):
        print("Mnemônico inválido!")
        sys.exit(1)

    # Perguntar pela passphrase (opcional)
    passphrase = getpass("Digite a passphrase (opcional): ").strip()

    # Gerar a seed BIP39
    seed = Bip39SeedGenerator(mnemonic).Generate(passphrase)

    # Definindo os paths padrões
    deriv_paths = {
        '1': "m/44'/0'/0'",    # p2pkh
        '2': "m/49'/0'/0'",    # p2wpkh-p2sh
        '3': "m/84'/0'/0'",    # p2wpkh
        '4': "m/86'/0'/0'"     # p2tr
    }

    print("Tipos de endereços disponíveis:")
    print("1: p2pkh (m/44'/0'/0')")
    print("2: p2wpkh-p2sh (m/49'/0'/0')")
    print("3: p2wpkh (m/84'/0'/0')")
    print("4: p2tr (m/86'/0'/0')")

    address_type = input("Escolha o tipo de endereço (1-4): ").strip()

    if address_type not in deriv_paths:
        print("Tipo de endereço inválido!")
        sys.exit(1)

    derivation_path = deriv_paths[address_type]

    # Perguntar se quer gerar endereços de recebimento (0) ou de troco (1)
    address_purpose = input("Gerar endereços de recebimento (0) ou de troco (1)? ").strip()
    if address_purpose not in ['0', '1']:
        print("Opção inválida!")
        sys.exit(1)

    # Ajustar o caminho de derivação para endereços de troco
    derivation_path += f"/{address_purpose}"

    # Perguntar a partir de qual index mostrar os endereços
    start_index = int(input("A partir de qual index mostrar os endereços (padrão 0)? ").strip() or 0)

    # Perguntar quantos endereços mostrar
    address_count = int(input("Quantos endereços mostrar (padrão 50)? ").strip() or 50)

    # Inicializar a classe BIP adequada
    bip_cls_dict = {
        '1': (Bip44, Bip44Coins.BITCOIN),
        '2': (Bip49, Bip49Coins.BITCOIN),
        '3': (Bip84, Bip84Coins.BITCOIN),
        '4': (Bip86, Bip86Coins.BITCOIN)
    }
    bip_cls, coin_type = bip_cls_dict[address_type]
    bip_obj = bip_cls.FromSeed(seed, coin_type)

    # Derivar a conta principal
    bip_acc_obj = bip_obj.Purpose().Coin().Account(0)

    # Derivar os endereços
    addresses = []
    for i in range(start_index, start_index + address_count):
        addr_obj = bip_acc_obj.Change(Bip44Changes(int(address_purpose))).AddressIndex(i)
        priv_key = addr_obj.PrivateKey().Raw().ToBytes()
        priv_key_wif = WifEncoder.Encode(Secp256k1PrivateKey.FromBytes(priv_key))
        addresses.append({
            'index': i,
            'address': addr_obj.PublicKey().ToAddress(),
            'private_key_wif': priv_key_wif,
            'hdkeypath': f"{derivation_path}/{i}"
        })

    # Gerar a chave privada BIP32 raiz
    bip32_obj = Bip32Slip10Secp256k1.FromSeed(seed)
    root_xpriv = bip32_obj.PrivateKey().ToExtended()

    # Gerar a chave privada estendida BIP32 no nível da conta
    account_xpriv = bip_acc_obj.PrivateKey().ToExtended()

    # Mostrar os resultados
    print("\nMnemônico:", mnemonic)
    if passphrase:
        print("Passphrase:", passphrase)
    print("\nBIP32 Masterkey:", root_xpriv)
    print("Extended Private Key (Account Level):", account_xpriv)
    print()

    for addr in addresses:
        print(f"{addr['private_key_wif']} # addr={addr['address']} hdkeypath={addr['hdkeypath']}")

    # Perguntar se deseja gerar um arquivo dump.txt
    save_to_file = input("Deseja gerar um arquivo dump.txt para importar em uma carteira? (s/n): ").strip().lower()
    if save_to_file == 's':
        with open('dump.txt', 'w') as f:
            f.write(f"Mnemônico: {mnemonic}\n")
            if passphrase:
                f.write(f"Passphrase: {passphrase}\n")
            f.write(f"\nBIP32 Masterkey: {root_xpriv}\n")
            f.write(f"Extended Private Key (Account Level): {account_xpriv}\n\n")
            for addr in addresses:
                f.write(f"{addr['private_key_wif']} # addr={addr['address']} hdkeypath={addr['hdkeypath']}\n")
        print("Arquivo dump.txt gerado com sucesso!")
    else:
        print("Saída salva apenas na tela.")

if __name__ == "__main__":
    main()

Instale a biblioteca bip32utils com:

Code:
pip install bip_utils

Se puder agregar alguma melhoria nesse código, como as que eu citei de poder alterar o derivation path e o código derivar os dados corretamente sem nenhum erro eu agradeceria muito, bem como derivar de subcontas.

Uma coisa interessante também (que eu não consegui fazer) é gerar as xpubs de cada mnemônico/contas, pra ficar bem igual ao iancoleman mesmo.
legendary
Activity: 2758
Merit: 6830
Depois eu posso postar o código aqui via pastebin, github. Mas lembrem-se, é um código experimental criado por alguém que não sabe (eu) que inclusive foi criado pelo chat GPT, eu neutralizei o máximo de erros que consegui, então ainda pode existir erros.
Posta aqui para eu dar uma olhada, por gentileza.

Só botar vários print() bem grandes avisando que o código está extremamente quebrado, não testato, super arriscado, e que não deve ser usado seriamente. Grin
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
Estou trabalhando em um script python que faz basicamente "a mesma coisa" que o site do iancoleman ou afins, mas sem depender de ser um site, arquivo html e abrir no navegador. Mas por enquanto com limitações. Ele por enquanto faz o seguinte:

Gera chaves privadas WIF e endereços bitcoin nos derivation path padrões: BIP44, BIP49, BIP84 e BIP86 contendo todos os formatos de endereços disponíveis, incluindo o taproot.

O usuário é solicitado ao rodar o script:

Entrar com o mnemônico (o código checa se o mnemônico é válido).
Passphrase (se não for incluida, ele ignora e gera só à partir da seed).

Oferece quatro tipos de endereços: p2pkh, p2wpkh-p2sh, p2wpkh e p2tr, com seus respectivos paths padrões.

Pode escolher mostrar entre os endereços internal recebimento (0) ou external troco, change (1).

Gera a chave privada extendida na raiz BIP32 (root key).

Gera também a chave privada extendida para a conta BIP32, pra por exemplo, se quiser importar na Electrum.

Depois de gerar uma lista com as chaves WIF, endereços e o detalhamento de cada index, o script pergunta se quer salvar em um dump.txt




O que eu não consegui fazer e qual as limitações:

Não consigo alterar o derivation path pra fora dos padrões, da erro no código ou gera chaves incorretas (perigoso).

Quase o mesmo problema que acima, não consigo alterar a conta de uma mesma carteira via derivation path.

Só funciona nos derivation path padrões mencionados.

Eu não entendo nada de python ainda, pedi pro chatGPT criar pra mim esse código com base nas descrições, ele não acertou de primeira, depois de várias tentativas e erros, eu consegui fazer com que o código rode pelo menos o básico.

Depois eu posso postar o código aqui via pastebin, github. Mas lembrem-se, é um código experimental criado por alguém que não sabe (eu) que inclusive foi criado pelo chat GPT, eu neutralizei o máximo de erros que consegui, então ainda pode existir erros.

Então deve ser usado apenas pra fins educativos.
legendary
Activity: 1862
Merit: 5154
**In BTC since 2013**
Mas, se a carteira não dá a semente, não sei até que ponto ela é segura. Ainda por cima tratar-se de uma carteira para um dispositivo móvel.

Não existiam Seeds em 2011, quando a carteira foi lançada.

É verdade. Nem me lembrei disso.



Mas assim que o Bip39 foi introduzido, a carteira adaptou ao código.

Mas o sistema de backup deles, eles não mudaram, é por arquivo de backup criptografado.

Quando eu tiver um tempo, vou tentar descriptografar de novo.

Eles podem ter adaptado, mas as wallet antes do BIP39, muito provavelmente não ficaram automaticamente com a seed. Apenas as wallet a seguir é que passaram a ter a seed.

Experimenta criar uma carteira agora e ver se te dão a seed ou não.
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real

Não existiam Seeds em 2011, quando a carteira foi lançada.
Mas assim que o Bip39 foi introduzido, a carteira adaptou ao código.

Mas o sistema de backup deles, eles não mudaram, é por arquivo de backup criptografado.

Quando eu tiver um tempo, vou tentar descriptografar de novo.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
@darkv0rt3x você sabe como descriptografar o backup da carteira Bitcoin Wallet?

Essa é a primeira carteira bitcoin mobile que existiu, desde 2011, ela possui o sistema de backup por arquivo digital e não mostra a semente de recuperação (a semente de recuperação está criptografada no backup exportado).

Eu conseguia descriptografar em 2018, fui testar de novo e não tô conseguindo, parece que eles mudaram o algorítimo ou adicionaram uma nova camada.

Antes eu só precisava exportar o backup (sem o PIN, somente a senha) e descriptografava com openssl aes-256-cbc, agora sempre que eu tento no terminal do linux da bad password (senha errada), mesmo estando certa.


https://bitcointalksearch.org/topic/how-to-export-bitcoin-private-keys-in-wif-from-bitcoin-android-schildbach-5305923

Não sei. Não faço ideia de como o fazer! Nunca tentei fazê-lo senão pelas vias normais do walletpassphrase.
legendary
Activity: 2352
Merit: 6089
bitcoindata.science
@darkv0rt3x você sabe como descriptografar o backup da carteira Bitcoin Wallet?

Essa é a primeira carteira bitcoin mobile que existiu, desde 2011, ela possui o sistema de backup por arquivo digital e não mostra a semente de recuperação (a semente de recuperação está criptografada no backup exportado).

Eu conseguia descriptografar em 2018, fui testar de novo e não tô conseguindo, parece que eles mudaram o algorítimo ou adicionaram uma nova camada.

Antes eu só precisava exportar o backup (sem o PIN, somente a senha) e descriptografava com openssl aes-256-cbc, agora sempre que eu tento no terminal do linux da bad password (senha errada), mesmo estando certa.


https://bitcointalksearch.org/topic/how-to-export-bitcoin-private-keys-in-wif-from-bitcoin-android-schildbach-5305923

Você já olhou o github deles? tem dezenas de perguntas sobre recover/back ups. Achei um texto oficial aqui

https://github.com/bitcoin-wallet/bitcoin-wallet/blob/main/wallet/README.recover.md

Voce basicamente precisa baixar o bitcoinj (https://github.com/bitcoinj/bitcoinj.git) e decodificar por lá;

Mas, se a carteira não dá a semente, não sei até que ponto ela é segura. Ainda por cima tratar-se de uma carteira para um dispositivo móvel.

Não existiam Seeds em 2011, quando a carteira foi lançada.
legendary
Activity: 1862
Merit: 5154
**In BTC since 2013**
@darkv0rt3x você sabe como descriptografar o backup da carteira Bitcoin Wallet?

Essa é a primeira carteira bitcoin mobile que existiu, desde 2011, ela possui o sistema de backup por arquivo digital e não mostra a semente de recuperação (a semente de recuperação está criptografada no backup exportado).

Eu conseguia descriptografar em 2018, fui testar de novo e não tô conseguindo, parece que eles mudaram o algorítimo ou adicionaram uma nova camada.

Antes eu só precisava exportar o backup (sem o PIN, somente a senha) e descriptografava com openssl aes-256-cbc, agora sempre que eu tento no terminal do linux da bad password (senha errada), mesmo estando certa.


https://bitcointalksearch.org/topic/how-to-export-bitcoin-private-keys-in-wif-from-bitcoin-android-schildbach-5305923

Bem se isso era possível antes, provavelmente a carteira não estava a fazer um bom backup.

Mas, se a carteira não dá a semente, não sei até que ponto ela é segura. Ainda por cima tratar-se de uma carteira para um dispositivo móvel.
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
@darkv0rt3x você sabe como descriptografar o backup da carteira Bitcoin Wallet?

Essa é a primeira carteira bitcoin mobile que existiu, desde 2011, ela possui o sistema de backup por arquivo digital e não mostra a semente de recuperação (a semente de recuperação está criptografada no backup exportado).

Eu conseguia descriptografar em 2018, fui testar de novo e não tô conseguindo, parece que eles mudaram o algorítimo ou adicionaram uma nova camada.

Antes eu só precisava exportar o backup (sem o PIN, somente a senha) e descriptografava com openssl aes-256-cbc, agora sempre que eu tento no terminal do linux da bad password (senha errada), mesmo estando certa.


https://bitcointalksearch.org/topic/how-to-export-bitcoin-private-keys-in-wif-from-bitcoin-android-schildbach-5305923
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees

Então, uma wallet que mostre diretamente a chave privada dos endereços é difícil...

Por isso mesmo é que eu quis fazer aquele script!


É comum carteiras que usem derivation paths diferentes,  especialmente em se tratando de altcoins.
Eu já passei por algumas situações assim.

A coinomi por exemplo usa derivation path próprios para ethereum e para monero.

Retirando a excepção que o @Forsyth Jones mencionou, os derivation paths são mais ou menos constantes. Quero dizer que o derivation path é constituído por 6 partes:
m: Master or Root node
44': Purpose, pode ser BIP44(P2PKH), BIP49 (P2SH-wrapped SegWit addresses) ou BIP84 (bech32)
0': Coin type for Bitcoin. Cada coin tem um valor, 60 para Shitereum
0': Account index - Número de contas dentro da wallet
0: Endereço de destino (ou externo) ou Endereço de troco (ou interno).
0: Quantidade de endereços a gerar.

Sei que você não gosta desse site, mas ele ilistra bem o que falei

https://iancoleman.io/bip39/

Clique rm BIp32 e depois em cliente. Vc verá que inclusive a ledger usa um derivation path próprio dela.

Eu gosto do site. O que não aconselho é usar-se o site (nem esse nenhum tipo bitaddress.org)  para gerar addresses ou PKs ou o que quer se seja que a gente depois vá usar em "ambiente de produção"!
legendary
Activity: 2352
Merit: 6089
bitcoindata.science

Então, uma wallet que mostre diretamente a chave privada dos endereços é difícil...

Por isso mesmo é que eu quis fazer aquele script!


É comum carteiras que usem derivation paths diferentes,  especialmente em se tratando de altcoins.
Eu já passei por algumas situações assim.

A coinomi por exemplo usa derivation path próprios para ethereum e para monero.

Retirando a excepção que o @Forsyth Jones mencionou, os derivation paths são mais ou menos constantes. Quero dizer que o derivation path é constituído por 6 partes:
m: Master or Root node
44': Purpose, pode ser BIP44(P2PKH), BIP49 (P2SH-wrapped SegWit addresses) ou BIP84 (bech32)
0': Coin type for Bitcoin. Cada coin tem um valor, 60 para Shitereum
0': Account index - Número de contas dentro da wallet
0: Endereço de destino (ou externo) ou Endereço de troco (ou interno).
0: Quantidade de endereços a gerar.

Sei que você não gosta desse site, mas ele ilistra bem o que falei

https://iancoleman.io/bip39/

Clique rm BIp32 e depois em cliente. Vc verá que inclusive a ledger usa um derivation path próprio dela.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees

Então, uma wallet que mostre diretamente a chave privada dos endereços é difícil...

Por isso mesmo é que eu quis fazer aquele script!


É comum carteiras que usem derivation paths diferentes,  especialmente em se tratando de altcoins.
Eu já passei por algumas situações assim.

A coinomi por exemplo usa derivation path próprios para ethereum e para monero.

Retirando a excepção que o @Forsyth Jones mencionou, os derivation paths são mais ou menos constantes. Quero dizer que o derivation path é constituído por 6 partes:
m: Master or Root node
44': Purpose, pode ser BIP44(P2PKH), BIP49 (P2SH-wrapped SegWit addresses) ou BIP84 (bech32)
0': Coin type for Bitcoin. Cada coin tem um valor, 60 para Shitereum
0': Account index - Número de contas dentro da wallet
0: Endereço de destino (ou externo) ou Endereço de troco (ou interno).
0: Quantidade de endereços a gerar.
legendary
Activity: 2352
Merit: 6089
bitcoindata.science
Pra mim, tendo acesso a seed, eu consigo importá-la na electrum que é um software muito confiável, alterar para o derivationpath que eu quero (normalmente nunca vai precisar alterar, pois os padrões são usados em 99% das wallets), mas uma vez ou outra vamos encontrar uma carteira que usa um derivation path diferente, como a Schildbatch wallet (bitcoin wallet para android), aí importando na Electrum, eu consigo obter tanto as chaves privadas quanto a chave privada estendida BIP32.


É comum carteiras que usem derivation paths diferentes,  especialmente em se tratando de altcoins.
Eu já passei por algumas situações assim.

A coinomi por exemplo usa derivation path próprios para ethereum e para monero.
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
...
Eu tenho a minha forma de ter as minhas PKs guardadas de várias maneiras (redundância), e uma delas é tê-las em papel.

E quando dizem que, ah e tal as PKs não têm toda a informação neessária para transportar wallets de um lado para o outro e é difícil e etc por causa de derivaion paths e não sei que mais. Isso acontece porque houve necessidade das wallets de flexibilizarem determinados processos e agilizarem as coisas e melhorarem o UX.

Para mim podia continuar a coisa o mais arcaica possível. 1 PK gerar uma e uma só address. Ponto final! Mas entendo que se há a possibilidade de evoluir, então que se evolua.
...
Então, uma wallet que mostre diretamente a chave privada dos endereços é difícil, o máximo que eles fazem é fornecer o mnemônico que nada mais é que um conjunto de palavras codificada, na verdade essas palavras são um conjunto de códigos hexadecimais extenso codificadas, ele serve pra gerar a chave raiz BIP32 (xpriv) e se tiver um 'salt' adicionada ao mnemônico (passphrase), esse xpriv muda a cada caractere adicionado no 'salt'.

Pra mim, tendo acesso a seed, eu consigo importá-la na electrum que é um software muito confiável, alterar para o derivationpath que eu quero (normalmente nunca vai precisar alterar, pois os padrões são usados em 99% das wallets), mas uma vez ou outra vamos encontrar uma carteira que usa um derivation path diferente, como a Schildbatch wallet (bitcoin wallet para android), aí importando na Electrum, eu consigo obter tanto as chaves privadas quanto a chave privada estendida BIP32.

Ou seja, com o mnemônico ou com a xpriv raiz BIP32 eu consigo chegar ao derivation path e endereços que eu quero, carteiras como a Sparrow você pode fazer isso, já na Electrum, se você só tem a xpriv, ela vai recuperar a nível de conta (com xpriv, electrum não permite alterar o path).

Acho essencial que a carteira deixe exportar chaves privadas, mas se não tiver jeito por ela, tem como fazer por outros softwares como Electrum.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
@darkv0rt3x consegue fazer um novo resumo do seu problema e o que quer, atualizado com o que entendeu até agora? Não consigo ler todos os replies então fica dificil de acompanhar tudo. Posso tentar te ajudar.

O meu objectivo é poder ter as PKs das addresses onde eu tenho Bitcoin. E estas apps que a gente vai usando e testando, tipo Peach, Relai e outras, acabam por nunca nos mostrarem as PKs "a nu" ou raw, e era isso mesmo que eu queria, uma vez que com a PK eu posso importá-la, em último recurso no Bitcoin Core, e ter acesso à address com os meus fundos.

Eu tenho a minha forma de ter as minhas PKs guardadas de várias maneiras (redundância), e uma delas é tê-las em papel.

E quando dizem que, ah e tal as PKs não têm toda a informação neessária para transportar wallets de um lado para o outro e é difícil e etc por causa de derivaion paths e não sei que mais. Isso acontece porque houve necessidade das wallets de flexibilizarem determinados processos e agilizarem as coisas e melhorarem o UX.

Para mim podia continuar a coisa o mais arcaica possível. 1 PK gerar uma e uma só address. Ponto final! Mas entendo que se há a possibilidade de evoluir, então que se evolua.

Mas @TryNinja, acho que neste momento, o script que fiz, por mais burro que seja, faz o que pretendo e até mais, por isso estou satisfeito! Obrigado por te disponibilizares a ajudar!
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
Meio que concordo com você. Creio que não tem nada de errado em exportar uma private-key, ela é a fundação mais básica do Bitcoin, assim como atomos são a fundação da matéria.

Entendo a questão de seguir com os "descriptors" de forma que haja um padrão que ajuda naquela situação onde você tem uma seed mas um derivation path gera tais endereços, outro gera endereços diferentes, aí tem como ser legacy ou segwit... enfim, fácil de se perder... mas dessa forma você só pode facilmente exportar e importar sua carteira se aquele programa suporta esse novo padrão.

@darkv0rt3x consegue fazer um novo resumo do seu problema e o que quer, atualizado com o que entendeu até agora? Não consigo ler todos os replies então fica dificil de acompanhar tudo. Posso tentar te ajudar.
Pois é cara, a migração para o descritor foi uma atualização realmente necessária e ótima, porém poucos usuários ou os mais experientes ou depois de fuçar muito pela internet que vão saber usar essa parada direito.

Acho que não custava nada manter a exportação de chaves, pois o usuário que exporta essas coisas está ciente dos riscos, ou poderia mudar o nome ou um novo comando especifico pra isso, ex:
Code:
deriveprivkeys "descritor":"script(xpriv/84h/0h/0h/0/*)#checksum" "[0,50]"
Aí derivaria 50 endereços e as chaves associadas:

"endereço" "privkey associada" "index"

 eu imagino que em algum momento em específico, o usuário vai precisar pegar essa chave privada, seja pra assinar mensagem pelo endereço em outro software e etc.

Pra pegar as chaves privadas do Bitcoin Core, ou você faz isso pelo iancoleman colando a xpriv lá.

Pra importar direto na Electrum não há, pois a Electrum deriva a carteira pela xpriv pelo caminho raiz: m/0 ou seja, você deve entrar no iancoleman e colar a xpriv lá pra derivar as xpriv a nível de conta (Account extended private key) para que a Electrum consiga gerar a mesma carteira no Bitcoin Core.

A Sparrow deixa especificar o derivation path quando utiliza xpriv, porém ela não deriva chaves privadas filhas.

Porém se você não confia em sites como iancoleman, a única opção que esses usuários tem é criar seu próprio script para fazer o que você bem queira, como fez o nosso colega darkv0rt3x, porém se você pegar esse script de alguém que já fez, você terá que confiar no código dessa pessoa (a não ser que você saiba revisar o código e veja por sí só). Podia ser tudo pelo Bitcoin core mesmo, eu acho que isso coloca os usuários que queiram exportar chaves filhas mais em risco ainda, pois eles buscaram soluções de terceiros para isso, expondo ainda mais a chave.
legendary
Activity: 2758
Merit: 6830
Bitcoin Core é outra carteira que não permite mais exportar chaves privadas WIF individuais, eu fui um dos contrários a esta decisão, os desenvolvedores chegaram a conclusão de que não é seguro.

O Bitcoin Core não tem mais nenhum comando para exportação pk filhas individuais porque desde a implementação de descritores passou a ser o formato padrão, mudaram o derivation path para os padrões atuais: m/44, 49, 84 e 86 para taproot, antes das carteiras descritoras, as chaves privadas eram derivadas de um derivation path reforçado. Quando mudou o derivation path para os padrões atuais, a derivação das chaves filhas deixaram de ser reforçadas, o padrão atual que citei é usado por 99% das carteiras HD e não são reforçadas, chaves não reforçadas significam que não são tão seguras em relação as reforçadas, isso quer dizer que se o usuário vazar qualquer pk de seu endereço e a chave pública estendida, o atacante apenas com essas duas informações pode calcular para derivar TODAS as chaves filhas da carteira!
Meio que concordo com você. Creio que não tem nada de errado em exportar uma private-key, ela é a fundação mais básica do Bitcoin, assim como atomos são a fundação da matéria.

Entendo a questão de seguir com os "descriptors" de forma que haja um padrão que ajuda naquela situação onde você tem uma seed mas um derivation path gera tais endereços, outro gera endereços diferentes, aí tem como ser legacy ou segwit... enfim, fácil de se perder... mas dessa forma você só pode facilmente exportar e importar sua carteira se aquele programa suporta esse novo padrão.

@darkv0rt3x consegue fazer um novo resumo do seu problema e o que quer, atualizado com o que entendeu até agora? Não consigo ler todos os replies então fica dificil de acompanhar tudo. Posso tentar te ajudar.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees

Descriptor wallets do not allow dumpprivkey because the fundamental principle behind descriptor wallets is that private keys are not enough information to transport a wallet. Private keys lack derivation information and lack information about what kind of scripts to create. They also do not work for wallets that have anything more complicated than just single key scripts.


Obrigado por postar isso.

Isso mostra q o que eu falei acima, explicando que o que o darkv0rt3x está fazendo é inseguro e inútil, esta alinhado com o entendimento mais recentes do devs do bitcoin core.

Para quem não sabe, achow101 é um dev do bitcoin core.
https://github.com/achow101/

Quote
Talvez o conceito de preocupar em guardar as pk individuais não seja mais necessário, o que devemos nos preocupar é se a carteira nos oferesse a Seed ou xprivs (no caso do Bitcoin Core).

Se você acessar o site que falei, iancoleman.io/bip39, você consegue tirar a xpriv (Account Extended Private Key) de qualquer seed.

Como exercício  , vale qualquer método para derivar chaves privadas a partir da seed. Mas como medida de segurança,  não se deve fazer isso.

Isso é apenas para descriptor wallets.
Podes achar inútil. Para mim não é! E se calhar para outros também não é.

Continuo a dizer que colocar seeds em sites ou gerar wallets em sites é só ridículo, mas cada um é que sabe!

Volto a repetir que o meu intuito não é aumentar segurança, nem nunca foi. E já o tinha dito!
Pages:
Jump to: