Загрузка...

Взаимодействие с криптовалютой через ноду используя Python и aiotx

Тема в разделе Криптовалюты создана пользователем grommash9 29 май 2024. 493 просмотра

Загрузка...
  1. grommash9
    grommash9 Автор темы 29 май 2024 Разработка - zelenka.guru/threads/4013760/ 73 13 сен 2021
    Я уже много лет "работаю в криптовалюте" и так же пишу на python и я решил сделать что-то хорошее для комьюнити разработчиков.
    Я разрабатываю python пакет для удобного взаимодействия с блокчейн нодами из python.

    О нодах
    Ноду нужно использовать для того что бы не иметь кучу лимитов которые есть у апишек, а так же минимально платить за подписки и расширения.
    Крипто нода это узел криптовалютной сети при взаимодействии с которым вы можете получать или отправлять информацию (узнать о транзакциях, балансах. отправить свои транзакции в сеть)

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

    Главное преимущество использование нод в том что если нам нужно проверить 1000 кошельков на предмет пополнений мы не будем как в случае с аги проверять их по одному, что каждый раз увеличивало бы задержки нашего сервиса, вместо этого мы будем реагировать на новые блоки в блокчейне которые содержат транзакции и в этом блоке смотреть есть ли там транзакции которые нас интересуют, что позволит отслеживать любое кол-во кошельков на предмет пополнения

    Используя мою библиотеку и подключение к ноде вы сможете сделать прием крипто платежей в своем продукте без каких либо комиссий или проверок, вы будете платить только комиссию сети, что сделает ваш проект намного выгоднее чем у конкурентов в некоторых случаях (сильно зависит от сферы использования)

    О библиотеке и ее целях
    Библиотека вдохновлена aiogram'ом как аиограм это обертка вокруг API телеграм так и моя библиотека это по сути обертка вокруг RPC API криптовалютной ноды. Так же я пытаюсь сделать взаимодействие с разными блокчейнами на столько похожим на сколько это возможно и разумно, то есть функция создания кошелька для BTC и ETH или отправки средств максимально похожи друг на друга. Большинство функций уже покрыто тестами и мы всегда можем быть уверены что код не содержит ошибок, что сделает ваш конечный продукт проще и надежнее.
    Как использовать
    Основа библиотеки это клиенты, вначале вы всегда будете импортировать клиент и создавать его что бы после этого использовать какие-либо функции этого клиента (аналогия с созданием объекта класса бота в аиограмм) для создания клиентов могут иногда требоваться дополнительные параметры, но в основном нужна только ссылка на ноду к которой вы будете подключаться.

    Для тестирования работы вашего приложения начинать нужно с тестовой ноды (у каждой криптовалюты есть тестовая среда в которой мы можем получить не настоящие тестовые монеты и протестировать на них работу нашего приложения)

    Тестовые ноды для ETH мы можем найти на quicknode (реферальная ссылка) обычная - www.quicknode.com

    Там довольно понятный интерфейс - выбираем блокчейн, выбирает мейнент / тестнет и получаем ссылку, но если вдруг нужен гайд то есть вот тут

    После получения ссылки на ноду давайте установим aiotx и напишем код для мониторинга сети ETH

    Код
    pip install aiotx
    Создаем клиент и запускаем мониторинг, у нашего клиента есть декораторы как у aiogram в которые нам будут приходить новые блоки и новые транзакции в этих блоках

    Python
    from aiotx.clients import AioTxETHClient
    import asyncio

    eth_client = AioTxETHClient(
    node_url="https://ethereum-sepolia-rpc.publicnode.com")


    @eth_client.monitor.on_block
    async def handle_block(block):
    print("eth_client: block", block)

    @eth_client.monitor.on_transaction
    async def handle_transaction(transaction):
    print("eth_client: transaction", transaction)

    async def main():
    await eth_client.start_monitoring()
    while True:
    await asyncio.sleep(1)

    if __name__ == "__main__":
    asyncio.run(main())
    Результат выполнения кода будет примерно таким
    [IMG]
    Когда транзакция была связана с вызовом контракта - aiotx попытаться декодировать для вас функцию которая была вызвана, то есть вы сможете увидеть переводы средств, на какой кошелек они были совершены, какой контракт использоваться и сколько токенов ушло

    Используя этот мониторинг вы сможете моментально видеть и реагировать на все транзакции в сети, на 20-30 секунд быстрее сервисов типа ethscan и подобные

    Давайте теперь посмотрим как отправлять деньги
    Python
    from aiotx.clients import AioTxETHClient
    import asyncio

    eth_client = AioTxETHClient(
    node_url="https://ethereum-sepolia-rpc.publicnode.com",
    chain_id=11155111)

    private_key = "231d9a16df21402be2b2b50343c489129f1d42dcbaa18b553e6c99057e699df6"
    USDC_contract = "0x13fA158A117b93C27c55b8216806294a0aE88b6D"
    USDT_contract = "0x419Fe9f14Ff3aA22e46ff1d03a73EdF3b70A62ED"
    to_address = "0xf9E35E4e1CbcF08E99B84d3f6FF662Ba4c306b5a"

    eth_in_wei = eth_client.to_wei(0.00001, "ether")
    tokens_in_mwei = eth_client.to_wei(1, "mwei")

    async def main():
    nonce = await eth_client.get_transactions_count(to_address)
    tx_id = await eth_client.send(private_key, to_address, eth_in_wei)
    print(tx_id)
    tx_id = await eth_client.send_token(private_key, to_address, USDT_contract, tokens_in_mwei, nonce=nonce+1)
    print(tx_id)
    tx_id = await eth_client.send_token(private_key, to_address, USDT_contract, tokens_in_mwei, nonce=nonce+2)
    print(tx_id)

    asyncio.run(main())
    Nonce это кол-во транзакций на вашем кошельке, по умолчанию если вы не укажите nonce функция отправки подтянет его из ноды для вас, но если вы хотите отправить например 10 транзакций в секунду вам нужно получить nonce и для каждой следующей транзакции прибавлять его самостоятельно, ну или просто ставить задержку между ними. Хочу дополнительно обратить внимание что это относиться только к множественным транзакциям на один кошелек, если часто слать на разные такой проблемы не будет

    Как видите функции для отправки ETH или USDT крайне простые в использовании

    Давайте так же посмотрим на пример отправки транзакций в сети лайткоин (та же логика есть и для биткоин)

    Python
    from aiotx.clients import AioTxLTCClient
    import asyncio

    LTC_TEST_NODE_URL = "http://"
    ltc_client = AioTxLTCClient(LTC_TEST_NODE_URL, testnet=True)


    private_key = "18553b3eb4c5f905d7b023e1736b55ffcbf47657d2cb27f398526ddc9d1764e7"
    address = "tltc1qekukv0c9frj3zz8jyag863p8gvv7m3gy2np88d"
    to_address = "tltc1qswa8y94sd0njs0atf7h2rmr638nuksw0p2m03v"

    async def main():
    balance = await ltc_client.get_balance("tltc1qekukv0c9frj3zz8jyag863p8gvv7m3gy2np88d")
    print("balance is:", balance)
    amount_in_satoshi = ltc_client.to_satoshi(0.0005)
    # Without any additional params
    tx_id = await ltc_client.send(private_key, to_address, amount_in_satoshi)
    print(tx_id)
    # Deduct fee from client
    tx_id = await ltc_client.send(private_key, to_address, amount_in_satoshi, deduct_fee=True)
    print(tx_id)
    tx_id = await ltc_client.send_bulk(private_key, {to_address: amount_in_satoshi,
    "tltc1qswslzcdulvlk62gdrg8wa0sw36f938h2cvtaf7": amount_in_satoshi})
    print(tx_id)
    balance = await ltc_client.get_balance("tltc1qekukv0c9frj3zz8jyag863p8gvv7m3gy2np88d")
    print("balance is:", balance)

    asyncio.run(main())
    Как видите тут мы имеем функцию send_bulk для множественной отправки а также параметр deduct_fee то есть если вам нужно отправить деньги 10 разным людям вы можете сделать это в рамках одной транзакции и поделить комиссию между всеми получателями, то есть если транзакция стоит 10 долларов каждый их них просто получить на 1 доллар меньше чем должен был

    Примеры которые я показал тут а так же примеры для всех остальных сетей доступны тут
    https://github.com/Grommash9/aiotx/tree/main/examples

    [IMG]


    Заключение
    На данный момент (версия 2.3.0) aiotx поддерживает такие валюты как ETH, BSC, TON, MATIC, BTC, LTC
    Новые клиенты, а так же функции для старых будут добавляться со временем как например массовая отправка токенов для ETH и BSC

    У меня есть тема на форуме где я пишу об обновлениях
    https://zelenka.guru/threads/7013065/

    У нас есть чат и канал в телегам где мы готовы помочь разобраться в библиотеке так же в той теме есть ссылки на гитхаб проекта и на документацию по нему.

    На данный момент единственная проблема это сделать так что бы больше людей узнали о проекте поэтому ваша поддержка играет ключевую роль, я буду крайне признателен за любые вопросы в комментах, за лайки и за звездочки на гитхаб, спасибо что прочитали.
     
    1. Uglymb
      grommash9, хороший софт видимо, а какой сервис используется для хоста ноды?
Top