← P.I.M.P. Servicesandy/zyklisch

Testnet · LND / lncli + curl

Einmal bezahlen. Zweimal Daten abrufen.

Diese Anleitung richtet sich an Entwickler mit einem bereits eingerichteten LND-Testnet-Knoten. Sie beschreibt den Weg von HTTP 402 zur JSON-Antwort für BTC RSI(14). Preis: 25 Testnet-sats zuzüglich möglicher Lightning-Routinggebühren.

Prüfstand: Der zugrunde liegende Ablauf wurde mit LND/lncli im Docker-Container erfolgreich getestet: eine Zahlung, zwei autorisierte Abrufe. Diese auf einzelne Schritte aufgeteilte Anleitung ist syntaktisch geprüft, aber noch nicht auf einer unabhängigen Tester-Installation vollständig durchlaufen. Die genaue Client-Version des Ursprungstests wurde nicht erfasst.

Voraussetzungen

  • Linux mit Bash, curl und Python 3.
  • LND mit entsperrter Wallet, abgeschlossener Synchronisation und funktionierendem lncli-Zugriff auf deinen eigenen Knoten.
  • Bitcoin-Testnet wie beim getesteten Aufruf mit --network=testnet; Mainnet, Signet und Regtest sind nicht dieser Testablauf. Ein Rechnungspräfix allein belegt keine erreichbare Zahlungsroute.
  • Test-Satoshis als ausgehende Lightning-Kanalliquidität und eine Route zum Empfänger. Ein On-Chain-Guthaben allein genügt nicht.

Die Einrichtung eines Knotens, die Beschaffung von Test-Satoshis und das Öffnen von Kanälen sind hier nicht enthalten. Falls dir das Setup fehlt, kontaktiere uns vor dem Zahlungsschritt.

1. Terminal vorbereiten

Führe die Blöcke der Reihe nach im selben Terminal aus. Der erste Befehl öffnet eine eigene Bash-Sitzung. Deine LND-Verbindung einschließlich Zertifikat und Macaroon muss bereits konfiguriert sein; ergänze bei Bedarf deine üblichen lokalen Verbindungsoptionen in der Funktion.

bash
set +x
umask 077
pimp_dir="$(mktemp -d)"
endpoint='https://pimp.andyzyklisch.de/v1/btc/rsi14'
# Lokales lncli mit bereits eingerichteter Verbindung:
pimp_lncli() { lncli --network=testnet "$@"; }
pimp_lncli getinfo

Falls lncli bei dir in Docker läuft, ersetze die Funktion durch diese Variante. litd-buyer ist der Name unseres Testcontainers, kein notwendiger Name für deinen Knoten.

# Alternative: Container-Namen an deine Installation anpassen.
pimp_lncli() { docker exec -i litd-buyer lncli --network=testnet "$@"; }
pimp_lncli getinfo

Fahre nur fort, wenn getinfo den erwarteten Testnet-Knoten und synced_to_chain: true meldet. Nach einem Fehler in einem Schritt anhalten und die Ursache klären. Token und Preimage bleiben privat; keine Terminalausgabe davon veröffentlichen.

2. Zahlungsanforderung abholen

Dieser Schritt kostet nichts. Erwartet werden HTTP 402 und die Meldung, dass Token und Rechnung lokal gespeichert wurden. Ohne beides nicht fortfahren.

curl --silent --show-error --connect-timeout 10 --max-time 25   -D "$pimp_dir/headers" -o "$pimp_dir/challenge-body"   -w 'HTTP %{http_code}\n' "$endpoint"
python3 - "$pimp_dir" <<'PYTHON'
import pathlib, re, sys
p = pathlib.Path(sys.argv[1])
h = (p / 'headers').read_text()
m = re.search(r'(?im)^www-authenticate:\s*L402\s+macaroon="([^"]+)",\s*invoice="([^"]+)"', h)
if not m:
    raise SystemExit('STOP: keine passende L402-Zahlungsanforderung')
if not m[2].startswith('lntb'):
    raise SystemExit('STOP: keine erwartete Testnet-Rechnung')
(p / 'macaroon').write_text(m[1])
(p / 'invoice').write_text(m[2])
print('Token und Rechnung lokal gespeichert.')
PYTHON

3. Rechnung kontrollieren

pimp_lncli decodepayreq "$(cat "$pimp_dir/invoice")"

Prüfe in der Ausgabe: num_satoshis muss 25 sein (entsprechend 25.000 Millisatoshis). Prüfe auch timestamp plus expiry: Die Rechnung darf noch nicht abgelaufen sein. Bei abweichendem Betrag oder Netz nicht bezahlen. Eine abgelaufene, noch unbezahlte Rechnung kannst du über Schritt 2 ersetzen.

4. Einmal bezahlen

Erst dieser Befehl löst nach deiner Bestätigung eine Testnet-Zahlung aus. Kontrolliere den angezeigten Betrag und die Gebührenbedingungen deines Clients. Unser getesteter Ablauf verwendete eine automatische Bestätigung; hier bestätigst du bewusst selbst.

pimp_lncli payinvoice "$(cat "$pimp_dir/invoice")"

Warte auf SUCCEEDED. Kopiere das zugehörige preimage privat für den nächsten Schritt. Bei Zeitüberschreitung, Verbindungsabbruch oder unklarem Status nicht erneut bezahlen und keine neue Rechnung anfordern: Prüfe zuerst den Status der ursprünglichen Zahlung in deinem LND-Client. Das Rechnungsablaufdatum und die Gültigkeit des API-Zugangs sind unterschiedliche Dinge.

5. Zugang lokal zusammensetzen

Füge das Preimage derselben erfolgreichen Zahlung in die verdeckte Eingabe ein. Es gehört zum Token aus Schritt 2. Bei einer STOP-Meldung diesen Schritt mit dem korrekten Preimage wiederholen.

read -r -s -p 'Preimage der erfolgreichen Zahlung: ' pimp_preimage
printf '\n'
if [[ "$pimp_preimage" =~ ^[0-9a-fA-F]{64}$ ]]; then
  printf 'Authorization: L402 %s:%s\n'     "$(cat "$pimp_dir/macaroon")" "$pimp_preimage" > "$pimp_dir/auth"
else
  printf 'STOP: Preimage muss aus 64 Hex-Zeichen bestehen.\n'
fi
unset pimp_preimage

6. JSON abrufen und Zugang erneut nutzen

curl --silent --show-error --connect-timeout 10 --max-time 25   --header "@$pimp_dir/auth" -o "$pimp_dir/response.json"   -w 'HTTP %{http_code}\n' "$endpoint"
python3 -m json.tool "$pimp_dir/response.json"

Erwartet: HTTP 200 und JSON mit symbol: BTC, timeframe: 1h, rsi_period: 14 und einem numerischen rsi. Prüfe auch Zeitstempel und Snapshot-Alter; das Ergebnis ist kein Handelssignal.

Führe nur diesen Abrufblock ein zweites Mal aus. Er verwendet dieselbe lokale Berechtigung und löst keine Lightning-Zahlung aus. Bei Erfolg erhältst du erneut HTTP 200. Damit prüfst du Wiederverwendung am selben Endpunkt; Langzeitgültigkeit und Zugriff auf andere Endpunkte sind damit nicht belegt.

Wenn etwas nicht klappt

  • Keine Zahlungsroute: Verbindung, ausgehende Kanalliquidität und Route prüfen. Bei unklarem Zahlungsstatus zuerst die ursprüngliche Zahlung kontrollieren.
  • HTTP 402 nach erfolgreicher Zahlung: Token und Preimage müssen aus derselben Zahlungsanforderung stammen. Prüfe, ob ein gültiger Authorization-Header gespeichert wurde. Nicht automatisch erneut bezahlen.
  • HTTP 401, 403 oder 5xx: Status und Zeitpunkt notieren und Kontakt aufnehmen; daraus lässt sich kein Bedarf für eine weitere Zahlung ableiten.
  • Browserfehler: Diese Anleitung verwendet curl. Ein fehlgeschlagener Browserabruf allein belegt keinen Ausfall der API.
  • Kein JSON oder alte Daten: HTTP-Status, Kerzenzeitstempel und Snapshot-Alter prüfen; bei Auffälligkeiten melden.

Für Rückmeldungen reichen Client-Version, Schritt, HTTP-Status und Zeitpunkt. Bitte keine Zugangstoken, Preimages, privaten Schlüssel oder vollständigen Authentifizierungsheader teilen. Zur Stacker-News-Diskussion ↗

7. Nach dem Test aufräumen

Dieser Block entfernt die temporären Dateien einschließlich deines bezahlten Zugangs. Wenn du den Zugang weiterverwenden möchtest, bewahre vorher die Datei auth sicher und nur lokal auf. Ohne Token und Preimage kannst du diesen Zugang nicht erneut verwenden. Anschließend beendet exit die in Schritt 1 geöffnete Bash-Sitzung.

rm -f -- "$pimp_dir/headers" "$pimp_dir/challenge-body"   "$pimp_dir/macaroon" "$pimp_dir/invoice" "$pimp_dir/auth"   "$pimp_dir/response.json"
rmdir -- "$pimp_dir"
unset pimp_dir endpoint
unset -f pimp_lncli
exit