Использование кошелька Монеро через Телеграм бот
Так как не знаю никакие Монеро кошельки на мобильном устройстве, а в 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