Was verstehe ich hier nicht (oder falsch) bzgl. „öffentlich“?
Ursprünglich hast Du doch LND verwendet zum Erzeugen des Seeds und der Adressen. Und das ist doch öffentlich:
The Lightning Network Daemon (LND) is a complete implementation of an LN node by Lightning Labs. The LND project provides a number of executable applications, including lnd (the daemon itself) and lncli (the command-line utility). LND has several pluggable backend chain services, including btcd (a full node), bitcoind (Bitcoin Core), and Neutrino (a new, experimental light client). LND is written in the Go programming language. The project is open source and developed collaboratively on GitHub.
Da muss mMn nichts „neu programmiert“ werden. Entweder ist es möglich, „von aussen“ (d.h. per API) auf die benötigten Funktionen von LND zuzugreifen, oder im Notfall müsste man den Code aus dem Projekt raussuchen und „von Hand“ ausführen.
Für erstere Variante gibt es z.B. dieses LightningJ, das ich nun erfolgreich auf meinem Laptop installiert habe. Nur leider habe ich nicht so weit gedacht, dass ich ja auch das LND installieren müsste. Und ich glaube das braucht dann ein bitcoind und die gesamte Blockchain im Hintergrund?!
Oder hat jemand Erfahrung damit, nur LND zum Laufen zu bringen um Adressen etc. zu erzeugen, ohne bincoind dahinter?
Das ist richtig. LND ist in der „Go“ Programmiersprache programmiert und Open Source. Theoretisch kann man daraus alles lesen was man braucht, muss es dann aber nunmal auch an den Anwendungsfall anpassen, den Seed zu brute forcen. Im LND source code gibt es bestimmt keine Funktion der man 23 Wörter gibt und die das 24. dann sucht.
Ich zum Beispiel verstehe den LND code leider nicht (ich kenne mich mit Go nicht aus) und kann ihn daher auch nicht verwenden außerhalb dessen was von den LND Devs vorgesehen ist.
Mit „öffentlich“ meinte ich öffentlich verfügbare scripte, welche tatsächlich für Brute Force Anwendungen sind. Diese sind aber vermutlich nur für BIP 39 oder halt Master Private keys programmiert.
Im Ernst, ich dachte wir sind uns über die Schritte unterdessen prinzipiell einig. Du hast es doch schon beschrieben:
Schritt 1 und 3 sollte der Einfachheit direkt von LND aufgerufen werden können via API (RPC).
Schritt 3 eventuell sowas wie
Da gibts ja sogar fertige Javascript-Anwendungsbeispiele!!
Schritt 2, das Brute-Forcen ist vergleichsweise sehr simpel. Bei aller Bescheidenheit, wenn ich die 23 Wörter und die Wortliste hätte ginge das kaum 1/2 Stunde zum Programmieren.
Natürlich muss man es dann iwie so machen, dass der TE das bei sich lokal ausführen kann. Ich bin kein nigerianischer Prinz und brauche seine 23 Wörter daher nicht.
Also ich hätte es ggf. in Java oder Javascript gemacht, da ich Python kaum kenne.
Und das Beispiel ist auch sehr hilfreich, danach hätte ich früher oder später gefragt
Und einfach damit gefragt ist:
Ich nehme an, Du hast schon überprüft, dass Du wirklich ein Wort vergessen hast aufzuschreiben?! Und nicht z.B. Wort x = Baum, Wort x+1=stamm und auf Deiner Liste steht „Baumstamm“ und Du hast eigentlich nur das Leerzeichen vergessen oä?!
Edit: Ich war eigentlich sicher, dass die Wörter in der Liste „klug“ ausgewählt sind, um möglichst Missverständnisse zu vermeiden.
So etwas hätte ich eher nicht erwartet:
430 cup
431 cupboard
Nein, es sind 23 Wörter. Bei der Lightning Wallet in Umbrel werden in einem 4x5 Raster alle Seed-Wörter auf einmal angezeigt. Ich habe es in zwei Spalten notiert und habe auf einer Seite andere Abstände zwischen den Worten gehabt, so dass am Ende beide Spalten gleich lang aussehen, aber in einer ein Wort fehlt.
Ich Vollidiot habe den Seed danach wohl nicht noch mal geprüft.
Das mit dem Beispielseed ist sehr gut.
Ich hätte mir vermutlich auch ein Beispielseed erstellt an dem ich so ein Script testen kann.
Die BIP39 Wörter sind so gewählt, dass man mit den ersten 4 Buchstaben eindeutig sagen kann welches Wort es ist.
Dass aber ähnliche Wörter wie car und cart vorkommen, finde ich schon sehr blöd.
Mir ist aber leider etwas eingefallen, was oben genannte Methode doch schwer ausführbar macht.
Nehmen wir an, wir haben unser fertiges Script, welche die LND API nutzt.
Es würde jetzt Seed 0 (unseren ersten Brute Force Versuch) an den LND node übergeben und dieser antwortet mit einer Art Master Priv Key oder in den meisten Fällen mit „invalid checksum“ oder so ähnlich.
Wer von euch mal über cmd einen Befehl wie „lncli getinfo“ übermittelt hat, weiß, dass die Antwort nicht sofort kommt.
Sie braucht zwar nicht lange, aber doch lange genug, dass ich nicht 24*2048(=49152) mal diese Antwort abwarten möchte.
Darüber hinaus muss ja bei allen validen Seeds ja auch noch Adresse 0-9 erstellt werden, wobei wieder 10 API calls gemacht werden müssen.
Das Script könnte gut und gerne 10-20h laufen bis alle Möglichkeiten ausprobiert sind.
Wenn da auf dem Node viel Geld ist, macht man das natürlich, aber es ist nicht wie bei anderen scripted, welche innerhalb des scripts alles machen und keine API nutzen müssen.
Also besser nicht, _ich_funktioniere damit besser.
Es ging mir dabei eher darum, dass Du dann eine jre brauchst, falls es in Java wäre. Und ev. ein .jar File ausführen müsstest, was meines Wissens nach auch einiges an Vertrauen benötigt, das man eigentlich nicht in fremde Leute haben sollte. Von daher wäre JavaScript ev. besser.
Was glaubst Du, wie lange mein Vanity Address Finder gelaufen ist
Ok! Habe am WE nochmals etwas versucht, mit LingntningJ und der API rumzuspielen.
Ich denke aber, wir werden um eine lokale Installation von bitcoind und lnd nicht herumkommen. Zuerst dachte ich, man könnte ev. eine öffentliche Instanz im Testnet dazu verwenden. Aber ich möchte diese eigentlich nicht mit 24*2048 Requets bewerfen. Danach möchte diese dann ev. nicht mehr mit mir befreundet sein
Habe festgestellt dass ich sogar noch eine bitcoin-0.21.0 Version auf dem Rechner hatte. Man wird vergesslich im Alter. Habe mal die Testnet Chain gesynct, das geht relativ schnell, 1-2h!
Jetzt müsste ich noch LND installieren und dann irgendwie versuchen, ob ich mit diesen API Calls etwas erreichen kann.
Eines der grössten Probleme sehe ich darin, dass Du ja am Ende dasselbe bei Dir auch machen musst. Deine ‚echten‘ 23 Wörter musst Du ja unbedingt für Dich behalten…
…was meinst Du damit genau? Du bräuchtest eben mMn auch noch die ganzen BTC Installationen.
Vielleicht kannst Du mir noch ein einfacheres Beispiel machen, mit allen 24 Wörtern? Und z.B. der dritten abgeleiteten Adresse als „Lösung“ zum testen.
Als nächstes müsste man dann (wie oben schon erwähnt) etwa hier schauen:
Ob es etwa solche Kommandos gibt, wie wir es brauchen, also
Das Problem wurde von einem Forenmitglied gelöst! Das fehlende Wort wurde erfolgreich in wenigen Sekunden gefunden. In meinem Fall war das selbe Wort direkt zweimal hintereinander im Seed und ich werde das zweite beim Abschreiben übersprungen haben…
Das Skript wird (demnächst) Open-Source gestellt.
Der Autor des Skripts möchte jedoch keine direkte Verbindung zwischen seinem Github Account und dem Pseudonym hier im Forum herstellen, weswegen ich keine weiteren Details nennen werde. Wer Hilfe braucht, soll sich hier melden, aber ich werde den Link zum Projekt dann irgendwann auch hier posten.
Danke für Eure Hilfe!
Für Interessierte: Im Seed ist eine Prüfsumme codiert. Das erleichtert die Rekonstruktion, da man nicht (wie bei einem gewöhnlichen BIP-39 Seed) alle Adressen durchsuchen muss. Wenn man einen gültigen Seed trifft, dann ist das auch der Richtige.
Freut mich für Dich! Also ich bin sehr interessiert an der Lösung!
Habe vorgestern und gestern auch noch einiges versucht. Hier die Kurzzusammenfassung für Interessierte:
Lokal bincoind und lnd laufen lassen und damit per REST darauf zugreifen (über Python) hat tatsächlich funktioniert. Aber damit kann man dann einfach ein wallet auf einmal erstellen (aus einem mnemonic seed), muss dieses zunächst noch per REST Befehl öffnen und kann dann Adressen ableiten. Für 2048*24 Iterationen wäre das ziemlich umständlich.
Auch das Script habe ich zum laufen gebracht, dass @mapleloopsong von ChatGPT hat erstellen lassen. Wie erwartet funktioniert das aber nicht.
Zum Beispiel erzeugt es Legacy Adressen, beginnend mit 1…
Gesucht war aber eine bc1… Adresse. Dazu müsste man mindestens dan korrekten Adresstyp setzen, mMn etwa so:
Generierung der Bitcoin-Adresse aus dem HD-Schlüssel
address = hd_key.address(encoding='bech32')
Aber eben, das erzeugt Adressen nach BIP039, nicht aezeed.
Die Lösung verstehe ich nicht so ganz.
Auch wenn du die Checksumme hast musst du doch zur Überprüfung derselben jedesmal den SHA256 Hash ermitteln. Und das maximal 24x2048 mal.
Ohne das kann es doch nicht funktioniert haben oder?
Respekt das dies jemand in ein paar wenigen Sekunden hin bekommt.
Ich schreibe gerade bei Scratch ein BIP39 Projekt. Da könnte ich so etwas auch ausführen. Allerdings braucht mein kleiner Raspberry pi 4 mit Hilfe von Scratch 3 Sekunden für einen SHA256 Hash. Ein Scratch BIP39 Benchmark Test ist bei den Entwicklung für mein BIP39 Projekt abgefallen zwischendurch.