Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)

в 7:37, , рубрики: bitcoin, javascript, node.js, криптография, метки: , ,

Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)
Встала как-то перед мной задача подключить оплату на сайте с помощью биткоина, я конечно слышал про биткоин, но в руках не держал, статей по этому делу мало, под Node.js тем более, пришлось потратить денек и разбираться. Ничего сложного, но думаю смогу сократить ваши пару часов, если вы никогда не работали с биткоином через консоль и не подключали таким образом платежи.


У меня сервер крутится на Ubuntu, соответственно буду рассказывать под нее, разница лишь в установке клиента bitcoind в систему.

1. Как это будет работать.

Соответственно единственное, что нам нужно, чтоб принимать биткоины, это биткоин клиент на сервере. Называется он bitcoind, это всего-лишь консольный вариант клиента, со всем тем же привычным функционалом.

Работает все это чудо через протокол JSON-RPC, висит под портом 8332. Все, что нам останется после установки, просто наладить работу клиента и Node.js.

2. Установка bitcoind.

Для установки нам понадобится выполнить всего пару команд: добавить репозиторий биткоина, установить обновления, установить клиент и создать директорию в домашнем каталоге:

sudo aptitude install python-software-properties
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo aptitude update
sudo aptitude install bitcoind
mkdir ~/.bitcoin/

Дальше мы выполним конфигурацию клиента, создадим daemon, дабы запускать bitcoind в фоновом режиме. Конфигурационный файл клиент нужно поместить в домашней категории, ~/.bitcoind, файл сам называется bitcoin.conf. Так что продолжим:

nano ~/.bitcoin/bitcoin.conf

Вводим:
server=1
daemon=1
rpcuser=USERNAME
rpcpassword=PASSWORD

Устанавливаем логи и пароль на месте USERNAME и PASSWORD соответственно. Теперь создадим daemon для работы в фоновом режиме:
sudo nano /etc/init/bitcoind.conf

Вводим:
description «bitcoind»

start on filesystem
stop on runlevel [!2345]
oom never
expect daemon
respawn
respawn limit 10 60 # 10 times in 60 seconds

script
user=USER
home=/home/$user
cmd=DIR
pidfile=$home/.bitcoin/bitcoind.pid
# Don't change anything below here unless you know what you're doing
[[ -e $pidfile &&! -d "/proc/$(cat $pidfile)" ]] && rm $pidfile
[[ -e $pidfile && "$(cat /proc/$(cat $pidfile)/cmdline)" != $cmd* ]] && rm $pidfile
exec start-stop-daemon --start -c $user --chdir $home --pidfile $pidfile --startas $cmd -b -m
end script

Авторство скрипта не за мной. USER нужно заменить на имя пользователя, под которым будем запускаться bitcoind и DIR нужно заменить расположением самого бинарика, он у меня находится по следующему пути — /usr/bin/bitcoind. У вас должен находится так же, если следовать этому туториалу.

Выполнял перезагрузку конфигурации daemon:
sudo initctl reload-configuration

Выполняем запуск:
sudo start bitcoind

У меня заработало, надеюсь, у вас тоже.

3. Подключаем оплату к сайту.

Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)

Теперь мы можем работать с биткоином через консоль, список команд клиента можно получить так:
sudo bitcoind help

Выпадет обширный список, к каждой команде можно найти описание, например, здесь. Нас интересуют лишь некоторые команды:
getnewaddress (account) — для создания нового адреса и аккаунта.
getbalance (account) — для получения баланса.
listtransactions (account) (count) (from) — для получения списка транзакций.

В принципе это и все, что нам сейчас понадобится. Я буду делать так, нажимаем на кнопочку, получаем адрес, по адресу можем пройти в свой кошелек.

Я набросал немного верстки на скорую руку, выглядит не очень, но статья эта не о верстке вовсе. Все это выглядит до внедрения функционала так.
Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)

И сам кошелек:
Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)

А дальше мы подружим сайт и биткоин клиент. Я не буду рассказывать о том, как писал ajax методы и тому подобное, это все и так знают.

Чтоб работать с bitcoind из под node.js и не писать собственный врапер уже предусмотрено несколько библиотек, я использую просто модуль bitcoin, который можно найти здесь. Так вот, приступим.

Я уже установил модуль bitcoin командой:
npm install bitcoin

Теперь осталось создать подключение в коде и написать первый функционал. Работать с модулем просто, вот пример инициализации клиента:
var client = new bitcoin.Client({
host: 'localhost',
port: 8332,
user: 'b_povod',
pass: '4G92kut51ms02kf%'
});

Для создания нового аккаунта достаточно запросить новый адрес у нашего bitcoind, через модуль bitcoin это делается так:
app.post('/newwallet', function (req, res) {
var id = makeid();
client.cmd('getnewaddress', id, function (err, addr) {
if (err) {
console.log(err);
return res.json({ success : false });
} else {
return res.json({ success : true, addr : addr });
}
});
});

Мы используем метод cmd для доступа к функциям API биткоин клиента, первым аргументом идет названия функции, дальше идут аргументы, в данном случае случайно генерированный id аккаунта, на выходе мы получаем callback с ошибкой, если она есть, и с новым адресом.

Теперь займемся личным кабинетом. Давайте попробуем выводить баланс, заодно и проверим существует ли такой кошелек при переходе по нашему url. Баланс мы узнать можем только по аккаунту, либо же получить общий баланс кошелька, это нам не подходит, потому сперва мы получим аккаунт по адресу, а затем получим баланс, ну и выведем все это на экран.

Для получения аккаунта используем метод getaccount (address), который вернет нам аккаунт по адресу:
client.cmd('getaccount', wallet, function (err, acc) { ... });

Ну и теперь мы можем получить баланс:
client.cmd('getbalance', acc, function (err, balance) { ... });

Перед получение баланса я обрабатываю и перекидываю на главную, если вместо существующего кошелька ввели какой-нибудь крези код:
if (err || !acc) {
if (err) {
console.log(err);
}

return res.redirect('/');
}

Теперь займемся транзакциями. Все точно так же, только метод меняется на listtransactions, стоит заметить, что данный метод вернет лишь 10 последних транзакций, для большего числа, просто укажите 2-ым аргументом количество.
client.cmd('listtransactions', acc, function (err, transactions) { ... });

Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)

Ну и осталось самое интересное, вывод денег :)
Стоит сказать, чтоб перевести деньги, есть два варианта.
move (fromaccount) (toaccount) (amount) — переводит деньги между вашими аккаунтами.
sendfrom (fromaccount) (tobitcoinaddress) (amount) — переводит с вашего аккаунта на указанный адрес.

Мы будем использовать sendfrom, дабы получить уже полноценный онлайн кошелек. Собственно код отправки выглядит так:
client.cmd('sendfrom', acc, addr, amount, function (err, tid) {… });

В ответ мы получим ID транзакции, если все прошло хорошо. Я обычно на всякий случай проверяю, есть ли возможность сделать перевод (просто сравниваю балансы) и т.п., что и вам советую.

Работа с bitcoin из под Node.js (Делаем Online Bitcoin Wallet)

В принципе это все. Как и обещал — вот вам живой пример и код:
http://unlockit.me:8080/ — живой пример (надеюсь хабра эффект не убьет сервак).
Код в репозитории.

Автор: MrPovod

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js