Статья Работа с криптовалютой Bitcoin посредством Python

admin

Администратор
Команда форума
1 Дек 2019
858
16
840
ovnl.in
Всем привет, за прощедший месяц я выкатил несколько проектов, связанных с криптовалютой и пожалуй настало написать небольшую статью по работе с ней, а конкретно с Bitcoin.
В данном уроке мы будем генерировать секретный ключ и адрес, а также проверять баланс и совершать транзакции.

Зависимости
Нам потребуется только три сторонние библиотеки: requests, bit, bipwallet
А также Python3.8, поскольку bipwallet не работает на Python3.9

Python:
from bipwallet import wallet
from bipwallet.utils import *
import requests
import bit

Разработка
Чтобы сгенерировать адрес кошелька (address) и приватный ключ для совершения транзакций (wif) нам понадобится лишь две вещи, это секретна фраза (seed; обычно 12 слов) и индификатор (index; на одной секретной фразе может быть бесконечное количество кошельков, достаточно только сменить индекс).

Имея seed, можно сгенерировать address и wif.
Имея wif, можно проводить транзакции.

Генерация секретной фразы (seed):
Python:
wallet.generate_mnemonic()  # на выходе будет фраза из 12 слов

Генерация Bitcoin-адреса (address) и приватного ключа (wif):
Python:
def generate(seed, index=1):
    master_key = HDPrivateKey.master_key_from_mnemonic(seed)

    root_keys = HDKey.from_path(master_key, "m/44'/0'/0'/0")[-1].public_key.to_b58check()
    xpublic_key = root_keys

    address = Wallet.deserialize(xpublic_key, network='BTC').get_child(index, is_prime=False).to_address()
    rootkeys_wif = HDKey.from_path(master_key, f"m/44'/0'/0'/0/{index}")[-1]

    xprivatekey = rootkeys_wif.to_b58check()
    wif = Wallet.deserialize(xprivatekey, network='BTC').export_to_wif()

    return address, wif

Далее отрезок, который выведет нам наш новый seed, а также address и wif.
Index можно оставить дефолтный, то есть единичку.
Python:
s = wallet.generate_mnemonic()
a = generate(s)

print("Секретная фраза:", s)
print("Адрес:", a[0])
print("Приватный ключ:", a[1])

1613987791009.png


Проверку баланса мы будем делать, при помощи Blockcypher.com API:
Python:
def balance(address):
    url = f"https://api.blockcypher.com/v1/btc/main/addrs/{address}"
    response = requests.get(url).json()

    return response["final_balance"] / 10000000

Мы получаем баланс в сатоши, чтобы получить в BTC, нужно разделить на 100000000 (т.е. 8 нулей после точки)
И добавим строчку к остальным print("Баланс:", balance(a[0]))

1613988283293.png


Совершение транзакций:
Python:
def send(wif, address, money):
        key = bit.Key(wif)
        transaction_hash = key.create_transaction([(address, money, "btc")], fee=10000, absolute_fee=True)
    
        response = requests.post('https://blockchain.info/pushtx', data={'tx': transaction_hash}).text

        if response == "Transaction Submitted": return True
        return False

На данном участке кода мы генерируем транзакцию, т.е. ее хэш, который мы активируем на блокчейне.
При генерации задается комиссия (fee) в сатоши, майнерам. В нашем случае 10000 САТ или 0.0001 BTC.
Для успешной транзакции на кошельке должны быть средства разумеется.

Если поставить слишком маленькую комиссию, например 0.00001 BTC, то она не пройдет и деньги останутся в полете до лучших времен.
На момент написания статьи Bitcoin сеть была слишком нагружена и комиссии требовались высокие.

money - соотвественно сколько вы хотите перевести, а address - кому.

Строчка для создания транзакции: send(a[1], "btc адрес получателя", "0.00001")

На этом думаю все.
Примеры мои готовых проектов, построенных на данных библиотеках: bitbank, chaines.
 

admin

Администратор
Команда форума
1 Дек 2019
858
16
840
ovnl.in