שילוב LND: הגדרת gRPC/API, ניהול נזילות, LNURL

שילוב רשת הברק פותח את הדרך לתשלומים מיידיים וזולים, אך הגדרת LND דורשת ידע טכני מעמיק. אנחנו לוקחים על עצמנו את כל המחזור: מהגדרת gRPC וניהול נזילות ועד להטמעת LNURL ומתן תמיכה לאחר ההשקה. הצוות שלנו מספק את הפרויקט במפתח מלא, ומבטיח פעילות אמינה של פתרון התשלומים שלך.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

Lightning Network פותר את הבעיה הבסיסית של ביטקוין: עסקאות on-chain יקרות (עד $100 להעברה) ואיטיות (10–60 דקות). דמיינו שירות מיקרופיימנט — כל תשלום של $0.01 דורש עמלה גדולה פי 1000. עם Lightning Network Daemon מ-Lightning Labs, העמלות יורדות ל-1–10 סאטושי ($0.0001–0.001), והאישור לוקח שניות. אבל אינטגרציה של Bitcoin Lightning דרך LND אינה טריוויאלית: צריך להגדיר לקוח gRPC עם אימות macaroon, לנהל נזילות ערוצים, וליישם עיבוד תשלומים ללא הפסדים. לצוות שלנו יש ניסיון של למעלה מ-5 שנים: חיברנו LND לשערי תשלום, בורסות ויישומי DeFi. בשעות שיא, עמלות on-chain יכולות לעלות על $100 להעברה — Lightning מפחית אותן לשברי סנט, ומשיג חיסכון של עד 99.98% בעלויות. לפי Lightning Labs, יישום LND יכול לחסוך עד 99% בעלויות עסקאות. לעסק שמעבד 10,000 עסקאות בחודש, מעבר מ-on-chain ($50 לעסקה) ל-Lightning ($0.01 לעסקה) מביא לחיסכון חודשי של $499,990. בואו נצלול לפרטים הטכניים.

מה זה LND ואיך זה עובד

LND הוא צומת תוכנה לרשת Lightning. הוא דורש:

  • צומת ביטקוין מסונכרן (Bitcoind או מצב אור neutrino)
  • ערוצי תשלום פתוחים עם עמיתים ברשת
  • ניהול נזילות: כספים בצד שלך של הערוץ לתשלומים יוצאים, ובצד הנגדי לתשלומים נכנסים

ערוצי תשלום הם חוזי multisig מסוג 2-מתוך-2 על ביטקוין L1. LND מנהל את מצב הערוץ off-chain, ומפרסם רק פתיחה וסגירה של ערוצים לבלוקצ'יין. תשלומים מבוססי חשבוניות: המקבל יוצר חשבונית (בקשת תשלום BOLT-11), והמשלם משלם אותה. החשבונית מכילה hash תשלום — מנגנון HTLC מבטיח אטומיות.

אילו APIs מספק LND לאינטגרציה?

LND מציע שני APIs: gRPC (ראשי, עם כל הפונקציונליות) ו-REST (עטיפה). לייצור — gRPC, שמבצע פי 10 טוב יותר מ-REST בתרחישים של תפוקה גבוהה. השוואה:

תכונה gRPC REST
ביצועים גבוהים (HTTP/2, פרוטוקול בינארי) בינוניים (JSON, HTTP/1.1)
פונקציונליות סט מלא של שיטות RPC (כולל סטרימינג) כיסוי חלקי
אימות TLS + macaroon TLS + macaroon (Hex/Base64)
המלצה בחירה ראשית לאינטגרציות פשוטות

אימות באמצעות תעודת TLS + macaroon (טוקן מבוסס הרשאות):

import * as grpc from '@grpc/grpc-js';
import * as protoLoader from '@grpc/proto-loader';
import fs from 'fs';

const TLS_CERT = fs.readFileSync('/home/bitcoin/.lnd/tls.cert');
const MACAROON = fs.readFileSync('/home/bitcoin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon');

const sslCreds = grpc.credentials.createSsl(TLS_CERT);
const macaroonCreds = grpc.credentials.createFromMetadataGenerator((_, callback) => {
  const metadata = new grpc.Metadata();
  metadata.add('macaroon', MACAROON.toString('hex'));
  callback(null, metadata);
});
const credentials = grpc.credentials.combineChannelCredentials(sslCreds, macaroonCreds);

const packageDef = protoLoader.loadSync('rpc.proto', { keepCase: true });
const lnrpc = grpc.loadPackageDefinition(packageDef) as any;
const lightning = new lnrpc.lnrpc.Lightning('localhost:10009', credentials);

Macaroon הוא לא רק טוקן — זה אימות מבוסס הרשאות. אפשר ליצור invoice.macaroon (יצירת חשבוניות בלבד), readonly.macaroon (קריאה בלבד), או כאלה מותאמות עם הגבלות IP וזמן. לעולם אל תחשוף admin.macaroon ליישומים — רק הרשאות מינימליות נדרשות.

פעולות ליבה

יצירת חשבונית (קבלת תשלום)

function addInvoice(amountSats: number, memo: string): Promise<Invoice> {
  return new Promise((resolve, reject) => {
    lightning.AddInvoice(
      {
        value: amountSats,
        memo,
        expiry: 3600,
      },
      (err: any, response: any) => {
        if (err) reject(err);
        else
          resolve({
            paymentRequest: response.payment_request,
            rHash: response.r_hash.toString('hex'),
            addIndex: response.add_index.toString(),
          });
      }
    );
  });
}

המחרוזת BOLT-11 מתחילה ב-lnbc (mainnet) או lntb (testnet). זה מה שהמשתמש סורק עם הארנק שלו.

מעקב אחר תשלומים נכנסים שתי גישות: Polling — LookupInvoice לפי r_hash. פשוט אבל לא אופטימלי. מנויי סטרימינג — SubscribeInvoices מזרים את כל העדכונים בזמן אמת:

function subscribeInvoices(onSettled: (invoice: SettledInvoice) => void) {
  const stream = lightning.SubscribeInvoices({
    settle_index: 0,
  });
  stream.on('data', (invoice: any) => {
    if (invoice.state === 1) {
      onSettled({
        rHash: invoice.r_hash.toString('hex'),
        amountPaidSats: Number(invoice.amt_paid_sat),
        settledAt: Number(invoice.settle_date),
        memo: invoice.memo,
      });
    }
  });
  stream.on('error', (err: Error) => {
    setTimeout(() => subscribeInvoices(onSettled), 5000);
  });
}

חשוב: יש לשמור settle_index. בעת הפעלה מחדש של היישום, הירשם מ-settle_index האחרון שעובד, אחרת תפספס תשלומים שהתקבלו בזמן השבתה.

תשלומים יוצאים

async function sendPayment(paymentRequest: string): Promise<string> {
  return new Promise((resolve, reject) => {
    const routerStub = new lnrpc.routerrpc.Router('localhost:10009', credentials);
    const stream = routerStub.SendPaymentV2({
      payment_request: paymentRequest,
      timeout_seconds: 60,
      fee_limit_sat: 100,
      max_parts: 4,
    });
    stream.on('data', (payment: any) => {
      if (payment.status === 2) {
        resolve(payment.payment_preimage.toString('hex'));
      } else if (payment.status === 3) {
        reject(new Error(`Payment failed: ${payment.failure_reason}`));
      }
    });
  });
}

SendPaymentV2 (router RPC) עדיף על SendPayment הישן — הוא תומך ב-MPP (תשלומים מרובי נתיבים) ומטפל טוב יותר בשגיאות ניתוב.

תוכנית אינטגרציה של LND שלב אחר שלב

  1. הגדרת צומת ואימות. פרוס צומת LND (mainnet/testnet) או התחבר לקיים. צור תעודת TLS ו-macaroon עם הרשאות מינימליות (למשל, invoice.macaroon לקבלת תשלומים). ודא שהצומת מסונכרן והערוצים פתוחים.

  2. יישום לקוח gRPC. השתמש בהגדרות protobuf ממאגר LND. הגדר אישורים משולבים (TLS + macaroon). הוסף לוגיקת התחברות מחדש עם backoff אקספוננציאלי.

  3. טיפול בתשלומים. יישם יצירת חשבוניות (AddInvoice) ומנוי לאירועי settle (SubscribeInvoices) עם settle_index מתמשך. לתשלומים יוצאים, השתמש ב-SendPaymentV2 עם תמיכת MPP.

  4. ניהול נזילות וניטור. הגדר איזון ערוצים אוטומטי באמצעות charge-lnd או bos. חבר ניטור (Prometheus + Grafana) למעקב אחר יתרות וזמינות.

קבל ייעוץ לפרויקט שלך — נעזור להעריך את היקף העבודה.

למה ניהול נזילות הוא קריטי

זו משימה תפעולית מתמשכת. הבעיות העיקריות:

  • נזילות נכנסת: כדי לקבל תשלומים, אתה צריך נזילות בצד העמית של הערוץ. צומת חדש לעיתים קרובות לא יכול לקבל תשלומים. פתרונות: ספקי שירותי Lightning (Bitrefill Thor, Loop In, Amboss Magma) — השכרת נזילות נכנסת בתשלום; פתח ערוץ בכיוון ההפוך.
  • איזון ערוצים: עם הזמן, ערוצים הופכים לא מאוזנים — כל הכספים בצד אחד. LND loop out — החלפת submarine לאיזון: מזיז כספי Lightning ל-on-chain, ומחלק מחדש. משמש אוטומטית על ידי כלים כמו charge-lnd או bos (Balance of Satoshis).
  • מדיניות עמלות: לניתוב תשלומים של אחרים דרך הצומת שלך, אתה גובה base_fee + fee_rate. הגדרות עמלות נכונות משפיעות על יעילות הניתוב.

איך לעקוב אחר תשלומים ב-LND

כבר כיסינו שתי שיטות: polling וסטרימינג. לייצור, השתמש בסטרימינג עם settle_index מתמשך. זה מבטיח שאף תשלום לא הולך לאיבוד. בזמן השבתה, היישום מחדש את המנוי מהאינדקס האחרון.

LNURL ואינטגרציית ארנקים

LNURL הוא הרחבת פרוטוקול על גבי LN. סוגים מרכזיים:

סוג LNURL תיאור דוגמת שימוש
LNURL-pay המשתמש סורק QR, הארנק מבקש אוטומטית חשבונית בסכום הנדרש תרומות, תשלומים בחנות
LNURL-withdraw מאפשר למשתמש לקבל כספים דרך LN תשלומים, קאשבק
Lightning Address כתובת קריאה כמו [email protected] מפשט שליחת תשלומים

דוגמת backend ל-LNURL-pay:

app.get('/.well-known/lnurlp/:username', async (req, res) => {
  res.json({
    callback: `https://yourdomain.com/lnurlp/${req.params.username}/pay`,
    maxSendable: 100_000_000,
    minSendable: 1_000,
    metadata: JSON.stringify([['text/plain', `Pay ${req.params.username}`]]),
    tag: 'payRequest',
  });
});

app.get('/lnurlp/:username/pay', async (req, res) => {
  const { amount } = req.query;
  const invoice = await createInvoice(Number(amount) / 1000);
  res.json({
    pr: invoice.paymentRequest,
    routes: [],
  });
});

מה כלול באינטגרציה

אינטגרציית LND סטנדרטית כוללת:

  • הגדרה או חיבור לצומת LND קיים
  • לקוח gRPC עם אימות TLS + macaroon
  • יצירת חשבוניות ומנוי לתשלומים נכנסים עם settle_index מתמשך
  • עיבוד תשלומים יוצאים עם תמיכת MPP
  • נקודת קצה LNURL-pay (אם נדרש)
  • טיפול בסיסי בשגיאות ולוגיקת התחברות מחדש

החלק התפעולי (ניהול ערוצים, נזילות) הוא נושא נפרד, תלוי בהיקף זרימת התשלומים. אנחנו תומכים בפרויקטים, ומבטיחים יציבות תשתית.

רשימת בדיקה לאינטגרציית LND
  • פרוס צומת LND (mainnet/testnet) או התחבר לקיים
  • הגדר תעודת TLS ו-macaroon עם הרשאות מינימליות
  • יישם לקוח gRPC עם טיפול בהתחברות מחדש
  • צור חשבוניות והירשם לאירועי settle עם אינדקס מתמשך
  • יישם תשלומים יוצאים עם MPP וטיפול בשגיאות
  • הוסף נקודת קצה LNURL-pay (אם נדרש)
  • בדוק על testnet עם סימולציית עומס (למשל, 1000 חשבוניות לדקה)
  • פרוס לייצור עם ניטור זמינות ויתרות ערוצים

הערך את הפרויקט שלך — צור קשר לייעוץ. ציר זמן אינטגרציה בסיסי: 1–2 שבועות. קבל הצעת מחיר למשימות שלך.

דוגמת חיסכון: החלפת תשלום on-chain ב-Lightning מפחיתה את העמלה מ-$50 לפחות מ-$0.01, הפחתה של 99.98%. ב-10,000 עסקאות בחודש, החיסכון מסתכם ב-$499,990. זו לא תיאוריה — יישמנו פתרונות כאלה עבור לקוחות. צור קשר כדי לדון באינטגרציית LND שלך.