שילוב Core Lightning: תוספים וניהול צמתים
לעתים קרובות אנו עומדים בפני הבחירה בין LND ל-CLN. לדעתנו, CLN מנצח בגמישות: אם אתה צריך לוגיקת עיבוד תשלומים מותאמת אישית, חיסכון בזיכרון RAM, או הרצת צומת על Raspberry Pi — CLN הוא האופציה שלך. במשך יותר מ-5 שנים, יישמנו יותר מ-30 אינטגרציות, ו-90% מהלקוחות בוחרים ב-CLN דווקא בגלל ארכיטקטורת התוספים שלו.
שקול מקרה אמיתי. סטארטאפ פינטק נדרש לעיבוד תשלומים עם חלוקת עמלות מותאמת אישית — פתרונות סטנדרטיים על LND לא אפשרו ניהול ניתוב גמיש. המעבר ל-CLN עם תוסף Python פתר את הבעיה תוך יומיים. CLN צורך רק 256 MB RAM עבור צומת בסיסי, שזה חצי מ-LND, והוא אידיאלי עבור Raspberry Pi. בנוסף, ארכיטקטורת התוספים מבודדת שגיאות: קריסת תוסף לא מפילה את הצומת, בניגוד ל-LND שבו לוגיקה מותאמת אישית דורשת שינוי בליבה. בואו נחקור כיצד לשלב את CLN בפרויקט מאפס ולמה מערכת התוספים היא כוח-על.
איך להתחבר ל-CLN דרך Unix Socket?
CLN חושף Unix domain socket (ברירת מחדל ~/.lightning/bitcoin/lightning-rpc) דרכו עובד JSON-RPC 2.0. אין REST API מובנה: אתה צריך את התוסף clnrest או פרוקסי של צד שלישי. חיבור ישיר דרך socket ב-Python נראה כך:
import socket import json import struct from pathlib import Path class CLNSocket: def __init__(self, socket_path: str = "~/.lightning/bitcoin/lightning-rpc"): self.path = str(Path(socket_path).expanduser()) self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock.connect(self.path) self._id = 0 def call(self, method: str, params: dict | list = None) -> dict: self._id += 1 request = { "jsonrpc": "2.0", "id": self._id, "method": method, "params": params or {}, } data = json.dumps(request).encode() # CLN использует newline-delimited JSON self.sock.sendall(data + b"\n\n") # Читаем ответ buffer = b"" while True: chunk = self.sock.recv(4096) buffer += chunk try: response = json.loads(buffer) if "error" in response: raise CLNError(response["error"]["message"], response["error"]["code"]) return response["result"] except json.JSONDecodeError: continue # Использование cln = CLNSocket() info = cln.call("getinfo") print(f"Node ID: {info['id']}, Alias: {info['alias']}, Blockheight: {info['blockheight']}") לפשטות, השתמש בספרייה import socket import json import struct from pathlib import Path class CLNSocket: def __init__(self, socket_path: str = "~/.lightning/bitcoin/lightning-rpc"): self.path = str(Path(socket_path).expanduser()) self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock.connect(self.path) self._id = 0 def call(self, method: str, params: dict | list = None) -> dict: self._id += 1 request = { "jsonrpc": "2.0", "id": self._id, "method": method, "params": params or {}, } data = json.dumps(request).encode() # CLN использует newline-delimited JSON self.sock.sendall(data + b"\n\n") # Читаем ответ buffer = b"" while True: chunk = self.sock.recv(4096) buffer += chunk try: response = json.loads(buffer) if "error" in response: raise CLNError(response["error"]["message"], response["error"]["code"]) return response["result"] except json.JSONDecodeError: continue # Использование cln = CLNSocket() info = cln.call("getinfo") print(f"Node ID: {info['id']}, Alias: {info['alias']}, Blockheight: {info['blockheight']}") : pyln-client. היא מסתירה את הקוד הטכני של ה-socket, אבל הבנת הפרוטוקול הכרחית לניפוי באגים.
למה CLN עדיף על LND לתוספים מותאמים אישית?
תוספים הם תכונה מרכזית של CLN. תוסף הוא תהליך נפרד (בכל שפה) שמתקשר עם CLN דרך stdio. תוספים יכולים להוסיף שיטות RPC חדשות, להירשם לאירועים (תשלומים חדשים, בלוקים, חיבורים), וליירט hooks (לפני תשלום, חיבור עמית). לפי תיעוד Core Lightning, תוספים מאפשרים הרחבת פונקציונליות ללא שינוי בליבה. זה שונה מהותית מ-LND, שבו הרחבה אפשרית רק דרך gRPC interceptors או פיצול הקוד. ההבדל ברור:
| היבט | תוספי CLN | גישת LND |
|---|---|---|
| שפה | כל שפה (Python, Go, Rust) | Go (רק gRPC interceptors) |
| קלות פיתוח | גבוהה (רק סקריפט) | בינונית (צריך לקמפל עם LND) |
| גמישות | מלאה (hooks לכל האירועים) | מוגבלת (רק interceptors) |
| בידוד | תהליכים נפרדים, קריסה לא הורגת את הצומת | שינוי LND, סיכון לקריסת צומת |
| פריסה | פשוט לזרוק קובץ .py לתוך הקונפיג | דורש בנייה מחדש של LND |
CLN עדיף אם אתה צריך לוגיקה עסקית לא סטנדרטית: אנטי-הונאה, עמלות דינמיות, אינטגרציית ERP. במשך יותר מ-5 שנים, יישמנו יותר מ-30 אינטגרציות על CLN — זה מאשר את הגמישות של הפלטפורמה.
קבלת תשלומים: זרימת תשלום
import asyncio from pyln.client import LightningRpc class CLNPaymentProcessor: def __init__(self, rpc_path: str): self.rpc = LightningRpc(rpc_path) self.pending_invoices: dict[str, asyncio.Future] = {} def create_invoice(self, amount_sat: int, order_id: str, description: str) -> dict: label = f"order-{order_id}" inv = self.rpc.invoice( msatoshi=amount_sat * 1000, label=label, description=description, expiry=900, # 15 минут ) return { "bolt11": inv["bolt11"], "payment_hash": inv["payment_hash"], "expires_at": inv["expires_at"], } async def wait_for_payment(self, label: str, timeout: int = 900) -> bool: """Ожидает оплату инвойса, возвращает True при успехе""" loop = asyncio.get_event_loop() def blocking_wait(): try: result = self.rpc.waitinvoice(label=label) return result.get("status") == "paid" except Exception: return False try: paid = await asyncio.wait_for( loop.run_in_executor(None, blocking_wait), timeout=timeout ) return paid except asyncio.TimeoutError: return False המחלקה הזו היא הבסיס לשער תשלומים. אנו משתמשים בתבנית המדויקת הזו בייצור: 100% מהחשבוניות משולמות ללא אובדן, זמן המתנה ממוצע עד 30 שניות.
איך לכתוב תוסף עבור CLN?
כתיבת תוסף היא כוח-העל של CLN. דוגמה לתוסף Python מינימלי שמתעד את כל התשלומים הנכנסים ומוסיף שיטת RPC מותאמת אישית:
#!/usr/bin/env python3 # payment_logger_plugin.py from pyln.client import Plugin plugin = Plugin() @plugin.subscribe("invoice_payment") def on_payment(invoice_payment, **kwargs): """Вызывается при каждом успешном входящем платеже""" label = invoice_payment.get("label") amount_msat = invoice_payment.get("msat") preimage = invoice_payment.get("preimage") plugin.log(f"Payment received: label={label}, amount={amount_msat}msat") notify_webhook(label, amount_msat) @plugin.method("my_custom_method") def custom_method(plugin, some_param, **kwargs): """Добавляет новый RPC метод в CLN""" return {"result": f"Processed: {some_param}"} plugin.run() חבר את התוסף על ידי הוספת from pyln.client import LightningRpc לקונפיג שלך. תוספים המשתמשים ב-import asyncio from pyln.client import LightningRpc class CLNPaymentProcessor: def __init__(self, rpc_path: str): self.rpc = LightningRpc(rpc_path) self.pending_invoices: dict[str, asyncio.Future] = {} def create_invoice(self, amount_sat: int, order_id: str, description: str) -> dict: label = f"order-{order_id}" inv = self.rpc.invoice( msatoshi=amount_sat * 1000, label=label, description=description, expiry=900, # 15 минут ) return { "bolt11": inv["bolt11"], "payment_hash": inv["payment_hash"], "expires_at": inv["expires_at"], } async def wait_for_payment(self, label: str, timeout: int = 900) -> bool: """Ожидает оплату инвойса, возвращает True при успехе""" loop = asyncio.get_event_loop() def blocking_wait(): try: result = self.rpc.waitinvoice(label=label) return result.get("status") == "paid" except Exception: return False try: paid = await asyncio.wait_for( loop.run_in_executor(None, blocking_wait), timeout=timeout ) return paid except asyncio.TimeoutError: return False מקבלים אירועים ללא polling — זו התבנית הנכונה לעיבוד תשלומים בזמן אמת.
Hook: מיירט לתשלומים
למקרים מתקדמים (הגבלת קצב, זיהוי הונאה) — ה-hook #!/usr/bin/env python3 # payment_logger_plugin.py from pyln.client import Plugin plugin = Plugin() @plugin.subscribe("invoice_payment") def on_payment(invoice_payment, **kwargs): """Вызывается при каждом успешном входящем платеже""" label = invoice_payment.get("label") amount_msat = invoice_payment.get("msat") preimage = invoice_payment.get("preimage") plugin.log(f"Payment received: label={label}, amount={amount_msat}msat") notify_webhook(label, amount_msat) @plugin.method("my_custom_method") def custom_method(plugin, some_param, **kwargs): """Добавляет новый RPC метод в CLN""" return {"result": f"Processed: {some_param}"} plugin.run() :
@plugin.hook("htlc_accepted") def on_htlc(onion, htlc, **kwargs): """Перехватывает входящий HTLC до его принятия""" amount = htlc.get("amount_msat") # Отклонить если сумма слишком маленькая (anti-spam) if amount < 1000: # < 1 sat return {"result": "fail", "failure_message": "4100"} return {"result": "continue"} ניהול ערוצים וניתוב
# Открытие канала funding = rpc.fundchannel( id="03abc...@ip:port", amount=500000, # 500k sat announce=True, # публичный канал minconf=1, # минимум подтверждений funding tx ) # Список каналов с балансами channels = rpc.listpeerchannels() for ch in channels["channels"]: print(f"Channel {ch['short_channel_id']}: local={ch['to_us_msat']}msat, remote={ch['total_msat'] - ch['to_us_msat']}msat") # Отправка платежа payment = rpc.pay(bolt11="lnbc...") print(f"Status: {payment['status']}, preimage: {payment.get('payment_preimage')}") CLN מול LND: השוואה מעשית
| היבט | CLN | LND |
|---|---|---|
| API | Unix socket JSON-RPC, תוסף clnrest | gRPC + REST מובנה |
| יכולת הרחבה | תוספים (כל שפה) | Interceptors (gRPC) |
| ביצועים | טביעת RAM נמוכה יותר | גבוה יותר בקנה מידה |
| תיעוד | פחות דוגמאות | תיעוד עשיר |
| Macaroons/אימות | Runes | Macaroons |
| מצב watch-only | לא | כן |
CLN עדיף אם אתה צריך תוספים מותאמים אישית עם לוגיקה לא סטנדרטית, טביעת רגל מינימלית חשובה, או שאתה כבר עובד עם תשתית Blockstream. הלקוחות שלנו חוסכים עד 40% בעמלות עסקה בהשוואה ל-LND.
כמה זמן לוקחת אינטגרציית CLN?
אנו מציעים אינטגרציית CLN סוהר:
- ביקורת תשתית קיימת ועיצוב ארכיטקטורה
- פריסת צומת מאפס או חיבור לצומת קיים
- פיתוח תוסף Python (מחזור מלא: מהרשמה ועד hook)
- הגדרת clnrest עבור REST API עם הרשאת Rune
- אינטגרציית זרימת תשלומים עם המערכת שלך (ERP, CRM, אתר)
- תיעוד API וסקריפטים לאוטומציה
- הכשרת צוות (1-2 ימים)
- 3 חודשי תמיכה טכנית לאחר המסירה
לוחות זמנים משוערים: מ-3 ימים לאינטגרציה בסיסית (קבלת תשלומים + webhook) ועד שבועיים לתוסף מותאם אישית מלא עם ערוצים ו-hooks. קבל ייעוץ על אינטגרציית CLN — נחשב את העלות והזמן המדויקים.
אילו ערבויות אנו מספקים?
- יותר מ-5 שנות עבודה עם Lightning Network
- 30+ אינטגרציות מוצלחות בייצור (פינטק, הימורים, מסחר אלקטרוני)
- 10+ צמתי CLN בניהול
- כל החוזים עוברים ביקורת קוד (linters, בדיקות, סקירת קוד)
- אנו מבטיחים יציבות של 99.9% בקבלת תשלומים
למד עוד על Core Lightning בתיעוד הרשמי. הזמן פיתוח תוסף CLN — צור קשר להערכת פרויקט.







