Найти все используемые адреса с помощью ключа xpub

В настоящее время я использую кошелек Ledger, и мне сложно подключать его каждый раз, когда я хочу проверить свой баланс.

У меня есть доступ к моему мастер-ключу xpub, как мне узнать все соответствующие ему адреса? Есть ли сайт, на котором размещен этот сервис и есть API?

Я нашел в Интернете скрипт, который делает это, но он написан на PHP и довольно медленный. Я ищу что-то совместимое с python.

Здесь есть ответ: bitcoin.stackexchange.com/a/64685/38324

Ответы (1)

Вы можете использовать блокономику , это довольно быстро. У него также есть API для баланса данного xpub.

Если вы не хотите отправлять свой xpub на сервер, вы можете использовать https://github.com/dan-da/hd-wallet-addrs . Это выберет службу API случайного баланса для каждого адреса и проведет пошаговое руководство в формате HD.

Добавлен пример кода с использованием blockr api, извлекает балансы сразу для 20 адресов, должно быть довольно быстро

import pycoin.key
import sys
import os
os.environ["PYCOIN_NATIVE"]="openssl"
import requests
BATCH_SIZE = 20
BLOCKR_URL= "http://btc.blockr.io/api/v1/address/info"
def get_used_addresses(xpub, account_type):
  xpub_subkey = xpub.subkey(account_type)
  index = 0
  addr_batch = []
  output = []
  while True:
    addr = xpub_subkey.subkey(index).bitcoin_address()
    addr_batch.append(addr)
    if (index+1)%BATCH_SIZE==0:
      results = requests.get("{}/{}".format(BLOCKR_URL, ",".join(addr_batch))).json()
      addr_batch = []
      used_addrs = [x["address"] for x in results['data'] if not x["is_unknown"]]   
      if (used_addrs):                       
        output.extend(used_addrs)
      else:  
        break                     
    index += 1
  return output

def main():
  xpub = pycoin.key.Key.from_text(sys.argv[1])
  result = []
  result.extend(get_used_addresses(xpub, 0))
  result.extend(get_used_addresses(xpub, 1))
  print result

if __name__ == "__main__":
  main()
1. Блокономика имеет ограничение на 50 адресов. Если бы я хотел отправить свой публичный ключ на сторонний сервер, я бы использовал blockchain.ifo/xpub. Это быстрее.
2. Это PHP-скрипт, о котором я говорил. Обработка занимает слишком много времени.
Не уверен, смотрели ли вы параметр --batch-size в PHP-скрипте. Таким образом, он будет искать несколько адресов одновременно и должен работать быстрее. Еще одним узким местом является генерация подраздела, с Python вы можете использовать github.com/richardkiss/pycoin с PYCOIN_NATIVE=openssl, это действительно помогает ускориться.
добавлен пример кода на питоне
Я не уверен, как бы я соединил эти два вместе - один - PHP, другой - Python...
@WhytetheWeeabear Я добавил пример кода Python, вы можете использовать его напрямую, не беспокойтесь о php
Попробовал ваш код, выдал мне "IndexError: индекс списка вне допустимого диапазона"
Вы должны передать xpub в качестве параметра для программы
Скрипт не работает с segwit-кошельками (BIP49).