Author

Topic: Script Python para extrair informação de uma wallet (Read 523 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: 1722
Merit: 4711
**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: 1722
Merit: 4711
**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!
legendary
Activity: 2352
Merit: 6089
bitcoindata.science

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.
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
-
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!

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. Thus allowing a RPC that only outputs private keys would be working against the point of having descriptors.

Instead of dumpprivkey, descriptor wallets have listdescriptors. This will output all of the descriptors stored in the wallet, which means that it will include information about derivation paths and scripts to create. Descriptors are a full backup of the key and script information stored in the wallet. With 23.0, listdescriptors will also be able to optionally output descriptors containing private keys.

Isso serve para qualquer carteira e não só o Bitcoin Core, pois elas não são reforçadas.

For dumpprivkey, I believe that it's intentionally removed because of the design of BIP44, BIP49, BIP84 and BIP86 standards which now use non-hardened addresses.
Previously, there's no serious issue with exporting a single private key from a legacy HD wallet with hardened addresses since there's no way to compute the parent extended private key from its pair extended public key and a child (exported) private key.
Now, since the 'address_index' as well as the 'chain_index' (change) paths aren't hardened, that issue is now possible if an attacker gets his hand on the data mentioned above.

There's a workaround to export your privKey but be warned of the issue above:  https://bitcointalksearch.org/topic/m.62109703

Mas você pode dumpar a chave privada raiz (ou xpriv) do Bitcoin core no console com o comando (necessário informar a senha antes):
Code:
listdescriptors true

Fazendo isso vai mostrar todos os descritores da carteira e a chave privada estendida estará no meio dos descritores, algo como:

Para endereços de recebimento:
Code:
wpkh(xpriv99999/84h/0h/0h/0/*)#pavne9dy

Para troco (change)
Code:
wpkh(xpriv99999/84h/0h/0h/1/*)#pavne9dy

Você pode visualizar as chaves públicas estendidas também apenas com "listdescriptors", não é necessário informar a senha pra usar esse comando, irá mostrar as chaves públicas em formato legacy (xpub) no meio dos descritores, você pode usar essa informação para importar em outra carteira somente a xpub ou o copiar e colar o descritor inteiro (se a carteira tiver suporte para descritor como a Sparrow).

O Bitcoin Core permite importar quantos descritores quiser, ou seja, você pode importar quantas carteiras HD quiser usando o xpriv para importá-las, isso mudou o conceito de carteiras na minha opnião, permitindo que o Bitcoin Core seja a única carteira que faz isso (acho isso um diferencial espetacular), é como se o Core fosse uma espécie de chaveiro para todas estas carteiras HD (xprivs, descritores).

Então no Bitcoin Core, você é o dono de suas chaves privadas assim como qualquer carteira.

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).

Para o usuário médio, guardar o keystore (wallet.dat) é a maneira mais segura, pois ele não interage diratamente com as chaves privadas sem ter chances de vazar, ele só precisa lembrar da senha para descritografar a carteira ou gastar as moedas nessa carteira.
legendary
Activity: 1722
Merit: 4711
**In BTC since 2013**
Mostrar a seed equivale a mostrar todas as private keys. Nenhuma wallet mostra suas private keys mais. Apenas o bitcoin core, e a forma correta de backup é guardar o wallet.dat de forma codificada. Isso exige maior conhecimento de segurança, acho altamente não recomendável que você guarde seus fundos lá se eles forem significantes.

Eu ainda tenho o wallet.dat da primeira wallet que tive no Bitcoin Core.
Foi uma boa supressa, quando coloquei o nó a funcionar outra vez e voltei abrir o wallet.dat.  Roll Eyes
Entretanto, já movi para outra wallet.


Em relação as formas de backup, apenas digo: não importa se usa-se 2 ou 3 formas diferentes ou apenas uma. O que importa é ter esse backup seguro e talvez até repetido em vários locais diferentes. Além disso, acho que a segurança não tem de ser complicada, mas sim segura. O complicado coloca mais risco, do que segurança no processo.

Outro ponto que eu acho sempre relevante, é que quanto mais sensação de segurança se tem, mais exposto se esta. Parece contraditório, mas é verdade. Por isso é que por vezes lemos historias de pessoal muito experiente perde moedas. A verdade é que quando você sabe que devia fazer mais pela sua segurança, você mantem-se alerta, para tentar evitar ficar exposto. Já quando a pessoa tem a total confiança que esta seguro, mais cedo ou mais tarde, pode baixar a guardar.

legendary
Activity: 2352
Merit: 6089
bitcoindata.science
Olha, eu tenho todas as minhas PKs em papel. É da tua/nossa responsabilidade certeficares-te que as escreves correctamente. Essa é a ideia. Seres o "ultimate accountable" pelo que fazes com as tuas PKs.
Voce gera novas Privates key com saldo a cada transação. Voce salva essa nova private key a cada transação?

Uma dúvida. como você ve sua private key? Voce roda num Jupiter Notebook no seu browser?? Lembre-se de que sempre que você digita ou visualiza sua private key ou seed num computador com acesso a internet você está expondo seus fundos. Você não sabe se alguém está vendo o que você faz no seu computador.

Quote
2 - Custodial, para mim é ter as PKs à minha disposição. Não é uma app que me permite enviar os meus Bitcoins para onde eu quiser, quando eu quiser, mas sem me mostrar as minhas PKs.

Mostrar a seed equivale a mostrar todas as private keys. Nenhuma wallet mostra suas private keys mais. Apenas o bitcoin core, e a forma correta de backup é guardar o wallet.dat de forma codificada. Isso exige maior conhecimento de segurança, acho altamente não recomendável que você guarde seus fundos lá se eles forem significantes.

Quote
3 - Sites para gerar addresses ou para derivar addresses ou whatever??? NÃO, muito obrigado! Nem que seja um site comprovadamente criado pelo Satoshi.

O site que eu te falei não faz isso. Você só não entendeu o que ele faz.

Quote
4 - Não sei como é o processo de chegar de uma Seed a uma PK. O que sei é que euma PK é um número aleatório e é nele que tudo começa. Portanto, mais importante que uma Seed, para mim, é a PK em si.

Eu recomendo que você leia o Mastering Bitcoin, a parte de wallets, antes que perca seus fundos.

https://github.com/bitcoinbook/bitcoinbook

Boa sorte.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees

Olha, eu tenho todas as minhas PKs em papel. É da tua/nossa responsabilidade certeficares-te que as escreves correctamente. Essa é a ideia. Seres o "ultimate accountable" pelo que fazes com as tuas PKs.
Aliás, eu escrevi as addresses e as respectivas PKs umas ao pé das outras. É um dos meus backups. Claro que não é o único, mas é um deles.

Eu ainda sou do tempo, em que não havia seed... Então, se a pessoa queria guardar em papel, tinha mesmo de guardar o PK.  Roll Eyes

Nunca usei, mas lembro-me deste site www.bitaddress.org que servia para criar wallet, e tem um modelo XPTO para se imprimir.

Pois. Não acho nada de errado em termos as PKs em papel. Claro que tem os seus riscos, mas é como tudo... Há riscos em praticamente tudo!

Não é boa prática de segurança. Os tempos mudaram e as carteiras também.
Uma private key te dá acesso apenas a um endereço.

As carteiras hoje são desenhadas levando em consideração que você guardou sua Seed.

Se você fizer uma transação numa carteira moderna, ela automaticamente envia o troco da transação para outro endereço , em outro derivation path, o qual você provavelmente não fez o backup.

Ou seja, Vai acabar perdendo suas moedas se seu backup for a private keys.

Claro que é uma boa prática de segurança. Aliás, teres redundância dos backups das tuas PKs é uma boa prática de segurança!
Usares apenas um meio de backup, é que é má prática de segurança. Pelo menos na minha opinião.

Depende da carteira.
Se usares a do Bitcoin Core, não é a wallet que te faz essa gestão. És tu e tens que saber o que estás a fazer. Essa é a ideia de custodial! Teres controlo absoluto dos teus fundos.
Pelo menos é assim que funciona o Bitcoin Core na linha de comandos. Colocas o endereço de destino e tens que fazer as contas para a fee da rede e para o que queres que seja enviado. Se fizeres mal as contas ou não colocares uma address para o "troco", todo o troco é considerado fee!
 Mas também admito que esta é a minha visão. Não ter que ser igual para todos nem tem que ser a mais correcta. É só a mais correcta para mim!
Portanto, resumindo:
1 - Ter várias formas de backup é melhor que ter apenas uma. E lá por ser em papel não tem que ser pior que meteres a PK ou a Seed ou whatever em discos de metal e mais não sei quantos malabarismos que inventam, para o risco de perder ser igual.
2 - Custodial, para mim é ter as PKs à minha disposição. Não é uma app que me permite enviar os meus Bitcoins para onde eu quiser, quando eu quiser, mas sem me mostrar as minhas PKs.
3 - Sites para gerar addresses ou para derivar addresses ou whatever??? NÃO, muito obrigado! Nem que seja um site comprovadamente criado pelo Satoshi.
4 - Não sei como é o processo de chegar de uma Seed a uma PK. O que sei é que euma PK é um número aleatório e é nele que tudo começa. Portanto, mais importante que uma Seed, para mim, é a PK em si.
5 - Ser o "ultimate accountable" é para mim a definição suprema de ser dono do meu património, ou vice-versa!
legendary
Activity: 2352
Merit: 6089
bitcoindata.science

Olha, eu tenho todas as minhas PKs em papel. É da tua/nossa responsabilidade certeficares-te que as escreves correctamente. Essa é a ideia. Seres o "ultimate accountable" pelo que fazes com as tuas PKs.
Aliás, eu escrevi as addresses e as respectivas PKs umas ao pé das outras. É um dos meus backups. Claro que não é o único, mas é um deles.

Eu ainda sou do tempo, em que não havia seed... Então, se a pessoa queria guardar em papel, tinha mesmo de guardar o PK.  Roll Eyes

Nunca usei, mas lembro-me deste site www.bitaddress.org que servia para criar wallet, e tem um modelo XPTO para se imprimir.

Pois. Não acho nada de errado em termos as PKs em papel. Claro que tem os seus riscos, mas é como tudo... Há riscos em praticamente tudo!

Não é boa prática de segurança. Os tempos mudaram e as carteiras também.
Uma private key te dá acesso apenas a um endereço.

As carteiras hoje são desenhadas levando em consideração que você guardou sua Seed.

Se você fizer uma transação numa carteira moderna, ela automaticamente envia o troco da transação para outro endereço , em outro derivation path, o qual você provavelmente não fez o backup.

Ou seja, Vai acabar perdendo suas moedas se seu backup for a private keys.



Indo mais afundo, quem quiser aprender.

Não é porque você ouviu falar que 15 anos atras as pessoas salvavam suas private keys, que você deve fazer isso também

Antigamente, as carteiras eram assim. De forma simplificada, o Bitcoin Core gerava 100 chaves privadas aleatórias, e você guardava elas em papel, e pronto. Não existia endereço troco.
Essas carteiras eram apelidadas de JBOK (Just a Bunch of Keys, só um monte de chaves). Devido a sua dificuldade de manejo, essas carteiras não existem mais.

Abaixo quotes do melhor livro técnico sobre bitcoin, o Mastering Bitcoin

Quote
The disadvantage of random keys is that if you generate many of them you must keep copies of all of them, meaning that the wallet must be backed up frequently. Each key must be backed up, or the funds it controls are irrevocably lost if the wallet becomes inaccessible. This conflicts directly with the principle of avoiding address re-use, by using each bitcoin address for only one transaction.

https://www.oreilly.com/library/view/mastering-bitcoin/9781491902639/ch04.html

Depois disso, foram desenvolvidas as carteiras hierárquicas determinísticas (HD).

Essas carteiras só tem vantagens. Não existe mais a necessidade de guardar as private keys. Cada seed contem literalmente milhões de private keys, algo humanamente impossível de guardar. Pessoalmente, eu tenho mais de 20 endereços com saldos em bitcoin, e uma transação pode gerar mais 1 ou 2 rapidamente.

Quote
HD wallets offer two major advantages over random (nondeterministic) keys. First, the tree structure can be used to express additional organizational meaning, such as when a specific branch of subkeys is used to receive incoming payments and a different branch is used to receive change from outgoing payments. Branches of keys can also be used in a corporate setting, allocating different branches to departments, subsidiaries, specific functions, or accounting categories.

The second advantage of HD wallets is that users can create a sequence of public keys without having access to the corresponding private keys. This allows HD wallets to be used on an insecure server or in a receive-only capacity, issuing a different public key for each transaction. The public keys do not need to be preloaded or derived in advance, yet the server doesn’t have the private keys that can spend the funds.

Seeds ainda melhoram sua privacidade, pois ao guardar private keys você acaba fazendo reutilização de endereços, uma péssima prática.

Recomendo novamente que você vá no iancoleman.io/bip39 para aprender como funciona a derivação de uma seed em private keys. É uma operação matemática. Se voce olhar o source code dele (em javascript), pode adaptar o código dele para python para fazer corretamente a extração das private keys a partir da semente.

Levando em conta que sua seed nunca deve ser colocada online, e se sua private key já apareceu alguma vez pra você na tela do seu computador, ela está exposta e você pode deletar sua carteira.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees

A sua seed é a private key de todos os endereços da sua wallet. Uma simples operação matemática irá derivar todas as private keys.

O que você está fazendo não aumenta sua segurança, pelo contrário.

Eu não quero aumentar a segurança. Quero apenas ter as PKs comigo.

Com exercício, para uma seed sem fundos, beleza, vale qualquer coisa. E o mais eficiente é botar na ferramenta que recomendei.

Agora se tiver fundos aí, pode parar pq voce já tem suas chaves e está apenas expondo elas nessa brincadeira.

Continuo a dizer que é mau aconselhar usar sites para esses efeitos. Qualquer coisa que exponha as PKs à internet, é mau. Pelo menos para efeitos de guardar PKs por muito tempo!


Quote
Mas colocar a seed noutra wallet, continua a não me mostrar as PKs das addresses! Se quiseres fazer um backup de uma as adresses em papel, como é que fazes? (Eu respondo: não fazes).

Não se deve fazer backup de private keys em papel. Isso não foi feito para seres humanos lerem.

Uma private key é assim:

Code:
KzTT1W3toHBjkNFh3YTTnfwN3WUJXPGaAy9E592oDCfZWDCJPMBF

Imagina escrever isso na mão. Trocar um B por um 8, ou um 0 por um O e está tudo perdido.
Em papel só se deve guardar a seed.


Olha, eu tenho todas as minhas PKs em papel. É da tua/nossa responsabilidade certeficares-te que as escreves correctamente. Essa é a ideia. Seres o "ultimate accountable" pelo que fazes com as tuas PKs.
Aliás, eu escrevi as addresses e as respectivas PKs umas ao pé das outras. É um dos meus backups. Claro que não é o único, mas é um deles.



Então mas quando se tem uma wallet no Electrum, não se consegue obter as PKs?
Nunca experimentei, nem pesquisei, por isso pergunto.

Sim, na Electrum sim. Mas como é raro eu usar a Electrum, também só soube que dava para extrair as PKs agora que fiz o script e enquanto não consegui fazer o script, acabei opr ir testar com a Electrum.


Outra curiosidade, qual é o objetivo de obter as PKs?
Ou apenas estas a explorar um exercício para aprender mais sobre o tema?

O objectivo é só esse. Ter as PKs e em qualquer eventualidade, tenho sempre a possibilidade de recuperar as addresses.



Eu ainda sou do tempo, em que não havia seed... Então, se a pessoa queria guardar em papel, tinha mesmo de guardar o PK.  Roll Eyes

Nunca usei, mas lembro-me deste site www.bitaddress.org que servia para criar wallet, e tem um modelo XPTO para se imprimir.

Pois. Não acho nada de errado em termos as PKs em papel. Claro que tem os seus riscos, mas é como tudo... Há riscos em praticamente tudo!
legendary
Activity: 1722
Merit: 4711
**In BTC since 2013**
Mais ou menos. A opção para gerar o backup é uma coisa, teres a seed é outra. Tens uma opção para mostrar a seed se não me engano.

Mas colocar a seed noutra wallet, continua a não me mostrar as PKs das addresses! Se quiseres fazer um backup de uma as adresses em papel, como é que fazes? (Eu respondo: não fazes).

Sim, é possível. Aliás eu testei importar na Electrum e funcionou. Mas é o que eu disse, não fico com as PKs na mesma!

Então mas quando se tem uma wallet no Electrum, não se consegue obter as PKs?
Nunca experimentei, nem pesquisei, por isso pergunto.

Outra curiosidade, qual é o objetivo de obter as PKs?
Ou apenas estas a explorar um exercício para aprender mais sobre o tema?



Não se deve fazer backup de private keys em papel. Isso não foi feito para seres humanos lerem.

Uma private key é assim:

Code:
KzTT1W3toHBjkNFh3YTTnfwN3WUJXPGaAy9E592oDCfZWDCJPMBF

Imagina escrever isso na mão. Trocar um B por um 8, ou um 0 por um O e está tudo perdido.
Em papel só se deve guardar a seed.

Eu ainda sou do tempo, em que não havia seed... Então, se a pessoa queria guardar em papel, tinha mesmo de guardar o PK.  Roll Eyes

Nunca usei, mas lembro-me deste site www.bitaddress.org que servia para criar wallet, e tem um modelo XPTO para se imprimir.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees

Oh @bitmover, eu também não ando cá há dois dias, né?
Ou não me conheces minimamente pelo tipo de conteúdo dos meus posts ou então nem percebo como é que tu achas sequer possível que eu caísse num erro desses.
Essa wallet que usei já teve coins mas já lá não há nada há muito tempo. Até tu próprio podias ter ido ver  se eu lá tinha alguma coisa e evitavas passar sequer a ideia que eu era tão novato quanto isso. :p :p !

E se não tem moedas, pq é tão absurdo botar a seed no site q eu sugeri?

Se vc só quer as private keys da seed  você pode usar isso aqui também.

https://stackoverflow.com/questions/54202617/how-to-generate-bitcoin-keys-addresses-from-a-seed-in-python

Eu não tenho mas se alguém ler comentários a sugerir colocar seeds em sites, pode dar asneira. Ninguém quer isso. Eu por acaso não tenho mas também já sei mais ou menos o que a casa gasta mas pessoas com menos experiência podem cair nesse erro e darem-se mal. Por isso, a minha opinião é que sugerir sites para gerar wallets e/ou para o que quer que seja que envolva expôr PKs à internet, nunca é bom conselho!
legendary
Activity: 2352
Merit: 6089
bitcoindata.science

Oh @bitmover, eu também não ando cá há dois dias, né?
Ou não me conheces minimamente pelo tipo de conteúdo dos meus posts ou então nem percebo como é que tu achas sequer possível que eu caísse num erro desses.
Essa wallet que usei já teve coins mas já lá não há nada há muito tempo. Até tu próprio podias ter ido ver  se eu lá tinha alguma coisa e evitavas passar sequer a ideia que eu era tão novato quanto isso. :p :p !

E se não tem moedas, pq é tão absurdo botar a seed no site q eu sugeri?

Se vc só quer as private keys da seed  você pode usar isso aqui também.

https://stackoverflow.com/questions/54202617/how-to-generate-bitcoin-keys-addresses-from-a-seed-in-python
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
Desculpa lá mas nem parece teu. Tu és mais sábio que isso.
Seja lá qual for o site, até podia ser do Satoshi, mas eu nunca iria meter uma seed ou seja o que for, para me dar as PKs das minhas addresses! Acho que isso é conselho que eu jamais daria a quem quer que fosse.

Cara, o que você está fazendo já é por si só altamente inseguro. Se você tem qualquer dinheiro nessa seed, já recomendo que pare imediatamente seu experimento. Tire todas as moedas dessa wallet pq sua seed já está comprometida.

Tudo que você está fazendo é inseguro. Você está baixando um monte de libs, procurando githubs por aí etc.. e botando sua seed num "código python " para extrair sementes.

Eu apenas te mostrei a forma correta de derivar private keys de seeds. Pelo código de um desenvolvedor bitcoin que criou o bip39, ou seja, um dos inventores da seed.

Novamente, isso serve apenas para fins experimentais. Você não deve criar códigos python com sua seed se ela tiver fundos.
Acho que o que você está fazendo é mais perigoso do que usar o iancoleman.io

Oh @bitmover, eu também não ando cá há dois dias, né?
Ou não me conheces minimamente pelo tipo de conteúdo dos meus posts ou então nem percebo como é que tu achas sequer possível que eu caísse num erro desses.
Essa wallet que usei já teve coins mas já lá não há nada há muito tempo. Até tu próprio podias ter ido ver  se eu lá tinha alguma coisa e evitavas passar sequer a ideia que eu era tão novato quanto isso. :p :p !
legendary
Activity: 2352
Merit: 6089
bitcoindata.science
Desculpa lá mas nem parece teu. Tu és mais sábio que isso.
Seja lá qual for o site, até podia ser do Satoshi, mas eu nunca iria meter uma seed ou seja o que for, para me dar as PKs das minhas addresses! Acho que isso é conselho que eu jamais daria a quem quer que fosse.

Cara, o que você está fazendo já é por si só altamente inseguro. Se você tem qualquer dinheiro nessa seed, já recomendo que pare imediatamente seu experimento. Tire todas as moedas dessa wallet pq sua seed já está comprometida.

Tudo que você está fazendo é inseguro. Você está baixando um monte de libs, procurando githubs por aí etc.. e botando sua seed num "código python " para extrair sementes.

Eu apenas te mostrei a forma correta de derivar private keys de seeds. Pelo código de um desenvolvedor bitcoin que criou o bip39, ou seja, um dos inventores da seed.

Novamente, isso serve apenas para fins experimentais. Você não deve criar códigos python com sua seed se ela tiver fundos.
Acho que o que você está fazendo é mais perigoso do que usar o iancoleman.io

Quote
Mas a verdade é que Not your keys, not your bitcoin. E portanto, a Peach não te mostra em plain text em lado nenhum as PKs de cada address que ela gera para as tuas transacções. E eu queria ter as PKs comigo. Foi só por isso que tentei fazer este script!

A sua seed é a private key de todos os endereços da sua wallet. Uma simples operação matemática irá derivar todas as private keys.

O que você está fazendo não aumenta sua segurança, pelo contrário.

Com exercício, para uma seed sem fundos, beleza, vale qualquer coisa. E o mais eficiente é botar na ferramenta que recomendei.

Agora se tiver fundos aí, pode parar pq voce já tem suas chaves e está apenas expondo elas nessa brincadeira.


Quote
Mas colocar a seed noutra wallet, continua a não me mostrar as PKs das addresses! Se quiseres fazer um backup de uma as adresses em papel, como é que fazes? (Eu respondo: não fazes).

Não se deve fazer backup de private keys em papel. Isso não foi feito para seres humanos lerem.

Uma private key é assim:

Code:
KzTT1W3toHBjkNFh3YTTnfwN3WUJXPGaAy9E592oDCfZWDCJPMBF

Imagina escrever isso na mão. Trocar um B por um 8, ou um 0 por um O e está tudo perdido.
Em papel só se deve guardar a seed.
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
Se fores às definições da app, tem lá uma opção para criar um backup.

O meu objectivo, em concreto era apenas conseguir tirar as addresses e as PKs, para eu ficar com controlo total sobre as addresses da wallet. Eu sei que tenho controlo "total" porque é non-custodial e etc. Mas a verdade é que Not your keys, not your bitcoin. E portanto, a Peach não te mostra em plain text em lado nenhum as PKs de cada address que ela gera para as tuas transacções. E eu queria ter as PKs comigo. Foi só por isso que tentei fazer este script!

Mas, nessa opção de backup, podes obter a seed. Logo se tens a seed, basta colocares no Electrum e passas a ter o controlo fora do Peach da tua wallet.
Eu nunca experimentei, mas pensei que seja possível. Ou não!?

Mais ou menos. A opção para gerar o backup é uma coisa, teres a seed é outra. Tens uma opção para mostrar a seed se não me engano.

Mas colocar a seed noutra wallet, continua a não me mostrar as PKs das addresses! Se quiseres fazer um backup de uma as adresses em papel, como é que fazes? (Eu respondo: não fazes).

Sim, é possível. Aliás eu testei importar na Electrum e funcionou. Mas é o que eu disse, não fico com as PKs na mesma!

Eu tenho a seed phrase e já tentei usá-la para extrair as PKs mas tudo o que consigo é uma PK em formato WIF. Não quero WIF. Quero no mesmo formato que o Bitcoin Core as mostra com o comando dumpprivkey.

Se você tem a seed e quer derivar as private keys, você não precisa de nada disso.

Basta botar aqui
https://iancoleman.io/bip39/

Ele vai generate todas as private keys e respectivos addresses

Desculpa lá mas nem parece teu. Tu és mais sábio que isso.
Seja lá qual for o site, até podia ser do Satoshi, mas eu nunca iria meter uma seed ou seja o que for, para me dar as PKs das minhas addresses! Acho que isso é conselho que eu jamais daria a quem quer que fosse.
Eu sei que o site muito provavelmente é de confiança e etc, mas quando falamos aqui em OpSec para guardar as nossas wallets/Pks de forma a nunca as perdermos, dizer para meter uma seed num site para nos dar as PKs, não é o melhor conselho, acho eu.

Vais dizer que o posso fazer offline e etc... Ok, mas também nada me garante que não haja um mecanismo qualquer que quando detecta uma ligação à net, que não envia informação em cache ou sobre outra forma qualquer, para o dono do site!

Podes dizer que as libraries que eu usei, podem fazer o mesmo, talvez, mas então muitos outros projectos que usam as mesmas libraries estariam a sofrer do mesmo.
legendary
Activity: 2352
Merit: 6089
bitcoindata.science
Eu tenho a seed phrase e já tentei usá-la para extrair as PKs mas tudo o que consigo é uma PK em formato WIF. Não quero WIF. Quero no mesmo formato que o Bitcoin Core as mostra com o comando dumpprivkey.

Se você tem a seed e quer derivar as private keys, você não precisa de nada disso.

Basta botar aqui
https://iancoleman.io/bip39/

Ele vai generate todas as private keys e respectivos addresses
legendary
Activity: 1722
Merit: 4711
**In BTC since 2013**
Se fores às definições da app, tem lá uma opção para criar um backup.

O meu objectivo, em concreto era apenas conseguir tirar as addresses e as PKs, para eu ficar com controlo total sobre as addresses da wallet. Eu sei que tenho controlo "total" porque é non-custodial e etc. Mas a verdade é que Not your keys, not your bitcoin. E portanto, a Peach não te mostra em plain text em lado nenhum as PKs de cada address que ela gera para as tuas transacções. E eu queria ter as PKs comigo. Foi só por isso que tentei fazer este script!

Mas, nessa opção de backup, podes obter a seed. Logo se tens a seed, basta colocares no Electrum e passas a ter o controlo fora do Peach da tua wallet.
Eu nunca experimentei, mas pensei que seja possível. Ou não!?
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
Estou a tentar fazer um script em Python para extrair umas informações de uma wallet que é a Peach que tenho usado para comprar Bitcoin P2P.
O objectivo é mesmo tentar extrair as PKs das addresses desta wallet. Ou pelo menos uma PK.

Fiquei curioso, porque também uso o Peach.

Onde vais buscar a informação da wallet? Consegues extrair algum ficheiro com essa info? Não me lembro de ver isso na app...

Depois, qual é o objetivo de recolher essa informação?

Não sei ao certo o que queres dizer com o "ir buscar a informação da wallet". A própria wallet sugere-te de tempos a tempos fazer um backup. Isso cria um ficheiro JSON encriptado.
Desse ficheiro, se o souberes desencriptar, deves poder tirar informação sobre a wallet. Não sei qual informação ao certo, mas talvez histórico de transacções, etc.

Se fores às definições da app, tem lá uma opção para criar um backup.

O meu objectivo, em concreto era apenas conseguir tirar as addresses e as PKs, para eu ficar com controlo total sobre as addresses da wallet. Eu sei que tenho controlo "total" porque é non-custodial e etc. Mas a verdade é que Not your keys, not your bitcoin. E portanto, a Peach não te mostra em plain text em lado nenhum as PKs de cada address que ela gera para as tuas transacções. E eu queria ter as PKs comigo. Foi só por isso que tentei fazer este script!
legendary
Activity: 1722
Merit: 4711
**In BTC since 2013**
Estou a tentar fazer um script em Python para extrair umas informações de uma wallet que é a Peach que tenho usado para comprar Bitcoin P2P.
O objectivo é mesmo tentar extrair as PKs das addresses desta wallet. Ou pelo menos uma PK.

Fiquei curioso, porque também uso o Peach.

Onde vais buscar a informação da wallet? Consegues extrair algum ficheiro com essa info? Não me lembro de ver isso na app...

Depois, qual é o objetivo de recolher essa informação?
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
Ei my man, eu li seu tópico, mas como estava meio sem tempo, não deu pra ler tudo, você quer extrair as chaves privadas em formato WIF, certo? Essa wallet da peach não fornece um mnemônico? Você pode através do mnemônico BIP39 restaurar as chaves privadas de cada endereço em formato WIF em ferramentas para uso offline como Electrum, iancoleman etc, definindo corretamente o derivation path.

Seria ótimo se você fizesse um vídeo demonstrando como desvendou o mistério, eu acho ótimo essas coisas. Mas sei que fazer um vídeo requer muito tempo e pode ser trabalhoso, mas pretendo voltar aqui quando estiver aprendendo python (atualmente eu não conheço ou sei como usar essa linguagem).

Sim, a wallet fornece a Seed Phrase e foi através dela que fiz o script. Como podes ver pela minha reposta anterior, já consegui fazer o que queria e extrair "todas" as addresses e "todas" as keys que pretendia, tal como faz a Electrum.

Agora vou aproveitar e fazer mais algumas alterações e deixar o script mais "bonito" e até talvez interagir um pouco com o user! Tipo pedir quantas addresses quer, se quer addresses para "change", se quer imprimir juntamente as PKs e acho que será tudo!

Ainda tentei fazer o script usando o file de backup da wallet, mas fiquei "preso" num erro que não consegui resolver, e decidi fazer apenas pela Seed Phrase!

Se quiseres seguir o que vou adicionando ao script, podes ir vendo aqui:
https://gitlab.com/PsySc0rpi0n/peachkeyextractor
hero member
Activity: 1120
Merit: 540
Duelbits - Play for Free | Win for Real
Ei my man, eu li seu tópico, mas como estava meio sem tempo, não deu pra ler tudo, você quer extrair as chaves privadas em formato WIF, certo? Essa wallet da peach não fornece um mnemônico? Você pode através do mnemônico BIP39 restaurar as chaves privadas de cada endereço em formato WIF em ferramentas para uso offline como Electrum, iancoleman etc, definindo corretamente o derivation path.

Seria ótimo se você fizesse um vídeo demonstrando como desvendou o mistério, eu acho ótimo essas coisas. Mas sei que fazer um vídeo requer muito tempo e pode ser trabalhoso, mas pretendo voltar aqui quando estiver aprendendo python (atualmente eu não conheço ou sei como usar essa linguagem).
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
Bem, entretanto se não fosse no forum internacional, não conseguia chegar ao meu objectivo. E não estava muito longe! Faltaram apenas 2 detalhes.

Com o seguinte código já consigo sacar as Private Keys no formato que pretendo, ou seja, antes de chegar a WIF (base58).

Code:
from bitcoinlib.keys import HDKey
from bitcoinlib.mnemonic import Mnemonic
from bitcoinlib.encoding import base58encode
from bitcoinlib.encoding import double_sha256

# Example seed phrase (mnemonic)
mnemonic_phrase = "thunder trade sleep rack pair ranch sense hand inquiry gauge you know"

# Create a Mnemonic object
mnemonic = Mnemonic()
# Convert the mnemonic phrase to a seed (binary)
seed = mnemonic.to_seed(mnemonic_phrase)

# Create an HD wallet from the seed
hdkey = HDKey.from_seed(seed, network='bitcoin')

# Derive a private key using the specific derivation path (m/84'/0'/0'/0/2)
key = hdkey.subkey_for_path("m/84'/0'/0'/1/0")

# Get the corresponding native SegWit address
bitcoin_address = key.address(encoding='bech32')

# Prepend and append the network byte (0x80) and the compression flag (0x01)
prvKey_data = (b'\x80' + key.private_byte + b'\x01')

# Calculate the checksum
checksum = double_sha256(prvKey_data)

# Prepend the checksum to the double sha256'ed key
private_key_base58 = base58encode(prvKey_data + checksum[0:4])

print("Bitcoin address:", bitcoin_address)
print("Private key (Base58):", private_key_base58)
hero member
Activity: 1274
Merit: 681
I rather die on my feet than to live on my knees
Comecei uma thread igual no forum internacional mas não estou a obter feeback nenhum.

Pode ser que algum de vós mais experiente em Python me consiga ajudar.

Estou a tentar fazer um script em Python para extrair umas informações de uma wallet que é a Peach que tenho usado para comprar Bitcoin P2P.
O objectivo é mesmo tentar extrair as PKs das addresses desta wallet. Ou pelo menos uma PK.

Eu tenho a seed phrase e já tentei usá-la para extrair as PKs mas tudo o que consigo é uma PK em formato WIF. Não quero WIF. Quero no mesmo formato que o Bitcoin Core as mostra com o comando dumpprivkey.
Então, como ponto de partida, fui ao Github da Peach e fui tentar perceber quais as funções de interesse tanto para criar uma wallet a partir de uma seed ou para criar os backups e talvez conseguir perceber como extrair as PKs através ou do backup ou directamente através a seed phrase!

Achei alguns files de interesse com funcções que fazem o que acabei de dizer. Mas o código é TypeScript. É preciso tentar converter ese código para Python e também é preciso conhecer os detalhes das HD wallets e os passos que é necessário dar para criar as PKs e respectivas addresses. Não tenho conhecimento aprofundado de nenhuma das partes. lol.

Mas o que encontrei foi o seguinte:
https://github.com/Peach2Peach/peach-app/blob/develop/src/utils/wallet/getDescriptorSecretKey.ts

Code:
import { DescriptorSecretKey, Mnemonic } from "bdk-rn";
import { Network, WordCount } from "bdk-rn/lib/lib/enums";

export const getDescriptorSecretKey = async (
  network: Network,
  seedphrase?: string,
) => {
  let mnemonic = new Mnemonic();

  if (seedphrase) {
    mnemonic = await mnemonic.fromString(seedphrase);
  } else {
    mnemonic = await mnemonic.create(WordCount.WORDS12);
  }

  return new DescriptorSecretKey().create(network, mnemonic);
};

https://github.com/Peach2Peach/peach-app/blob/develop/src/utils/file/writeFile.ts

Code:
import RNFS from "react-native-fs";
import { encrypt } from "../crypto/encrypt";
import { error } from "../log/error";
import { info } from "../log/info";

export const writeFile = async (
  path: string,
  content: string,
  password?: string,
): Promise => {
  info(password ? "Writing encrypted file" : "Writing file", path);
  let encrypted;
  try {
    if (password) {
      encrypted = encrypt(content, password);
    } else {
      encrypted = content;
    }
  } catch (e) {
    error("Data could not be encrypted", e);
    return false;
  }
  try {
    await RNFS.writeFile(RNFS.DocumentDirectoryPath + path, encrypted, "utf8");
    return true;
  } catch (e) {
    error("File could not be written", e);
    return false;
  }
};

e este:
https://github.com/Peach2Peach/peach-app/blob/develop/src/utils/file/readChunkOfFile.ts

Code:
import RNFS from "react-native-fs";

export const readChunkOfFile = (
  uri: string,
  chunksize: number,
  index: number,
) => RNFS.read(uri, chunksize, index, "utf8");

Como nada sei sobre TypeScript, pedi ao chatGPT para converter estas funções para Python e depois, como o código nunca funciona vindo irecto do chatGPT, lá tentei fazer algusn ajustes até conseguir obter uma adress bitcoin a respectiva WIF e até o derivation path. O cóigo é este:

Code:
from bitcoinlib.wallets import Wallet, wallet_create_or_open
from bitcoinlib.wallets import wallet_delete_if_exists
import asyncio


async def get_descriptor_secret_key(network: str, seedphrase: str = None,
                                    name='My Wallet'):
    delete_wallet(name)
    if seedphrase:
        # Use the provided seed phrase to generate a wallet
        wallet = Wallet.create(name=name, keys=seedphrase,
                               network=network, witness_type='segwit')
    else:
        # Generate a new wallet with a new seed phrase
        wallet = wallet_create_or_open(name, witness_type='segwit',
                                       network=network)

    # Print wallet info
    print("Wallet Info:")
    print("Address:", wallet.new_key().address)
    print("Key:", wallet.new_key())
    # print("Descriptor:", wallet.descriptor)
    return wallet


def delete_wallet(name="My Wallet"):
    try:
        wallet_delete_if_exists(name)
        print(f"Wallet '{name}' was deleted.")
    except Exception as e:
        print(f"Faile to delete wallet '{name}': {str(e)}")


# Define the network ('bitcoin' or 'testnet')
network_name = 'bitcoin'

# Optionally, provide a seed phrase
seed_phrase = "word1 word1 word1 word1 word1 word1 word1 word1 word1 word1 word1 word1"
# Example seed phrase
asyncio.run(get_descriptor_secret_key(network_name, seed_phrase))

Obtenho o seguinte output:

Quote
Wallet 'My Wallet' was deleted.
Wallet Info:
Address: bc1qd.........my
Key:

Como ainda não consegui extrair exactamente o que quero, o que tentei foi usar a seed phrase na Electrum e aí consigo obter todas as addresses e as respectivas PKs nos formatos que pretendo, ou seja, acho que é Base58 e/ou Bech32.

Se alguém me conseguir ajudar, agradeço. Estou a usar a bliblioteca bitcoinlib.


Edited;
Alguém no canal de Telegram da Peach me deu também uma função JavaScript mas eu nem sequer tentei usar porque me parece que a única coisa que faz é abrir o ficheiro de backup, desencriptar e mostrar o conteúdo.

Code:
const CryptoJS = require('crypto-js');
const fs = require('fs');

fs.readFile('./peach-account.json.enc', 'utf8', function(err, data) {
    const res = CryptoJS.AES.decrypt(data, "").toString(CryptoJS.enc.Utf8);
    fs.writeFile('./peach-account.json', res, function(err) {
        if(err) {
            return console.log(err);
        }
        console.log("The file was saved!");
    })
});

Também a tentei converter para Python com o chatGPT mas obtenho sempre um erro que diz que não consegue ler o primeiro caractér UTF8 do ficheiro ou que o UTF8 está malformado ou algo assim!
Jump to: