@ Raghav Sood спасибо за ваш вклад, который направил меня в правильном направлении.
Используя NodeJS / Express / MongoDB в бэкэнде, мне удалось реализовать решение, которым я хотел бы поделиться здесь.
Прежде чем начать, я хочу сделать большой отказ от ответственности: это решение не единственное, оно не самое лучшее, оно не самое быстрое и, вероятно, не самое элегантное.
В любом случае, это решение имеет то преимущество, что не полагается на пакетные решения третьих сторон.Это соответствует духу всей философии «без посредников» сообщества биткойнов.Самое важное, что ваш XPub всегда остается на вашем сервере и НЕ используется совместно с какой-либо внешней службой, что, вероятно, является самым мудрым подходом.
Сказав это, можно показать динамические уникальные адреса BTC клиентам:
- Прежде всего, я установил счетчик, который отслеживает, сколько адресов btc было создано для клиентов из моего HD-кошелька.
Важно убедиться, что вы никогда не предоставляете клиентам один и тот же адрес дважды, что хорошо для конфиденциальности всех сторон, а также для реализации бизнес-логики в вашем приложении.
Для этого я сохраняю «значение счетчика» в моей БД.Каждый раз, когда кто-то посещает страницу оплаты BTC, это значение извлекается из mongo с помощью функции "dealCount" и присваивается переменной "serialPay", которая равна значению, полученному из Mongo + 1. В бэкэнде код был бычто-то вроде этого:
`function dealCount(){`
return new Promise(function(resolve, reject){
Deal.find({_id: "ID_OF_OBJ_WHERE_YOU_STORE_COUNTER"}, function(err, data){
if(err){
console.log(err);
}
resolve(data[0].serialDeal + 1);
})
})
};
Полученное новое значение (которое позже будет снова сохранено в Mongo для отслеживания созданных адресов) используется для генерации нового публичного адреса BTC для клиента под рукой.,Если вы продолжите читать, вы увидите, как.
Для динамического создания новых публичных адресов требуется ключ xPub его или ее HD-кошелька.Если кто-то кодирует в NodeJS, есть пара библиотек (которые можно импортировать на сервер), которые довольно легко разрешат эту операцию: bitcoinjs-lib и / или bitcore-lib.Лично я выбрал Bitcore-lib, потому что здесь меньше зависимостей, и мне было легче усваивать вспомогательные материалы.
Codewise, генерация адреса происходит следующим образом:
const bitcore = require('bitcore-lib');
app.post("/pay.html", urlencodedParser, function(req, res){
let serialPay = dealCount();
serialPay.then(function(serialPay){
const pub = new bitcore.HDPublicKey('INSERT_HERE_YOUR_XPUB_KEY');
let derivedHdPk = pub.derive('m/0/'+serialPay);
let derivedPk = derivedHdPk.publicKey;
let myDynAddress = new bitcore.Address(derivedPk);
res.render('pay', {myDynAddress: myDynAddress});
});
});
Затем, используя EJS в качестве движка шаблонов, я мог бы легко сделать динамический адрес полученного биткойна во внешнем интерфейсе (/pay.ejs):
let myDynAddress = "<%=myDynAddress%>";
let qrurl = "https://chart.googleapis.com/chart?chs=250x250&cht=qr&chl=bitcoin:"+myDynAddress+"?amount="+btcToPay+"%26label=CarRental";
Это сгенерирует QRКод динамически.В оригинальном вопросе можно увидеть, как сделать это на веб-странице.В то же время следует также ввести функцию для хранения обновленного счетчика «serialPay» обратно в БД.
На этом этапе следует начинать мониторинг только входящих (неподтвержденных) платежей по сгенерированному динамическому адресу BTC.Простой способ сделать это - использовать API веб-сокета blockchain.info.Когда приходит платеж, все идет вперед, как предлагает @Raghav Sood: один проверяет входящую транзакцию, проверяя, правильно ли клиент заплатил нужную сумму по нужному адресу.
Теперь вы знаете, кто за что заплатил, и может быть задействована всякая бизнес-логика.