Решил сделать свою реализацию кошелька в боте как пет-проект, уже на удивление можно считать 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
ссылка на оригинал статьи https://habr.com/ru/articles/852890/
Добавить комментарий