Платежный протокол, такой как биткойн, можно использовать не только для оплаты людям. Его можно использовать для забавных вещей, таких как взаимодействие с веб-сайтом, выполняя молниеносные транзакции. Их довольно легко сделать, но вы должны иметь некоторые знания о программировании.

В этой статье я объясню, как я сделал это веб-приложение, в котором вы можете изменять изображение или текст на веб-странице с помощью молниеносной транзакции.

Для обработки транзакций Lightning вам нужен способ связи с вашим узлом Lightning.

Я нашел такие варианты:

  1. Сервер BTCPay: https://btcpayserver.org/ (без третьих лиц)
  2. Opennode: https://www.opennode.co/ (третье лицо)

*** РЕДАКТИРОВАТЬ: Opennode теперь требует KYC. Пожалуйста, используйте сервер BTCPay. ***

В этом примере я использовал opennode, так что приступим!

Во-первых, вам необходимо зарегистрироваться на opennode.co, но сначала вы должны зарегистрироваться на https://dev.opennode.co. Opennode предоставляет вам вариант разработки для тестирования, который отлично подходит для разработки нашего приложения!

Вы можете напрямую работать с версией mainnet opennode.co, если хотите.

После входа в систему не стесняйтесь изучать интерфейс. Opennode предоставляет 10 000 долларов на бесплатную обработку транзакций, что для начала довольно много.

Некоторые пояснения: теперь opennode - это ваш осветительный узел. Это кастодиальная система, и все ваши транзакции будут поступать в ваш кошелек opennode.

Но как вы общаетесь с этим кошельком? Для этого opennode предоставляет API, который мы и будем использовать. Чтобы использовать этот API, нам сначала понадобится ключ API. Для этого зайдите в настройки ›Интеграции и нажмите« + ключ API ». Теперь дайте вашему API имя и выберите «Счета» в разрешениях.

Теперь нажмите «Создать», и он сгенерирует для вас ключ API. Теперь скопируйте этот ключ API куда-нибудь, потому что после этого вы не сможете его получить (хотя вы всегда можете создать новые).

Теперь, когда у нас есть ключ API, мы можем приступить к его использованию. Для начала посмотрим, как использовать API в приложении Node.js.

Создайте новый проект узла для тестирования с помощью npm и установите opennode через npm:

Как только это будет сделано, откройте свой index.js (создайте его в той же папке и в своем проекте). Для этого можно использовать любой редактор кода.

Теперь мы импортируем наш opennode api и аутентифицируем наш ключ API:

API_KEY = "aaceb538-0b4e-4e86-950f-13e0beb48531" // you got it from the dashboard.
const opennode = require(‘opennode’);
opennode.setCredentials(API_KEY, ‘dev’); //if no parameter given, default environment is ‘live’

Вы можете видеть, что второй параметр в setCredentials сообщает вам, в каком режиме должен работать этот API. «Dev» означает в режиме разработки, что означает, что все транзакции будут тестовыми биткойнами, а не реальными деньгами. Когда вы будете готовы развернуть свое приложение, вы можете изменить его на «живое», и все транзакции будут выполняться в основной сети биткойнов, что является реальными деньгами.

Примечание. Если у вас нет testBitcoins для тестирования, вы можете получить их бесплатно через сборщики в Интернете.

Теперь, когда мы настроили наш API, пришло время создать счет с функцией createCharge.

async function getCharge(){
    const charge = await opennode.createCharge({
        amount: 1000,
        description: “1 satoshi sindoor”,
        auto_settle: false
    });
    console.log(charge);
    
    invoice = charge["lightning_invoice"]["payreq"]
    charge_id = charge["id"]
    
    return charge;
}
getCharge();

Вы также можете указать фиатную валюту, но в нашем случае она не указана, поэтому валюта - сатоши. Вы также можете использовать метод обещания, если версия вашего узла старше 6.

Некоторое объяснение: Итак, что мы сделали? Вызвав getCharge (), мы создали счет на наш кошелек opennode Lightning. Теперь покупатель может использовать этот счет для оплаты вам. Давай попробуем это.

Вы видите «плату», возвращаемую API в форме JSON. В нем много информации, большая часть которой не требует пояснений. Чтобы клиент мог заплатить вам, вы должны указать ему «payreq», состоящий из большого количества символов, поэтому он в основном отображается в виде QR-кода. Также убедитесь, что вы сохранили «id», потому что он используется для проверки того, произошла ли транзакция.

Вы можете взять этот «payreq» и ​​выполнить молниеносную транзакцию из своего кошелька testnet-lightning, и транзакция произойдет и перейдет в ваш кошелек opennode.

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

charge = await opennode.chargeInfo(charge_id);

И здесь приходит волшебство. Вы используете эту способность, чтобы узнать, должно ли произойти «действие». Например: «Если эта транзакция завершится, измените изображение на веб-странице на это». Здесь вы можете проявить творческий подход и создавать приложения на основе биткойнов.

Чтобы проверить, оплачен ли счет, вы можете сделать это:

if(charge[“status”] == “paid”){
    console.log("yo its paid lets do something now")
}else{
    console.log("still waiting..")
}

И все ... все остальное - это обычная веб-разработка и технически не является ее частью, но если вы все еще хотите научиться, продолжайте читать.

После завершения разработки перейдите на opennode.co, создайте учетную запись в основной сети, получите ключ API основной сети и переключите setCredentials () в режим реального времени.

Теперь нужно сделать одно предостережение: как мне узнать, что пользователь выполнил транзакцию? Должна быть какая-то служба, периодически проверяющая, произошла ли транзакция. Итак, вам нужно настроить сервер, который это делает, или вы можете просто использовать лямбда-функцию AWS, которую я использовал.

Примечание. Вам, вероятно, в любом случае понадобится сервер для создания счетов, потому что API совместим с nodejs и не совместим с Javascript.

Итак, мой лямбда-код для проверки, оплачен ли счет, следующий:

let invoice_key = “"
let invoice_key_dev = “”
const opennode = require(‘opennode’);
opennode.setCredentials(invoice_key, ‘live’); //if no parameter given, default environment is ‘live’
exports.handler = async (event, context) => {
     // TODO implement
 
     let charge, text;
     let headers = {
         “Access-Control-Allow-Origin”: “*”,
         “Access-Control-Allow-Headers”: “application/json”,
         “Access-Control-Allow-Methods”: “OPTIONS,POST,GET”
      }
    charge = await opennode.chargeInfo(event.queryStringParameters.id);
 
    if(charge[“status”] == “unpaid”){
         text = JSON.stringify({status: “unpaid”});
         const response = {
             statusCode: 200,
             headers: headers,
             body: text,
         };
         return response;
    }else{
         text = JSON.stringify({status: “paid”});
         const response = {
             statusCode: 200,
             headers: headers,
             body: text,
         };
         return response
     }
};

Здесь я также настроил COR, который позволяет вызывать эту лямбда-функцию из другого домена, которым в нашем случае будет наш веб-сайт (вам также необходимо настроить шлюз API для этой лямбда-функции).

Что действительно происходит, так это то, что клиент (веб-сайт) отправляет запрос этой лямбда-функции каждые 5 секунд с помощью ajax.

function checkStatus(id){
url = “ https://yourawslambdafunction.execute-api.us-east-1.amazonaws.com/default/getInvoiceStatus?id=" + id
console.log(url)
$.ajax({
url: url,
xhrFields: {
withCredentials: false
},
method: ‘GET’,
success: function(data){
console.log(data)
if(data[“status”] == “paid”){
    document.getElementById(“isrecv”).textContent=”paid!”
    updateInDatabase()// This most likely send a request to update the database with what the user requested.
}else{
    document.getElementById(“isrecv”).textContent=”awaiting pay.. (valid for 5mins)”
    setTimeout(checkStatus, 5000, id) // re-checking after 5 seconds.
}
}
},
})
}

Если счет оплачен, клиент может затем запросить сервер для обновления данных (или сервер сделает это правильно, когда узнает, что транзакция произошла. Я не мог этого сделать, потому что моя база данных - это firebase, и aws не может получить к ней доступ почему-то). Это определенно не лучший и самый безопасный способ сделать это. Если ваша база данных более доступна, выполните обновление на стороне сервера.

И это в значительной степени есть. А теперь сделайте несколько потрясающих LApps.

PS - Я ничего не зарабатываю на средней партнерской программе, поэтому, если вам понравилось и вы узнали что-то, пожалуйста, дайте мне немного чаевых на tippin.me: https://tippin.me/@ParamdeepO. Спасибо.