Использование кошелька Монеро через Телеграм бот

Так как не знаю никакие Монеро кошельки на мобильном устройстве, а в Trust Wallet и Cryptobot попросту нет этой монеты, решил сделать свою реализацию, которую уже на удивление можно считать MVP и свободно принимать и переводить XMR.

Для начала, скачиваем Monero CLI Wallet, для того чтобы взаимодействовать с блокчейном:

https://www.getmonero.org/downloads/

Распаковываем архив, первым делом запускаем сам кошелек через:

./monero-wallet-cli

Создаем название файла кошелька и пароль. Кошелек готов.

Далее, скачиваем блокчейн, целиком или pruned версию (200–100 гб).

Можно установить как службу через systemd, либо на фон через nohup.

Пример скачивания блокчейна целиком:  (>150 гб)

nohup ./monerod --rpc-bind-ip 0.0.0.0 --rpc-bind-port 18081 --confirm-external-bind &

Pruned версия:  (<100гб)

nohup ./monerod --rpc-bind-ip 0.0.0.0 --rpc-bind-port 18081 --confirm-external-bind --prune-blocks &


Биндите RPC на 0.0.0.0 чтобы ваш нод был доступен из интернета другим пользователям.

Биндите RPC на 127.0.0.1 для доступа только из локальной сети для бота. (убрать --confirm-external-bind)

Локальный нод готов.

Далее, запускаем ./monero-wallet-rpc для операций с кошельком.

nohup ./monero-wallet-rpc --rpc-bind-ip 127.0.0.1 --rpc-bind-port 18083 --wallet-file {path_to_wallet_file} --password "habrahabr" --daemon-host 127.0.0.1:18081 --trusted-daemon --disable-rpc-login &


Готово, теперь можно использовать методы из RPC документации:  https://www.getmonero.org/resources/developer-guides/wallet-rpc.html

В том числе: создание адресов, перевод средств и экспорт транзакций. Используя 127.0.0.1:18083/json_rpc.

К примеру, посмотрим баланс кошелька с помощью python requests:

url = "http://127.0.0.1:18083/json_rpc"
headers = { 'content-type': 'application/json' }

payload = json.dumps ({
«jsonrpc»:»2.0»,
«id»:»0»,
«method»: «get_balance»,
«params»:{
«account_index»:0,
«address_indices»:[0]
}
})
response = requests.post (url, data=payload, headers=headers)

print (response.json ())

RPC возвращает баланс в виде атомарных единиц, чтобы перевести в привычный вид XMR:
format(atomic_units / (10**12), ".12f")

И обратно, к примеру, для отправки средств: (Функция transfer, соответственно)
int(float(xmr_amount) * (10**12))

Реализация функций:  https://t.me/wallet_xmrbot

Исходный код:  https://github.com/amlkyc/xmrbot

aiogram 3

aiogram 3

© Habrahabr.ru